1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-28 15:17:46 +00:00
sapphire/src/world/Network/Handlers/ActionHandler.cpp

136 lines
4.1 KiB
C++
Raw Normal View History

2018-03-06 22:22:19 +01:00
#include <Common.h>
#include <Network/CommonNetwork.h>
#include <Exd/ExdDataGenerated.h>
#include <Network/GamePacketNew.h>
#include <Network/PacketContainer.h>
#include <Network/CommonActorControl.h>
#include <Network/PacketDef/Zone/ClientZoneDef.h>
2018-03-06 22:22:19 +01:00
#include <Logging/Logger.h>
2018-10-26 08:25:20 +02:00
#include <Util/Util.h>
#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 "Action/Action.h"
#include "Action/ActionCast.h"
#include "Action/ActionMount.h"
#include "Script/ScriptMgr.h"
#include "Session.h"
#include "Framework.h"
using namespace Sapphire::Common;
using namespace Sapphire::Network::Packets;
using namespace Sapphire::Network::Packets::Server;
using namespace Sapphire::Network::ActorControl;
2018-12-23 03:53:08 +01:00
void Sapphire::Network::GameConnection::actionHandler( FrameworkPtr pFw,
const Packets::FFXIVARR_PACKET_RAW& inPacket,
Entity::Player& player )
{
const auto packet = ZoneChannelPacket< Client::FFXIVIpcSkillHandler >( inPacket );
2018-06-28 00:07:07 +02:00
2018-10-14 23:31:52 +11:00
const auto type = packet.data().type;
const auto action = packet.data().actionId;
const auto useCount = packet.data().useCount;
const auto targetId = packet.data().targetId;
2019-01-05 12:32:10 +01:00
player.sendDebug( "Skill type: {0}", type );
2018-12-23 03:53:08 +01:00
auto pExdData = pFw->get< Data::ExdDataGenerated >();
auto pScriptMgr = pFw->get< Scripting::ScriptMgr >();
switch( type )
{
case Common::SkillType::Normal:
if( action < 1000000 ) // normal action
{
2018-10-26 08:25:20 +02:00
std::string actionIdStr = Util::intToHexString( action, 4 );
player.sendDebug( "---------------------------------------" );
2019-01-05 12:32:10 +01:00
player.sendDebug( "ActionHandler ( {0} | {1} | {2} )",
actionIdStr, pExdData->get< Sapphire::Data::Action >( action )->name, targetId );
player.queuePacket( makeActorControl142( player.getId(), ActorControlType::ActionStart, 0x01, action ) );
if( action == 5 )
{
auto currentAction = player.getCurrentAction();
// we should always have an action here, if not there is a bug
assert( currentAction );
currentAction->onStart();
}
else
{
Sapphire::Entity::ActorPtr targetActor = player.getAsPlayer();
if( targetId != player.getId() )
{
targetActor = player.lookupTargetById( targetId );
}
// Check if we actually have an actor
if( !targetActor )
{
// todo: interrupt a cast.
player.sendDebug( "Invalid target." );
return;
}
if( !player.actionHasCastTime( action ) )
{
pScriptMgr->onCastFinish( player, targetActor->getAsChara(), action );
}
else
{
auto pActionCast = Action::make_ActionCast( player.getAsPlayer(), targetActor->getAsChara(), action, m_pFw );
player.setCurrentAction( pActionCast );
player.sendDebug( "setCurrentAction()" );
player.getCurrentAction()->onStart();
}
}
}
else if( action < 2000000 ) // craft action
{
}
else if( action < 3000000 ) // item action
{
auto info = pExdData->get< Sapphire::Data::EventItem >( action );
if( info )
{
pScriptMgr->onEventItem( player, action, info->quest, info->castTime, targetId );
}
}
else if( action > 3000000 ) // unknown
{
}
break;
case Common::SkillType::MountSkill:
2019-01-05 12:32:10 +01:00
player.sendDebug( "Request mount {0}", action );
auto pActionMount = Action::make_ActionMount( player.getAsPlayer(), action );
player.setCurrentAction( pActionMount );
player.sendDebug( "setCurrentAction()" );
player.getCurrentAction()->onStart();
break;
}
}