1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-27 06:47:45 +00:00
sapphire/src/world/Network/Handlers/CFHandlers.cpp

123 lines
4.1 KiB
C++
Raw Normal View History

2018-03-06 22:22:19 +01:00
#include <Common.h>
#include <Network/CommonNetwork.h>
2019-03-08 15:34:38 +01:00
#include <Network/GamePacket.h>
2018-03-06 22:22:19 +01:00
#include <Logging/Logger.h>
#include <Network/PacketContainer.h>
#include <Exd/ExdDataGenerated.h>
2020-03-01 01:00:57 +11:00
#include <Service.h>
#include "Manager/TerritoryMgr.h"
#include "Territory/InstanceContent.h"
#include "Network/GameConnection.h"
#include "Network/PacketWrappers/ServerNoticePacket.h"
#include "Network/PacketWrappers/PlayerStateFlagsPacket.h"
#include "Session.h"
using namespace Sapphire::Common;
using namespace Sapphire::Network::Packets;
using namespace Sapphire::Network::Packets::Server;
using namespace Sapphire::World::Manager;
2017-08-17 00:07:42 +02:00
2020-03-01 01:00:57 +11:00
void Sapphire::Network::GameConnection::cfDutyInfoRequest( const Packets::FFXIVARR_PACKET_RAW& inPacket,
Entity::Player& player )
2017-08-17 00:07:42 +02:00
{
auto dutyInfoPacket = makeZonePacket< FFXIVIpcCFDutyInfo >( player.getId() );
auto penaltyMinutes = player.getCFPenaltyMinutes();
if( penaltyMinutes > 255 )
{
// cap it since it's uint8_t in packets
penaltyMinutes = 255;
}
dutyInfoPacket->data().penaltyTime = static_cast< uint8_t >( penaltyMinutes );
queueOutPacket( dutyInfoPacket );
auto inNeedsPacket = makeZonePacket< FFXIVIpcCFPlayerInNeed >( player.getId() );
queueOutPacket( inNeedsPacket );
2017-08-17 00:07:42 +02:00
}
2020-03-01 01:00:57 +11:00
void Sapphire::Network::GameConnection::cfRegisterDuty( const Packets::FFXIVARR_PACKET_RAW& inPacket,
2018-12-23 03:53:08 +01:00
Entity::Player& player )
2017-08-17 00:07:42 +02:00
{
Packets::FFXIVARR_PACKET_RAW copy = inPacket;
2020-03-01 01:00:57 +11:00
auto& teriMgr = Common::Service< TerritoryMgr >::ref();
auto& exdData = Common::Service< Data::ExdDataGenerated >::ref();
std::vector< uint16_t > selectedContent;
for( uint32_t offset = 0x1E; offset <= 0x26; offset += 0x2 )
{
auto id = *reinterpret_cast< uint16_t* >( &copy.data[ offset ] );
if( id == 0 )
break;
2019-01-05 12:32:10 +01:00
player.sendDebug( "got contentId#{0}", id );
selectedContent.push_back( id );
}
// todo: rand bias problem, will do for now tho
auto index = static_cast< uint32_t >( std::rand() ) % selectedContent.size();
auto contentId = selectedContent.at( index );
2019-01-05 12:32:10 +01:00
player.sendDebug( "Duty register request for contentid#{0}", contentId );
// let's cancel it because otherwise you can't register it again
2020-05-01 20:19:10 +09:00
/*
auto cfCancelPacket = makeZonePacket< FFXIVIpcCFNotify >( player.getId() );
cfCancelPacket->data().state1 = 3;
cfCancelPacket->data().state2 = 1; // Your registration is withdrawn.
queueOutPacket( cfCancelPacket );
2020-05-01 20:19:10 +09:00
*/
auto packet = makeZonePacket< FFXIVIpcCFCancel >( player.getId() );
packet->data().cancelReason = 890;
queueOutPacket( packet );
2020-03-01 01:00:57 +11:00
auto cfCondition = exdData.get< Sapphire::Data::ContentFinderCondition >( contentId );
if( !cfCondition )
return;
2020-03-01 01:00:57 +11:00
auto instance = teriMgr.createInstanceContent( cfCondition->content );
if( !instance )
return;
auto pInstance = instance->getAsInstanceContent();
2018-09-19 23:26:36 +02:00
pInstance->bindPlayer( player.getId() );
2019-01-05 12:32:10 +01:00
player.sendDebug( "Created instance with id#", instance->getGuId() );
player.setInstance( instance );
2017-08-17 00:07:42 +02:00
}
2020-03-01 01:00:57 +11:00
void Sapphire::Network::GameConnection::cfRegisterRoulette( const Packets::FFXIVARR_PACKET_RAW& inPacket,
2018-12-23 03:53:08 +01:00
Entity::Player& player )
2017-08-17 00:07:42 +02:00
{
2020-05-01 20:19:10 +09:00
/*
auto cfCancelPacket = makeZonePacket< FFXIVIpcCFNotify >( player.getId() );
cfCancelPacket->data().state1 = 3;
cfCancelPacket->data().state2 = 1; // Your registration is withdrawn.
queueOutPacket( cfCancelPacket );
2020-05-01 20:19:10 +09:00
*/
auto packet = makeZonePacket< FFXIVIpcCFCancel >( player.getId() );
packet->data().cancelReason = 890;
queueOutPacket( packet );
player.sendDebug( "Roulette register" );
2017-08-17 00:07:42 +02:00
}
2020-03-01 01:00:57 +11:00
void Sapphire::Network::GameConnection::cfDutyAccepted( const Packets::FFXIVARR_PACKET_RAW& inPacket,
2018-12-23 03:53:08 +01:00
Entity::Player& player )
2017-08-17 00:07:42 +02:00
{
player.sendDebug( "TODO: Duty accept" );
2017-08-17 00:07:42 +02:00
}
2020-05-01 20:19:10 +09:00
void Sapphire::Network::GameConnection::cfCancel( const Packets::FFXIVARR_PACKET_RAW& inPacket,
Entity::Player& player )
{
auto packet = makeZonePacket< FFXIVIpcCFCancel >( player.getId() );
packet->data().cancelReason = 890;
queueOutPacket( packet );
}