diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 29 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/CreatureData.h | 17 |
3 files changed, 48 insertions, 6 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 72683379742..b305fe90e8c 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -298,12 +298,14 @@ bool ForcedDespawnDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) return true; } -Creature::Creature(bool isWorldObject): Unit(isWorldObject), MapObject(), m_PlayerDamageReq(0), _pickpocketLootRestore(0), +Creature::Creature(bool isWorldObject) : Unit(isWorldObject), MapObject(), m_PlayerDamageReq(0), _pickpocketLootRestore(0), m_corpseRemoveTime(0), m_respawnTime(0), m_respawnDelay(300), m_corpseDelay(60), m_ignoreCorpseDecayRatio(false), m_wanderDistance(0.0f), m_boundaryCheckTime(2500), m_combatPulseTime(0), m_combatPulseDelay(0), m_reactState(REACT_AGGRESSIVE), m_defaultMovementType(IDLE_MOTION_TYPE), m_spawnId(UI64LIT(0)), m_equipmentId(0), m_originalEquipmentId(0), m_AlreadyCallAssistance(false), m_AlreadySearchedAssistance(false), m_cannotReachTarget(false), m_cannotReachTimer(0), m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL), m_originalEntry(0), m_homePosition(), m_transportHomePosition(), m_creatureInfo(nullptr), m_creatureData(nullptr), _waypointPathId(0), _currentWaypointNodeInfo(0, 0), m_formation(nullptr), m_triggerJustAppeared(true), m_respawnCompatibilityMode(false), _lastDamagedTime(0), - _regenerateHealth(true), _regenerateHealthLock(false), _isMissingCanSwimFlagOutOfCombat(false) + _staticFlags(CreatureStaticFlags()), _staticFlags2(CreatureStaticFlags2()), _staticFlags3(CreatureStaticFlags3()), _staticFlags4(CreatureStaticFlags4()), + _staticFlags5(CreatureStaticFlags5()), _staticFlags6(CreatureStaticFlags6()), _staticFlags7(CreatureStaticFlags7()), _staticFlags8(CreatureStaticFlags8()), + _regenerateHealth(true), _isMissingCanSwimFlagOutOfCombat(false) { m_regenTimer = CREATURE_REGEN_INTERVAL; @@ -1851,7 +1853,7 @@ void Creature::LoadEquipment(int8 id, bool force /*= true*/) void Creature::SetSpawnHealth() { - if (_regenerateHealthLock) + if (_staticFlags5.HasFlag(CREATURE_STATIC_FLAG_5_NO_HEALTH_REGEN)) return; uint32 curhealth; diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 06c09a36ef1..44d79636bfb 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -302,8 +302,14 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma bool hasQuest(uint32 quest_id) const override; bool hasInvolvedQuest(uint32 quest_id) const override; - bool CanRegenerateHealth() const { return !_regenerateHealthLock && _regenerateHealth; } - void SetRegenerateHealth(bool value) { _regenerateHealthLock = !value; } + bool CanRegenerateHealth() const { return !_staticFlags5.HasFlag(CREATURE_STATIC_FLAG_5_NO_HEALTH_REGEN) && _regenerateHealth; } + void SetRegenerateHealth(bool value) + { + if (!value) + _staticFlags5 |= CREATURE_STATIC_FLAG_5_NO_HEALTH_REGEN; + else + _staticFlags5 &= ~CREATURE_STATIC_FLAG_5_NO_HEALTH_REGEN; + } virtual uint8 GetPetAutoSpellSize() const { return MAX_SPELL_CHARM; } virtual uint32 GetPetAutoSpellOnPos(uint8 pos) const; float GetPetChaseDistance() const; @@ -390,6 +396,15 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma void ExitVehicle(Position const* exitPosition = nullptr) override; + bool HasFlag(CreatureStaticFlags flag) const { return _staticFlags.HasFlag(flag); } + bool HasFlag(CreatureStaticFlags2 flag) const { return _staticFlags2.HasFlag(flag); } + bool HasFlag(CreatureStaticFlags3 flag) const { return _staticFlags3.HasFlag(flag); } + bool HasFlag(CreatureStaticFlags4 flag) const { return _staticFlags4.HasFlag(flag); } + bool HasFlag(CreatureStaticFlags5 flag) const { return _staticFlags5.HasFlag(flag); } + bool HasFlag(CreatureStaticFlags6 flag) const { return _staticFlags6.HasFlag(flag); } + bool HasFlag(CreatureStaticFlags7 flag) const { return _staticFlags7.HasFlag(flag); } + bool HasFlag(CreatureStaticFlags8 flag) const { return _staticFlags8.HasFlag(flag); } + uint32 GetTrainerId() const; void SetTrainerId(Optional<uint32> trainerId); @@ -473,9 +488,17 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma time_t _lastDamagedTime; // Part of Evade mechanics CreatureTextRepeatGroup m_textRepeat; + EnumFlag<CreatureStaticFlags>_staticFlags; + EnumFlag<CreatureStaticFlags2> _staticFlags2; + EnumFlag<CreatureStaticFlags3> _staticFlags3; + EnumFlag<CreatureStaticFlags4> _staticFlags4; + EnumFlag<CreatureStaticFlags5> _staticFlags5; + EnumFlag<CreatureStaticFlags6> _staticFlags6; + EnumFlag<CreatureStaticFlags7> _staticFlags7; + EnumFlag<CreatureStaticFlags8> _staticFlags8; + // Regenerate health bool _regenerateHealth; // Set on creation - bool _regenerateHealthLock; // Dynamically set bool _isMissingCanSwimFlagOutOfCombat; diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h index 09b758d7af3..f4d68be752c 100644 --- a/src/server/game/Entities/Creature/CreatureData.h +++ b/src/server/game/Entities/Creature/CreatureData.h @@ -20,6 +20,7 @@ #include "Common.h" #include "DBCEnums.h" +#include "EnumFlag.h" #include "Optional.h" #include "SharedDefines.h" #include "SpawnData.h" @@ -68,6 +69,8 @@ enum CreatureStaticFlags CREATURE_STATIC_FLAG_LARGE_AOI = 0x80000000 // UnitFlags2 0x200000 }; +DEFINE_ENUM_FLAG(CreatureStaticFlags); + enum CreatureStaticFlags2 { CREATURE_STATIC_FLAG_2_NO_PET_SCALING = 0x00000001, @@ -104,6 +107,8 @@ enum CreatureStaticFlags2 CREATURE_STATIC_FLAG_2_NO_PET_BAR = 0x80000000 // CREATURE_TYPE_FLAG_NO_PET_BAR }; +DEFINE_ENUM_FLAG(CreatureStaticFlags2); + enum CreatureStaticFlags3 { CREATURE_STATIC_FLAG_3_NO_DAMAGE_HISTORY = 0x00000001, @@ -140,6 +145,8 @@ enum CreatureStaticFlags3 CREATURE_STATIC_FLAG_3_AI_CAN_AUTO_LAND_IN_COMBAT = 0x80000000 }; +DEFINE_ENUM_FLAG(CreatureStaticFlags3); + enum CreatureStaticFlags4 { CREATURE_STATIC_FLAG_4_NO_BIRTH_ANIM = 0x00000001, // SMSG_UPDATE_OBJECT's "NoBirthAnim" @@ -176,6 +183,8 @@ enum CreatureStaticFlags4 CREATURE_STATIC_FLAG_4_QUEST_BOSS = 0x80000000 // CREATURE_TYPE_FLAG_QUEST_BOSS }; +DEFINE_ENUM_FLAG(CreatureStaticFlags4); + enum CreatureStaticFlags5 { CREATURE_STATIC_FLAG_5_UNTARGETABLE_BY_CLIENT = 0x00000001, // UnitFlags2 0x4000000 UNIT_FLAG2_UNTARGETABLE_BY_CLIENT @@ -212,6 +221,8 @@ enum CreatureStaticFlags5 CREATURE_STATIC_FLAG_5_GIVE_CRITERIA_KILL_CREDIT_WHEN_CHARMED = 0x80000000 }; +DEFINE_ENUM_FLAG(CreatureStaticFlags5); + enum CreatureStaticFlags6 { CREATURE_STATIC_FLAG_6_DO_NOT_AUTO_RESUMMON = 0x00000001, // "Do not auto-resummon this companion creature" @@ -248,6 +259,8 @@ enum CreatureStaticFlags6 CREATURE_STATIC_FLAG_6_APPLY_PROCEDURAL_WOUND_ANIM_TO_BASE = 0x80000000 // TFLAG2_UNK14 }; +DEFINE_ENUM_FLAG(CreatureStaticFlags6); + enum CreatureStaticFlags7 { CREATURE_STATIC_FLAG_7_IMPORTANT_NPC = 0x00000001, @@ -264,6 +277,8 @@ enum CreatureStaticFlags7 CREATURE_STATIC_FLAG_7_AI_ADDITIONAL_PATHING = 0x00080000, }; +DEFINE_ENUM_FLAG(CreatureStaticFlags7); + enum CreatureStaticFlags8 { CREATURE_STATIC_FLAG_8_FORCE_CLOSE_IN_ON_PATH_FAIL_BEHAVIOR = 0x00000002, @@ -271,6 +286,8 @@ enum CreatureStaticFlags8 CREATURE_STATIC_FLAG_8_USE_FAST_CLASSIC_HEARTBEAT = 0x00000040, }; +DEFINE_ENUM_FLAG(CreatureStaticFlags8); + // EnumUtils: DESCRIBE THIS enum CreatureFlagsExtra : uint32 { |