diff --git a/src/world/Manager/ActionMgr.cpp b/src/world/Manager/ActionMgr.cpp index 58c1dfb3..cd066c59 100644 --- a/src/world/Manager/ActionMgr.cpp +++ b/src/world/Manager/ActionMgr.cpp @@ -1,5 +1,12 @@ #include "ActionMgr.h" +#include "Action/Action.h" +#include "Script/ScriptMgr.h" + +#include "Actor/Player.h" + +#include + using namespace Sapphire; World::Manager::ActionMgr::ActionMgr( Sapphire::FrameworkPtr pFw ) : @@ -9,13 +16,13 @@ World::Manager::ActionMgr::ActionMgr( Sapphire::FrameworkPtr pFw ) : } void World::Manager::ActionMgr::handleAoEPlayerAction( Entity::Player& player, uint8_t type, - uint32_t actionId, Common::FFXIVARR_POSITION3 pos ) + Data::ActionPtr action, Common::FFXIVARR_POSITION3 pos ) { - + player.sendDebug( "got aoe act: {0}", action->name ); } void World::Manager::ActionMgr::handleTargetedPlayerAction( Entity::Player& player, uint8_t type, - uint32_t actionId, uint64_t targetId ) + Data::ActionPtr action, uint64_t targetId ) { - + player.sendDebug( "got act: {0}", action->name ); } \ No newline at end of file diff --git a/src/world/Manager/ActionMgr.h b/src/world/Manager/ActionMgr.h index 1745de04..0e06ce31 100644 --- a/src/world/Manager/ActionMgr.h +++ b/src/world/Manager/ActionMgr.h @@ -4,6 +4,12 @@ #include "BaseManager.h" #include "ForwardsZone.h" +namespace Sapphire::Data +{ + class Action; + using ActionPtr = std::shared_ptr< Action >; +} + namespace Sapphire::World::Manager { class ActionMgr : public Manager::BaseManager @@ -12,8 +18,8 @@ namespace Sapphire::World::Manager explicit ActionMgr( FrameworkPtr pFw ); ~ActionMgr() = default; - void handleTargetedPlayerAction( Entity::Player& player, uint8_t type, uint32_t actionId, uint64_t targetId ); - void handleAoEPlayerAction( Entity::Player& player, uint8_t type, uint32_t actionId, Common::FFXIVARR_POSITION3 pos ); + void handleTargetedPlayerAction( Entity::Player& player, uint8_t type, Data::ActionPtr action, uint64_t targetId ); + void handleAoEPlayerAction( Entity::Player& player, uint8_t type, Data::ActionPtr action, Common::FFXIVARR_POSITION3 pos ); }; } diff --git a/src/world/Network/Handlers/ActionHandler.cpp b/src/world/Network/Handlers/ActionHandler.cpp index 9d50a599..5ca1a98c 100644 --- a/src/world/Network/Handlers/ActionHandler.cpp +++ b/src/world/Network/Handlers/ActionHandler.cpp @@ -1,35 +1,18 @@ #include -#include #include #include -#include -#include #include #include -#include + +#include #include "Network/GameConnection.h" -#include "Network/PacketWrappers/ServerNoticePacket.h" -#include "Network/PacketWrappers/ActorControlPacket142.h" -#include "Network/PacketWrappers/ActorControlPacket143.h" -#include "Network/PacketWrappers/ActorControlPacket144.h" -#include "Network/PacketWrappers/MoveActorPacket.h" - -#include "Network/PacketWrappers/PlayerStateFlagsPacket.h" - -#include "Manager/DebugCommandMgr.h" -#include "Manager/ActionMgr.h" - -#include "Action/Action.h" -#include "Script/ScriptMgr.h" - -#include "Session.h" #include "Framework.h" +#include "Manager/ActionMgr.h" + using namespace Sapphire::Common; using namespace Sapphire::Network::Packets; -using namespace Sapphire::Network::Packets::Server; -using namespace Sapphire::Network::ActorControl; void Sapphire::Network::GameConnection::actionHandler( FrameworkPtr pFw, const Packets::FFXIVARR_PACKET_RAW& inPacket, @@ -38,14 +21,23 @@ void Sapphire::Network::GameConnection::actionHandler( FrameworkPtr pFw, const auto packet = ZoneChannelPacket< Client::FFXIVIpcSkillHandler >( inPacket ); const auto type = packet.data().type; - const auto action = packet.data().actionId; + const auto actionId = packet.data().actionId; const auto sequence = packet.data().sequence; const auto targetId = packet.data().targetId; - player.sendDebug( "Skill type: {0}, sequence: {1}, actionId: {2}, targetId: {3}", type, sequence, action, targetId ); + auto exdData = m_pFw->get< Data::ExdDataGenerated >(); + assert( exdData ); + + auto action = exdData->get< Data::Action >( actionId ); + + // ignore invalid actions + if( !action ) + return; auto actionMgr = pFw->get< World::Manager::ActionMgr >(); actionMgr->handleTargetedPlayerAction( player, type, action, targetId ); + + player.sendDebug( "Skill type: {0}, sequence: {1}, actionId: {2}, targetId: {3}", type, sequence, actionId, targetId ); } void Sapphire::Network::GameConnection::aoeActionHandler( FrameworkPtr pFw, @@ -55,13 +47,22 @@ void Sapphire::Network::GameConnection::aoeActionHandler( FrameworkPtr pFw, const auto packet = ZoneChannelPacket< Client::FFXIVIpcAoESkillHandler >( inPacket ); const auto type = packet.data().type; - const auto action = packet.data().actionId; + const auto actionId = packet.data().actionId; const auto sequence = packet.data().sequence; const auto pos = packet.data().pos; + auto exdData = m_pFw->get< Data::ExdDataGenerated >(); + assert( exdData ); + + auto action = exdData->get< Data::Action >( actionId ); + + // ignore invalid actions + if( !action ) + return; + auto actionMgr = pFw->get< World::Manager::ActionMgr >(); actionMgr->handleAoEPlayerAction( player, type, action, pos ); - player.sendDebug( "Skill type: {0}, sequence: {1}, actionId: {2}\nx:{3}, y:{4}, z:{5}", - type, sequence, action, pos.x, pos.y, pos.z ); + player.sendDebug( "Skill type: {0}, sequence: {1}, actionId: {2}, x:{3}, y:{4}, z:{5}", + type, sequence, actionId, pos.x, pos.y, pos.z ); }