1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-27 06:47:45 +00:00
sapphire/src/servers/sapphire_zone/Actor/EventObject.cpp

153 lines
4.4 KiB
C++
Raw Normal View History

#include "EventObject.h"
#include "Zone/InstanceContent.h"
#include "Actor/Player.h"
2018-03-06 22:22:19 +01:00
#include <Logging/Logger.h>
#include <Network/GamePacket.h>
#include <Network/GamePacketNew.h>
#include <Network/PacketDef/Zone/ServerZoneDef.h>
#include <Util/UtilMath.h>
using namespace Core::Common;
using namespace Core::Network::Packets;
using namespace Core::Network::Packets::Server;
2018-03-09 00:06:44 +01:00
#include "Framework.h"
extern Core::Framework g_fw;
Core::Entity::EventObject::EventObject( uint32_t actorId, uint32_t objectId, uint32_t gimmickId,
uint8_t initialState, Common::FFXIVARR_POSITION3 pos,
float rotation, const std::string& givenName ) :
Core::Entity::Actor( ObjKind::EventObj ),
m_gimmickId( gimmickId ),
m_state( initialState ),
m_objectId( objectId ),
m_name( givenName )
{
m_id = actorId;
m_pos.x = pos.x;
m_pos.y = pos.y;
m_pos.z = pos.z;
m_rot = rotation;
}
uint32_t Core::Entity::EventObject::getGimmickId() const
{
return m_gimmickId;
}
uint32_t Core::Entity::EventObject::getObjectId() const
{
return m_objectId;
}
float Core::Entity::EventObject::getScale() const
{
return m_scale;
}
void Core::Entity::EventObject::setScale( float scale )
{
m_scale = scale;
}
Core::Entity::EventObject::OnTalkEventHandler Core::Entity::EventObject::getOnTalkHandler() const
{
return m_onTalkEventHandler;
}
void Core::Entity::EventObject::setOnTalkHandler( Core::Entity::EventObject::OnTalkEventHandler handler )
{
m_onTalkEventHandler = handler;
}
void Core::Entity::EventObject::setGimmickId( uint32_t gimmickId )
{
m_gimmickId = gimmickId;
}
uint8_t Core::Entity::EventObject::getState() const
{
return m_state;
}
void Core::Entity::EventObject::setState( uint8_t state )
{
m_state = state;
for( const auto& player : m_inRangePlayers )
{
2018-06-28 00:07:07 +02:00
FFXIVPacketBasePtr packet = boost::make_shared< ZoneChannelPacket< FFXIVIpcActorControl142 > >( getId(), player->getId() );
auto eobjUpdatePacket = dynamic_cast< ZoneChannelPacket< FFXIVIpcActorControl142 >& >( *packet );
eobjUpdatePacket.data().category = Common::ActorControlType::DirectorEObjMod;
eobjUpdatePacket.data().param1 = state;
2018-06-28 00:07:07 +02:00
player->queuePacket( packet );
}
}
2018-06-12 09:29:21 +09:00
void Core::Entity::EventObject::setAnimationFlag( uint32_t flag, uint32_t animationFlag ) {
for( const auto& player : m_inRangePlayers )
{
2018-06-28 00:07:07 +02:00
FFXIVPacketBasePtr packet = boost::make_shared< ZoneChannelPacket< FFXIVIpcActorControl142 > >( getId(), player->getId() );
auto eobjUpdatePacket = dynamic_cast< ZoneChannelPacket< FFXIVIpcActorControl142 >& >( *packet );
2018-06-12 09:29:21 +09:00
eobjUpdatePacket.data().category = Common::ActorControlType::EObjAnimation;
eobjUpdatePacket.data().param1 = flag;
eobjUpdatePacket.data().param2 = animationFlag;
2018-06-28 00:07:07 +02:00
player->queuePacket( packet );
2018-06-12 09:29:21 +09:00
}
}
void Core::Entity::EventObject::setParentInstance( Core::InstanceContentPtr instance )
{
m_parentInstance = instance;
}
Core::InstanceContentPtr Core::Entity::EventObject::getParentInstance() const
{
return m_parentInstance;
}
void Core::Entity::EventObject::spawn( Core::Entity::PlayerPtr pTarget )
{
auto spawnIndex = pTarget->getNextObjSpawnIndexForActorId( getId( ) );
if( !pTarget->isObjSpawnIndexValid( spawnIndex ) )
return;
2018-03-09 00:06:44 +01:00
auto pLog = g_fw.get< Logger >();
pLog->debug( "Spawning EObj: id:" + std::to_string( getId() ) + " name:" + getName() );
2018-06-28 00:07:07 +02:00
FFXIVPacketBasePtr packet = boost::make_shared< ZoneChannelPacket< FFXIVIpcObjectSpawn > >( getId(), pTarget->getId() );
auto eobjStatePacket = dynamic_cast< ZoneChannelPacket< FFXIVIpcObjectSpawn >& >( *packet );
eobjStatePacket.data().spawnIndex = spawnIndex;
eobjStatePacket.data().objKind = getObjKind();
eobjStatePacket.data().state = getState();
eobjStatePacket.data().objId = getObjectId();
eobjStatePacket.data().gimmickId = getGimmickId();
eobjStatePacket.data().position = getPos();
eobjStatePacket.data().scale = getScale();
eobjStatePacket.data().actorId = getId();
eobjStatePacket.data().rotation = Math::Util::floatToUInt16Rot( getRot() );
2018-06-28 00:07:07 +02:00
pTarget->queuePacket( packet );
}
void Core::Entity::EventObject::despawn( Core::Entity::PlayerPtr pTarget )
{
2018-03-09 00:06:44 +01:00
auto pLog = g_fw.get< Logger >();
pLog->debug( "despawn eobj: " + std::to_string( getId() ) );
2018-03-01 23:17:35 +01:00
pTarget->freeObjSpawnIndexForActorId( getId( ) );
}
const std::string& Core::Entity::EventObject::getName() const
{
return m_name;
}