18#ifndef TRINITYCORE_CREATURE_H
19#define TRINITYCORE_CREATURE_H
53#define CREATURE_Z_ATTACK_RANGE 3
55#define MAX_VENDOR_ITEMS 150
64 explicit Creature(
bool isWorldObject =
false);
76 bool LoadCreaturesAddon();
78 void UpdateLevelDependantStats();
79 void LoadEquipment(
int8 id = 1,
bool force =
false);
80 void SetSpawnHealth();
81 void LoadTemplateRoot();
86 void GetRespawnPosition(
float &x,
float &y,
float &z,
float* ori =
nullptr,
float* dist =
nullptr)
const;
91 m_corpseDelay = delay;
92 if (ignoreCorpseDecayRatio)
93 m_ignoreCorpseDecayRatio =
true;
101 void InitializeMovementFlags();
102 void UpdateMovementFlags();
105 bool CanWalk()
const {
return GetMovementTemplate().IsGroundAllowed(); }
108 bool CanFly()
const override {
return GetMovementTemplate().IsFlightAllowed() ||
IsFlying(); }
117 Unit* SelectVictim();
122 void InitializeReactState();
135 bool isCanInteractWithBattleMaster(
Player* player,
bool msg)
const;
136 bool CanResetTalents(
Player* player,
bool pet)
const;
137 bool CanCreatureAttack(
Unit const* victim,
bool force =
true)
const;
138 void LoadTemplateImmunities();
141 bool isElite()
const;
142 bool isWorldBoss()
const;
151 bool AIM_Initialize(
CreatureAI* ai =
nullptr);
152 void Motion_Initialize();
163 bool UpdateEntry(
uint32 entry,
CreatureData const* data =
nullptr,
bool updateLevel =
true);
180 float GetSpellDamageMod(
int32 Rank)
const;
190 std::string
const& GetAIName()
const;
191 std::string GetScriptName()
const;
192 uint32 GetScriptId()
const;
193 void InheritStringIds(
Creature const* parent);
194 bool HasStringId(std::string_view
id)
const;
195 void SetScriptStringId(std::string
id);
196 std::string_view
GetStringId(
StringIdType type)
const {
return m_stringIds[size_t(type)] ? std::string_view(*m_stringIds[
size_t(type)]) : std::string_view(); }
210 void StartPickPocketRefillTimer();
212 bool CanGeneratePickPocketLoot()
const;
214 Player* GetLootRecipient()
const;
215 Group* GetLootRecipientGroup()
const;
216 bool hasLootRecipient()
const {
return !m_lootRecipient.IsEmpty() || !m_lootRecipientGroup.IsEmpty(); }
217 bool isTappedBy(
Player const* player)
const;
219 void SetLootRecipient (
Unit* unit,
bool withGroup =
true);
220 void AllLootRemovedFromCorpse();
231 bool CanStartAttack(
Unit const* u,
bool force)
const;
232 float GetAttackDistance(
Unit const* player)
const;
233 float GetAggroRange(
Unit const* target)
const;
237 Unit* SelectNearestTarget(
float dist = 0,
bool playerOnly =
false)
const;
238 Unit* SelectNearestTargetInAttackDistance(
float dist = 0)
const;
239 Unit* SelectNearestHostileUnitInAggroRange(
bool useLOS =
false,
bool ignoreCivilians =
false)
const;
241 void DoFleeToGetAssistance();
242 void CallForHelp(
float fRadius);
243 void CallAssistance();
247 bool CanAssistTo(
Unit const* u,
Unit const* enemy,
bool checkfaction =
true)
const;
248 bool _IsTargetAcceptable(
Unit const* target)
const;
251 void RemoveCorpse(
bool setSpawnTime =
true,
bool destroyForNearbyPlayers =
true);
256 time_t GetRespawnTimeEx()
const;
257 void SetRespawnTime(
uint32 respawn);
258 void Respawn(
bool force =
false);
259 void SaveRespawnTime(
uint32 forceDelay = 0);
271 m_combatPulseDelay = delay;
272 if (m_combatPulseTime == 0 || m_combatPulseTime > delay)
273 m_combatPulseTime = delay;
279 void SendZoneUnderAttackMessage(
Player* attacker);
287 virtual uint32 GetPetAutoSpellOnPos(
uint8 pos)
const;
288 float GetPetChaseDistance()
const;
290 void SetCannotReachTarget(
bool cannotReach);
293 void SetHomePosition(
float x,
float y,
float z,
float o) { m_homePosition.Relocate(x, y, z, o); }
295 void GetHomePosition(
float& x,
float& y,
float& z,
float& ori)
const { m_homePosition.GetPosition(x, y, z, ori); }
300 void GetTransportHomePosition(
float& x,
float& y,
float& z,
float& ori)
const { m_transportHomePosition.GetPosition(x, y, z, ori); }
310 bool IsReturningHome()
const;
312 void SearchFormation();
315 bool IsFormationLeader()
const;
316 void SignalFormationMovement();
317 bool IsFormationLeaderMoveAllowed()
const;
322 void LowerPlayerDamageReq(
uint32 unDamage);
333 static float _GetDamageMod(
int32 Rank);
341 void DoNotReacquireSpellFocusTarget();
344 void ReleaseSpellFocus(
Spell const* focusSpell =
nullptr,
bool withDelay =
true);
353 void SetTextRepeatId(
uint8 textGroup,
uint8 id);
354 void ClearTextRepeatGroup(
uint8 textGroup);
355 bool IsEscorted()
const;
357 bool CanGiveExperience()
const;
365 return !_isMissingCanSwimFlagOutOfCombat;
367 void RefreshCanSwimFlag(
bool recheck =
false);
380 static float _GetHealthMod(
int32 Rank);
398 void RegenerateHealth();
399 void Regenerate(
Powers power);
429 void ForcedDespawn(
uint32 timeMSToDespawn = 0,
Seconds forceRespawnTimer = 0s);
430 bool CheckNoGrayAggroConfig(
uint32 playerLevel,
uint32 creatureLevel)
const;
442 void ReacquireSpellFocusTarget();
448 float Orientation = 0.0f;
@ CREATURE_FLAG_EXTRA_DUNGEON_BOSS
@ CREATURE_FLAG_EXTRA_TRIGGER
@ CREATURE_FLAG_EXTRA_IGNORE_FEIGN_DEATH
@ CREATURE_FLAG_EXTRA_NO_PLAYER_DAMAGE_REQ
@ CREATURE_FLAG_EXTRA_CIVILIAN
@ CREATURE_FLAG_EXTRA_GUARD
@ CREATURE_FLAG_EXTRA_ALL_DIMINISH
static const uint32 MAX_CREATURE_SPELLS
std::vector< uint8 > CreatureTextRepeatIds
std::list< VendorItemCount > VendorItemCounts
std::unordered_map< uint8, CreatureTextRepeatIds > CreatureTextRepeatGroup
std::chrono::seconds Seconds
Seconds shorthand typedef.
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
std::list< ObjectGuid > GuidList
std::optional< T > Optional
Optional helper class to wrap optional values within.
static void SaveToDB(QuestPool const &pool, CharacterDatabaseTransaction trans)
AssistDelayEvent(ObjectGuid victim, Unit &owner)
void AddAssistant(ObjectGuid guid)
time_t _pickpocketLootRestore
Timers.
void SetCombatPulseDelay(uint32 delay)
VendorItemCounts m_vendorItemCounts
time_t const & GetRespawnTime() const
virtual uint8 GetPetAutoSpellSize() const
void SetHomePosition(float x, float y, float z, float o)
void SetNoSearchAssistance(bool val)
void RemoveLootMode(uint16 lootMode)
ObjectGuid lootingGroupLowGUID
int8 GetOriginalEquipmentId() const
std::array< std::string const *, 3 > m_stringIds
void SetHomePosition(Position const &pos)
void DoImmediateBoundaryCheck()
CreatureTextRepeatGroup m_textRepeat
bool IsDungeonBoss() const
SpellSchoolMask m_meleeDamageSchoolMask
int8 m_originalEquipmentId
void SetDisableReputationGain(bool disable)
ObjectGuid::LowType m_spawnId
For new or temporary creatures is 0 for saved it is lowguid.
Position m_transportHomePosition
uint16 GetLootMode() const
void SetImmuneToPC(bool apply) override
bool IsReputationGainDisabled() const
bool HasCanSwimFlagOutOfCombat() const
Optional< std::string > m_scriptStringId
bool m_respawnCompatibilityMode
CreatureTemplate const * m_creatureInfo
bool IsSpawnedOnTransport() const
bool CanFly() const override
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Position const & GetHomePosition() const
uint32 GetWaypointPath() const
void SetLastDamagedTime(time_t val)
bool IsEvadingAttacks() const
bool HasReactState(ReactStates state) const
bool m_triggerJustAppeared
void GetTransportHomePosition(float &x, float &y, float &z, float &ori) const
uint32 GetOriginalEntry() const
ObjectGuid GetLootRecipientGUID() const
MovementGeneratorType m_defaultMovementType
void SetReactState(ReactStates st)
bool GetRespawnCompatibilityMode()
void ResetPlayerDamageReq()
std::pair< uint32, uint32 > _currentWaypointNodeInfo
bool hasLootRecipient() const
void SetRespawnCompatibilityMode(bool mode=true)
void SetCurrentEquipmentId(uint8 id)
void SetRespawnDelay(uint32 delay)
uint32 m_cannotReachTimer
time_t m_corpseRemoveTime
uint32 m_combatPulseDelay
void UpdateCurrentWaypointInfo(uint32 nodeId, uint32 pathId)
void SetRegenerateHealth(bool value)
CreatureData const * m_creatureData
uint32 m_boundaryCheckTime
ObjectGuid m_lootRecipient
CreatureData const * GetCreatureData() const
std::pair< uint32, uint32 > GetCurrentWaypointInfo() const
bool CanIgnoreFeignDeath() const
ObjectGuid::LowType GetSpawnId() const
bool CanNotReachTarget() const
bool m_AlreadyCallAssistance
CreatureTemplate const * GetCreatureTemplate() const
uint32 GetRespawnDelay() const
Position const & GetTransportHomePosition() const
bool CanRegenerateHealth() const
bool DisableReputationGain
CreatureGroup * m_formation
bool HasSearchedAssistance() const
void SetTransportHomePosition(Position const &pos)
bool _regenerateHealthLock
void SetImmuneToNPC(bool apply) override
bool IsDamageEnoughForLootingAndReward() const
SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType=BASE_ATTACK, uint8=0) const override
CreatureGroup * GetFormation()
bool m_AlreadySearchedAssistance
uint32 GetCorpseDelay() const
std::string_view GetStringId(StringIdType type) const
void SetImmuneToAll(bool apply) override
void AddLootMode(uint16 lootMode)
ReactStates GetReactState() const
void SetTransportHomePosition(float x, float y, float z, float o)
void SetWanderDistance(float dist)
time_t GetLastDamagedTime() const
ObjectGuid m_lootRecipientGroup
MovementGeneratorType GetDefaultMovementType() const override
uint8 GetCurrentEquipmentId() const
void SetFormation(CreatureGroup *formation)
void SetCorpseDelay(uint32 delay, bool ignoreCorpseDecayRatio=false)
uint32 GetCombatPulseDelay() const
void SetMeleeDamageSchool(SpellSchools school)
float GetWanderDistance() const
bool HasLootMode(uint16 lootMode)
void ResetPickPocketRefillTimer()
void SetNoCallAssistance(bool val)
bool IsAffectedByDiminishingReturns() const override
bool IsRacialLeader() const
bool m_ignoreCorpseDecayRatio
bool IsInEvadeMode() const
void SetLootMode(uint16 lootMode)
void SetDefaultMovementType(MovementGeneratorType mgt)
void LoadPath(uint32 pathid)
void SetOriginalEntry(uint32 entry)
bool _isMissingCanSwimFlagOutOfCombat
Seconds const m_respawnTimer
ForcedDespawnDelayEvent(Creature &owner, Seconds respawnTimer)
virtual bool hasQuest(uint32) const
virtual void SetObjectScale(float scale)
virtual bool hasInvolvedQuest(uint32) const
void SetImmuneToAll(bool apply, bool keepCombat)
void SetImmuneToPC(bool apply, bool keepCombat)
virtual bool IsMovementPreventedByCasting() const
virtual void SetTarget(ObjectGuid)=0
void AddToWorld() override
virtual void SetCanDualWield(bool value)
virtual bool UpdateAllStats()=0
virtual void UpdateAttackPowerAndDamage(bool ranged=false)=0
virtual bool IsImmunedToSpell(SpellInfo const *spellInfo, WorldObject const *caster, bool requireImmunityPurgesEffectAttribute=false) const
virtual void AtDisengage()
virtual void UpdateResistances(uint32 school)=0
std::string GetDebugInfo() const override
void SetImmuneToNPC(bool apply, bool keepCombat)
virtual bool HasSpell(uint32) const
virtual bool IsAffectedByDiminishingReturns() const
bool IsImmuneToNPC() const
virtual bool CanEnterWater() const =0
virtual bool IsImmunedToSpellEffect(SpellInfo const *spellInfo, SpellEffectInfo const &spellEffectInfo, WorldObject const *caster, bool requireImmunityPurgesEffectAttribute=false) const
bool IsImmuneToAll() const
virtual void UpdateArmor()=0
virtual void UpdateMaxPower(Powers power)=0
virtual uint32 GetShieldBlockValue() const =0
virtual bool UpdateStats(Stats stat)=0
void SetPhaseMask(uint32 newPhaseMask, bool update) override
uint8 GetLevelForTarget(WorldObject const *) const override
virtual void SetDisplayId(uint32 modelId)
bool HasUnitState(const uint32 f) const
virtual void Update(uint32 time) override
virtual bool CanSwim() const
virtual float GetNativeObjectScale() const
void RemoveFromWorld() override
virtual void UpdateMaxHealth()=0
virtual void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex) const =0
virtual bool HasSpellFocus(Spell const *=nullptr) const
virtual void setDeathState(DeathState s)
virtual void AtEngage(Unit *target)
virtual bool IsEngaged() const
bool IsImmuneToPC() const
virtual void ExitVehicle(Position const *exitPosition=nullptr)
virtual bool IsInvisibleDueToDespawn() const
virtual std::string const & GetNameForLocaleIdx(LocaleConstant) const
virtual bool CanAlwaysSee(WorldObject const *) const
Player session in the World.