diff options
Diffstat (limited to 'src/Mobs/Monster.h')
-rw-r--r-- | src/Mobs/Monster.h | 473 |
1 files changed, 238 insertions, 235 deletions
diff --git a/src/Mobs/Monster.h b/src/Mobs/Monster.h index dde51e941..2ff411040 100644 --- a/src/Mobs/Monster.h +++ b/src/Mobs/Monster.h @@ -4,7 +4,7 @@ #include "../Entities/Pawn.h" #include "MonsterTypes.h" #include "PathFinder.h" - +#include <vector> class cItem; class cClientHandle; @@ -18,336 +18,339 @@ class cBehaviorChaser; class cBehaviorStriker; class cBehaviorWanderer; class cBehaviorDayLightBurner; +class cBehavior; // tolua_begin class cMonster : - public cPawn + public cPawn { - typedef cPawn super; + typedef cPawn super; public: - enum eFamily - { - mfHostile = 0, // Spider, Zombies ... - mfPassive = 1, // Cows, Pigs - mfAmbient = 2, // Bats - mfWater = 3, // Squid, Guardian - - mfNoSpawn, - mfUnhandled, // Nothing. Be sure this is the last and the others are in order - } ; + enum eFamily + { + mfHostile = 0, // Spider, Zombies ... + mfPassive = 1, // Cows, Pigs + mfAmbient = 2, // Bats + mfWater = 3, // Squid, Guardian - // tolua_end + mfNoSpawn, + mfUnhandled, // Nothing. Be sure this is the last and the others are in order + } ; - enum MPersonality{PASSIVE, AGGRESSIVE, COWARDLY} m_EMPersonality; + // tolua_end - /** 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, eMonsterType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, double a_Width, double a_Height); + enum MPersonality{PASSIVE, AGGRESSIVE, COWARDLY} m_EMPersonality; - virtual ~cMonster() override; + /** 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, eMonsterType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, double a_Width, double a_Height); - virtual void Destroy(bool a_ShouldBroadcast = true) override; + virtual ~cMonster() override; - virtual void Destroyed() override; + virtual void Destroy(bool a_ShouldBroadcast = true) override; - CLASS_PROTODEF(cMonster) + virtual void Destroyed() override; - virtual void SpawnOn(cClientHandle & a_ClientHandle) override; + CLASS_PROTODEF(cMonster) - virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override; + virtual void SpawnOn(cClientHandle & a_ClientHandle) override; - virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override; + virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override; - virtual void KilledBy(TakeDamageInfo & a_TDI) override; + virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override; - virtual void OnRightClicked(cPlayer & a_Player) override; + virtual void KilledBy(TakeDamageInfo & a_TDI) override; - virtual void HandleFalling(void) override; + virtual void OnRightClicked(cPlayer & a_Player) override; - /** Engage pathfinder and tell it to calculate a path to a given position, and move the mob accordingly - Currently, the mob will only start moving to a new position after the position it is currently going to is reached. */ - virtual void MoveToPosition(const Vector3d & a_Position); // tolua_export + virtual void HandleFalling(void) override; - // tolua_begin - eMonsterType GetMobType(void) const { return m_MobType; } - eFamily GetMobFamily(void) const; - // tolua_end + /** Engage pathfinder and tell it to calculate a path to a given position, and move the mob accordingly + Currently, the mob will only start moving to a new position after the position it is currently going to is reached. */ + virtual void MoveToPosition(const Vector3d & a_Position); // tolua_export - virtual void CheckEventSeePlayer(cChunk & a_Chunk); - virtual void EventSeePlayer(cPlayer * a_Player, cChunk & a_Chunk); + // tolua_begin + eMonsterType GetMobType(void) const { return m_MobType; } + eFamily GetMobFamily(void) const; + // tolua_end - // tolua_begin + // tolua_begin - /** Returns whether the mob can be leashed. */ - bool CanBeLeashed() const { return m_CanBeLeashed; } + /** Returns whether the mob can be leashed. */ + bool CanBeLeashed() const { return m_CanBeLeashed; } - /** Sets whether the mob can be leashed, for extensibility in plugins */ - void SetCanBeLeashed(bool a_CanBeLeashed) { m_CanBeLeashed = a_CanBeLeashed; } + /** Sets whether the mob can be leashed, for extensibility in plugins */ + void SetCanBeLeashed(bool a_CanBeLeashed) { m_CanBeLeashed = a_CanBeLeashed; } - /** Returns whether the monster is leashed to an entity. */ - bool IsLeashed() const { return (m_LeashedTo != nullptr); } + /** Returns whether the monster is leashed to an entity. */ + bool IsLeashed() const { return (m_LeashedTo != nullptr); } - /** Leash the monster to an entity. */ - void LeashTo(cEntity * a_Entity, bool a_ShouldBroadcast = true); + /** Leash the monster to an entity. */ + void LeashTo(cEntity * a_Entity, bool a_ShouldBroadcast = true); - /** Unleash the monster. Overload for the Unleash(bool, bool) function for plugins */ - void Unleash(bool a_ShouldDropLeashPickup); + /** Unleash the monster. Overload for the Unleash(bool, bool) function for plugins */ + void Unleash(bool a_ShouldDropLeashPickup); - /** Returns the entity to where this mob is leashed, returns nullptr if it's not leashed */ - cEntity * GetLeashedTo() const { return m_LeashedTo; } + /** Returns the entity to where this mob is leashed, returns nullptr if it's not leashed */ + cEntity * GetLeashedTo() const { return m_LeashedTo; } - // tolua_end + // tolua_end - /** Unleash the monster. */ - void Unleash(bool a_ShouldDropLeashPickup, bool a_ShouldBroadcast); + /** Unleash the monster. */ + void Unleash(bool a_ShouldDropLeashPickup, bool a_ShouldBroadcast); - /** Sets entity position to where is leashed this mob */ - void SetLeashToPos(Vector3d * pos) { m_LeashToPos = std::unique_ptr<Vector3d>(pos); } + /** Sets entity position to where is leashed this mob */ + void SetLeashToPos(Vector3d * pos) { m_LeashToPos = std::unique_ptr<Vector3d>(pos); } - /** Gets entity position to where mob should be leashed */ - Vector3d * GetLeashToPos() const { return m_LeashToPos.get(); } + /** Gets entity position to where mob should be leashed */ + Vector3d * GetLeashToPos() const { return m_LeashToPos.get(); } - /** Reads the monster configuration for the specified monster name and assigns it to this object. */ - void GetMonsterConfig(const AString & a_Name); + /** 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); + /** Returns whether this mob is undead (skeleton, zombie, etc.) */ + virtual bool IsUndead(void); - virtual void EventLosePlayer(void); - virtual void CheckEventLostPlayer(void); + int GetAttackRate() { return static_cast<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; } + int GetSightDistance() { return m_SightDistance; } - int GetAttackRate() { return static_cast<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; } - int GetSightDistance() { return m_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; } + void ResetAttackCooldown(); - 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; } - void ResetAttackCooldown(); + double GetRelativeWalkSpeed(void) const { return m_RelativeWalkSpeed; } // tolua_export + void SetRelativeWalkSpeed(double a_WalkSpeed) { m_RelativeWalkSpeed = a_WalkSpeed; } // tolua_export - double GetRelativeWalkSpeed(void) const { return m_RelativeWalkSpeed; } // tolua_export - void SetRelativeWalkSpeed(double a_WalkSpeed) { m_RelativeWalkSpeed = a_WalkSpeed; } // tolua_export + // Overridables to handle ageable mobs + virtual bool IsTame (void) const { return false; } + virtual bool IsSitting (void) const { return false; } - // Overridables to handle ageable mobs - virtual bool IsTame (void) const { return false; } - virtual bool IsSitting (void) const { return false; } + // tolua_begin + bool IsBaby (void) const { return m_Age < 0; } + int GetAge (void) const { return m_Age; } + void SetAge(int a_Age) { m_Age = a_Age; } + // tolua_end - // tolua_begin - bool IsBaby (void) const { return m_Age < 0; } - int GetAge (void) const { return m_Age; } - void SetAge(int a_Age) { m_Age = a_Age; } - // tolua_end + // tolua_begin - // tolua_begin + /** Returns true if the monster has a custom name. */ + bool HasCustomName(void) const { return !m_CustomName.empty(); } - /** Returns true if the monster has a custom name. */ - bool HasCustomName(void) const { return !m_CustomName.empty(); } + /** Gets the custom name of the monster. If no custom name is set, the function returns an empty string. */ + const AString & GetCustomName(void) const { return m_CustomName; } - /** Gets the custom name of the monster. If no custom name is set, the function returns an empty string. */ - const AString & GetCustomName(void) const { return m_CustomName; } + /** Sets the custom name of the monster. You see the name over the monster. + If you want to disable the custom name, simply set an empty string. */ + void SetCustomName(const AString & a_CustomName); - /** Sets the custom name of the monster. You see the name over the monster. - If you want to disable the custom name, simply set an empty string. */ - void SetCustomName(const AString & a_CustomName); + /** Is the custom name of this monster always visible? If not, you only see the name when you sight the mob. */ + bool IsCustomNameAlwaysVisible(void) const { return m_CustomNameAlwaysVisible; } - /** Is the custom name of this monster always visible? If not, you only see the name when you sight the mob. */ - bool IsCustomNameAlwaysVisible(void) const { return m_CustomNameAlwaysVisible; } + /** Sets the custom name visiblity of this monster. + If it's false, you only see the name when you sight the mob. If it's true, you always see the custom name. */ + void SetCustomNameAlwaysVisible(bool a_CustomNameAlwaysVisible); - /** Sets the custom name visiblity of this monster. - If it's false, you only see the name when you sight the mob. If it's true, you always see the custom name. */ - void SetCustomNameAlwaysVisible(bool a_CustomNameAlwaysVisible); + /** Translates MobType enum to a string, empty string if unknown */ + static AString MobTypeToString(eMonsterType a_MobType); - /** Translates MobType enum to a string, empty string if unknown */ - static AString MobTypeToString(eMonsterType a_MobType); + /** Translates MobType enum to the vanilla name of the mob, empty string if unknown. */ + static AString MobTypeToVanillaName(eMonsterType a_MobType); - /** Translates MobType enum to the vanilla name of the mob, empty string if unknown. */ - static AString MobTypeToVanillaName(eMonsterType a_MobType); + /** Translates MobType string to the enum, mtInvalidType if not recognized */ + static eMonsterType StringToMobType(const AString & a_MobTypeName); - /** Translates MobType string to the enum, mtInvalidType if not recognized */ - static eMonsterType StringToMobType(const AString & a_MobTypeName); + /** Returns the mob family based on the type */ + static eFamily FamilyFromType(eMonsterType a_MobType); - /** Returns the mob family based on the type */ - static eFamily FamilyFromType(eMonsterType a_MobType); + /** Returns the spawn delay (number of game ticks between spawn attempts) for the given mob family */ + static int GetSpawnDelay(cMonster::eFamily a_MobFamily); - /** 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 - // tolua_end + /** Translates the MobType enum to the vanilla nbt name */ + static AString MobTypeToVanillaNBT(eMonsterType a_MobType); - /** Translates the MobType enum to the vanilla nbt name */ - static AString MobTypeToVanillaNBT(eMonsterType a_MobType); + /** Sets the target that this mob will chase. Pass a nullptr to unset. */ + void SetTarget (cPawn * a_NewTarget); - /** Sets the target that this mob will chase. Pass a nullptr to unset. */ - void SetTarget (cPawn * a_NewTarget); + /** Unset the target without notifying the target entity. Do not use this, use SetTarget(nullptr) instead. + This is only used by cPawn internally. */ + void UnsafeUnsetTarget(); - /** Unset the target without notifying the target entity. Do not use this, use SetTarget(nullptr) instead. - This is only used by cPawn internally. */ - void UnsafeUnsetTarget(); + /** Returns the current target. */ + cPawn * GetTarget(); - /** Returns the current target. */ - cPawn * GetTarget(); + /** 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 std::unique_ptr<cMonster> NewMonsterFromType(eMonsterType a_MobType); - /** 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 std::unique_ptr<cMonster> NewMonsterFromType(eMonsterType a_MobType); + /** Returns if this mob last target was a player to avoid destruction on player quit */ + bool WasLastTargetAPlayer() const { return m_WasLastTargetAPlayer; } - /** Returns if this mob last target was a player to avoid destruction on player quit */ - bool WasLastTargetAPlayer() const { return m_WasLastTargetAPlayer; } + bool IsPathFinderActivated() const; - bool IsPathFinderActivated() const; - // Behavior getters - virtual cBehaviorAggressive * GetBehaviorAggressive(); - virtual cBehaviorBreeder * GetBehaviorBreeder(); - virtual const cBehaviorBreeder * GetBehaviorBreeder() const; - virtual cBehaviorChaser * GetBehaviorChaser(); - virtual cBehaviorStriker * GetBehaviorStriker(); - virtual cBehaviorWanderer * GetBehaviorWanderer(); - virtual cBehaviorDayLightBurner * GetBehaviorDayLightBurner(); + // Behavior getters (most are probably not used. mobTodo - cleanup most of them) + virtual cBehaviorAggressive * GetBehaviorAggressive(); + virtual cBehaviorBreeder * GetBehaviorBreeder(); + virtual const cBehaviorBreeder * GetBehaviorBreeder() const; + virtual cBehaviorChaser * GetBehaviorChaser(); + virtual cBehaviorStriker * GetBehaviorStriker(); + virtual cBehaviorWanderer * GetBehaviorWanderer(); + virtual cBehaviorDayLightBurner * GetBehaviorDayLightBurner(); - // Polymorphic behavior functions ("Skin-specific") - virtual void InheritFromParents(cMonster * a_Parent1, cMonster * a_Parent2); - virtual void GetFollowedItems(cItems & a_Items); - virtual void GetBreedingItems(cItems & a_Items); + // Polymorphic behavior functions ("Skin-specific") + virtual void InheritFromParents(cMonster * a_Parent1, cMonster * a_Parent2); + virtual void GetFollowedItems(cItems & a_Items); + virtual void GetBreedingItems(cItems & a_Items); - cPlayer * GetNearestPlayer(); + cPlayer * GetNearestPlayer(); - protected: + protected: - /** Whether or not m_NearestPlayer is stale. Always true at the beginning of a tick. - When true, GetNearestPlayer() actually searches for a player, updates m_NearestPlayer, and sets it to false. - otherwise it returns m_NearestPlayer. This means we only perform 1 search per tick. */ - bool m_NearestPlayerIsStale; - cPlayer * m_NearestPlayer; + /** Whether or not m_NearestPlayer is stale. Always true at the beginning of a tick. + When true, GetNearestPlayer() actually searches for a player, updates m_NearestPlayer, and sets it to false. + otherwise it returns m_NearestPlayer. This means we only perform 1 search per tick. */ + bool m_NearestPlayerIsStale; + cPlayer * m_NearestPlayer; - /** The pathfinder instance handles pathfinding for this monster. */ - cPathFinder m_PathFinder; + /** The pathfinder instance handles pathfinding for this monster. */ + cPathFinder m_PathFinder; - /** Stores if pathfinder is being used - set when final destination is set, and unset when stopped moving to final destination */ - bool m_PathfinderActivated; + /** Stores if pathfinder is being used - set when final destination is set, and unset when stopped moving to final destination */ + bool m_PathfinderActivated; - /** Coordinates of the next position that should be reached */ - Vector3d m_NextWayPointPosition; + /** Coordinates of the next position that should be reached */ + Vector3d m_NextWayPointPosition; - /** Coordinates for the ultimate, final destination. */ - Vector3d m_FinalDestination; + /** Coordinates for the ultimate, final destination. */ + Vector3d m_FinalDestination; - /** Finds the lowest 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. - If no suitable position is found, returns cChunkDef::Height. */ - int FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ); + /** Finds the lowest 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. + If no suitable position is found, returns cChunkDef::Height. */ + int FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ); - /** Returns if the ultimate, final destination has been reached. */ - bool ReachedFinalDestination(void) { return ((m_FinalDestination - GetPosition()).SqrLength() < WAYPOINT_RADIUS * WAYPOINT_RADIUS); } + /** Returns if the ultimate, final destination has been reached. */ + bool ReachedFinalDestination(void) { return ((m_FinalDestination - GetPosition()).SqrLength() < WAYPOINT_RADIUS * WAYPOINT_RADIUS); } - /** Returns whether or not the target is close enough for attack. */ - bool TargetIsInRange(void) - { - ASSERT(GetTarget() != nullptr); - return ((GetTarget()->GetPosition() - GetPosition()).SqrLength() < (m_AttackRange * m_AttackRange)); - } + /** Returns whether or not the target is close enough for attack. */ + bool TargetIsInRange(void) + { + ASSERT(GetTarget() != nullptr); + return ((GetTarget()->GetPosition() - GetPosition()).SqrLength() < (m_AttackRange * m_AttackRange)); + } - /** Returns whether the monster needs to jump to reach a given height. */ - inline bool DoesPosYRequireJump(double a_PosY) - { - return (a_PosY > GetPosY() + 0.8); // Assume that differences up to 0.8 blocks can be walked instead of jumped - } + /** Returns whether the monster needs to jump to reach a given height. */ + inline bool DoesPosYRequireJump(double a_PosY) + { + return (a_PosY > GetPosY() + 0.8); // Assume that differences up to 0.8 blocks can be walked instead of jumped + } - /** Move in a straight line to the next waypoint in the path, will jump if needed. */ - void MoveToWayPoint(cChunk & a_Chunk); + /** Move in a straight line to the next waypoint in the path, will jump if needed. */ + void MoveToWayPoint(cChunk & a_Chunk); - /** Stops pathfinding. Calls ResetPathFinding and sets m_IsFollowingPath to false */ - void StopMovingToPosition(); + /** Stops pathfinding. Calls ResetPathFinding and sets m_IsFollowingPath to false */ + void StopMovingToPosition(); - /** Sets the body yaw and head yaw */ - void SetPitchAndYawFromDestination(bool a_IsFollowingPath); + /** Sets the body yaw and head yaw */ + void SetPitchAndYawFromDestination(bool a_IsFollowingPath); - int m_JumpCoolDown; + int m_JumpCoolDown; - std::chrono::milliseconds m_IdleInterval; - std::chrono::milliseconds m_DestroyTimer; + std::chrono::milliseconds m_IdleInterval; + std::chrono::milliseconds m_DestroyTimer; - eMonsterType m_MobType; - AString m_CustomName; - bool m_CustomNameAlwaysVisible; + eMonsterType m_MobType; + AString m_CustomName; + bool m_CustomNameAlwaysVisible; - AString m_SoundHurt; - AString m_SoundDeath; + AString m_SoundHurt; + AString m_SoundDeath; - float m_AttackRate; - int m_AttackDamage; - int m_AttackRange; - int m_AttackCoolDownTicksLeft; - int m_SightDistance; + float m_AttackRate; + int m_AttackDamage; + int m_AttackRange; + int m_AttackCoolDownTicksLeft; + int m_SightDistance; - float m_DropChanceWeapon; - float m_DropChanceHelmet; - float m_DropChanceChestplate; - float m_DropChanceLeggings; - float m_DropChanceBoots; - bool m_CanPickUpLoot; - int m_TicksSinceLastDamaged; // How many ticks ago we were last damaged by a player? + float m_DropChanceWeapon; + float m_DropChanceHelmet; + float m_DropChanceChestplate; + float m_DropChanceLeggings; + float m_DropChanceBoots; + bool m_CanPickUpLoot; + int m_TicksSinceLastDamaged; // How many ticks ago we were last damaged by a player? - double m_RelativeWalkSpeed; + double m_RelativeWalkSpeed; - int m_Age; - int m_AgingTimer; + int m_Age; + int m_AgingTimer; - bool m_WasLastTargetAPlayer; + bool m_WasLastTargetAPlayer; - /** Entity leashed to */ - cEntity * m_LeashedTo; + /** Entity leashed to */ + cEntity * m_LeashedTo; - /** Entity pos where this mob was leashed to. Used when deserializing the chunk in order to make the mob find the leash knot. */ - std::unique_ptr<Vector3d> m_LeashToPos; + /** Entity pos where this mob was leashed to. Used when deserializing the chunk in order to make the mob find the leash knot. */ + std::unique_ptr<Vector3d> m_LeashToPos; - /** Mob has ben leashed or unleashed in current player action. Avoids double actions on horses. */ - bool m_IsLeashActionJustDone; + /** Mob has ben leashed or unleashed in current player action. Avoids double actions on horses. */ + bool m_IsLeashActionJustDone; - /** Determines whether a monster can be leashed */ - bool m_CanBeLeashed; + /** Determines whether a monster can be leashed */ + bool m_CanBeLeashed; - /** 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); + /** 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); - /** Adds a item a_Item with the chance of a_Chance (in percent) to itemdrops a_Drops */ - void AddRandomUncommonDropItem(cItems & a_Drops, float a_Chance, short a_Item, short a_ItemHealth = 0); + /** Adds a item a_Item with the chance of a_Chance (in percent) to itemdrops a_Drops */ + void AddRandomUncommonDropItem(cItems & a_Drops, float a_Chance, short a_Item, short a_ItemHealth = 0); - /** Adds one rare item out of the list of rare items a_Items modified by the looting level a_LootingLevel(I-III or custom) to the itemdrop a_Drops */ - void AddRandomRareDropItem(cItems & a_Drops, cItems & a_Items, unsigned int a_LootingLevel); + /** Adds one rare item out of the list of rare items a_Items modified by the looting level a_LootingLevel(I-III or custom) to the itemdrop a_Drops */ + void AddRandomRareDropItem(cItems & a_Drops, cItems & a_Items, unsigned int a_LootingLevel); - /** Adds armor that is equipped with the chance saved in m_DropChance[...] (this will be greter than 1 if picked up or 0.085 + (0.01 per LootingLevel) if born with) to the drop */ - void AddRandomArmorDropItem(cItems & a_Drops, unsigned int a_LootingLevel); + /** Adds armor that is equipped with the chance saved in m_DropChance[...] (this will be greter than 1 if picked up or 0.085 + (0.01 per LootingLevel) if born with) to the drop */ + void AddRandomArmorDropItem(cItems & a_Drops, unsigned int a_LootingLevel); - /** Adds weapon that is equipped with the chance saved in m_DropChance[...] (this will be greter than 1 if picked up or 0.085 + (0.01 per LootingLevel) if born with) to the drop */ - void AddRandomWeaponDropItem(cItems & a_Drops, unsigned int a_LootingLevel); + /** Adds weapon that is equipped with the chance saved in m_DropChance[...] (this will be greter than 1 if picked up or 0.085 + (0.01 per LootingLevel) if born with) to the drop */ + void AddRandomWeaponDropItem(cItems & a_Drops, unsigned int a_LootingLevel); private: - /** A pointer to the entity this mobile is aiming to reach. - The validity of this pointer SHALL be guaranteed by the pointee; - it MUST be reset when the pointee changes worlds or is destroyed. */ - cPawn * m_Target; + /** A pointer to the entity this mobile is aiming to reach. + The validity of this pointer SHALL be guaranteed by the pointee; + it MUST be reset when the pointee changes worlds or is destroyed. */ + cPawn * m_Target; + + /** Leash calculations inside Tick function */ + void CalcLeashActions(); + + std::vector<cBehavior*> TickBehaviors; + std::vector<cBehavior*> OnDestroyBehaviors; + std::vector<cBehavior*> OnRightClickBehaviors; - /** Leash calculations inside Tick function */ - void CalcLeashActions(); + cBehavior * m_CurrentTickControllingBehavior; + enum TickState{ControlStarting, ControlEnding, Normal} m_TickControllingBehaviorState; } ; // tolua_export |