1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-08 11:47:45 +00:00
sapphire/src/world/Task/MoveTerritoryTask.cpp

98 lines
3.6 KiB
C++
Raw Normal View History

2022-01-30 14:44:17 +01:00
#include "MoveTerritoryTask.h"
#include <Logging/Logger.h>
#include <Actor/Player.h>
#include <WorldServer.h>
#include <Service.h>
#include <Manager/TerritoryMgr.h>
#include <Manager/PlayerMgr.h>
#include <Network/PacketContainer.h>
#include <Network/PacketDef/Zone/ServerZoneDef.h>
#include <Network/CommonActorControl.h>
#include <Network/PacketWrappers/ActorControlSelfPacket.h>
#include <Network/PacketWrappers/ActorControlPacket.h>
2022-01-30 14:44:17 +01:00
using namespace Sapphire::World;
using namespace Sapphire::World::Manager;
using namespace Sapphire::Common;
using namespace Sapphire::Network::ActorControl;
using namespace Sapphire::Network::Packets;
using namespace Sapphire::Network::Packets::WorldPackets::Server;
2022-01-30 14:44:17 +01:00
MoveTerritoryTask::MoveTerritoryTask( Entity::Player& player, Common::WarpType warpType,
uint32_t targetTerritoryId, Common::FFXIVARR_POSITION3 targetPos, float targetRot, uint64_t delayTime ) : Task( delayTime )
{
m_playerId = player.getId();
m_warpInfo = { targetTerritoryId, warpType, targetPos, targetRot };
}
void MoveTerritoryTask::onQueue()
{
Logger::debug( { __FUNCTION__ } );
}
void MoveTerritoryTask::execute()
{
auto& server = Common::Service< WorldServer >::ref();
auto& playerMgr = Common::Service< World::Manager::PlayerMgr >::ref();
auto pPlayer = playerMgr.getPlayer( m_playerId );
2022-01-30 14:44:17 +01:00
if( !pPlayer )
return;
auto inRangePlayerIds = pPlayer->getInRangePlayerIds();
auto warpStart = makeActorControlSelf( pPlayer->getId(), WarpStart, m_warpInfo.m_warpType, 1, 0, m_warpInfo.m_targetTerritoryId, 1 );
server.queueForPlayers( inRangePlayerIds, warpStart );
server.queueForPlayer( pPlayer->getCharacterId(), warpStart );
server.queueForPlayers( inRangePlayerIds, makeActorControl( pPlayer->getId(), ActorDespawnEffect, m_warpInfo.m_warpType, m_warpInfo.m_targetTerritoryId ) );
2023-02-20 15:25:57 +01:00
Common::Service< PlayerMgr >::ref().setCondition( *pPlayer, Common::PlayerCondition::BetweenAreas );
auto moveTerritoryPacket = makeZonePacket< WorldPackets::Server::FFXIVIpcMoveTerritory >( pPlayer->getId() );
moveTerritoryPacket->data().index = -1;
moveTerritoryPacket->data().territoryType = m_warpInfo.m_targetTerritoryId;
moveTerritoryPacket->data().zoneId = pPlayer->getTerritoryTypeId();
moveTerritoryPacket->data().worldId = server.getWorldId();
moveTerritoryPacket->data().worldId1 = server.getWorldId();
moveTerritoryPacket->data().landId = -1;
moveTerritoryPacket->data().landSetId = -1;
moveTerritoryPacket->data().landTerritoryId = -1;
strcpy( moveTerritoryPacket->data().worldName, "Sapphire" );
server.queueForPlayer( pPlayer->getCharacterId(), moveTerritoryPacket );
2022-01-30 14:44:17 +01:00
pPlayer->setPos( m_warpInfo.m_targetPos, false );
pPlayer->setRot( m_warpInfo.m_targetRot );
auto& teriMgr = Common::Service< TerritoryMgr >::ref();
pPlayer->setOnEnterEventDone( false );
TerritoryPtr pZone;
if( m_warpInfo.m_targetTerritoryId != 0 )
pZone = teriMgr.getTerritoryByGuId( m_warpInfo.m_targetTerritoryId );
2023-01-27 11:13:57 +01:00
if( !pZone )
{
Logger::error( "Territory typeId#{} not found!", m_warpInfo.m_targetTerritoryId );
return;
}
if( !teriMgr.movePlayer( *pZone, *pPlayer ) )
2022-01-30 14:44:17 +01:00
{
// todo: this will require proper handling, for now just return the player to their previous area
pPlayer->setPos( pPlayer->getPrevPos(), false );
auto pZone1 = teriMgr.getTerritoryByTypeId( pPlayer->getPrevTerritoryTypeId() );
2023-01-27 11:13:57 +01:00
if( !teriMgr.movePlayer( *pZone1, *pPlayer ) )
2022-01-30 14:44:17 +01:00
return;
}
}
std::string MoveTerritoryTask::toString()
{
return fmt::format( "MoveTerritoryTask: Player#{}, TerritoryId#{}, ElapsedTimeMs: {}", m_playerId, m_warpInfo.m_targetTerritoryId, getDelayTimeMs() );
}