diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index 512908fb..f035b1b9 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -465,25 +465,29 @@ void Sapphire::Entity::Player::teleport( uint16_t aetheryteId, uint8_t type ) setZoningType( Common::ZoneingType::Return ); } - m_queuedZoneing = std::make_shared< QueuedZoning >( data.TerritoryType, pos, Util::getTimeMs(), rot ); + m_queuedZoneing = std::make_shared< QueuedZoning >( data.TerritoryType, 0, pos, Util::getTimeMs(), rot ); } void Sapphire::Entity::Player::forceZoneing( uint32_t zoneId ) { - m_queuedZoneing = std::make_shared< QueuedZoning >( zoneId, getPos(), Util::getTimeMs(), 0.f ); + m_queuedZoneing = std::make_shared< QueuedZoning >( zoneId, 0, getPos(), Util::getTimeMs(), 0.f ); } -void Sapphire::Entity::Player::performZoning( uint16_t zoneId, const Common::FFXIVARR_POSITION3& pos, float rotation ) +void Sapphire::Entity::Player::performZoning( uint16_t territoryTypeId, uint32_t territoryId, const Common::FFXIVARR_POSITION3& pos, float rotation ) { m_pos = pos; - m_territoryTypeId = zoneId; m_bMarkedForZoning = true; setRot( rotation ); auto& teriMgr = Common::Service< TerritoryMgr >::ref(); m_onEnterEventDone = false; - auto pZone = teriMgr.getZoneByTerritoryTypeId( zoneId ); + TerritoryPtr pZone; + if( territoryId != 0 ) + pZone = teriMgr.getTerritoryByGuId( territoryId ); + else + pZone = teriMgr.getZoneByTerritoryTypeId( territoryTypeId ); + if( !teriMgr.movePlayer( pZone, *this ) ) { // todo: this will require proper handling, for now just return the player to their previous area @@ -516,8 +520,7 @@ bool Sapphire::Entity::Player::setInstance( uint32_t territoryId, Common::FFXIVA m_prevRot = m_rot; } - if( !teriMgr.movePlayer( instance, *this ) ) - return false; + m_queuedZoneing = std::make_shared< QueuedZoning >( instance->getTerritoryTypeId(), territoryId, m_pos, Util::getTimeMs(), m_rot ); m_pos = pos; return true; @@ -531,17 +534,12 @@ bool Sapphire::Entity::Player::exitInstance() resetHp(); resetMp(); - TerritoryPtr pTeri = teriMgr.getTerritoryByGuId( m_prevTerritoryId ); - - if( !teriMgr.movePlayer( pTeri, *this ) ) - return false; - m_pos = m_prevPos; m_rot = m_prevRot; m_territoryTypeId = m_prevTerritoryTypeId; m_territoryId = m_prevTerritoryId; - //m_queuedZoneing = std::make_shared< QueuedZoning >( m_territoryTypeId, m_pos, Util::getTimeMs(), m_rot ); + m_queuedZoneing = std::make_shared< QueuedZoning >( m_territoryTypeId, getTerritoryId(), m_pos, Util::getTimeMs(), m_rot ); return true; } @@ -696,7 +694,7 @@ void Sapphire::Entity::Player::resetDiscovery() void Sapphire::Entity::Player::changePosition( float x, float y, float z, float o ) { Common::FFXIVARR_POSITION3 pos{ x, y, z }; - m_queuedZoneing = std::make_shared< QueuedZoning >( getTerritoryTypeId(), pos, Util::getTimeMs(), o ); + m_queuedZoneing = std::make_shared< QueuedZoning >( getTerritoryTypeId(), 0, pos, Util::getTimeMs(), o ); } void Sapphire::Entity::Player::setSystemActionUnlocked( Common::UnlockEntry unlockId ) @@ -1054,9 +1052,10 @@ void Sapphire::Entity::Player::update( uint64_t tickCount ) if( m_queuedZoneing && ( tickCount - m_queuedZoneing->m_queueTime ) > 800 ) { Common::FFXIVARR_POSITION3 targetPos = m_queuedZoneing->m_targetPosition; - if( getTerritoryTypeId() != m_queuedZoneing->m_targetZone ) + if( getTerritoryTypeId() != m_queuedZoneing->m_targetTerritoryTypeId ) { - performZoning( m_queuedZoneing->m_targetZone, targetPos, m_queuedZoneing->m_targetRotation ); + Logger::debug( "{}_{}", m_queuedZoneing->m_targetTerritoryTypeId, m_queuedZoneing->m_targetTerritoryId ); + performZoning( m_queuedZoneing->m_targetTerritoryTypeId, m_queuedZoneing->m_targetTerritoryId, targetPos, m_queuedZoneing->m_targetRotation ); } else { diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index 1360477d..92f17949 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -20,17 +20,19 @@ namespace Sapphire::Entity struct QueuedZoning { - uint16_t m_targetZone; + uint16_t m_targetTerritoryTypeId; + uint32_t m_targetTerritoryId; Common::FFXIVARR_POSITION3 m_targetPosition; float m_targetRotation; uint64_t m_queueTime; - QueuedZoning( uint16_t targetZone, const Common::FFXIVARR_POSITION3& targetPosition, + QueuedZoning( uint16_t targetZone, uint32_t targetTerritoryId, const Common::FFXIVARR_POSITION3& targetPosition, uint64_t queuedTime, float targetRotation ) : - m_targetZone( targetZone ), - m_targetPosition( targetPosition ), - m_queueTime( queuedTime ), - m_targetRotation( targetRotation ) + m_targetTerritoryTypeId( targetZone ), + m_targetTerritoryId( targetTerritoryId ), + m_targetPosition( targetPosition ), + m_queueTime( queuedTime ), + m_targetRotation( targetRotation ) { } }; @@ -581,7 +583,7 @@ namespace Sapphire::Entity void setLoadingComplete( bool bComplete ); /*! mark this player for zoning, notify worldserver */ - void performZoning( uint16_t zoneId, const Common::FFXIVARR_POSITION3& pos, float rotation ); + void performZoning( uint16_t territoryTypeId, uint32_t territoryId, const Common::FFXIVARR_POSITION3& pos, float rotation ); /*! return true if the player is marked for zoning */ bool isMarkedForZoning() const; diff --git a/src/world/Network/Handlers/GMCommandHandlers.cpp b/src/world/Network/Handlers/GMCommandHandlers.cpp index 448eeddf..04c31b2b 100644 --- a/src/world/Network/Handlers/GMCommandHandlers.cpp +++ b/src/world/Network/Handlers/GMCommandHandlers.cpp @@ -194,7 +194,7 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR case GmCommand::Call: { if( targetPlayer->getTerritoryTypeId() != player.getTerritoryTypeId() ) - targetPlayer->performZoning( player.getTerritoryTypeId(), { player.getPos().x, player.getPos().y, player.getPos().z }, player.getRot() ); + targetPlayer->performZoning( player.getTerritoryTypeId(), player.getTerritoryId(), { player.getPos().x, player.getPos().y, player.getPos().z }, player.getRot() ); else targetPlayer->changePosition( player.getPos().x, player.getPos().y, player.getPos().z, player.getRot() ); PlayerMgr::sendServerNotice( player, "Calling {0}", targetPlayer->getName() ); @@ -486,7 +486,7 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR break; } - //player.setInstance( param1, { 0, 0, 0 } ); + player.setInstance( param1, { 0, 0, 0 } ); } else if( !teriMgr.isValidTerritory( param1 ) ) { @@ -533,7 +533,7 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR else { targetPlayer->setPos( targetPlayer->getPos() ); - targetPlayer->performZoning( static_cast< uint16_t >( param1 ), targetPlayer->getPos(), 0 ); + targetPlayer->performZoning( static_cast< uint16_t >( param1 ), targetPlayer->getTerritoryId(), targetPlayer->getPos(), 0 ); } PlayerMgr::sendServerNotice( player, "{0} was warped to zone {1}", targetPlayer->getName(), param1, pZone->getName() ); diff --git a/src/world/Network/Handlers/PacketHandlers.cpp b/src/world/Network/Handlers/PacketHandlers.cpp index 5e12fb22..137af674 100644 --- a/src/world/Network/Handlers/PacketHandlers.cpp +++ b/src/world/Network/Handlers/PacketHandlers.cpp @@ -359,7 +359,7 @@ void Sapphire::Network::GameConnection::zoneJumpHandler( const Packets::FFXIVARR PlayerMgr::sendDebug( player, "Walking ZoneLine#{0}", exitBoxId ); - player.performZoning( targetZone, targetPos, rotation ); + player.performZoning( targetZone, 0, targetPos, rotation ); }