18#ifndef TRINITYCORE_CREATURE_H
19#define TRINITYCORE_CREATURE_H
53#define CREATURE_Z_ATTACK_RANGE 3
55#define MAX_VENDOR_ITEMS 150
73 explicit Creature(
bool isWorldObject =
false);
85 bool LoadCreaturesAddon();
87 void UpdateLevelDependantStats();
88 void LoadEquipment(
int8 id = 1,
bool force =
false);
89 void SetSpawnHealth();
90 void LoadTemplateRoot();
95 void GetRespawnPosition(
float &x,
float &y,
float &z,
float* ori =
nullptr,
float* dist =
nullptr)
const;
100 m_corpseDelay = delay;
101 if (ignoreCorpseDecayRatio)
102 m_ignoreCorpseDecayRatio =
true;
110 void InitializeMovementFlags();
111 void UpdateMovementFlags();
114 bool CanWalk()
const {
return GetMovementTemplate().IsGroundAllowed(); }
117 bool CanFly()
const override {
return GetMovementTemplate().IsFlightAllowed() ||
IsFlying(); }
126 Unit* SelectVictim();
131 void InitializeReactState();
144 bool isCanInteractWithBattleMaster(
Player* player,
bool msg)
const;
145 bool CanResetTalents(
Player* player,
bool pet)
const;
146 bool CanCreatureAttack(
Unit const* victim,
bool force =
true)
const;
147 void LoadTemplateImmunities();
150 bool isElite()
const;
151 bool isWorldBoss()
const;
160 bool AIM_Initialize(
CreatureAI* ai =
nullptr);
161 void Motion_Initialize();
172 bool UpdateEntry(
uint32 entry,
CreatureData const* data =
nullptr,
bool updateLevel =
true);
189 float GetSpellDamageMod(
int32 Rank)
const;
199 std::string
const& GetAIName()
const;
200 std::string GetScriptName()
const;
201 uint32 GetScriptId()
const;
202 void InheritStringIds(
Creature const* parent);
203 bool HasStringId(std::string_view
id)
const;
204 void SetScriptStringId(std::string
id);
205 std::string_view
GetStringId(
StringIdType type)
const {
return m_stringIds[size_t(type)] ? std::string_view(*m_stringIds[
size_t(type)]) : std::string_view(); }
219 void StartPickPocketRefillTimer();
221 bool CanGeneratePickPocketLoot()
const;
223 Player* GetLootRecipient()
const;
224 Group* GetLootRecipientGroup()
const;
225 bool hasLootRecipient()
const {
return !m_lootRecipient.IsEmpty() || !m_lootRecipientGroup.IsEmpty(); }
226 bool isTappedBy(
Player const* player)
const;
228 void SetLootRecipient (
Unit* unit,
bool withGroup =
true);
229 void AllLootRemovedFromCorpse();
240 bool CanStartAttack(
Unit const* u,
bool force)
const;
241 float GetAttackDistance(
Unit const* player)
const;
242 float GetAggroRange(
Unit const* target)
const;
246 Unit* SelectNearestTarget(
float dist = 0,
bool playerOnly =
false)
const;
247 Unit* SelectNearestTargetInAttackDistance(
float dist = 0)
const;
248 Unit* SelectNearestHostileUnitInAggroRange(
bool useLOS =
false,
bool ignoreCivilians =
false)
const;
250 void DoFleeToGetAssistance();
251 void CallForHelp(
float fRadius);
252 void CallAssistance();
256 bool CanAssistTo(
Unit const* u,
Unit const* enemy,
bool checkfaction =
true)
const;
257 bool _IsTargetAcceptable(
Unit const* target)
const;
260 void RemoveCorpse(
bool setSpawnTime =
true,
bool destroyForNearbyPlayers =
true);
265 time_t GetRespawnTimeEx()
const;
266 void SetRespawnTime(
uint32 respawn);
267 void Respawn(
bool force =
false);
268 void SaveRespawnTime(
uint32 forceDelay = 0);
280 m_combatPulseDelay = delay;
281 if (m_combatPulseTime == 0 || m_combatPulseTime > delay)
282 m_combatPulseTime = delay;
288 void SendZoneUnderAttackMessage(
Player* attacker);
296 virtual uint32 GetPetAutoSpellOnPos(
uint8 pos)
const;
297 float GetPetChaseDistance()
const;
299 void SetCannotReachTarget(
bool cannotReach);
302 void SetHomePosition(
float x,
float y,
float z,
float o) { m_homePosition.Relocate(x, y, z, o); }
304 void GetHomePosition(
float& x,
float& y,
float& z,
float& ori)
const { m_homePosition.GetPosition(x, y, z, ori); }
309 void GetTransportHomePosition(
float& x,
float& y,
float& z,
float& ori)
const { m_transportHomePosition.GetPosition(x, y, z, ori); }
319 bool IsReturningHome()
const;
321 void SearchFormation();
324 bool IsFormationLeader()
const;
325 void SignalFormationMovement();
326 bool IsFormationLeaderMoveAllowed()
const;
331 void LowerPlayerDamageReq(
uint32 unDamage);
342 static float _GetDamageMod(
int32 Rank);
350 void DoNotReacquireSpellFocusTarget();
353 void ReleaseSpellFocus(
Spell const* focusSpell =
nullptr,
bool withDelay =
true);
362 void SetTextRepeatId(
uint8 textGroup,
uint8 id);
363 void ClearTextRepeatGroup(
uint8 textGroup);
364 bool IsEscorted()
const;
366 bool CanGiveExperience()
const;
374 return !_isMissingCanSwimFlagOutOfCombat;
376 void RefreshCanSwimFlag(
bool recheck =
false);
389 static float _GetHealthMod(
int32 Rank);
407 void RegenerateHealth();
408 void Regenerate(
Powers power);
440 void ForcedDespawn(
uint32 timeMSToDespawn = 0,
Seconds forceRespawnTimer = 0s);
441 bool CheckNoGrayAggroConfig(
uint32 playerLevel,
uint32 creatureLevel)
const;
453 void ReacquireSpellFocusTarget();
459 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
uint32 m_baseRangedAttackPower
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
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)
virtual void SetTarget(ObjectGuid const &)=0
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)
std::string const & GetNameForLocaleIdx(LocaleConstant) const override
virtual bool IsInvisibleDueToDespawn() const
virtual bool CanAlwaysSee(WorldObject const *) const
Player session in the World.