summaryrefslogtreecommitdiffstats
path: root/src/Mobs/Monster.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Mobs/Monster.h')
-rw-r--r--src/Mobs/Monster.h221
1 files changed, 63 insertions, 158 deletions
diff --git a/src/Mobs/Monster.h b/src/Mobs/Monster.h
index cdbd26c09..bfaceece2 100644
--- a/src/Mobs/Monster.h
+++ b/src/Mobs/Monster.h
@@ -6,6 +6,7 @@
#include "../BlockID.h"
#include "../Item.h"
#include "../Enchantments.h"
+#include "Components/AllComponents.h"
@@ -15,12 +16,7 @@ class cClientHandle;
class cWorld;
-
-
-// tolua_begin
-class cMonster :
- public cPawn
-{
+class cMonster : public cPawn {
typedef cPawn super;
public:
/// This identifies individual monster type, as well as their network type-ID
@@ -57,7 +53,7 @@ public:
mtWolf = E_META_SPAWN_EGG_WOLF,
mtZombie = E_META_SPAWN_EGG_ZOMBIE,
mtZombiePigman = E_META_SPAWN_EGG_ZOMBIE_PIGMAN,
- } ;
+ };
enum eFamily
{
@@ -69,81 +65,61 @@ public:
mfNoSpawn,
mfUnhandled, // Nothing. Be sure this is the last and the others are in order
} ;
-
- // tolua_end
-
- enum MState{ATTACKING, IDLE, CHASING, ESCAPING} m_EMState;
- enum MPersonality{PASSIVE, AGGRESSIVE, COWARDLY} m_EMPersonality;
-
- /** Creates the mob object.
- If a_ConfigName is not empty, the configuration is loaded using GetMonsterConfig()
- a_MobType is the type of the mob (also used in the protocol ( http://wiki.vg/Entities#Mobs 2012_12_22))
- a_SoundHurt and a_SoundDeath are assigned into m_SoundHurt and m_SoundDeath, respectively
- */
- cMonster(const AString & a_ConfigName, eType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, double a_Width, double a_Height);
- CLASS_PROTODEF(cMonster)
-
- virtual void SpawnOn(cClientHandle & a_ClientHandle) override;
- virtual void Tick(float a_Dt, cChunk & a_Chunk) override;
+protected:
+ eType m_MobType;
- virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;
-
- virtual void KilledBy(TakeDamageInfo & a_TDI) override;
+ cAIComponent * m_AI;
+ cAttackComponent * m_Attack;
+ cEnvironmentComponent * m_Environment;
+ cMovementComponent * m_Movement;
+public:
+ cMonster(const AString & a_ConfigName, eType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, double a_Width, double a_Height);
+ ~cMonster() { delete m_AI; delete m_Attack; delete m_Environment; delete m_Movement;}
+ virtual void SpawnOn(cClientHandle & a_ClientHandle) /*override*/;
- virtual void MoveToPosition(const Vector3d & a_Position); // tolua_export
- virtual bool ReachedDestination(void);
-
- // tolua_begin
- eType GetMobType(void) const {return m_MobType; }
- eFamily GetMobFamily(void) const;
- // tolua_end
-
- virtual void CheckEventSeePlayer(void);
- virtual void EventSeePlayer(cEntity * a_Player);
-
- /// Reads the monster configuration for the specified monster name and assigns it to this object.
- void GetMonsterConfig(const AString & a_Name);
-
- /** Returns whether this mob is undead (skeleton, zombie, etc.) */
- virtual bool IsUndead(void);
-
- virtual void EventLosePlayer(void);
- virtual void CheckEventLostPlayer(void);
-
- virtual void InStateIdle (float a_Dt);
- virtual void InStateChasing (float a_Dt);
- virtual void InStateEscaping(float a_Dt);
-
- int GetAttackRate() { return (int)m_AttackRate; }
- void SetAttackRate(float a_AttackRate) { m_AttackRate = a_AttackRate; }
- void SetAttackRange(int a_AttackRange) { m_AttackRange = a_AttackRange; }
- void SetAttackDamage(int a_AttackDamage) { m_AttackDamage = a_AttackDamage; }
- void SetSightDistance(int a_SightDistance) { m_SightDistance = a_SightDistance; }
-
- float GetDropChanceWeapon() { return m_DropChanceWeapon; }
- float GetDropChanceHelmet() { return m_DropChanceHelmet; }
- float GetDropChanceChestplate() { return m_DropChanceChestplate; }
- float GetDropChanceLeggings() { return m_DropChanceLeggings; }
- float GetDropChanceBoots() { return m_DropChanceBoots; }
- bool CanPickUpLoot() { return m_CanPickUpLoot; }
- void SetDropChanceWeapon(float a_DropChanceWeapon) { m_DropChanceWeapon = a_DropChanceWeapon; }
- void SetDropChanceHelmet(float a_DropChanceHelmet) { m_DropChanceHelmet = a_DropChanceHelmet; }
- void SetDropChanceChestplate(float a_DropChanceChestplate) { m_DropChanceChestplate = a_DropChanceChestplate; }
- void SetDropChanceLeggings(float a_DropChanceLeggings) { m_DropChanceLeggings = a_DropChanceLeggings; }
- void SetDropChanceBoots(float a_DropChanceBoots) { m_DropChanceBoots = a_DropChanceBoots; }
- void SetCanPickUpLoot(bool a_CanPickUpLoot) { m_CanPickUpLoot = a_CanPickUpLoot; }
-
- /// Sets whether the mob burns in daylight. Only evaluated at next burn-decision tick
- void SetBurnsInDaylight(bool a_BurnsInDaylight) { m_BurnsInDaylight = a_BurnsInDaylight; }
+ virtual void Tick(float a_Dt, cChunk & a_Chunk);
- // Overridables to handle ageable mobs
+ // Type Function
virtual bool IsBaby (void) const { return false; }
virtual bool IsTame (void) const { return false; }
- virtual bool IsSitting (void) const { return false; }
+ virtual bool IsUndead (void) const { return false; }
+
+ // Get Functions
+ cAIComponent * GetAIComponent() { return m_AI; }
+ cAttackComponent * GetAttackComponent() { return m_Attack; }
+ cEnvironmentComponent * GetEnvironmentComponent() { return m_Environment; }
+ cMovementComponent * GetMovementComponent() { return m_Movement; }
+
+ // Get Functions - Temporary
+
+ AString GetOwnerName (void) const { return m_OwnerName; }
+ AString GetOwnerUUID (void) const { return m_OwnerUUID; }
+ float GetDropChanceBoots() { return m_DropChanceBoots; }
+ float GetDropChanceHelmet() { return m_DropChanceHelmet; }
+ float GetDropChanceChestplate() { return m_DropChanceChestplate; }
+ float GetDropChanceLeggings() { return m_DropChanceLeggings; }
+ float GetDropChanceWeapon() { return m_DropChanceWeapon; }
- // tolua_begin
+ eType GetMobType() const { return m_MobType; }
+ eFamily GetMobFamily() { return mfPassive; }
+
+
+ // Set Functions - Temporary
+ void SetDropChanceBoots(float a_Chance) { m_DropChanceBoots = a_Chance; }
+ void SetDropChanceHelmet(float a_Chance) { m_DropChanceHelmet = a_Chance; }
+ void SetDropChanceChestplate(float a_Chance) { m_DropChanceChestplate = a_Chance; }
+ void SetDropChanceLeggings(float a_Chance) { m_DropChanceLeggings = a_Chance; }
+ void SetDropChanceWeapon(float a_Chance) { m_DropChanceWeapon = a_Chance; }
+ void SetIsTame(bool m_Tame) {}
+ void SetOwner(AString a_Name, AString a_UUID) { m_OwnerName = a_Name; m_OwnerUUID = a_UUID; }
+
+ // Ability Functions
+ bool CanPickUpLoot() { return false; }
+ void SetCanPickUpLoot(bool a_Looting) {}
+
+ // Static Functions
/// Translates MobType enum to a string, empty string if unknown
static AString MobTypeToString(eType a_MobType);
@@ -156,97 +132,15 @@ public:
/// Returns the spawn delay (number of game ticks between spawn attempts) for the given mob family
static int GetSpawnDelay(cMonster::eFamily a_MobFamily);
-
- // tolua_end
/** Creates a new object of the specified mob.
a_MobType is the type of the mob to be created
Asserts and returns null if mob type is not specified
*/
static cMonster * NewMonsterFromType(eType a_MobType);
-
protected:
-
- /* ======= PATHFINDING ======= */
- /** A pointer to the entity this mobile is aiming to reach */
- cEntity * m_Target;
- /** Coordinates of the next position that should be reached */
- Vector3d m_Destination;
- /** Coordinates for the ultimate, final destination. */
- Vector3d m_FinalDestination;
- /** Returns if the ultimate, final destination has been reached */
- bool ReachedFinalDestination(void);
- /** Stores if mobile is currently moving towards the ultimate, final destination */
- bool m_bMovingToDestination;
-
- /** Finds the first non-air block position (not the highest, as cWorld::GetHeight does)
- If current Y is nonsolid, goes down to try to find a solid block, then returns that + 1
- If current Y is solid, goes up to find first nonsolid block, and returns that */
- int FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ);
- /** Returns if a monster can actually reach a given height by jumping or walking */
- inline bool IsNextYPosReachable(int a_PosY)
- {
- return (
- (a_PosY <= POSY_TOINT) ||
- DoesPosYRequireJump(a_PosY)
- );
- }
- /** Returns if a monster can reach a given height by jumping */
- inline bool DoesPosYRequireJump(int a_PosY)
- {
- return ((a_PosY > POSY_TOINT) && (a_PosY == POSY_TOINT + 1));
- }
-
- /** A semi-temporary list to store the traversed coordinates during active pathfinding so we don't visit them again */
- std::vector<Vector3i> m_TraversedCoordinates;
- /** Returns if coordinate is in the traversed list */
- bool IsCoordinateInTraversedList(Vector3i a_Coords);
-
- /** Finds the next place to go
- This is based on the ultimate, final destination and the current position, as well as the traversed coordinates, and any environmental hazards */
- void TickPathFinding(void);
- /** Finishes a pathfinding task, be it due to failure or something else */
- inline void FinishPathFinding(void)
- {
- m_TraversedCoordinates.clear();
- m_bMovingToDestination = false;
- }
- /** Sets the body yaw and head yaw/pitch based on next/ultimate destinations */
- void SetPitchAndYawFromDestination(void);
-
- /* =========================== */
- /* ========= FALLING ========= */
-
- virtual void HandleFalling(void);
- int m_LastGroundHeight;
-
- /* =========================== */
-
- float m_IdleInterval;
- float m_DestroyTimer;
-
- eType m_MobType;
-
- AString m_SoundHurt;
- AString m_SoundDeath;
-
- float m_AttackRate;
- int m_AttackDamage;
- int m_AttackRange;
- float m_AttackInterval;
- int m_SightDistance;
-
- float m_DropChanceWeapon;
- float m_DropChanceHelmet;
- float m_DropChanceChestplate;
- float m_DropChanceLeggings;
- float m_DropChanceBoots;
- bool m_CanPickUpLoot;
-
- void HandleDaylightBurning(cChunk & a_Chunk);
- bool m_BurnsInDaylight;
/** Adds a random number of a_Item between a_Min and a_Max to itemdrops a_Drops*/
void AddRandomDropItem(cItems & a_Drops, unsigned int a_Min, unsigned int a_Max, short a_Item, short a_ItemHealth = 0);
@@ -262,10 +156,21 @@ protected:
/** Adds weapon that is equipped with the chance saved in m_DropChance[...] (this will be greter than 1 if piccked up or 0.085 + (0.01 per LootingLevel) if born with) to the drop*/
void AddRandomWeaponDropItem(cItems & a_Drops, short a_LootingLevel);
-
-} ; // tolua_export
+ AString m_SoundHurt;
+ AString m_SoundDeath;
+ // Temporary placement till I figure out where to put it
+ float m_DropChanceWeapon;
+ float m_DropChanceHelmet;
+ float m_DropChanceChestplate;
+ float m_DropChanceLeggings;
+ float m_DropChanceBoots;
+ AString m_OwnerName;
+ AString m_OwnerUUID;
+
+ float m_DestroyTimer;
+};