2018-03-02 07:22:25 -03:00
|
|
|
#include <boost/format.hpp>
|
|
|
|
|
2018-03-06 22:22:19 +01:00
|
|
|
#include <Common.h>
|
|
|
|
#include <Network/CommonNetwork.h>
|
|
|
|
#include <Network/GamePacketNew.h>
|
|
|
|
#include <Logging/Logger.h>
|
|
|
|
#include <Exd/ExdDataGenerated.h>
|
|
|
|
#include <Network/PacketContainer.h>
|
2018-06-23 21:38:04 +02:00
|
|
|
#include <Network/CommonActorControl.h>
|
2018-07-06 22:43:49 +10:00
|
|
|
#include <Network/PacketDef/Zone/ClientZoneDef.h>
|
2017-08-17 16:19:20 +02:00
|
|
|
|
2017-12-08 15:38:25 +01:00
|
|
|
#include "Zone/Zone.h"
|
|
|
|
#include "Zone/ZonePosition.h"
|
|
|
|
|
2018-03-02 07:22:25 -03:00
|
|
|
#include "Network/GameConnection.h"
|
2017-12-08 15:38:25 +01:00
|
|
|
#include "Network/PacketWrappers/InitUIPacket.h"
|
|
|
|
#include "Network/PacketWrappers/PingPacket.h"
|
|
|
|
#include "Network/PacketWrappers/MoveActorPacket.h"
|
|
|
|
#include "Network/PacketWrappers/ChatPacket.h"
|
|
|
|
#include "Network/PacketWrappers/ServerNoticePacket.h"
|
|
|
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
|
|
|
|
2018-01-28 11:16:34 +01:00
|
|
|
#include "DebugCommand/DebugCommandHandler.h"
|
2018-03-02 07:22:25 -03:00
|
|
|
|
2017-12-08 15:38:25 +01:00
|
|
|
#include "Event/EventHelper.h"
|
2018-03-02 07:22:25 -03:00
|
|
|
|
2017-12-08 15:38:25 +01:00
|
|
|
#include "Action/Action.h"
|
|
|
|
#include "Action/ActionTeleport.h"
|
2017-08-17 16:19:20 +02:00
|
|
|
|
2018-03-02 07:22:25 -03:00
|
|
|
#include "Session.h"
|
|
|
|
#include "ServerZone.h"
|
|
|
|
#include "Forwards.h"
|
|
|
|
#include "Framework.h"
|
2018-06-23 21:38:04 +02:00
|
|
|
#include <Network/PacketDef/Lobby/ServerLobbyDef.h>
|
2018-03-02 07:22:25 -03:00
|
|
|
|
2018-03-09 00:06:44 +01:00
|
|
|
extern Core::Framework g_fw;
|
2017-08-17 16:19:20 +02:00
|
|
|
|
|
|
|
using namespace Core::Common;
|
|
|
|
using namespace Core::Network::Packets;
|
|
|
|
using namespace Core::Network::Packets::Server;
|
2018-06-23 21:38:04 +02:00
|
|
|
using namespace Core::Network::ActorControl;
|
2017-08-17 16:19:20 +02:00
|
|
|
|
2018-07-03 15:01:13 +02:00
|
|
|
void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket,
|
|
|
|
Entity::Player& player )
|
2017-08-17 16:19:20 +02:00
|
|
|
{
|
2018-03-15 03:13:20 +11:00
|
|
|
auto pLog = g_fw.get< Logger >();
|
2018-07-06 22:43:49 +10:00
|
|
|
|
2018-07-06 23:36:50 +10:00
|
|
|
const auto packet = ZoneChannelPacket< Client::FFXIVIpcClientTrigger >( inPacket );
|
|
|
|
|
|
|
|
const auto& commandId = packet.data().commandId;
|
|
|
|
const auto& param1 = packet.data().param1;
|
|
|
|
const auto& param11 = *reinterpret_cast< const uint32_t* >( &packet.data().param1 );
|
|
|
|
const auto& param12 = *reinterpret_cast< const uint32_t* >( &packet.data().param1 + sizeof( uint32_t ) );
|
|
|
|
const auto& param2 = packet.data().param2;
|
|
|
|
const auto& param3 = packet.data().param3;
|
2018-03-15 03:13:20 +11:00
|
|
|
|
|
|
|
pLog->debug( "[" + std::to_string( m_pSession->getId() ) + "] Incoming action: " +
|
|
|
|
boost::str( boost::format( "%|04X|" ) % ( uint32_t ) ( commandId & 0xFFFF ) ) +
|
|
|
|
"\nparam1: " + boost::str( boost::format( "%|016X|" ) % ( uint64_t ) ( param1 & 0xFFFFFFFFFFFFFFF ) ) +
|
|
|
|
"\nparam2: " + boost::str( boost::format( "%|08X|" ) % ( uint32_t ) ( param2 & 0xFFFFFFFF ) ) +
|
|
|
|
"\nparam3: " + boost::str( boost::format( "%|016X|" ) % ( uint64_t ) ( param3 & 0xFFFFFFFFFFFFFFF ) )
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
//g_log.Log(LoggingSeverity::debug, "[" + std::to_string(m_pSession->getId()) + "] " + pInPacket->toString());
|
|
|
|
|
|
|
|
switch( commandId )
|
|
|
|
{
|
2018-07-06 22:43:26 +10:00
|
|
|
case ClientTriggerType::ToggleSheathe: // Toggle sheathe
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
2018-03-15 03:13:20 +11:00
|
|
|
if ( param11 == 1 )
|
|
|
|
player.setStance( Entity::Chara::Stance::Active );
|
|
|
|
else
|
|
|
|
{
|
|
|
|
player.setStance( Entity::Chara::Stance::Passive );
|
|
|
|
player.setAutoattack( false );
|
|
|
|
}
|
|
|
|
|
2018-06-28 00:07:07 +02:00
|
|
|
player.sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( player.getId(), 0, param11, 1 ) );
|
2018-03-15 03:13:20 +11:00
|
|
|
|
|
|
|
break;
|
2018-03-15 03:31:46 +11:00
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::ToggleAutoAttack: // Toggle auto-attack
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
2018-03-15 03:13:20 +11:00
|
|
|
if ( param11 == 1 )
|
|
|
|
{
|
|
|
|
player.setAutoattack( true );
|
|
|
|
player.setStance( Entity::Chara::Stance::Active );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
player.setAutoattack( false );
|
|
|
|
|
2018-06-28 00:07:07 +02:00
|
|
|
player.sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( player.getId(), 1, param11, 1 ) );
|
2018-03-15 03:13:20 +11:00
|
|
|
|
|
|
|
break;
|
2018-03-15 03:31:46 +11:00
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::ChangeTarget: // Change target
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
2018-03-15 03:13:20 +11:00
|
|
|
|
2018-06-18 23:03:39 +02:00
|
|
|
uint64_t targetId = param1;
|
2018-03-15 03:13:20 +11:00
|
|
|
player.changeTarget( targetId );
|
|
|
|
break;
|
2018-03-15 03:31:46 +11:00
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::DismountReq:
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
|
|
|
player.dismount();
|
|
|
|
break;
|
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::RemoveStatusEffect: // Remove status (clicking it off)
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
|
|
|
// todo: check if status can be removed by client from exd
|
|
|
|
player.removeSingleStatusEffectById( static_cast< uint32_t >( param1 ) );
|
|
|
|
break;
|
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::CastCancel: // Cancel cast
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
|
|
|
if( player.getCurrentAction() )
|
|
|
|
player.getCurrentAction()->setInterrupted();
|
|
|
|
break;
|
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::MarkPlayer: // Mark player
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::SetTitleReq: // Set player title
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
|
|
|
player.setTitle( static_cast< uint16_t >( param1 ) );
|
|
|
|
break;
|
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::TitleList: // Get title list
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
|
|
|
player.sendTitleList();
|
|
|
|
break;
|
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::UpdatedSeenHowTos: // Update howtos seen
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
2018-03-15 03:13:20 +11:00
|
|
|
uint32_t howToId = param11;
|
|
|
|
player.updateHowtosSeen( howToId );
|
|
|
|
break;
|
2018-03-15 03:31:46 +11:00
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::EmoteReq: // emote
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
2018-03-15 03:13:20 +11:00
|
|
|
uint64_t targetId = player.getTargetId();
|
2018-06-18 23:03:39 +02:00
|
|
|
uint32_t emoteId = param11;
|
2018-03-15 03:13:20 +11:00
|
|
|
|
|
|
|
player.emote( emoteId, targetId );
|
|
|
|
break;
|
2018-03-15 03:31:46 +11:00
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::PersistantEmoteCancel: // cancel persistant emote
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
2018-03-15 03:13:20 +11:00
|
|
|
break;
|
2018-03-15 03:31:46 +11:00
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::PoseChange: // change pose
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
2018-03-15 03:13:20 +11:00
|
|
|
break;
|
2018-03-15 03:31:46 +11:00
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::PoseReapply: // reapply pose
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
2018-03-15 03:13:20 +11:00
|
|
|
break;
|
2018-03-15 03:31:46 +11:00
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::PoseCancel: // cancel pose
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
2018-03-15 03:13:20 +11:00
|
|
|
break;
|
2018-03-15 03:31:46 +11:00
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::Return: // return dead / accept raise
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
|
|
|
switch ( static_cast < ResurrectType >( param1 ) )
|
|
|
|
{
|
|
|
|
case ResurrectType::RaiseSpell:
|
|
|
|
// todo: handle raise case (set position to raiser, apply weakness status, set hp/mp/tp as well as packet)
|
|
|
|
player.returnToHomepoint();
|
|
|
|
break;
|
|
|
|
case ResurrectType::Return:
|
|
|
|
player.returnToHomepoint();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::FinishZoning: // Finish zoning
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
2018-03-15 03:13:20 +11:00
|
|
|
player.finishZoning();
|
|
|
|
break;
|
2018-03-15 03:31:46 +11:00
|
|
|
}
|
2018-03-15 03:13:20 +11:00
|
|
|
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::Teleport: // Teleport
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
2018-03-15 03:13:20 +11:00
|
|
|
|
|
|
|
player.teleportQuery( param11 );
|
2018-03-05 23:01:55 +01:00
|
|
|
break;
|
2018-03-15 03:31:46 +11:00
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::DyeItem: // Dye item
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::DirectorInitFinish: // Director init finish
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
|
|
|
player.getCurrentZone()->onInitDirector( player );
|
|
|
|
break;
|
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::SomeDirectorEvent: // Director init finish
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
|
|
|
player.getCurrentZone()->onSomeDirectorEvent( player );
|
|
|
|
break;
|
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::EnterTerritoryEventFinished:// this may still be something else. I think i have seen it elsewhere
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
|
|
|
player.setOnEnterEventDone( true );
|
|
|
|
break;
|
|
|
|
}
|
2018-07-03 14:31:20 +02:00
|
|
|
case ClientTriggerType::RequestInstanceLeave:
|
2018-03-15 03:31:46 +11:00
|
|
|
{
|
|
|
|
// todo: apply cf penalty if applicable, make sure player isnt in combat
|
|
|
|
player.exitInstance();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
pLog->debug( "[" + std::to_string( m_pSession->getId() ) + "] Unhandled action: " +
|
|
|
|
boost::str( boost::format( "%|04X|" ) % (uint32_t) ( commandId & 0xFFFF ) ) );
|
|
|
|
break;
|
|
|
|
}
|
2018-03-15 03:13:20 +11:00
|
|
|
}
|
2017-08-17 16:19:20 +02:00
|
|
|
}
|