1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-29 07:37:45 +00:00
sapphire/src/world/Actor/EventObject.cpp

189 lines
5.4 KiB
C++
Raw Normal View History

#include "EventObject.h"
#include "Territory/InstanceContent.h"
#include "Actor/Player.h"
#include "Network/PacketWrappers/ActorControlPacket.h"
#include "Network/PacketWrappers/ActorControlTargetPacket.h"
2018-03-06 22:22:19 +01:00
#include <Logging/Logger.h>
#include <Network/PacketDef/Zone/ServerZoneDef.h>
#include <Network/CommonActorControl.h>
2018-03-06 22:22:19 +01:00
#include <Util/UtilMath.h>
#include <Service.h>
2023-01-17 08:28:06 +01:00
#include <utility>
#include "WorldServer.h"
#include "Session.h"
#include "Network/GameConnection.h"
using namespace Sapphire::Common;
using namespace Sapphire::Network::Packets;
using namespace Sapphire::Network::Packets::WorldPackets::Server;
using namespace Sapphire::Network::ActorControl;
2022-02-16 11:56:59 +01:00
Sapphire::Entity::EventObject::EventObject( uint32_t actorId, uint32_t objectId, uint32_t gimmickId, uint32_t instanceId,
2019-01-04 12:34:19 +01:00
uint8_t initialState, Common::FFXIVARR_POSITION3 pos,
2022-02-16 11:56:59 +01:00
float rotation, const std::string& givenName, uint8_t permissionInv ) :
Sapphire::Entity::GameObject( ObjKind::EventObj ),
m_gimmickId( gimmickId ),
2022-02-16 11:56:59 +01:00
m_instanceId( instanceId ),
m_state( initialState ),
m_objectId( objectId ),
m_name( givenName ),
2022-02-16 11:56:59 +01:00
m_housingLink( 0 ),
m_permissionInvisibility( permissionInv ),
m_ownerId( Common::INVALID_GAME_OBJECT_ID )
{
m_id = actorId;
m_pos.x = pos.x;
m_pos.y = pos.y;
m_pos.z = pos.z;
m_rot = rotation;
}
uint32_t Sapphire::Entity::EventObject::getGimmickId() const
{
return m_gimmickId;
}
uint32_t Sapphire::Entity::EventObject::getObjectId() const
{
return m_objectId;
}
float Sapphire::Entity::EventObject::getScale() const
{
return m_scale;
}
void Sapphire::Entity::EventObject::setScale( float scale )
{
m_scale = scale;
}
Sapphire::Entity::EventObject::OnTalkEventHandler Sapphire::Entity::EventObject::getOnTalkHandler() const
{
return m_onTalkEventHandler;
}
void Sapphire::Entity::EventObject::setOnTalkHandler( Sapphire::Entity::EventObject::OnTalkEventHandler handler )
{
2023-01-17 08:28:06 +01:00
m_onTalkEventHandler = std::move( handler );
}
void Sapphire::Entity::EventObject::setGimmickId( uint32_t gimmickId )
{
m_gimmickId = gimmickId;
}
uint8_t Sapphire::Entity::EventObject::getState() const
{
return m_state;
}
void Sapphire::Entity::EventObject::setState( uint8_t state )
{
m_state = state;
}
void Sapphire::Entity::EventObject::setAnimationFlag( uint32_t flag, uint32_t animationFlag )
{
auto& server = Common::Service< World::WorldServer >::ref();
for( const auto& player : m_inRangePlayers )
{
auto pSession = server.getSession( player->getCharacterId() );
pSession->getZoneConnection()->queueOutPacket( makeActorControl( getId(), EObjAnimation, flag, animationFlag ) );
}
2018-06-12 09:29:21 +09:00
}
void Sapphire::Entity::EventObject::setHousingLink( uint32_t housingLink )
{
m_housingLink = housingLink;
}
uint32_t Sapphire::Entity::EventObject::getHousingLink() const
{
return m_housingLink;
}
2019-07-21 22:33:33 +10:00
void Sapphire::Entity::EventObject::setParentInstance( Sapphire::TerritoryPtr instance )
{
2023-01-17 08:28:06 +01:00
m_parentInstance = std::move( instance );
}
2019-07-21 22:33:33 +10:00
Sapphire::TerritoryPtr Sapphire::Entity::EventObject::getParentInstance() const
{
return m_parentInstance;
}
void Sapphire::Entity::EventObject::spawn( Sapphire::Entity::PlayerPtr pTarget )
{
auto spawnIndex = pTarget->getNextObjSpawnIndexForActorId( getId() );
if( !pTarget->isObjSpawnIndexValid( spawnIndex ) )
return;
auto& server = Common::Service< World::WorldServer >::ref();
2019-01-04 12:34:19 +01:00
Logger::debug( "Spawning EObj: id#{0} name={1}", getId(), getName() );
2018-06-28 00:07:07 +02:00
auto eobjStatePacket = makeZonePacket< FFXIVIpcCreateObject >( getId(), pTarget->getId() );
eobjStatePacket->data().Index = spawnIndex;
eobjStatePacket->data().Kind = getObjKind();
eobjStatePacket->data().Flag = getState();
eobjStatePacket->data().BaseId = getObjectId();
2022-02-16 11:56:59 +01:00
eobjStatePacket->data().LayoutId = getInstanceId();
eobjStatePacket->data().BindLayoutId = getGimmickId();
2022-02-16 11:56:59 +01:00
eobjStatePacket->data().OwnerId = getOwnerId();
eobjStatePacket->data().Pos = getPos();
eobjStatePacket->data().Scale = getScale();
eobjStatePacket->data().EntityId = getId();
eobjStatePacket->data().Dir = Util::floatToUInt16Rot( getRot() );
2022-02-16 11:56:59 +01:00
eobjStatePacket->data().OwnerId = getOwnerId();
2022-02-16 23:18:32 +01:00
eobjStatePacket->data().PermissionInvisibility = getPermissionInvisibility();
2022-02-16 11:56:59 +01:00
eobjStatePacket->data().Args = 0xE0;
eobjStatePacket->data().Args2 = 0; // initial animation state
eobjStatePacket->data().Args3 = getHousingLink();
server.queueForPlayer( pTarget->getCharacterId(), eobjStatePacket );
}
void Sapphire::Entity::EventObject::despawn( Sapphire::Entity::PlayerPtr pTarget )
{
2019-01-04 12:34:19 +01:00
Logger::debug( "despawn eobj#{0}", getId() );
pTarget->freeObjSpawnIndexForActorId( getId() );
}
const std::string& Sapphire::Entity::EventObject::getName() const
{
return m_name;
}
2022-02-16 11:56:59 +01:00
uint32_t Sapphire::Entity::EventObject::getInstanceId() const
{
return m_instanceId;
}
uint8_t Sapphire::Entity::EventObject::getPermissionInvisibility() const
{
return m_permissionInvisibility;
}
void Sapphire::Entity::EventObject::setPermissionInvisibility( uint8_t permissionInvisibility )
{
m_permissionInvisibility = permissionInvisibility;
auto& server = Common::Service< World::WorldServer >::ref();
auto inRangePlayerIds = getInRangePlayerIds();
server.queueForPlayers( inRangePlayerIds, makeActorControl( getId(), DirectorEObjMod, permissionInvisibility ) );
2022-02-16 11:56:59 +01:00
}
uint32_t Sapphire::Entity::EventObject::getOwnerId() const
{
return m_ownerId;
}