1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-27 14:57:44 +00:00
sapphire/src/servers/sapphire_zone/Network/Handlers/CFHandlers.cpp

112 lines
3.6 KiB
C++
Raw Normal View History

2018-03-06 22:22:19 +01:00
#include <Common.h>
#include <Network/CommonNetwork.h>
#include <Network/GamePacketNew.h>
#include <Logging/Logger.h>
#include <Network/PacketContainer.h>
#include <Exd/ExdDataGenerated.h>
#include "Zone/TerritoryMgr.h"
#include "Zone/InstanceContent.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/PlayerStateFlagsPacket.h"
#include "Framework.h"
#include "Session.h"
2017-08-17 00:07:42 +02:00
2018-03-09 00:06:44 +01:00
extern Core::Framework g_fw;
2017-08-17 00:07:42 +02:00
using namespace Core::Common;
using namespace Core::Network::Packets;
using namespace Core::Network::Packets::Server;
void Core::Network::GameConnection::cfDutyInfoRequest( const Packets::GamePacket& inPacket,
Entity::Player& player )
2017-08-17 00:07:42 +02:00
{
ZoneChannelPacket< FFXIVIpcCFDutyInfo > dutyInfoPacket( player.getId() );
2017-08-17 00:07:42 +02:00
auto penaltyMinutes = player.getCFPenaltyMinutes();
2018-03-09 00:06:44 +01:00
if( penaltyMinutes > 255 )
{
// cap it since it's uint8_t in packets
penaltyMinutes = 255;
}
dutyInfoPacket.data().penaltyTime = penaltyMinutes;
queueOutPacket( dutyInfoPacket );
ZoneChannelPacket< FFXIVIpcCFPlayerInNeed > inNeedsPacket( player.getId() );
queueOutPacket( inNeedsPacket );
2017-08-17 00:07:42 +02:00
}
void Core::Network::GameConnection::cfRegisterDuty( const Packets::GamePacket& inPacket,
Entity::Player& player)
2017-08-17 00:07:42 +02:00
{
2018-03-09 00:06:44 +01:00
auto pTeriMgr = g_fw.get< TerritoryMgr >();
auto pExdData = g_fw.get< Data::ExdDataGenerated >();
std::vector< uint16_t > selectedContent;
for( uint32_t offset = 0x2E; offset <= 0x36; offset += 0x2 )
{
auto id = inPacket.getValAt< uint16_t >( offset );
if( id == 0 )
break;
player.sendDebug( "got contentId: " + std::to_string( id ) );
selectedContent.push_back( id );
}
// todo: rand bias problem, will do for now tho
auto index = std::rand() % selectedContent.size();
auto contentId = selectedContent.at( index );
player.sendDebug( "Duty register request for contentid: " + std::to_string( contentId ) );
// let's cancel it because otherwise you can't register it again
ZoneChannelPacket< FFXIVIpcCFNotify > cfCancelPacket( player.getId() );
cfCancelPacket.data().state1 = 3;
cfCancelPacket.data().state2 = 1; // Your registration is withdrawn.
queueOutPacket( cfCancelPacket );
auto cfCondition = pExdData->get< Core::Data::ContentFinderCondition >( contentId );
if( !cfCondition )
return;
2018-03-09 00:06:44 +01:00
auto instance = pTeriMgr->createInstanceContent( cfCondition->instanceContent );
if( !instance )
return;
auto pInstance = instance->getAsInstanceContent();
pInstance->bindPlayer( player.getId() );
player.sendDebug( "Created instance with id: " + std::to_string( instance->getGuId() ) );
player.setInstance( instance );
2017-08-17 00:07:42 +02:00
}
void Core::Network::GameConnection::cfRegisterRoulette( const Packets::GamePacket& inPacket,
Entity::Player& player)
2017-08-17 00:07:42 +02:00
{
ZoneChannelPacket< FFXIVIpcCFNotify > cfCancelPacket( player.getId() );
cfCancelPacket.data().state1 = 3;
cfCancelPacket.data().state2 = 1; // Your registration is withdrawn.
queueOutPacket( cfCancelPacket );
2018-03-09 00:06:44 +01:00
player.sendDebug( "Roulette register" );
2017-08-17 00:07:42 +02:00
}
void Core::Network::GameConnection::cfDutyAccepted( const Packets::GamePacket& inPacket,
Entity::Player& player)
2017-08-17 00:07:42 +02:00
{
2018-03-09 00:06:44 +01:00
player.sendDebug( "TODO: Duty accept" );
2017-08-17 00:07:42 +02:00
}