From a69ccd33df347512672e9b4480a8d2ad47c131f6 Mon Sep 17 00:00:00 2001 From: Mordred Date: Sun, 18 Feb 2018 01:50:20 +0100 Subject: [PATCH] More cleanup of actionhandler --- src/servers/sapphire_zone/Actor/Player.cpp | 85 +++++++++++++++++-- src/servers/sapphire_zone/Actor/Player.h | 6 ++ .../Network/Handlers/ActionHandler.cpp | 59 +------------ 3 files changed, 89 insertions(+), 61 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 18cec2d1..4c7c3df8 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -19,6 +19,7 @@ #include "Network/GameConnection.h" #include "Network/PacketWrappers/ActorControlPacket142.h" #include "Network/PacketWrappers/ActorControlPacket143.h" +#include "Network/PacketWrappers/ActorControlPacket144.h" #include "Network/PacketWrappers/InitUIPacket.h" #include "Network/PacketWrappers/ServerNoticePacket.h" #include "Network/PacketWrappers/ChatPacket.h" @@ -36,6 +37,7 @@ #include "Action/Action.h" #include "Action/EventAction.h" #include "Action/EventItemAction.h" +#include "Action/ActionTeleport.h" #include "Zone/ZonePosition.h" #include "Math/CalcStats.h" #include "Math/CalcBattle.h" @@ -299,7 +301,7 @@ void Core::Entity::Player::teleport( uint16_t aetheryteId, uint8_t type ) setStateFlag( PlayerStateFlag::BetweenAreas ); - auto z_pos = g_territoryMgr.getTerritoryPosition( data->territory ); + auto targetPos = g_territoryMgr.getTerritoryPosition( data->territory ); Common::FFXIVARR_POSITION3 pos; pos.x = 0; @@ -307,10 +309,10 @@ void Core::Entity::Player::teleport( uint16_t aetheryteId, uint8_t type ) pos.z = 0; float rot = 0; - if( z_pos != nullptr ) + if( targetPos != nullptr ) { - pos = z_pos->getTargetPosition(); - rot = z_pos->getTargetRotation(); + pos = targetPos->getTargetPosition(); + rot = targetPos->getTargetRotation(); } sendDebug( "Teleport: " + g_exdDataGen.get< Core::Data::PlaceName >( data->placeName )->name + " " + @@ -1638,10 +1640,83 @@ bool Core::Entity::Player::isDirectorInitialized() const return m_directorInitialized; } -void Core::Entity::Player::sendTitleList() +void Core::Entity::Player::sendTitleList() { ZoneChannelPacket< FFXIVIpcPlayerTitleList > titleListPacket( getId() ); memcpy( titleListPacket.data().titleList, getTitleList(), sizeof( titleListPacket.data().titleList ) ); queuePacket( titleListPacket ); } + +void Core::Entity::Player::finishZoning() +{ + switch( getZoningType() ) + { + case ZoneingType::None: + sendToInRangeSet( ActorControlPacket143( getId(), ZoneIn, 0x01 ), true ); + break; + + case ZoneingType::Teleport: + sendToInRangeSet( ActorControlPacket143( getId(), ZoneIn, 0x01, 0, 0, 110 ), true ); + break; + + case ZoneingType::Return: + case ZoneingType::ReturnDead: + { + if( getStatus() == Entity::Actor::ActorStatus::Dead ) + { + resetHp(); + resetMp(); + setStatus( Entity::Actor::ActorStatus::Idle ); + + sendToInRangeSet( ActorControlPacket143( getId(), ZoneIn, 0x01, 0x01, 0, 111 ), true ); + sendToInRangeSet( ActorControlPacket142( getId(), SetStatus, + static_cast< uint8_t >( Entity::Actor::ActorStatus::Idle ) ), true ); + } + else + sendToInRangeSet( ActorControlPacket143( getId(), ZoneIn, 0x01, 0x00, 0, 111 ), true ); + } + break; + + case ZoneingType::FadeIn: + break; + } + + setZoningType( Common::ZoneingType::None ); + unsetStateFlag( PlayerStateFlag::BetweenAreas ); +} + +void Player::emote( uint32_t emoteId, uint64_t targetId ) +{ + sendToInRangeSet( ActorControlPacket144( getId(), ActorControlType::Emote, emoteId, 0, 0, 0, targetId ) ); +} + +void Player::teleportQuery( uint16_t aetheryteId ) +{ + // TODO: only register this action if enough gil is in possession + auto targetAetheryte = g_exdDataGen.get< Core::Data::Aetheryte >( aetheryteId ); + + if( targetAetheryte ) + { + auto fromAetheryte = g_exdDataGen.get< Core::Data::Aetheryte >( + g_exdDataGen.get< Core::Data::TerritoryType >( getZoneId() )->aetheryte ); + + // calculate cost - does not apply for favorite points or homepoints neither checks for aether tickets + auto cost = static_cast< uint16_t > ( ( sqrt( pow( fromAetheryte->aetherstreamX - targetAetheryte->aetherstreamX, 2 ) + + pow( fromAetheryte->aetherstreamY - targetAetheryte->aetherstreamY, 2 ) ) / 2 ) + 100 ); + + // cap at 999 gil + cost = cost > uint16_t{999} ? uint16_t{999} : cost; + + bool insufficientGil = getCurrency( Inventory::CurrencyType::Gil ) < cost; + // TODO: figure out what param1 really does + queuePacket( ActorControlPacket143( getId(), TeleportStart, insufficientGil ? 2 : 0, aetheryteId ) ); + + if( !insufficientGil ) + { + Action::ActionPtr pActionTeleport; + pActionTeleport = Action::make_ActionTeleport( getAsPlayer(), aetheryteId, cost ); + setCurrentAction( pActionTeleport ); + } + } +} diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index 65f7638e..7fb80e58 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -343,6 +343,8 @@ public: uint64_t getOnlineStatusMask() const; /*! perform a teleport of a specified type ( teleport,return,aethernet ) */ void teleport( uint16_t aetheryteId, uint8_t type = 1 ); + /*! query teleport of a specified type */ + void teleportQuery( uint16_t aetheryteId ); /*! prepares zoning / fades out the screen */ void prepareZoning( uint16_t targetZone, bool fadeOut, uint8_t fadoutTime = 0, uint16_t animation = 0 ); /*! get player's title list (available titles) */ @@ -488,6 +490,10 @@ public: /*! return true if the player is marked for zoning */ bool isMarkedForZoning() const; + void emote( uint32_t emoteId, uint64_t targetId ); + + void finishZoning(); + void sendZonePackets(); Common::ZoneingType getZoningType() const; diff --git a/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp index e20a9784..b04e9074 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp @@ -191,7 +191,7 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in uint64_t targetId = player.getTargetId(); uint32_t emoteId = inPacket.getValAt< uint32_t >( 0x24 ); - player.sendToInRangeSet( ActorControlPacket144( player.getId(), ActorControlType::Emote, emoteId, 0, 0, 0, targetId ) ); + player.emote( emoteId, targetId ); break; } case ClientTrigger::PersistantEmoteCancel: // cancel persistant emote @@ -228,66 +228,13 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in } case ClientTrigger::FinishZoning: // Finish zoning { - switch( player.getZoningType() ) - { - case ZoneingType::None: - player.sendToInRangeSet( ActorControlPacket143( player.getId(), ZoneIn, 0x01 ), true ); - break; - case ZoneingType::Teleport: - player.sendToInRangeSet( ActorControlPacket143( player.getId(), ZoneIn, 0x01, 0, 0, 110 ), true ); - break; - case ZoneingType::Return: - case ZoneingType::ReturnDead: - { - if( player.getStatus() == Entity::Actor::ActorStatus::Dead ) - { - player.resetHp(); - player.resetMp(); - player.setStatus( Entity::Actor::ActorStatus::Idle ); - - player.sendToInRangeSet( ActorControlPacket143( player.getId(), ZoneIn, 0x01, 0x01, 0, 111 ), true ); - player.sendToInRangeSet( ActorControlPacket142( player.getId(), SetStatus, static_cast< uint8_t >( Entity::Actor::ActorStatus::Idle ) ), true ); - } - else - player.sendToInRangeSet( ActorControlPacket143( player.getId(), ZoneIn, 0x01, 0x00, 0, 111 ), true ); - } - break; - case ZoneingType::FadeIn: - break; - } - - player.setZoningType( Common::ZoneingType::None ); - - player.unsetStateFlag( PlayerStateFlag::BetweenAreas ); + player.finishZoning(); break; } case ClientTrigger::Teleport: // Teleport { - // TODO: only register this action if enough gil is in possession - auto targetAetheryte = g_exdDataGen.get< Core::Data::Aetheryte >( param11 ); - - if( targetAetheryte ) - { - auto fromAetheryte = g_exdDataGen.get< Core::Data::Aetheryte >( g_exdDataGen.get< Core::Data::TerritoryType >( player.getZoneId() )->aetheryte ); - - // calculate cost - does not apply for favorite points or homepoints neither checks for aether tickets - auto cost = static_cast< uint16_t > ( ( sqrt( pow( fromAetheryte->aetherstreamX - targetAetheryte->aetherstreamX, 2 ) + - pow( fromAetheryte->aetherstreamY - targetAetheryte->aetherstreamY, 2 ) ) / 2 ) + 100 ); - - // cap at 999 gil - cost = cost > uint16_t{999} ? uint16_t{999} : cost; - - bool insufficientGil = player.getCurrency( Inventory::CurrencyType::Gil ) < cost; - // todo: figure out what param1 really does - player.queuePacket( ActorControlPacket143( player.getId(), TeleportStart, insufficientGil ? 2 : 0, param11 ) ); - - if( !insufficientGil ) - { - auto pActionTeleport = Action::make_ActionTeleport( player.getAsPlayer(), param11, cost ); - player.setCurrentAction( pActionTeleport ); - } - } + player.teleportQuery( param11 ); break; } case ClientTrigger::DyeItem: // Dye item