2010-10-07 15:54:07 +02:00
/*
2020-01-02 06:44:10 +01:00
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
2010-10-07 15:54:07 +02:00
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
2008-10-02 16:23:55 -05:00
*/
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
#ifndef _OBJECT_H
#define _OBJECT_H
2009-10-17 15:51:44 -07:00
2025-12-27 11:43:04 +01:00
#include "BaseEntity.h"
2008-10-02 16:23:55 -05:00
#include "Common.h"
2017-11-30 20:45:44 +01:00
#include "Duration.h"
2021-04-11 12:50:13 +02:00
#include "Errors.h"
2018-02-10 16:43:01 -03:00
#include "EventProcessor.h"
2024-03-07 13:31:12 +01:00
#include "MapDefines.h"
2017-01-21 14:44:31 +01:00
#include "ModelIgnoreFlags.h"
2017-05-21 23:18:43 +02:00
#include "MovementInfo.h"
#include "ObjectDefines.h"
2019-01-16 20:48:01 +01:00
#include "Optional.h"
2018-01-28 11:37:20 +01:00
#include "PhaseShift.h"
2017-05-15 22:55:16 +02:00
#include "Position.h"
#include "SharedDefines.h"
2020-11-15 21:59:18 +01:00
#include "SpellDefines.h"
2024-03-13 18:51:29 +01:00
#include "UniqueTrackablePtr.h"
2017-05-15 22:55:16 +02:00
#include <list>
2009-10-17 15:51:44 -07:00
2017-05-14 12:49:48 +02:00
class AreaTrigger ;
class Conversation ;
2013-03-25 10:36:30 +01:00
class Corpse ;
2008-10-02 16:23:55 -05:00
class Creature ;
2013-03-25 10:36:30 +01:00
class CreatureAI ;
class DynamicObject ;
2008-10-17 18:13:04 -05:00
class GameObject ;
2013-03-25 10:36:30 +01:00
class InstanceScript ;
2024-03-14 11:37:32 +01:00
class Item ;
2017-05-14 12:49:48 +02:00
class Map ;
2019-06-03 20:40:34 +02:00
class Object ;
2013-03-25 10:36:30 +01:00
class Player ;
2016-11-06 23:30:49 +01:00
class Scenario ;
2019-06-23 16:01:51 +02:00
class SceneObject ;
2022-01-29 19:44:55 +01:00
class SmoothPhasing ;
2018-02-10 16:43:01 -03:00
class Spell ;
class SpellCastTargets ;
2021-09-04 15:13:15 +02:00
class SpellEffectInfo ;
2018-02-10 16:43:01 -03:00
class SpellInfo ;
2009-03-19 14:41:30 -06:00
class TempSummon ;
2022-05-25 22:14:32 +02:00
class TransportBase ;
2013-03-25 10:36:30 +01:00
class Unit ;
class UpdateData ;
class WorldObject ;
class WorldPacket ;
class ZoneScript ;
2018-02-10 16:43:01 -03:00
struct FactionTemplateEntry ;
2022-09-01 20:07:58 +02:00
struct Loot ;
2017-05-28 16:34:44 +02:00
struct QuaternionData ;
2025-01-04 18:08:09 +01:00
struct SpawnTrackingStateData ;
2023-07-31 00:11:05 +02:00
struct SpellPowerCost ;
2017-05-14 12:49:48 +02:00
2018-02-10 16:43:01 -03:00
namespace WorldPackets
{
namespace CombatLog
{
class CombatLogServerPacket ;
}
}
2017-12-29 22:32:07 +01:00
float const DEFAULT_COLLISION_HEIGHT = 2.03128f ; // Most common value in dbc
2024-04-26 01:14:48 +02:00
static constexpr Milliseconds const HEARTBEAT_INTERVAL = 5 s + 200 ms ;
2017-12-29 22:32:07 +01:00
2025-12-27 11:43:04 +01:00
class TC_GAME_API Object : public BaseEntity
2008-10-02 16:23:55 -05:00
{
public :
2012-05-30 08:01:02 +02:00
virtual ~ Object ();
2009-10-17 15:51:44 -07:00
2025-12-27 11:43:04 +01:00
void AddToWorld () override ;
void RemoveFromWorld () override ;
2009-10-17 15:51:44 -07:00
2019-06-03 20:40:34 +02:00
uint32 GetEntry () const { return m_objectData -> EntryID ; }
void SetEntry ( uint32 entry ) { SetUpdateFieldValue ( m_values . ModifyValue ( & Object :: m_objectData ). ModifyValue ( & UF :: ObjectData :: EntryID ), entry ); }
2009-10-17 15:51:44 -07:00
2019-06-03 20:40:34 +02:00
float GetObjectScale () const { return m_objectData -> Scale ; }
virtual void SetObjectScale ( float scale ) { SetUpdateFieldValue ( m_values . ModifyValue ( & Object :: m_objectData ). ModifyValue ( & UF :: ObjectData :: Scale ), scale ); }
uint32 GetDynamicFlags () const { return m_objectData -> DynamicFlags ; }
bool HasDynamicFlag ( uint32 flag ) const { return ( * m_objectData -> DynamicFlags & flag ) != 0 ; }
2022-03-27 18:14:47 +02:00
void SetDynamicFlag ( uint32 flag ) { SetUpdateFieldFlagValue ( m_values . ModifyValue ( & Object :: m_objectData ). ModifyValue ( & UF :: ObjectData :: DynamicFlags ), flag ); }
2019-06-03 20:40:34 +02:00
void RemoveDynamicFlag ( uint32 flag ) { RemoveUpdateFieldFlagValue ( m_values . ModifyValue ( & Object :: m_objectData ). ModifyValue ( & UF :: ObjectData :: DynamicFlags ), flag ); }
2022-03-26 18:59:44 +01:00
void ReplaceAllDynamicFlags ( uint32 flag ) { SetUpdateFieldValue ( m_values . ModifyValue ( & Object :: m_objectData ). ModifyValue ( & UF :: ObjectData :: DynamicFlags ), flag ); }
2012-05-30 08:01:02 +02:00
2019-06-03 20:40:34 +02:00
void BuildValuesUpdateBlockForPlayerWithFlag ( UpdateData * data , UF :: UpdateFieldFlag flags , Player const * target ) const ;
2009-10-17 15:51:44 -07:00
2025-12-27 11:43:04 +01:00
void ClearUpdateMask ( bool remove ) override ;
2020-04-18 10:59:35 +02:00
2008-10-02 16:23:55 -05:00
virtual bool hasQuest ( uint32 /* quest_id */ ) const { return false ; }
virtual bool hasInvolvedQuest ( uint32 /* quest_id */ ) const { return false ; }
2009-10-17 15:51:44 -07:00
2024-03-14 11:37:32 +01:00
static WorldObject * ToWorldObject ( Object * o ) { return o ? o -> ToWorldObject () : nullptr ; }
static WorldObject const * ToWorldObject ( Object const * o ) { return o ? o -> ToWorldObject () : nullptr ; }
2024-03-14 19:28:49 +01:00
WorldObject * ToWorldObject () { if ( IsWorldObject ()) return reinterpret_cast < WorldObject *> ( this ); else return nullptr ; }
WorldObject const * ToWorldObject () const { if ( IsWorldObject ()) return reinterpret_cast < WorldObject const *> ( this ); else return nullptr ; }
2024-03-14 11:37:32 +01:00
static Item * ToItem ( Object * o ) { return o ? o -> ToItem () : nullptr ; }
static Item const * ToItem ( Object const * o ) { return o ? o -> ToItem () : nullptr ; }
Item * ToItem () { if ( IsItem ()) return reinterpret_cast < Item *> ( this ); else return nullptr ; }
Item const * ToItem () const { if ( IsItem ()) return reinterpret_cast < Item const *> ( this ); else return nullptr ; }
2019-06-23 16:01:51 +02:00
static Player * ToPlayer ( Object * o ) { return o ? o -> ToPlayer () : nullptr ; }
static Player const * ToPlayer ( Object const * o ) { return o ? o -> ToPlayer () : nullptr ; }
2017-07-29 21:40:28 +02:00
Player * ToPlayer () { if ( IsPlayer ()) return reinterpret_cast < Player *> ( this ); else return nullptr ; }
Player const * ToPlayer () const { if ( IsPlayer ()) return reinterpret_cast < Player const *> ( this ); else return nullptr ; }
2012-08-07 13:27:33 +02:00
2019-06-23 16:01:51 +02:00
static Creature * ToCreature ( Object * o ) { return o ? o -> ToCreature () : nullptr ; }
static Creature const * ToCreature ( Object const * o ) { return o ? o -> ToCreature () : nullptr ; }
2017-07-29 21:40:28 +02:00
Creature * ToCreature () { if ( IsCreature ()) return reinterpret_cast < Creature *> ( this ); else return nullptr ; }
Creature const * ToCreature () const { if ( IsCreature ()) return reinterpret_cast < Creature const *> ( this ); else return nullptr ; }
2012-08-07 13:27:33 +02:00
2019-06-23 16:01:51 +02:00
static Unit * ToUnit ( Object * o ) { return o ? o -> ToUnit () : nullptr ; }
static Unit const * ToUnit ( Object const * o ) { return o ? o -> ToUnit () : nullptr ; }
2017-07-29 21:40:28 +02:00
Unit * ToUnit () { if ( IsUnit ()) return reinterpret_cast < Unit *> ( this ); else return nullptr ; }
Unit const * ToUnit () const { if ( IsUnit ()) return reinterpret_cast < Unit const *> ( this ); else return nullptr ; }
2010-03-07 15:20:19 +01:00
2019-06-23 16:01:51 +02:00
static GameObject * ToGameObject ( Object * o ) { return o ? o -> ToGameObject () : nullptr ; }
static GameObject const * ToGameObject ( Object const * o ) { return o ? o -> ToGameObject () : nullptr ; }
2017-07-29 21:40:28 +02:00
GameObject * ToGameObject () { if ( IsGameObject ()) return reinterpret_cast < GameObject *> ( this ); else return nullptr ; }
GameObject const * ToGameObject () const { if ( IsGameObject ()) return reinterpret_cast < GameObject const *> ( this ); else return nullptr ; }
2011-08-26 12:05:47 +02:00
2019-06-23 16:01:51 +02:00
static Corpse * ToCorpse ( Object * o ) { return o ? o -> ToCorpse () : nullptr ; }
static Corpse const * ToCorpse ( Object const * o ) { return o ? o -> ToCorpse () : nullptr ; }
2017-07-29 21:40:28 +02:00
Corpse * ToCorpse () { if ( IsCorpse ()) return reinterpret_cast < Corpse *> ( this ); else return nullptr ; }
Corpse const * ToCorpse () const { if ( IsCorpse ()) return reinterpret_cast < Corpse const *> ( this ); else return nullptr ; }
2009-10-17 15:51:44 -07:00
2019-06-23 16:01:51 +02:00
static DynamicObject * ToDynObject ( Object * o ) { return o ? o -> ToDynObject () : nullptr ; }
static DynamicObject const * ToDynObject ( Object const * o ) { return o ? o -> ToDynObject () : nullptr ; }
2017-07-29 21:40:28 +02:00
DynamicObject * ToDynObject () { if ( IsDynObject ()) return reinterpret_cast < DynamicObject *> ( this ); else return nullptr ; }
DynamicObject const * ToDynObject () const { if ( IsDynObject ()) return reinterpret_cast < DynamicObject const *> ( this ); else return nullptr ; }
2012-08-07 13:27:33 +02:00
2019-06-23 16:01:51 +02:00
static AreaTrigger * ToAreaTrigger ( Object * o ) { return o ? o -> ToAreaTrigger () : nullptr ; }
static AreaTrigger const * ToAreaTrigger ( Object const * o ) { return o ? o -> ToAreaTrigger () : nullptr ; }
2017-07-29 21:40:28 +02:00
AreaTrigger * ToAreaTrigger () { if ( IsAreaTrigger ()) return reinterpret_cast < AreaTrigger *> ( this ); else return nullptr ; }
AreaTrigger const * ToAreaTrigger () const { if ( IsAreaTrigger ()) return reinterpret_cast < AreaTrigger const *> ( this ); else return nullptr ; }
2013-05-26 04:56:43 +03:00
2019-06-23 16:01:51 +02:00
static SceneObject * ToSceneObject ( Object * o ) { return o ? o -> ToSceneObject () : nullptr ; }
static SceneObject const * ToSceneObject ( Object const * o ) { return o ? o -> ToSceneObject () : nullptr ; }
SceneObject * ToSceneObject () { if ( IsSceneObject ()) return reinterpret_cast < SceneObject *> ( this ); else return nullptr ; }
SceneObject const * ToSceneObject () const { if ( IsSceneObject ()) return reinterpret_cast < SceneObject const *> ( this ); else return nullptr ; }
static Conversation * ToConversation ( Object * o ) { return o ? o -> ToConversation () : nullptr ; }
static Conversation const * ToConversation ( Object const * o ) { return o ? o -> ToConversation () : nullptr ; }
Conversation * ToConversation () { if ( IsConversation ()) return reinterpret_cast < Conversation *> ( this ); else return nullptr ; }
Conversation const * ToConversation () const { if ( IsConversation ()) return reinterpret_cast < Conversation const *> ( this ); else return nullptr ; }
2017-05-14 11:40:55 +02:00
2024-10-30 14:41:27 +01:00
UF :: UpdateField < UF :: ObjectData , int32 ( WowCS :: EntityFragment :: CGObject ), TYPEID_OBJECT > m_objectData ;
2019-06-03 20:40:34 +02:00
2025-12-27 11:43:04 +01:00
std :: string GetDebugInfo () const override ;
2018-12-14 22:01:16 +01:00
2024-03-13 18:51:29 +01:00
Trinity :: unique_weak_ptr < Object > GetWeakPtr () const { return m_scriptRef ; }
2022-09-01 20:07:58 +02:00
virtual Loot * GetLootForPlayer ( [[maybe_unused]] Player const * player ) const { return nullptr ; }
2025-01-04 18:08:09 +01:00
virtual SpawnTrackingStateData const * GetSpawnTrackingStateDataForPlayer ( [[maybe_unused]] Player const * player ) const { return nullptr ; }
2012-08-07 13:27:33 +02:00
protected :
2012-05-30 08:01:02 +02:00
Object ();
2009-10-17 15:51:44 -07:00
2025-12-27 11:43:04 +01:00
void BuildValuesCreate ( ByteBuffer * data , UF :: UpdateFieldFlag flags , Player const * target ) const override = 0 ;
void BuildValuesUpdate ( ByteBuffer * data , UF :: UpdateFieldFlag flags , Player const * target ) const override = 0 ;
2025-03-02 15:43:34 +01:00
void BuildEntityFragmentsForValuesUpdateForPlayerWithMask ( ByteBuffer * data , EnumFlag < UF :: UpdateFieldFlag > flags ) const ;
2020-04-23 20:22:53 +02:00
public :
2019-06-03 20:40:34 +02:00
virtual void BuildValuesUpdateWithFlag ( ByteBuffer * data , UF :: UpdateFieldFlag flags , Player const * target ) const ;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
private :
2009-10-17 15:51:44 -07:00
2024-03-13 18:51:29 +01:00
struct NoopObjectDeleter { void operator ()( Object * ) const { /*noop - not managed*/ } };
Trinity :: unique_trackable_ptr < Object > m_scriptRef ;
2008-10-02 16:23:55 -05:00
};
2009-10-17 15:51:44 -07:00
2021-03-14 21:23:07 +02:00
template < class T_VALUES , class T_FLAGS , class FLAG_TYPE , size_t ARRAY_SIZE >
2010-11-13 17:18:09 +01:00
class FlaggedValuesArray32
{
public :
2022-10-07 17:08:20 +03:00
static_assert ( sizeof ( T_FLAGS ) * 8 > ARRAY_SIZE , "Fix T_FLAGS" );
2010-11-13 17:18:09 +01:00
FlaggedValuesArray32 ()
{
2017-05-19 00:41:18 +02:00
for ( uint32 i = 0 ; i < ARRAY_SIZE ; ++ i )
m_values [ i ] = T_VALUES ( 0 );
2022-10-07 17:08:20 +03:00
m_flags = T_FLAGS ( 0 );
2010-11-13 17:18:09 +01:00
}
2019-07-08 12:51:42 +02:00
T_FLAGS GetFlags () const { return m_flags ; }
2022-10-07 17:08:20 +03:00
bool HasFlag ( FLAG_TYPE flag ) const { return m_flags & ( T_FLAGS ( 1 ) << flag ); }
void AddFlag ( FLAG_TYPE flag ) { m_flags |= ( T_FLAGS ( 1 ) << flag ); }
void DelFlag ( FLAG_TYPE flag ) { m_flags &= ~ ( T_FLAGS ( 1 ) << flag ); }
2010-11-13 17:18:09 +01:00
T_VALUES GetValue ( FLAG_TYPE flag ) const { return m_values [ flag ]; }
2019-07-08 12:51:42 +02:00
void SetValue ( FLAG_TYPE flag , T_VALUES value ) { m_values [ flag ] = value ; }
void AddValue ( FLAG_TYPE flag , T_VALUES value ) { m_values [ flag ] += value ; }
2010-11-13 17:18:09 +01:00
private :
T_VALUES m_values [ ARRAY_SIZE ];
T_FLAGS m_flags ;
};
2024-12-22 12:59:57 +01:00
enum class FindCreatureAliveState : uint8
{
Alive = 0 , // includes feign death
Dead = 1 , // excludes feign death
EffectivelyAlive = 2 , // excludes feign death
EffectivelyDead = 3 , // includes feign death
Max
};
2023-07-29 23:46:31 +02:00
struct FindCreatureOptions
2022-12-26 20:13:13 +01:00
{
Optional < uint32 > CreatureId ;
2022-12-27 16:39:05 +01:00
Optional < std :: string_view > StringId ;
2022-12-26 20:13:13 +01:00
2024-12-22 12:59:57 +01:00
Optional < FindCreatureAliveState > IsAlive ;
2022-12-26 20:13:13 +01:00
Optional < bool > IsInCombat ;
Optional < bool > IsSummon ;
2023-05-22 10:40:57 +02:00
bool IgnorePhases = false ;
bool IgnoreNotOwnedPrivateObjects = true ;
bool IgnorePrivateObjects = false ;
2022-12-26 20:13:13 +01:00
Optional < uint32 > AuraSpellId ;
Optional < ObjectGuid > OwnerGuid ;
Optional < ObjectGuid > CharmerGuid ;
Optional < ObjectGuid > CreatorGuid ;
Optional < ObjectGuid > DemonCreatorGuid ;
Optional < ObjectGuid > PrivateObjectOwnerGuid ;
};
2023-07-30 13:55:34 +02:00
struct FindGameObjectOptions
{
Optional < uint32 > GameObjectId ;
Optional < std :: string_view > StringId ;
Optional < bool > IsSummon ;
2023-07-30 19:49:12 +02:00
Optional < bool > IsSpawned = true ; // most searches should be for spawned objects only, to search for "any" just clear this field at call site
2023-07-30 13:55:34 +02:00
bool IgnorePhases = false ;
bool IgnoreNotOwnedPrivateObjects = true ;
bool IgnorePrivateObjects = false ;
Optional < ObjectGuid > OwnerGuid ;
Optional < ObjectGuid > PrivateObjectOwnerGuid ;
2023-10-08 19:59:21 +02:00
Optional < GameobjectTypes > GameObjectType ;
2023-07-30 13:55:34 +02:00
};
2025-05-11 21:10:21 +02:00
struct CanSeeOrDetectExtraArgs
{
bool ImplicitDetection = false ;
bool IgnorePhaseShift = false ;
bool IncludeHiddenBySpawnTracking = false ;
bool IncludeAnyPrivateObject = false ;
bool DistanceCheck = false ;
bool AlertCheck = false ;
};
2016-03-11 16:37:14 +01:00
class TC_GAME_API WorldObject : public Object , public WorldLocation
2009-08-29 14:58:45 -05:00
{
2010-08-08 20:32:14 +02:00
protected :
2011-12-20 17:05:08 -05:00
explicit WorldObject ( bool isWorldObject ); //note: here it means if it is in grid object list or world object list
2009-08-29 14:58:45 -05:00
public :
virtual ~ WorldObject ();
2009-10-17 15:51:44 -07:00
2023-02-05 16:24:13 +01:00
virtual void Update ( uint32 diff );
2009-10-17 15:51:44 -07:00
2017-06-08 00:25:06 +02:00
void AddToWorld () override ;
void RemoveFromWorld () override ;
2010-11-16 21:17:49 +01:00
2019-07-08 12:51:42 +02:00
void GetNearPoint2D ( WorldObject const * searcher , float & x , float & y , float distance , float absAngle ) const ;
void GetNearPoint ( WorldObject const * searcher , float & x , float & y , float & z , float distance2d , float absAngle ) const ;
void GetClosePoint ( float & x , float & y , float & z , float size , float distance2d = 0 , float relAngle = 0 ) const ;
2024-09-21 05:33:30 +02:00
void MovePosition ( Position & pos , float dist , float angle , float maxHeightChange = 6.0f ) const ;
2014-04-25 21:19:30 +02:00
Position GetNearPosition ( float dist , float angle );
2024-06-10 00:13:57 +02:00
void MovePositionToFirstCollision ( Position & pos , float dist , float angle ) const ;
2014-04-25 21:19:30 +02:00
Position GetFirstCollisionPosition ( float dist , float angle );
Position GetRandomNearPosition ( float radius );
2019-07-08 12:51:42 +02:00
void GetContactPoint ( WorldObject const * obj , float & x , float & y , float & z , float distance2d = CONTACT_DISTANCE ) const ;
2009-10-17 15:51:44 -07:00
2017-03-23 00:43:04 +01:00
virtual float GetCombatReach () const { return 0.0f ; } // overridden (only) in Unit
2008-10-02 16:23:55 -05:00
void UpdateGroundPositionZ ( float x , float y , float & z ) const ;
2019-04-07 20:15:40 +02:00
void UpdateAllowedPositionZ ( float x , float y , float & z , float * groundZ = nullptr ) const ;
2009-10-17 15:51:44 -07:00
2020-09-04 13:38:24 +02:00
void GetRandomPoint ( Position const & srcPos , float distance , float & rand_x , float & rand_y , float & rand_z ) const ;
Position GetRandomPoint ( Position const & srcPos , float distance ) const ;
2009-10-17 15:51:44 -07:00
2009-08-25 11:42:18 -05:00
uint32 GetInstanceId () const { return m_InstanceId ; }
2009-10-17 15:51:44 -07:00
2022-12-25 00:44:12 +01:00
PhaseShift & GetPhaseShift () { return _phaseShift ; }
PhaseShift const & GetPhaseShift () const { return _phaseShift ; }
PhaseShift & GetSuppressedPhaseShift () { return _suppressedPhaseShift ; }
PhaseShift const & GetSuppressedPhaseShift () const { return _suppressedPhaseShift ; }
bool InSamePhase ( PhaseShift const & phaseShift ) const
{
return GetPhaseShift (). CanSee ( phaseShift );
}
bool InSamePhase ( WorldObject const * obj ) const
2018-01-28 11:37:20 +01:00
{
return GetPhaseShift (). CanSee ( obj -> GetPhaseShift ());
}
2018-01-03 20:04:19 +01:00
static bool InSamePhase ( WorldObject const * a , WorldObject const * b )
{
2022-12-25 00:44:12 +01:00
return a && b && a -> InSamePhase ( b );
2018-01-03 20:04:19 +01:00
}
2018-01-28 11:37:20 +01:00
2015-07-22 23:24:56 +01:00
int32 GetDBPhase () const { return _dbPhase ; }
2015-03-16 07:28:49 +01:00
// if negative it is used as PhaseGroupId
void SetDBPhase ( int32 p ) { _dbPhase = p ; }
2009-10-17 15:51:44 -07:00
2017-06-08 00:25:06 +02:00
uint32 GetZoneId () const { return m_zoneId ; }
uint32 GetAreaId () const { return m_areaId ; }
void GetZoneAndAreaId ( uint32 & zoneid , uint32 & areaid ) const { zoneid = m_zoneId , areaid = m_areaId ; }
2022-01-06 23:51:30 +01:00
bool IsInWorldPvpZone () const ;
2018-02-26 17:40:40 +01:00
bool IsOutdoors () const { return m_outdoors ; }
2020-04-07 23:28:44 +02:00
ZLiquidStatus GetLiquidStatus () const { return m_liquidStatus ; }
2024-03-07 13:31:12 +01:00
WmoLocation const * GetCurrentWmo () const { return m_currentWmo ? &* m_currentWmo : nullptr ; }
2009-10-17 15:51:44 -07:00
2017-09-15 03:53:02 +02:00
InstanceScript * GetInstanceScript () const ;
2009-10-17 15:51:44 -07:00
2012-10-24 13:29:34 +02:00
std :: string const & GetName () const { return m_name ; }
2020-04-18 10:59:35 +02:00
void SetName ( std :: string newname ) { m_name = std :: move ( newname ); }
2009-10-17 15:51:44 -07:00
2020-04-18 10:59:35 +02:00
std :: string GetNameForLocaleIdx ( LocaleConstant /*locale*/ ) const override { return m_name ; }
2009-10-17 15:51:44 -07:00
2013-03-25 10:36:30 +01:00
float GetDistance ( WorldObject const * obj ) const ;
2020-09-04 13:38:24 +02:00
float GetDistance ( Position const & pos ) const ;
2013-03-04 11:45:57 +01:00
float GetDistance ( float x , float y , float z ) const ;
2013-03-25 10:36:30 +01:00
float GetDistance2d ( WorldObject const * obj ) const ;
2013-03-04 11:45:57 +01:00
float GetDistance2d ( float x , float y ) const ;
2013-03-25 10:36:30 +01:00
float GetDistanceZ ( WorldObject const * obj ) const ;
2009-10-17 15:51:44 -07:00
2013-03-25 10:36:30 +01:00
bool IsSelfOrInSameMap ( WorldObject const * obj ) const ;
bool IsInMap ( WorldObject const * obj ) const ;
2013-03-04 11:45:57 +01:00
bool IsWithinDist3d ( float x , float y , float z , float dist ) const ;
2013-03-25 10:36:30 +01:00
bool IsWithinDist3d ( Position const * pos , float dist ) const ;
2013-03-04 11:45:57 +01:00
bool IsWithinDist2d ( float x , float y , float dist ) const ;
2013-03-25 10:36:30 +01:00
bool IsWithinDist2d ( Position const * pos , float dist ) const ;
2010-02-06 00:28:19 +01:00
// use only if you will sure about placing both object at same map
2022-12-30 21:50:16 +01:00
bool IsWithinDist ( WorldObject const * obj , float dist2compare , bool is3D = true , bool incOwnRadius = true , bool incTargetRadius = true ) const ;
2017-03-23 00:43:04 +01:00
bool IsWithinDistInMap ( WorldObject const * obj , float dist2compare , bool is3D = true , bool incOwnRadius = true , bool incTargetRadius = true ) const ;
2017-06-10 15:08:35 +02:00
bool IsWithinLOS ( float x , float y , float z , LineOfSightChecks checks = LINEOFSIGHT_ALL_CHECKS , VMAP :: ModelIgnoreFlags ignoreFlags = VMAP :: ModelIgnoreFlags :: Nothing ) const ;
bool IsWithinLOSInMap ( WorldObject const * obj , LineOfSightChecks checks = LINEOFSIGHT_ALL_CHECKS , VMAP :: ModelIgnoreFlags ignoreFlags = VMAP :: ModelIgnoreFlags :: Nothing ) const ;
2015-11-03 11:20:30 +01:00
Position GetHitSpherePointFor ( Position const & dest ) const ;
void GetHitSpherePointFor ( Position const & dest , float & x , float & y , float & z ) const ;
2009-05-14 16:50:47 -05:00
bool GetDistanceOrder ( WorldObject const * obj1 , WorldObject const * obj2 , bool is3D = true ) const ;
bool IsInRange ( WorldObject const * obj , float minRange , float maxRange , bool is3D = true ) const ;
bool IsInRange2d ( float x , float y , float minRange , float maxRange ) const ;
bool IsInRange3d ( float x , float y , float z , float minRange , float maxRange ) const ;
2014-08-21 16:56:11 +02:00
bool isInFront ( WorldObject const * target , float arc = float ( M_PI )) const ;
bool isInBack ( WorldObject const * target , float arc = float ( M_PI )) const ;
2009-10-17 15:51:44 -07:00
2016-09-10 14:14:34 +02:00
bool IsInBetween ( Position const & pos1 , Position const & pos2 , float size = 0 ) const ;
bool IsInBetween ( WorldObject const * obj1 , WorldObject const * obj2 , float size = 0 ) const { return obj1 && obj2 && IsInBetween ( obj1 -> GetPosition (), obj2 -> GetPosition (), size ); }
2009-10-17 15:51:44 -07:00
2010-01-22 20:03:47 +01:00
virtual void CleanupsBeforeDelete ( bool finalCleanup = true ); // used in destructor or explicitly before mass creature delete to remove cross-references to already deleted units
2009-10-17 15:51:44 -07:00
2017-07-26 00:53:25 +02:00
virtual void SendMessageToSet ( WorldPacket const * data , bool self ) const ;
virtual void SendMessageToSetInRange ( WorldPacket const * data , float dist , bool self ) const ;
virtual void SendMessageToSet ( WorldPacket const * data , Player const * skipped_rcvr ) const ;
2009-10-17 15:51:44 -07:00
2018-02-10 16:43:01 -03:00
void SendCombatLogMessage ( WorldPackets :: CombatLog :: CombatLogServerPacket * combatLog ) const ;
2017-07-29 21:40:28 +02:00
virtual uint8 GetLevelForTarget ( WorldObject const * /*target*/ ) const { return 1 ; }
2010-11-13 17:18:09 +01:00
2024-03-02 00:07:47 +01:00
void PlayDistanceSound ( uint32 soundId , Player const * target = nullptr ) const ;
void StopDistanceSound ( Player const * target = nullptr ) const ;
void PlayDirectSound ( uint32 soundId , Player const * target = nullptr , uint32 broadcastTextId = 0 ) const ;
void PlayDirectMusic ( uint32 musicId , Player const * target = nullptr ) const ;
void PlayObjectSound ( int32 soundKitId , ObjectGuid targetObject , Player const * target = nullptr , int32 broadcastTextId = 0 ) const ;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void AddObjectToRemoveList ();
2009-10-17 15:51:44 -07:00
2010-11-13 17:18:09 +01:00
float GetGridActivationRange () const ;
float GetVisibilityRange () const ;
2020-08-14 17:06:03 +02:00
float GetSightRange ( WorldObject const * target = nullptr ) const ;
2025-05-11 21:10:21 +02:00
bool CanSeeOrDetect ( WorldObject const * obj , CanSeeOrDetectExtraArgs const & args = { }) const ;
2010-11-13 17:18:09 +01:00
FlaggedValuesArray32 < int32 , uint32 , StealthType , TOTAL_STEALTH_TYPES > m_stealth ;
FlaggedValuesArray32 < int32 , uint32 , StealthType , TOTAL_STEALTH_TYPES > m_stealthDetect ;
2022-10-07 17:08:20 +03:00
FlaggedValuesArray32 < int32 , uint64 , InvisibilityType , TOTAL_INVISIBILITY_TYPES > m_invisibility ;
FlaggedValuesArray32 < int32 , uint64 , InvisibilityType , TOTAL_INVISIBILITY_TYPES > m_invisibilityDetect ;
2009-10-17 15:51:44 -07:00
2010-11-13 17:18:09 +01:00
FlaggedValuesArray32 < int32 , uint32 , ServerSideVisibilityType , TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibility ;
FlaggedValuesArray32 < int32 , uint32 , ServerSideVisibilityType , TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibilityDetect ;
2009-10-17 15:51:44 -07:00
2011-09-15 14:08:17 +02:00
virtual void SetMap ( Map * map );
2009-08-10 23:47:47 -05:00
virtual void ResetMap ();
2011-09-15 14:08:17 +02:00
Map * GetMap () const { ASSERT ( m_currMap ); return m_currMap ; }
Map * FindMap () const { return m_currMap ; }
2009-07-16 11:49:00 +08:00
//used to check all object's GetMap() calls when object is not in world!
2009-10-17 15:51:44 -07:00
2009-05-30 22:15:05 -05:00
void SetZoneScript ();
2022-04-24 00:16:13 +02:00
ZoneScript * FindZoneScript () const ;
2011-09-15 14:08:17 +02:00
ZoneScript * GetZoneScript () const { return m_zoneScript ; }
2009-10-17 15:51:44 -07:00
2016-11-06 23:30:49 +01:00
Scenario * GetScenario () const ;
2020-07-26 20:44:07 +02:00
TempSummon * SummonCreature ( uint32 entry , Position const & pos , TempSummonType despawnType = TEMPSUMMON_MANUAL_DESPAWN , Milliseconds despawnTime = 0 s , uint32 vehId = 0 , uint32 spellId = 0 , ObjectGuid privateObjectOwner = ObjectGuid :: Empty );
2020-07-26 20:44:07 +02:00
TempSummon * SummonCreature ( uint32 entry , float x , float y , float z , float o = 0 , TempSummonType despawnType = TEMPSUMMON_MANUAL_DESPAWN , Milliseconds despawnTime = 0 s , ObjectGuid privateObjectOwner = ObjectGuid :: Empty );
2022-02-08 00:03:02 +01:00
TempSummon * SummonPersonalClone ( Position const & pos , TempSummonType despawnType = TEMPSUMMON_MANUAL_DESPAWN , Milliseconds despawnTime = 0 s , uint32 vehId = 0 , uint32 spellId = 0 , Player * privateObjectOwner = nullptr );
2020-07-27 00:25:18 +02:00
GameObject * SummonGameObject ( uint32 entry , Position const & pos , QuaternionData const & rot , Seconds respawnTime , GOSummonType summonType = GO_SUMMON_TIMED_OR_CORPSE_DESPAWN );
GameObject * SummonGameObject ( uint32 entry , float x , float y , float z , float ang , QuaternionData const & rot , Seconds respawnTime , GOSummonType summonType = GO_SUMMON_TIMED_OR_CORPSE_DESPAWN );
2020-07-27 00:41:52 +02:00
Creature * SummonTrigger ( float x , float y , float z , float ang , Milliseconds despawnTime , CreatureAI * ( * GetAI )( Creature * ) = nullptr );
2020-08-14 17:06:03 +02:00
void SummonCreatureGroup ( uint8 group , std :: list < TempSummon *>* list = nullptr );
2009-10-17 15:51:44 -07:00
2011-08-30 13:46:36 +02:00
Creature * FindNearestCreature ( uint32 entry , float range , bool alive = true ) const ;
2022-12-26 20:13:13 +01:00
Creature * FindNearestCreatureWithOptions ( float range , FindCreatureOptions const & options ) const ;
2020-09-04 22:01:25 +02:00
GameObject * FindNearestGameObject ( uint32 entry , float range , bool spawnedOnly = true ) const ;
2023-07-30 13:55:34 +02:00
GameObject * FindNearestGameObjectWithOptions ( float range , FindGameObjectOptions const & options ) const ;
2020-04-26 21:32:24 +02:00
GameObject * FindNearestUnspawnedGameObject ( uint32 entry , float range ) const ;
2012-09-08 23:15:29 +01:00
GameObject * FindNearestGameObjectOfType ( GameobjectTypes type , float range ) const ;
2023-11-13 19:01:11 +01:00
Player * SelectNearestPlayer ( float range ) const ;
2009-10-17 15:51:44 -07:00
2023-10-24 10:38:27 +02:00
virtual ObjectGuid GetCreatorGUID () const = 0 ;
2018-02-10 16:43:01 -03:00
virtual ObjectGuid GetOwnerGUID () const = 0 ;
virtual ObjectGuid GetCharmerOrOwnerGUID () const { return GetOwnerGUID (); }
ObjectGuid GetCharmerOrOwnerOrOwnGUID () const ;
Unit * GetOwner () const ;
Unit * GetCharmerOrOwner () const ;
Unit * GetCharmerOrOwnerOrSelf () const ;
Player * GetCharmerOrOwnerPlayerOrPlayerItself () const ;
Player * GetAffectingPlayer () const ;
Player * GetSpellModOwner () const ;
2021-09-04 15:13:15 +02:00
int32 CalculateSpellDamage ( Unit const * target , SpellEffectInfo const & spellEffectInfo , int32 const * basePoints = nullptr , float * variance = nullptr , uint32 castItemId = 0 , int32 itemLevel = - 1 ) const ;
2018-02-10 16:43:01 -03:00
// target dependent range checks
float GetSpellMaxRangeForTarget ( Unit const * target , SpellInfo const * spellInfo ) const ;
float GetSpellMinRangeForTarget ( Unit const * target , SpellInfo const * spellInfo ) const ;
2022-12-14 00:24:24 +01:00
double ApplyEffectModifiers ( SpellInfo const * spellInfo , uint8 effIndex , double value ) const ;
2023-07-31 00:11:05 +02:00
int32 CalcSpellDuration ( SpellInfo const * spellInfo , std :: vector < SpellPowerCost > const * powerCosts ) const ;
2018-02-10 16:43:01 -03:00
int32 ModSpellDuration ( SpellInfo const * spellInfo , WorldObject const * target , int32 duration , bool positive , uint32 effectMask ) const ;
void ModSpellCastTime ( SpellInfo const * spellInfo , int32 & castTime , Spell * spell = nullptr ) const ;
void ModSpellDurationTime ( SpellInfo const * spellInfo , int32 & durationTime , Spell * spell = nullptr ) const ;
virtual float MeleeSpellMissChance ( Unit const * victim , WeaponAttackType attType , SpellInfo const * spellInfo ) const ;
virtual SpellMissInfo MeleeSpellHitResult ( Unit * victim , SpellInfo const * spellInfo ) const ;
SpellMissInfo MagicSpellHitResult ( Unit * victim , SpellInfo const * spellInfo ) const ;
2025-12-25 16:48:32 +01:00
SpellMissInfo SpellHitResult ( Unit * victim , SpellInfo const * spellInfo , bool canReflect , bool canImmune ) const ;
2018-03-10 19:51:36 -03:00
void SendSpellMiss ( Unit * target , uint32 spellID , SpellMissInfo missInfo );
2018-02-10 16:43:01 -03:00
virtual uint32 GetFaction () const = 0 ;
virtual void SetFaction ( uint32 /*faction*/ ) { }
FactionTemplateEntry const * GetFactionTemplateEntry () const ;
ReputationRank GetReactionTo ( WorldObject const * target ) const ;
static ReputationRank GetFactionReactionTo ( FactionTemplateEntry const * factionTemplateEntry , WorldObject const * target );
bool IsHostileTo ( WorldObject const * target ) const ;
bool IsHostileToPlayers () const ;
bool IsFriendlyTo ( WorldObject const * target ) const ;
bool IsNeutralToAll () const ;
// CastSpell's third arg can be a variety of things - check out CastSpellExtraArgs' constructors!
2019-05-10 19:58:26 +03:00
SpellCastResult CastSpell ( CastSpellTargetArg const & targets , uint32 spellId , CastSpellExtraArgs const & args = { });
2018-02-10 16:43:01 -03:00
2024-06-15 00:48:07 +02:00
void SendPlayOrphanSpellVisual ( Position const & sourceLocation , ObjectGuid const & target , uint32 spellVisualId , float travelSpeed , bool speedAsTime = false , bool withSourceOrientation = false );
void SendPlayOrphanSpellVisual ( Position const & sourceLocation , Position const & targetLocation , uint32 spellVisualId , float travelSpeed , bool speedAsTime = false , bool withSourceOrientation = false );
2021-12-12 19:34:00 +01:00
void SendPlayOrphanSpellVisual ( ObjectGuid const & target , uint32 spellVisualId , float travelSpeed , bool speedAsTime = false , bool withSourceOrientation = false );
void SendPlayOrphanSpellVisual ( Position const & targetLocation , uint32 spellVisualId , float travelSpeed , bool speedAsTime = false , bool withSourceOrientation = false );
void SendCancelOrphanSpellVisual ( uint32 id );
2018-03-10 19:40:05 -03:00
bool IsValidAttackTarget ( WorldObject const * target , SpellInfo const * bySpell = nullptr ) const ;
bool IsValidAssistTarget ( WorldObject const * target , SpellInfo const * bySpell = nullptr ) const ;
2018-02-10 16:43:01 -03:00
Unit * GetMagicHitRedirectTarget ( Unit * victim , SpellInfo const * spellInfo );
virtual uint32 GetCastSpellXSpellVisualId ( SpellInfo const * spellInfo ) const ;
2016-10-13 01:23:02 -03:00
template < typename Container >
void GetGameObjectListWithEntryInGrid ( Container & gameObjectContainer , uint32 entry , float maxSearchRange = 250.0f ) const ;
2023-07-30 13:55:34 +02:00
template < typename Container >
void GetGameObjectListWithOptionsInGrid ( Container & gameObjectContainer , float maxSearchRange , FindGameObjectOptions const & options ) const ;
2016-10-13 01:23:02 -03:00
template < typename Container >
void GetCreatureListWithEntryInGrid ( Container & creatureContainer , uint32 entry , float maxSearchRange = 250.0f ) const ;
2022-12-27 16:39:05 +01:00
template < typename Container >
void GetCreatureListWithOptionsInGrid ( Container & creatureContainer , float maxSearchRange , FindCreatureOptions const & options ) const ;
2016-10-13 01:23:02 -03:00
template < typename Container >
2021-08-10 13:08:49 +02:00
void GetPlayerListInGrid ( Container & playerContainer , float maxSearchRange , bool alive = true ) const ;
2009-10-17 15:51:44 -07:00
2009-08-28 14:19:14 -05:00
void DestroyForNearbyPlayers ();
2010-02-27 15:25:14 +02:00
virtual void UpdateObjectVisibility ( bool forced = true );
2018-02-26 17:40:40 +01:00
virtual void UpdateObjectVisibilityOnCreate () { UpdateObjectVisibility ( true ); }
2022-01-29 15:18:27 +01:00
virtual void UpdateObjectVisibilityOnDestroy () { DestroyForNearbyPlayers (); }
2017-06-08 00:25:06 +02:00
void UpdatePositionData ();
2016-03-02 23:54:37 +01:00
2014-08-09 20:17:40 +01:00
void BuildUpdate ( UpdateDataMapType & ) override ;
2020-03-19 20:42:44 +01:00
bool AddToObjectUpdate () override ;
2015-02-25 00:13:14 +01:00
void RemoveFromObjectUpdate () override ;
2009-10-17 15:51:44 -07:00
2010-02-27 15:25:14 +02:00
//relocation and visibility system functions
2009-12-19 10:12:40 +01:00
void AddToNotify ( uint16 f ) { m_notifyflags |= f ;}
2014-07-17 15:42:57 +02:00
bool isNeedNotify ( uint16 f ) const { return ( m_notifyflags & f ) != 0 ; }
2010-02-27 15:25:14 +02:00
uint16 GetNotifyFlags () const { return m_notifyflags ; }
2017-07-01 20:18:02 +02:00
void ResetAllNotifies () { m_notifyflags = 0 ; }
2009-12-19 10:12:40 +01:00
2009-02-25 20:52:20 -06:00
bool isActiveObject () const { return m_isActive ; }
void setActive ( bool isActiveObject );
2018-02-17 15:09:54 +01:00
bool IsFarVisible () const { return m_isFarVisible ; }
void SetFarVisible ( bool on );
2020-07-15 10:22:29 +02:00
bool IsVisibilityOverridden () const { return m_visibilityDistanceOverride . has_value (); }
2019-01-16 20:48:01 +01:00
void SetVisibilityDistanceOverride ( VisibilityDistanceType type );
2024-03-14 11:01:58 +01:00
void SetIsStoredInWorldObjectGridContainer ( bool apply );
bool IsAlwaysStoredInWorldObjectGridContainer () const { return m_isStoredInWorldObjectGridContainer ; }
bool IsStoredInWorldObjectGridContainer () const ;
2011-12-20 17:05:08 -05:00
2010-05-16 17:45:45 +02:00
uint32 LastUsedScriptID ;
2010-07-30 21:54:46 -07:00
// Transports
2022-05-25 22:14:32 +02:00
TransportBase * GetTransport () const { return m_transport ; }
2013-10-16 18:37:29 +02:00
float GetTransOffsetX () const { return m_movementInfo . transport . pos . GetPositionX (); }
float GetTransOffsetY () const { return m_movementInfo . transport . pos . GetPositionY (); }
float GetTransOffsetZ () const { return m_movementInfo . transport . pos . GetPositionZ (); }
float GetTransOffsetO () const { return m_movementInfo . transport . pos . GetOrientation (); }
2017-05-15 22:55:16 +02:00
Position const & GetTransOffset () const { return m_movementInfo . transport . pos ; }
2013-10-16 18:37:29 +02:00
uint32 GetTransTime () const { return m_movementInfo . transport . time ; }
int8 GetTransSeat () const { return m_movementInfo . transport . seat ; }
2014-09-14 16:14:12 +02:00
virtual ObjectGuid GetTransGUID () const ;
2025-12-26 00:42:14 +01:00
void SetTransport ( TransportBase * t );
2010-07-30 21:54:46 -07:00
MovementInfo m_movementInfo ;
2013-10-16 18:37:29 +02:00
2025-06-17 23:09:08 +02:00
virtual Position const & GetStationaryPosition () const { return * this ; }
2013-10-16 18:37:29 +02:00
2017-06-08 00:25:06 +02:00
float GetFloorZ () const ;
2017-12-14 16:56:30 +01:00
virtual float GetCollisionHeight () const { return 0.0f ; }
2017-12-29 22:32:07 +01:00
float GetMapWaterOrGroundLevel ( float x , float y , float z , float * ground = nullptr ) const ;
float GetMapHeight ( float x , float y , float z , bool vmap = true , float distanceToSearch = 50.0f ) const ; // DEFAULT_HEIGHT_SEARCH in map.h
2017-06-08 00:25:06 +02:00
2018-12-14 22:01:16 +01:00
std :: string GetDebugInfo () const override ;
2018-02-10 16:43:01 -03:00
// Event handler
EventProcessor m_Events ;
2015-09-16 17:06:24 +02:00
virtual uint16 GetAIAnimKitId () const { return 0 ; }
virtual uint16 GetMovementAnimKitId () const { return 0 ; }
virtual uint16 GetMeleeAnimKitId () const { return 0 ; }
2015-05-25 01:50:03 +02:00
2021-03-14 21:23:07 +02:00
// Watcher
bool IsPrivateObject () const { return ! _privateObjectOwner . IsEmpty (); }
ObjectGuid GetPrivateObjectOwner () const { return _privateObjectOwner ; }
void SetPrivateObjectOwner ( ObjectGuid const & owner ) { _privateObjectOwner = owner ; }
2021-03-28 16:38:04 +02:00
bool CheckPrivateObjectOwnerVisibility ( WorldObject const * seer ) const ;
2021-03-14 21:23:07 +02:00
2022-01-29 19:44:55 +01:00
// Smooth Phasing
2022-01-29 19:44:55 +01:00
SmoothPhasing * GetOrCreateSmoothPhasing ();
SmoothPhasing * GetSmoothPhasing () { return _smoothPhasing . get (); }
SmoothPhasing const * GetSmoothPhasing () const { return _smoothPhasing . get (); }
2022-01-29 19:44:55 +01:00
2008-10-02 16:23:55 -05:00
protected :
std :: string m_name ;
2008-10-27 08:41:55 -05:00
bool m_isActive ;
2018-02-17 15:09:54 +01:00
bool m_isFarVisible ;
2019-01-16 20:48:01 +01:00
Optional < float > m_visibilityDistanceOverride ;
2024-03-14 11:01:58 +01:00
bool const m_isStoredInWorldObjectGridContainer ;
2011-09-15 14:08:17 +02:00
ZoneScript * m_zoneScript ;
2009-10-17 15:51:44 -07:00
2022-05-25 22:14:32 +02:00
// transports (gameobjects only)
TransportBase * m_transport ;
2010-07-30 21:54:46 -07:00
2017-06-08 00:25:06 +02:00
virtual void ProcessPositionDataChanged ( PositionFullTerrainStatus const & data );
uint32 m_zoneId ;
uint32 m_areaId ;
float m_staticFloorZ ;
2018-02-26 17:40:40 +01:00
bool m_outdoors ;
2020-04-07 23:28:44 +02:00
ZLiquidStatus m_liquidStatus ;
2024-03-07 13:31:12 +01:00
Optional < WmoLocation > m_currentWmo ;
2017-06-08 00:25:06 +02:00
2009-08-25 11:42:18 -05:00
//these functions are used mostly for Relocate() and Corpse/Player specific stuff...
//use them ONLY in LoadFromDB()/Create() funcs and nowhere else!
//mapId/instanceId should be set in SetMap() function!
void SetLocationMapId ( uint32 _mapId ) { m_mapId = _mapId ; }
void SetLocationInstanceId ( uint32 _instanceId ) { m_InstanceId = _instanceId ; }
2009-10-17 15:51:44 -07:00
2025-05-11 21:10:21 +02:00
virtual bool CanNeverSee ( WorldObject const * obj , bool ignorePhaseShift = false ) const ;
2022-10-21 22:11:00 +02:00
virtual bool CanAlwaysSee ( [[maybe_unused]] WorldObject const * /*obj*/ ) const { return false ; }
2023-03-12 17:12:36 +01:00
virtual bool IsNeverVisibleFor ( [[maybe_unused]] WorldObject const* seer, [[maybe_unused]] bool allowServersideObjects = false ) const { return ! IsInWorld () || IsDestroyedObject (); }
2022-10-21 22:11:00 +02:00
virtual bool IsAlwaysVisibleFor ( [[maybe_unused]] WorldObject const * seer ) const { return false ; }
virtual bool IsInvisibleDueToDespawn ( [[maybe_unused]] WorldObject const * seer ) const { return false ; }
2011-10-13 17:01:55 -04:00
//difference from IsAlwaysVisibleFor: 1. after distance check; 2. use owner or charmer as seer
2022-10-21 22:11:00 +02:00
virtual bool IsAlwaysDetectableFor ( [[maybe_unused]] WorldObject const * seer ) const { return false ; }
2024-04-26 01:14:48 +02:00
virtual void Heartbeat () { }
2008-10-02 16:23:55 -05:00
private :
2017-06-08 00:25:06 +02:00
Map * m_currMap ; // current object's Map location
2009-10-17 15:51:44 -07:00
2017-06-08 00:25:06 +02:00
uint32 m_InstanceId ; // in map copy with instance id
2018-01-28 11:37:20 +01:00
PhaseShift _phaseShift ;
2017-06-08 00:25:06 +02:00
PhaseShift _suppressedPhaseShift ; // contains phases for current area but not applied due to conditions
2015-03-16 07:28:49 +01:00
int32 _dbPhase ;
2009-12-19 10:12:40 +01:00
uint16 m_notifyflags ;
2021-03-14 21:23:07 +02:00
ObjectGuid _privateObjectOwner ;
2022-01-29 19:44:55 +01:00
std :: unique_ptr < SmoothPhasing > _smoothPhasing ;
2022-01-29 19:44:55 +01:00
2024-04-26 01:14:48 +02:00
Milliseconds _heartbeatTimer ;
2017-03-23 00:43:04 +01:00
virtual bool _IsWithinDist ( WorldObject const * obj , float dist2compare , bool is3D , bool incOwnRadius = true , bool incTargetRadius = true ) const ;
2011-10-13 14:02:07 -04:00
2015-07-15 18:43:19 +02:00
bool CanDetect ( WorldObject const * obj , bool ignoreStealth , bool checkAlert = false ) const ;
2011-10-13 17:01:55 -04:00
bool CanDetectInvisibilityOf ( WorldObject const * obj ) const ;
2015-07-15 18:43:19 +02:00
bool CanDetectStealthOf ( WorldObject const * obj , bool checkAlert = false ) const ;
2008-10-02 16:23:55 -05:00
};
2010-05-30 04:23:27 +02:00
namespace Trinity
{
// Binary predicate to sort WorldObjects based on the distance to a reference WorldObject
class ObjectDistanceOrderPred
{
public :
2014-08-14 16:09:14 +02:00
ObjectDistanceOrderPred ( WorldObject const * refObj , bool ascending = true ) : _refObj ( refObj ), _ascending ( ascending ) { }
bool operator ()( WorldObject const * left , WorldObject const * right ) const
2010-05-30 04:23:27 +02:00
{
2014-08-14 16:09:14 +02:00
return _refObj -> GetDistanceOrder ( left , right ) == _ascending ;
2010-05-30 04:23:27 +02:00
}
2014-08-14 16:09:14 +02:00
2010-05-30 04:23:27 +02:00
private :
2014-08-14 16:09:14 +02:00
WorldObject const * _refObj ;
bool _ascending ;
2010-05-30 04:23:27 +02:00
};
}
2008-10-02 16:23:55 -05:00
#endif