diff --git a/src/tools/nav_export/main.cpp b/src/tools/nav_export/main.cpp index fc4d0565..ea62ea06 100644 --- a/src/tools/nav_export/main.cpp +++ b/src/tools/nav_export/main.cpp @@ -34,7 +34,7 @@ using namespace Sapphire; // garbage to ignore models bool noObj = false; -std::string gamePath( "H:\\Games\\ffxiv3.05\\game\\sqpack" ); +std::string gamePath( "C:\\Data\\Dev\\ffxiv3.35\\game\\sqpack" ); std::unordered_map< uint16_t, std::string > zoneNameMap; std::map< std::string, std::string > exportedTeriMap; @@ -311,7 +311,7 @@ int main( int argc, char* argv[] ) bool generateNavmesh = true; bool dumpAllZones = true; - int nJobs = 4; + int nJobs = std::thread::hardware_concurrency(); int exportFileType = 0; if( !noObj ) diff --git a/src/world/Manager/DebugCommandMgr.cpp b/src/world/Manager/DebugCommandMgr.cpp index 782c5ee4..ad6e608b 100644 --- a/src/world/Manager/DebugCommandMgr.cpp +++ b/src/world/Manager/DebugCommandMgr.cpp @@ -474,7 +474,7 @@ void DebugCommandMgr::add( char* data, Entity::Player& player, std::shared_ptr< actorControl->data().param2 = param2; actorControl->data().param3 = param3; actorControl->data().param4 = param4; - pSession->getZoneConnection()->queueOutPacket( actorControl ); + player.sendToInRangeSet( actorControl, true ); /*sscanf(params.c_str(), "%x %x %x %x %x %x %x", &opcode, ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6, &playerId); diff --git a/src/world/Manager/WarpMgr.cpp b/src/world/Manager/WarpMgr.cpp index f6c67b51..fdc45a71 100644 --- a/src/world/Manager/WarpMgr.cpp +++ b/src/world/Manager/WarpMgr.cpp @@ -45,34 +45,18 @@ void WarpMgr::requestMoveTerritory( Entity::Player& player, Common::WarpType war m_entityIdToWarpInfoMap[ player.getId() ] = { targetTerritoryId, warpType, targetPos, targetRot }; player.updatePrevTerritory(); - - player.sendToInRangeSet( makeActorControl( player.getId(), WarpStart, warpType, 1, pTeri->getTerritoryTypeId() ), true ); - player.sendToInRangeSet( makeActorControl( player.getId(), ActorDespawnEffect, warpType ) ); - Common::Service< PlayerMgr >::ref().onSetStateFlag( player, PlayerStateFlag::BetweenAreas ); - - auto moveTerritoryPacket = makeZonePacket< FFXIVIpcMoveTerritory >( player.getId() ); - moveTerritoryPacket->data().index = -1; - moveTerritoryPacket->data().territoryType = pTeri->getTerritoryTypeId(); - moveTerritoryPacket->data().zoneId = player.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( player.getCharacterId(), moveTerritoryPacket ); - + // create warp task auto& taskMgr = Common::Service< TaskMgr >::ref(); - taskMgr.queueTask( makeMoveTerritoryTask( player, warpType, targetTerritoryId, targetPos, targetRot, 2000 ) ); + taskMgr.queueTask( makeMoveTerritoryTask( player, warpType, targetTerritoryId, targetPos, targetRot, 1000 ) ); } void WarpMgr::requestWarp( Entity::Player& player, Common::WarpType warpType, Common::FFXIVARR_POSITION3 targetPos, float targetRot ) { m_entityIdToWarpInfoMap[ player.getId() ] = { 0, warpType, targetPos, targetRot }; - player.sendToInRangeSet( makeActorControl( player.getId(), WarpStart, warpType, 1, 0, player.getTerritoryTypeId(), 1 ), true ); - player.sendToInRangeSet( makeActorControl( player.getId(), ActorDespawnEffect, warpType ) ); + player.sendToInRangeSet( makeActorControlSelf( player.getId(), WarpStart, warpType, warpType, 0, player.getTerritoryTypeId(), 1 ), true ); + player.sendToInRangeSet( makeActorControl( player.getId(), ActorDespawnEffect, warpType, player.getTerritoryTypeId() ) ); auto& taskMgr = Common::Service< TaskMgr >::ref(); taskMgr.queueTask( makeWarpTask( player, warpType, targetPos, targetRot, 1000 ) ); @@ -87,35 +71,37 @@ void WarpMgr::finishWarp( Entity::Player& player ) if( it != m_entityIdToWarpInfoMap.end() ) warpType = it->second.m_warpType; - uint32_t vfxType = 0; // seems to only be used for raise animation? + bool raiseAnim = player.getStatus() == Common::ActorStatus::Dead ? 1 : 0; switch( warpType ) { case WarpType::WARP_TYPE_REISE: case WarpType::WARP_TYPE_HOME_POINT: + case WarpType::WARP_TYPE_EXIT_RANGE: { if( player.getStatus() == Common::ActorStatus::Dead ) { player.resetHp(); player.resetMp(); player.setStatus( Common::ActorStatus::Idle ); - vfxType = 1; } } } - auto zoneInPacket = makeActorControlSelf( player.getId(), Appear, warpType, vfxType, 0, 0 ); + auto warpFinishAnim = warpType - 1; + + auto zoneInPacket = makeActorControlSelf( player.getId(), Appear, warpFinishAnim, raiseAnim, 0, 0 ); auto setStatusPacket = makeActorControl( player.getId(), SetStatus, static_cast< uint8_t >( Common::ActorStatus::Idle ) ); player.setZoningType( Common::ZoningType::None ); if( !player.getGmInvis() ) player.sendToInRangeSet( zoneInPacket ); - player.sendToInRangeSet( setStatusPacket, true ); - auto& server = Common::Service< WorldServer >::ref(); server.queueForPlayer( player.getCharacterId(), zoneInPacket ); + player.sendToInRangeSet( setStatusPacket, true ); + playerMgr.onUnsetStateFlag( player, PlayerStateFlag::BetweenAreas ); } @@ -169,12 +155,12 @@ void WarpMgr::requestPlayerTeleport( Entity::Player& player, uint16_t aetheryteI } else if( teleportType == 3 ) // return { - warpType = WarpType::WARP_TYPE_HOME_POINT; + warpType = WarpType::WARP_TYPE_EXIT_RANGE; player.setZoningType( Common::ZoningType::Return ); } - else if( teleportType == 4 ) // return + else if( teleportType == 4 ) // return dead { - warpType = WarpType::WARP_TYPE_REISE; + warpType = WarpType::WARP_TYPE_EXIT_RANGE; player.setZoningType( Common::ZoningType::ReturnDead ); } diff --git a/src/world/Task/MoveTerritoryTask.cpp b/src/world/Task/MoveTerritoryTask.cpp index 0b30dec5..3f316078 100644 --- a/src/world/Task/MoveTerritoryTask.cpp +++ b/src/world/Task/MoveTerritoryTask.cpp @@ -6,9 +6,20 @@ #include #include +#include +#include +#include + +#include +#include +#include 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; MoveTerritoryTask::MoveTerritoryTask( Entity::Player& player, Common::WarpType warpType, uint32_t targetTerritoryId, Common::FFXIVARR_POSITION3 targetPos, float targetRot, uint64_t delayTime ) : Task( delayTime ) @@ -29,6 +40,22 @@ void MoveTerritoryTask::execute() if( !pPlayer ) return; + pPlayer->sendToInRangeSet( makeActorControlSelf( pPlayer->getId(), WarpStart, m_warpInfo.m_warpType, 1, 0, m_warpInfo.m_targetTerritoryId, 1 ), true ); + pPlayer->sendToInRangeSet( makeActorControl( pPlayer->getId(), ActorDespawnEffect, m_warpInfo.m_warpType, m_warpInfo.m_targetTerritoryId ) ); + Common::Service< PlayerMgr >::ref().onSetStateFlag( *pPlayer, Common::PlayerStateFlag::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 ); + pPlayer->setPos( m_warpInfo.m_targetPos, false ); pPlayer->setRot( m_warpInfo.m_targetRot ); diff --git a/src/world/Task/WarpTask.cpp b/src/world/Task/WarpTask.cpp index c0c33a42..daca8b16 100644 --- a/src/world/Task/WarpTask.cpp +++ b/src/world/Task/WarpTask.cpp @@ -31,9 +31,9 @@ void WarpTask::execute() auto pPlayer = server.getPlayer( m_playerId ); if( !pPlayer ) return; - - pPlayer->setPos( m_warpInfo.m_targetPos, false ); + pPlayer->sendToInRangeSet( makeWarp( pPlayer->getId(), m_warpInfo.m_warpType, m_warpInfo.m_targetPos, m_warpInfo.m_targetRot ), true ); + pPlayer->setPos( m_warpInfo.m_targetPos, false ); } std::string WarpTask::toString()