aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp8
-rw-r--r--src/server/game/Entities/Creature/Creature.h29
-rw-r--r--src/server/game/Entities/Creature/CreatureData.h17
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
{