38#include <unordered_map>
75 virtual void AddToWorld();
76 virtual void RemoveFromWorld();
94 bool isType(
uint16 mask)
const {
return (mask & m_objectType) != 0; }
96 virtual void BuildCreateUpdateBlockForPlayer(
UpdateData* data,
Player* target)
const;
97 void SendUpdateToPlayer(
Player* player);
99 void BuildValuesUpdateBlockForPlayer(
UpdateData* data,
Player const* target)
const;
100 void BuildOutOfRangeUpdateBlock(
UpdateData* data)
const;
103 virtual void DestroyForPlayer(
Player* target,
bool onDeath =
false)
const;
108 float GetFloatValue(
uint16 index)
const;
117 void SetFloatValue(
uint16 index,
float value);
122 void SetStatFloatValue(
uint16 index,
float value);
128 void ApplyModUInt32Value(
uint16 index,
int32 val,
bool apply);
129 void ApplyModInt32Value(
uint16 index,
int32 val,
bool apply);
130 void ApplyModPositiveFloatValue(
uint16 index,
float val,
bool apply);
131 void ApplyModSignedFloatValue(
uint16 index,
float val,
bool apply);
137 void ApplyModFlag(
uint16 index,
uint32 flag,
bool apply);
149 void ApplyModFlag64(
uint16 index,
uint64 flag,
bool apply);
151 void ClearUpdateMask(
bool remove);
165 void ForceValuesUpdateAtIndex(
uint32);
176 Item*
ToItem() {
if (IsItem())
return reinterpret_cast<Item*
>(
this);
else return nullptr; }
177 Item const*
ToItem()
const {
if (IsItem())
return reinterpret_cast<Item const*
>(
this);
else return nullptr; }
183 Player const*
ToPlayer()
const {
if (IsPlayer())
return reinterpret_cast<Player const*
>(
this);
else return nullptr; }
194 Unit*
ToUnit() {
if (IsUnit())
return reinterpret_cast<Unit*
>(
this);
else return nullptr; }
195 Unit const*
ToUnit()
const {
if (IsUnit())
return reinterpret_cast<Unit const*
>(
this);
else return nullptr; }
207 Corpse const*
ToCorpse()
const {
if (IsCorpse())
return reinterpret_cast<Corpse const*
>(
this);
else return nullptr; }
224 std::string _ConcatFields(
uint16 startIndex,
uint16 size)
const;
225 [[nodiscard]]
bool _LoadIntoDataField(std::string
const& data,
uint32 startOffset,
uint32 count);
252 void AddToObjectUpdateIfNeeded();
266 bool PrintIndexError(
uint32 index,
bool set)
const;
274template <
class T_VALUES,
class T_FLAGS,
class FLAG_TYPE,
size_t ARRAY_SIZE>
280 for (
uint32 i = 0; i < ARRAY_SIZE; ++i)
343 virtual void Update(
uint32 diff);
345 void AddToWorld()
override;
346 void RemoveFromWorld()
override;
348 void GetNearPoint2D(
WorldObject const* searcher,
float& x,
float& y,
float distance,
float absAngle)
const;
349 void GetNearPoint(
WorldObject const* searcher,
float& x,
float& y,
float& z,
float distance2d,
float absAngle)
const;
350 void GetClosePoint(
float& x,
float& y,
float& z,
float size,
float distance2d = 0,
float relAngle = 0)
const;
351 void MovePosition(
Position &pos,
float dist,
float angle);
352 Position GetNearPosition(
float dist,
float angle);
353 void MovePositionToFirstCollision(
Position &pos,
float dist,
float angle);
354 Position GetFirstCollisionPosition(
float dist,
float angle);
355 Position GetRandomNearPosition(
float radius);
359 void UpdateGroundPositionZ(
float x,
float y,
float &z)
const;
360 void UpdateAllowedPositionZ(
float x,
float y,
float &z,
float* groundZ =
nullptr)
const;
362 void GetRandomPoint(
Position const& srcPos,
float distance,
float& rand_x,
float& rand_y,
float& rand_z)
const;
367 virtual void SetPhaseMask(
uint32 newPhaseMask,
bool update);
376 bool IsInWorldPvpZone()
const;
382 std::string
const&
GetName()
const {
return m_name; }
383 void SetName(std::string newname) { m_name = std::move(newname); }
388 float GetDistance(
Position const& pos)
const;
389 float GetDistance(
float x,
float y,
float z)
const;
391 float GetDistance2d(
float x,
float y)
const;
394 bool IsSelfOrInSameMap(
WorldObject const* obj)
const;
396 bool IsWithinDist3d(
float x,
float y,
float z,
float dist)
const;
397 bool IsWithinDist3d(
Position const* pos,
float dist)
const;
398 bool IsWithinDist2d(
float x,
float y,
float dist)
const;
399 bool IsWithinDist2d(
Position const* pos,
float dist)
const;
401 bool IsWithinDist(
WorldObject const* obj,
float dist2compare,
bool is3D =
true)
const;
402 bool IsWithinDistInMap(
WorldObject const* obj,
float dist2compare,
bool is3D =
true,
bool incOwnRadius =
true,
bool incTargetRadius =
true)
const;
406 void GetHitSpherePointFor(
Position const& dest,
float& x,
float& y,
float& z)
const;
408 bool IsInRange(
WorldObject const* obj,
float minRange,
float maxRange,
bool is3D =
true)
const;
409 bool IsInRange2d(
float x,
float y,
float minRange,
float maxRange)
const;
410 bool IsInRange3d(
float x,
float y,
float z,
float minRange,
float maxRange)
const;
411 bool isInFront(
WorldObject const* target,
float arc =
float(
M_PI))
const;
412 bool isInBack(
WorldObject const* target,
float arc =
float(
M_PI))
const;
414 bool IsInBetween(
Position const& pos1,
Position const& pos2,
float size = 0)
const;
417 virtual void CleanupsBeforeDelete(
bool finalCleanup =
true);
419 virtual void SendMessageToSet(
WorldPacket const* data,
bool self)
const;
420 virtual void SendMessageToSetInRange(
WorldPacket const* data,
float dist,
bool self)
const;
421 virtual void SendMessageToSet(
WorldPacket const* data,
Player const* skipped_rcvr)
const;
425 void PlayDistanceSound(
uint32 soundId,
Player* target =
nullptr);
426 void PlayDirectSound(
uint32 soundId,
Player* target =
nullptr);
427 void PlayDirectMusic(
uint32 musicId,
Player* target =
nullptr);
431 void AddObjectToRemoveList();
433 float GetGridActivationRange()
const;
434 float GetVisibilityRange()
const;
435 float GetSightRange(
WorldObject const* target =
nullptr)
const;
436 bool CanSeeOrDetect(
WorldObject const* obj,
bool implicitDetect =
false,
bool distanceCheck =
false,
bool checkAlert =
false)
const;
447 virtual void SetMap(
Map* map);
448 virtual void ResetMap();
453 void SetZoneScript();
454 void ClearZoneScript();
462 void SummonCreatureGroup(
uint8 group, std::list<TempSummon*>* list =
nullptr);
464 Creature* FindNearestCreature(
uint32 entry,
float range,
bool alive =
true)
const;
466 GameObject* FindNearestGameObject(
uint32 entry,
float range,
bool spawnedOnly =
true)
const;
468 GameObject* FindNearestUnspawnedGameObject(
uint32 entry,
float range)
const;
470 Player* SelectNearestPlayer(
float distance)
const;
474 ObjectGuid GetCharmerOrOwnerOrOwnGUID()
const;
476 Unit* GetOwner()
const;
477 Unit* GetCharmerOrOwner()
const;
478 Unit* GetCharmerOrOwnerOrSelf()
const;
479 Player* GetCharmerOrOwnerPlayerOrPlayerItself()
const;
480 Player* GetAffectingPlayer()
const;
482 Player* GetSpellModOwner()
const;
486 float GetSpellMaxRangeForTarget(
Unit const* target,
SpellInfo const* spellInfo)
const;
487 float GetSpellMinRangeForTarget(
Unit const* target,
SpellInfo const* spellInfo)
const;
489 float ApplyEffectModifiers(
SpellInfo const* spellInfo,
uint8 effIndex,
float value)
const;
492 void ModSpellCastTime(
SpellInfo const* spellInfo,
int32& castTime,
Spell* spell =
nullptr)
const;
493 void ModSpellDurationTime(
SpellInfo const* spellInfo,
int32& durationTime,
Spell* spell =
nullptr)
const;
509 bool IsHostileToPlayers()
const;
510 bool IsFriendlyTo(
WorldObject const* target)
const;
511 bool IsNeutralToAll()
const;
521 template <
typename Container>
524 template <
typename Container>
527 template <
typename Container>
530 template <
typename Container>
533 template <
typename Container>
536 void DestroyForNearbyPlayers();
537 virtual void UpdateObjectVisibility(
bool forced =
true);
539 void UpdatePositionData();
542 bool AddToObjectUpdate()
override;
543 void RemoveFromObjectUpdate()
override;
552 void setActive(
bool isActiveObject);
554 void SetFarVisible(
bool on);
557 void SetIsStoredInWorldObjectGridContainer(
bool apply);
559 bool IsStoredInWorldObjectGridContainer()
const;
568 float GetTransOffsetO()
const {
return m_movementInfo.transport.pos.GetOrientation(); }
582 float GetFloorZ()
const;
585 float GetMapWaterOrGroundLevel(
float x,
float y,
float z,
float* ground =
nullptr)
const;
586 float GetMapHeight(
float x,
float y,
float z,
bool vmap =
true,
float distanceToSearch = 50.0f)
const;
597 bool CheckPrivateObjectOwnerVisibility(
WorldObject const* seer)
const;
623 virtual bool IsNeverVisible([[maybe_unused]]
bool allowServersideObjects)
const {
return !IsInWorld(); }
642 virtual bool _IsWithinDist(
WorldObject const* obj,
float dist2compare,
bool is3D,
bool incOwnRadius =
true,
bool incTargetRadius =
true)
const;
646 bool CanDetect(
WorldObject const* obj,
bool ignoreStealth,
bool checkAlert =
false)
const;
647 bool CanDetectInvisibilityOf(
WorldObject const* obj)
const;
648 bool CanDetectStealthOf(
WorldObject const* obj,
bool checkAlert =
false)
const;
std::chrono::seconds Seconds
Seconds shorthand typedef.
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
std::string GetDebugInfo()
@ TEMPSUMMON_MANUAL_DESPAWN
@ GO_SUMMON_TIMED_OR_CORPSE_DESPAWN
static constexpr Milliseconds const HEARTBEAT_INTERVAL
float const DEFAULT_COLLISION_HEIGHT
std::unordered_map< Player *, UpdateData > UpdateDataMapType
std::optional< T > Optional
Optional helper class to wrap optional values within.
void GetCreatureListWithEntryInGrid(Container &container, WorldObject *source, uint32 entry, float maxSearchRange)
void GetCreatureListWithOptionsInGrid(Container &container, WorldObject *source, float maxSearchRange, FindCreatureOptions const &options)
void GetPlayerListInGrid(Container &container, WorldObject *source, float maxSearchRange, bool alive=true)
void GetGameObjectListWithEntryInGrid(Container &container, WorldObject *source, uint32 entry, float maxSearchRange)
bool HasFlag(FLAG_TYPE flag) const
void AddFlag(FLAG_TYPE flag)
void DelFlag(FLAG_TYPE flag)
T_VALUES GetValue(FLAG_TYPE flag) const
T_VALUES m_values[ARRAY_SIZE]
void AddValue(FLAG_TYPE flag, T_VALUES value)
void SetValue(FLAG_TYPE flag, T_VALUES value)
static ObjectGuid const Empty
Trinity::unique_weak_ptr< Object > GetWeakPtr() const
virtual void RemoveDynamicFlag(uint32 flag)
Object(Object &&right)=delete
static Creature * ToCreature(Object *o)
static Player const * ToPlayer(Object const *o)
Player const * ToPlayer() const
static Item const * ToItem(Object const *o)
float GetObjectScale() const
void SetInt16Value(uint16 index, uint8 offset, int16 value)
Trinity::unique_trackable_ptr< Object > m_scriptRef
PackedGuid const & GetPackGUID() const
DynamicObject * ToDynObject()
static Unit * ToUnit(Object *o)
static GameObject * ToGameObject(Object *o)
static Corpse const * ToCorpse(Object const *o)
WorldObject const * ToWorldObject() const
bool HasDynamicFlag(uint32 flag) const
void RemoveFieldNotifyFlag(uint16 flag)
virtual bool hasQuest(uint32) const
WorldObject * ToWorldObject()
virtual bool AddToObjectUpdate()=0
bool isType(uint16 mask) const
Object & operator=(Object &&right)=delete
static WorldObject const * ToWorldObject(Object const *o)
Object & operator=(Object const &right)=delete
bool IsGameObject() const
Item const * ToItem() const
virtual void SetDynamicFlag(uint32 flag)
static WorldObject * ToWorldObject(Object *o)
GameObject * ToGameObject()
virtual void ReplaceAllDynamicFlags(uint32 flag)
GameObject const * ToGameObject() const
Corpse const * ToCorpse() const
Unit const * ToUnit() const
static DynamicObject const * ToDynObject(Object const *o)
virtual uint32 GetDynamicFlags() const
static GameObject const * ToGameObject(Object const *o)
static Item * ToItem(Object *o)
void SetIsNewObject(bool enable)
virtual void BuildUpdate(UpdateDataMapType &)
bool IsWorldObject() const
static Unit const * ToUnit(Object const *o)
static Creature const * ToCreature(Object const *o)
virtual void RemoveFromObjectUpdate()=0
static Corpse * ToCorpse(Object *o)
static ObjectGuid GetGUID(Object const *o)
Creature const * ToCreature() const
void SetEntry(uint32 entry)
virtual void SetObjectScale(float scale)
virtual bool hasInvolvedQuest(uint32) const
void SetFieldNotifyFlag(uint16 flag)
uint16 GetValuesCount() const
ObjectGuid GetGUID() const
Object(Object const &right)=delete
DynamicObject const * ToDynObject() const
static DynamicObject * ToDynObject(Object *o)
static Player * ToPlayer(Object *o)
WorldObject const * _refObj
ObjectDistanceOrderPred(WorldObject const *refObj, bool ascending=true)
bool operator()(WorldObject const *left, WorldObject const *right) const
Specialized variant of std::shared_ptr that enforces unique ownership and/or std::unique_ptr with std...
Trinity::unique_trackable_ptr companion class, replicating what std::weak_ptr is to std::shared_ptr.
int8 GetTransSeat() const
ZLiquidStatus m_liquidStatus
uint32 GetPhaseMask() const
ZLiquidStatus GetLiquidStatus() const
virtual float GetCollisionHeight() const
virtual float GetStationaryO() const
bool isNeedNotify(uint16 f) const
virtual uint8 GetLevelForTarget(WorldObject const *) const
void SetLocationInstanceId(uint32 _instanceId)
ObjectGuid GetPrivateObjectOwner() const
virtual bool IsInvisibleDueToDespawn() const
virtual bool IsAlwaysDetectableFor(WorldObject const *) const
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPES > m_invisibility
Position const & GetTransOffset() const
void SetTransport(Transport *t)
bool IsVisibilityOverridden() const
virtual ObjectGuid GetCharmerOrOwnerGUID() const
float GetTransOffsetX() const
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPES > m_invisibilityDetect
void SetLocationMapId(uint32 _mapId)
ZoneScript * GetZoneScript() const
virtual void UpdateObjectVisibilityOnCreate()
bool isActiveObject() const
bool GetDistanceOrder(WorldObject const *obj1, WorldObject const *obj2, bool is3D=true) const
bool IsPrivateObject() const
uint32 GetInstanceId() const
uint16 GetNotifyFlags() const
void SetPrivateObjectOwner(ObjectGuid const &owner)
ZoneScript * m_zoneScript
float GetTransOffsetY() const
bool InSamePhase(uint32 phasemask) const
std::string const & GetName() const
bool IsFarVisible() const
virtual float GetStationaryX() const
float GetTransOffsetZ() const
virtual bool IsAlwaysVisibleFor(WorldObject const *) const
virtual std::string const & GetNameForLocaleIdx(LocaleConstant) const
virtual bool IsNeverVisible(bool allowServersideObjects) const
bool InSamePhase(WorldObject const *obj) const
uint32 GetTransTime() const
bool const m_isStoredInWorldObjectGridContainer
Transport * GetTransport() const
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPES > m_stealthDetect
void SetName(std::string newname)
void AddToNotify(uint16 f)
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPES > m_stealth
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibilityDetect
virtual uint32 GetFaction() const =0
static bool InSamePhase(WorldObject const *a, WorldObject const *b)
Optional< float > m_visibilityDistanceOverride
ObjectGuid _privateObjectOwner
bool IsInBetween(WorldObject const *obj1, WorldObject const *obj2, float size=0) const
float GetTransOffsetO() const
virtual ObjectGuid GetOwnerGUID() const =0
Milliseconds _heartbeatTimer
MovementInfo m_movementInfo
bool IsAlwaysStoredInWorldObjectGridContainer() const
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibility
void GetZoneAndAreaId(uint32 &zoneid, uint32 &areaid) const
virtual float GetStationaryY() const
virtual void SetFaction(uint32)
virtual float GetCombatReach() const
virtual float GetStationaryZ() const
virtual bool CanAlwaysSee(WorldObject const *) const
Optional< std::string_view > StringId
Optional< ObjectGuid > CreatorGuid
Optional< bool > IsSummon
bool IgnoreNotOwnedPrivateObjects
bool IgnorePrivateObjects
Optional< uint32 > AuraSpellId
Optional< ObjectGuid > PrivateObjectOwnerGuid
Optional< uint32 > CreatureId
Optional< bool > IsInCombat
Optional< ObjectGuid > OwnerGuid
Optional< ObjectGuid > CharmerGuid
bool IgnoreNotOwnedPrivateObjects
Optional< ObjectGuid > OwnerGuid
Optional< std::string_view > StringId
Optional< GameobjectTypes > GameObjectType
Optional< uint32 > GameObjectId
Optional< ObjectGuid > PrivateObjectOwnerGuid
bool IgnorePrivateObjects
Optional< bool > IsSummon
Optional< bool > IsSpawned
void operator()(Object *) const
void GetPosition(float &x, float &y) const