2021-11-27 00:53:57 +01:00
|
|
|
#include "GameObject.h"
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-03-06 22:22:19 +01:00
|
|
|
#include <Network/PacketContainer.h>
|
2018-06-02 15:52:35 +02:00
|
|
|
|
2018-03-06 22:22:19 +01:00
|
|
|
#include <Util/UtilMath.h>
|
2018-06-28 00:07:07 +02:00
|
|
|
#include <utility>
|
2021-11-27 00:53:57 +01:00
|
|
|
#include <Service.h>
|
2018-02-22 15:31:10 +01:00
|
|
|
|
2019-07-21 22:33:33 +10:00
|
|
|
#include "Territory/Territory.h"
|
2018-02-22 18:12:36 +01:00
|
|
|
|
2018-02-22 15:31:10 +01:00
|
|
|
#include "Network/GameConnection.h"
|
2018-02-22 18:12:36 +01:00
|
|
|
|
|
|
|
#include "Chara.h"
|
|
|
|
#include "EventObject.h"
|
2018-02-22 15:31:10 +01:00
|
|
|
#include "Player.h"
|
2018-09-09 23:56:22 +02:00
|
|
|
#include "BNpc.h"
|
2018-02-22 18:12:36 +01:00
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
#include "WorldServer.h"
|
2018-02-22 15:31:10 +01:00
|
|
|
#include "Session.h"
|
2017-12-08 15:38:25 +01:00
|
|
|
|
2018-12-01 00:27:16 +11:00
|
|
|
#include "Manager/TerritoryMgr.h"
|
2018-03-02 07:22:25 -03:00
|
|
|
|
2017-12-08 15:38:25 +01:00
|
|
|
#include "StatusEffect/StatusEffect.h"
|
2018-03-02 07:22:25 -03:00
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
using namespace Sapphire::Common;
|
2023-03-08 09:20:08 +01:00
|
|
|
using namespace Sapphire::Entity;
|
2018-11-29 16:55:48 +01:00
|
|
|
using namespace Sapphire::Network::Packets;
|
|
|
|
//using namespace Sapphire::Network::Packets::Server;
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
GameObject::GameObject( ObjKind type ) :
|
2018-08-29 21:40:59 +02:00
|
|
|
m_objKind( type )
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
uint32_t GameObject::getId() const
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_id;
|
2017-08-08 13:53:47 +02:00
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
void GameObject::setId( uint32_t id )
|
2018-02-23 23:47:21 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
m_id = id;
|
2018-02-23 23:47:21 +01:00
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
ObjKind GameObject::getObjKind() const
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_objKind;
|
2017-08-08 13:53:47 +02:00
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
FFXIVARR_POSITION3& GameObject::getPos()
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_pos;
|
2017-08-08 13:53:47 +02:00
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
const FFXIVARR_POSITION3& GameObject::getPos() const
|
2019-04-05 13:15:14 +02:00
|
|
|
{
|
|
|
|
return m_pos;
|
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
void GameObject::setPos( float x, float y, float z, bool broadcastUpdate )
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
m_pos.x = x;
|
|
|
|
m_pos.y = y;
|
|
|
|
m_pos.z = z;
|
2019-02-01 00:04:19 +11:00
|
|
|
|
|
|
|
if( broadcastUpdate )
|
2022-01-10 23:50:44 +01:00
|
|
|
{
|
2022-01-24 09:20:34 +01:00
|
|
|
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
|
2022-01-10 23:50:44 +01:00
|
|
|
auto pZone = teriMgr.getTerritoryByGuId( getTerritoryId() );
|
|
|
|
pZone->updateActorPosition( *this );
|
|
|
|
}
|
|
|
|
|
2017-08-08 13:53:47 +02:00
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
void GameObject::setPos( const FFXIVARR_POSITION3& pos, bool broadcastUpdate )
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
m_pos = pos;
|
2019-02-01 00:04:19 +11:00
|
|
|
|
|
|
|
if( broadcastUpdate )
|
2022-01-10 23:50:44 +01:00
|
|
|
{
|
2022-01-24 09:20:34 +01:00
|
|
|
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
|
2022-01-10 23:50:44 +01:00
|
|
|
auto pZone = teriMgr.getTerritoryByGuId( getTerritoryId() );
|
|
|
|
pZone->updateActorPosition( *this );
|
|
|
|
}
|
2017-08-15 15:48:52 +02:00
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
float GameObject::getRot() const
|
2017-09-04 01:36:19 -03:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_rot;
|
2017-09-06 20:25:58 +02:00
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
void GameObject::setRot( float rot )
|
2017-09-06 20:25:58 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
m_rot = rot;
|
2017-12-03 18:11:56 +01:00
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
bool GameObject::isChara() const
|
2018-02-22 17:06:30 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return isPlayer() || isBattleNpc() || isEventNpc() || isRetainer() || isCompanion();
|
2018-02-22 17:06:30 +01:00
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
bool GameObject::isPlayer() const
|
2017-12-03 18:11:56 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_objKind == ObjKind::Player;
|
2017-12-05 11:21:56 +01:00
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
bool GameObject::isEventNpc() const
|
2018-02-22 17:06:30 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_objKind == ObjKind::EventNpc;
|
2018-02-22 17:06:30 +01:00
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
bool GameObject::isBattleNpc() const
|
2018-02-22 17:06:30 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_objKind == ObjKind::BattleNpc;
|
2018-02-22 17:06:30 +01:00
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
bool GameObject::isRetainer() const
|
2018-02-22 17:06:30 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_objKind == ObjKind::Retainer;
|
2018-02-22 17:06:30 +01:00
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
bool GameObject::isCompanion() const
|
2018-02-22 17:06:30 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_objKind == ObjKind::Companion;
|
2018-02-22 17:06:30 +01:00
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
bool GameObject::isEventObj() const
|
2018-02-22 17:06:30 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_objKind == ObjKind::EventObj;
|
2018-02-22 17:06:30 +01:00
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
bool GameObject::isHousingEventObj() const
|
2018-02-22 17:06:30 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_objKind == ObjKind::Housing;
|
2018-02-22 17:06:30 +01:00
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
bool GameObject::isAetheryte() const
|
2018-02-22 17:06:30 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_objKind == ObjKind::Aetheryte;
|
2018-02-22 17:06:30 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
/*! \return pointer to this instance as GameObjectPtr */
|
2023-03-08 09:20:08 +01:00
|
|
|
CharaPtr GameObject::getAsChara()
|
2017-12-05 11:21:56 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
if( !isChara() )
|
|
|
|
return nullptr;
|
2023-03-08 09:20:08 +01:00
|
|
|
return std::dynamic_pointer_cast< Chara, GameObject >( shared_from_this() );
|
2017-12-05 11:21:56 +01:00
|
|
|
}
|
|
|
|
|
2018-02-20 22:46:44 +01:00
|
|
|
/*! \return pointer to this instance as PlayerPtr */
|
2023-03-08 09:20:08 +01:00
|
|
|
PlayerPtr GameObject::getAsPlayer()
|
2017-12-05 11:21:56 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
if( !isPlayer() )
|
|
|
|
return nullptr;
|
2023-03-08 09:20:08 +01:00
|
|
|
return std::dynamic_pointer_cast< Player, GameObject >( shared_from_this() );
|
2017-12-05 11:21:56 +01:00
|
|
|
}
|
|
|
|
|
2018-09-09 23:56:22 +02:00
|
|
|
/*! \return pointer to this instance as EventObjPtr */
|
2023-03-08 09:20:08 +01:00
|
|
|
EventObjectPtr GameObject::getAsEventObj()
|
2018-02-22 17:06:30 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
if( !isEventObj() )
|
|
|
|
return nullptr;
|
2023-03-08 09:20:08 +01:00
|
|
|
return std::dynamic_pointer_cast< EventObject, GameObject >( shared_from_this() );
|
2018-02-22 17:06:30 +01:00
|
|
|
}
|
|
|
|
|
2018-09-09 23:56:22 +02:00
|
|
|
/*! \return pointer to this instance as BNpcPtr */
|
2023-03-08 09:20:08 +01:00
|
|
|
BNpcPtr GameObject::getAsBNpc()
|
2018-09-09 23:56:22 +02:00
|
|
|
{
|
|
|
|
if( !isBattleNpc() )
|
|
|
|
return nullptr;
|
2023-03-08 09:20:08 +01:00
|
|
|
return std::dynamic_pointer_cast< BNpc, GameObject >( shared_from_this() );
|
2018-09-09 23:56:22 +02:00
|
|
|
}
|
|
|
|
|
2018-02-22 15:31:10 +01:00
|
|
|
/*!
|
|
|
|
Add a given actor to the fitting in range set according to type
|
|
|
|
but also to the global actor map
|
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
\param GameObjectPtr to add
|
2018-02-22 15:31:10 +01:00
|
|
|
*/
|
2023-03-08 09:20:08 +01:00
|
|
|
void GameObject::addInRangeActor( GameObjectPtr pActor )
|
2018-02-22 15:31:10 +01:00
|
|
|
{
|
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
// if this is null, something went wrong
|
|
|
|
assert( pActor );
|
2018-02-22 15:31:10 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
// add actor to in range set
|
|
|
|
m_inRangeActor.insert( pActor );
|
2018-02-22 15:31:10 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
if( pActor->isPlayer() )
|
|
|
|
{
|
|
|
|
auto pPlayer = pActor->getAsPlayer();
|
2018-02-22 15:31:10 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
spawn( pPlayer );
|
2018-02-22 15:31:10 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
// if actor is a player, add it to the in range player set
|
|
|
|
m_inRangePlayers.insert( pPlayer );
|
|
|
|
}
|
2018-09-10 23:57:14 +02:00
|
|
|
else if( pActor->isBattleNpc() )
|
|
|
|
{
|
|
|
|
auto pBNpc = pActor->getAsBNpc();
|
|
|
|
|
|
|
|
// if actor is a player, add it to the in range player set
|
|
|
|
m_inRangeBNpc.insert( pBNpc );
|
|
|
|
}
|
2018-02-22 15:31:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
Remove a given actor from the matching in range set according to type
|
|
|
|
but also to the global actor map
|
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
\param GameObjectPtr to remove
|
2018-02-22 15:31:10 +01:00
|
|
|
*/
|
2023-03-08 09:20:08 +01:00
|
|
|
void GameObject::removeInRangeActor( GameObject& actor )
|
2018-02-22 15:31:10 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
// call virtual event
|
|
|
|
onRemoveInRangeActor( actor );
|
2018-02-22 15:31:10 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
// remove actor from in range actor set
|
|
|
|
m_inRangeActor.erase( actor.shared_from_this() );
|
2018-02-22 15:31:10 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
// if actor is a player, despawn ourself for him
|
|
|
|
// TODO: move to virtual onRemove?
|
|
|
|
if( isPlayer() )
|
|
|
|
actor.despawn( getAsPlayer() );
|
2018-02-22 15:31:10 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
if( actor.isPlayer() )
|
|
|
|
m_inRangePlayers.erase( actor.getAsPlayer() );
|
2018-09-10 23:57:14 +02:00
|
|
|
|
|
|
|
if( actor.isBattleNpc() )
|
|
|
|
m_inRangeBNpc.erase( actor.getAsBNpc() );
|
2018-02-22 15:31:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*! \return true if there is at least one actor in the in range set */
|
2023-03-08 09:20:08 +01:00
|
|
|
bool GameObject::hasInRangeActor() const
|
2018-02-22 15:31:10 +01:00
|
|
|
{
|
2021-11-27 00:53:57 +01:00
|
|
|
return ( !m_inRangeActor.empty() );
|
2018-02-22 15:31:10 +01:00
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
void GameObject::removeFromInRange()
|
2018-02-22 15:31:10 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
if( !hasInRangeActor() )
|
|
|
|
return;
|
2018-02-22 15:31:10 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
for( auto& pCurAct : m_inRangeActor )
|
|
|
|
{
|
|
|
|
pCurAct->removeInRangeActor( *this );
|
|
|
|
}
|
2018-02-22 15:31:10 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
check if a given actor is in the actors in range set
|
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
\param GameObjectPtr to be checked for
|
2018-02-22 15:31:10 +01:00
|
|
|
\return true if the actor was found
|
|
|
|
*/
|
2023-03-08 09:20:08 +01:00
|
|
|
bool GameObject::isInRangeSet( GameObjectPtr pActor ) const
|
2018-02-22 15:31:10 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return !( m_inRangeActor.find( pActor ) == m_inRangeActor.end() );
|
2018-02-22 15:31:10 +01:00
|
|
|
}
|
|
|
|
|
2018-02-22 17:06:30 +01:00
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
/*! \return GameObjectPtr of the closest actor in range, if none, nullptr */
|
2023-03-08 09:20:08 +01:00
|
|
|
CharaPtr GameObject::getClosestChara()
|
2018-02-22 15:31:10 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
if( m_inRangeActor.empty() )
|
|
|
|
// no actors in range, don't bother
|
|
|
|
return nullptr;
|
2018-02-22 15:31:10 +01:00
|
|
|
|
2019-01-17 23:54:47 +01:00
|
|
|
CharaPtr tmpActor = nullptr;
|
2018-02-22 15:31:10 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
// arbitrary high number
|
|
|
|
float minDistance = 10000;
|
2018-02-22 15:31:10 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
for( const auto& pCurAct : m_inRangeActor )
|
|
|
|
{
|
2023-03-08 09:20:08 +01:00
|
|
|
float distance = Util::distance( getPos().x, getPos().y, getPos().z, pCurAct->getPos().x, pCurAct->getPos().y, pCurAct->getPos().z );
|
2018-02-22 15:31:10 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
if( distance < minDistance )
|
|
|
|
{
|
|
|
|
minDistance = distance;
|
2019-01-17 23:54:47 +01:00
|
|
|
tmpActor = pCurAct->getAsChara();
|
2018-08-29 21:40:59 +02:00
|
|
|
}
|
|
|
|
}
|
2018-02-22 15:31:10 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
return tmpActor;
|
2018-02-22 15:31:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*! Clear the whole in range set, this does no cleanup */
|
2023-03-08 09:20:08 +01:00
|
|
|
void GameObject::clearInRangeSet()
|
2018-02-22 15:31:10 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
m_inRangeActor.clear();
|
|
|
|
m_inRangePlayers.clear();
|
2018-09-10 23:57:14 +02:00
|
|
|
m_inRangeBNpc.clear();
|
2018-02-22 15:31:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*! \return list of actors currently in range */
|
2023-03-08 09:20:08 +01:00
|
|
|
std::set< GameObjectPtr > GameObject::getInRangeActors( bool includeSelf )
|
2018-02-22 15:31:10 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
auto tempInRange = m_inRangeActor;
|
2018-02-22 15:31:10 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
if( includeSelf )
|
|
|
|
tempInRange.insert( shared_from_this() );
|
2018-02-22 15:31:10 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
return tempInRange;
|
2018-02-22 17:06:30 +01:00
|
|
|
}
|
2018-02-22 18:12:36 +01:00
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
std::set< uint64_t > GameObject::getInRangePlayerIds( bool includeSelf )
|
2023-02-16 08:24:39 +01:00
|
|
|
{
|
|
|
|
std::set< uint64_t > playerIds;
|
|
|
|
for( auto& player : m_inRangePlayers )
|
|
|
|
playerIds.insert( player->getCharacterId() );
|
|
|
|
|
|
|
|
if( isPlayer() && includeSelf )
|
|
|
|
playerIds.insert( getAsPlayer()->getCharacterId() );
|
|
|
|
|
|
|
|
return playerIds;
|
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
uint32_t GameObject::getTerritoryTypeId() const
|
2022-01-10 23:50:44 +01:00
|
|
|
{
|
|
|
|
return m_territoryTypeId;
|
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
void GameObject::setTerritoryTypeId( uint32_t territoryTypeId )
|
2022-01-10 23:50:44 +01:00
|
|
|
{
|
|
|
|
m_territoryTypeId = territoryTypeId;
|
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
uint32_t GameObject::getTerritoryId() const
|
2022-01-10 23:50:44 +01:00
|
|
|
{
|
|
|
|
return m_territoryId;
|
|
|
|
}
|
|
|
|
|
2023-03-08 09:20:08 +01:00
|
|
|
void GameObject::setTerritoryId( uint32_t territoryId )
|
2022-01-10 23:50:44 +01:00
|
|
|
{
|
|
|
|
m_territoryId = territoryId;
|
|
|
|
}
|
|
|
|
|
2018-02-22 18:12:36 +01:00
|
|
|
/*!
|
2021-11-27 00:53:57 +01:00
|
|
|
Get the current cellId of a region the actor is in
|
2018-02-22 18:12:36 +01:00
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
\return CellId
|
2018-02-22 18:12:36 +01:00
|
|
|
*/
|
2023-03-08 09:20:08 +01:00
|
|
|
CellId GameObject::getCellId() const
|
2018-02-22 18:12:36 +01:00
|
|
|
{
|
2021-11-27 00:53:57 +01:00
|
|
|
return m_cellId;
|
2018-02-22 18:12:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2021-11-27 00:53:57 +01:00
|
|
|
Set the current cellId the actor is in
|
2018-02-22 18:12:36 +01:00
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
\param CellId for the cell to be set
|
2018-02-22 18:12:36 +01:00
|
|
|
*/
|
2023-03-08 09:20:08 +01:00
|
|
|
void GameObject::setCellId( CellId cellId )
|
2018-02-22 18:12:36 +01:00
|
|
|
{
|
2021-11-27 00:53:57 +01:00
|
|
|
m_cellId = cellId;
|
2017-08-08 13:53:47 +02:00
|
|
|
}
|