1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-07 19:27:45 +00:00

Beginnings of FC. FC can be created in petition mode.

This commit is contained in:
Mordred 2023-02-05 22:46:46 +01:00
parent 6e9d47b6a3
commit 0df9fca281
10 changed files with 120 additions and 13 deletions

View file

@ -713,4 +713,14 @@ struct FFXIVIpcPcPartyChangeLeader : FFXIVIpcBasePacket< PcPartyChangeLeader >
char NextLeaderCharacterName[32];
};
struct FFXIVIpcGetFcInviteList : FFXIVIpcBasePacket< GetFcInviteList >
{
uint32_t Reserve;
};
struct FFXIVIpcGetFcHierarchy : FFXIVIpcBasePacket< GetFcHierarchy >
{
uint8_t ListType;
};
}

View file

@ -197,8 +197,8 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
uint64_t AuthorityList;
uint64_t ChannelID;
uint64_t CrestID;
uint64_t CharaFcState;
uint64_t CharaFcParam;
uint32_t CharaFcState;
uint32_t CharaFcParam;
uint16_t Param;
uint8_t FcStatus;
uint8_t GrandCompanyID;

View file

@ -82,10 +82,24 @@ class ComDefFreeCompany : public Sapphire::ScriptAPI::EventScript
}
else if( sceneId == 5 && yieldId == 18 )
{
// resultstring contains name and tag delimited by '|'
std::size_t splitPos( resultString.find( '|' ) );
std::string fcName( resultString.substr( 0, splitPos ) );
std::string fcTag( resultString.substr( splitPos + 1 ) );
auto& pFcMgr = Common::Service< Sapphire::World::Manager::FreeCompanyMgr >::ref();
auto pFc = pFcMgr.createFreeCompany( resultString, resultString, player );
auto& playerMgr = Common::Service< Sapphire::World::Manager::PlayerMgr >::ref();
auto pFc = pFcMgr.createFreeCompany( fcName, fcTag, player );
// if no fc is returned, the name has been taken already
if( !pFc )
{
playerMgr.sendLogMessage( player, 3051 );
eventMgr().resumeScene( player, eventId, sceneId, yieldId, { 3051 } );
return;
}
pFcMgr.writeFreeCompany( pFc->getId() );
eventMgr().resumeScene( player, eventId, sceneId, yieldId, { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } );
eventMgr().resumeScene( player, eventId, sceneId, yieldId, { 0 } );
pFcMgr.sendFreeCompanyStatus( player );
}
}

View file

@ -2,8 +2,6 @@
#include <Exd/ExdData.h>
#include <Service.h>
#include "Network/PacketWrappers/Notice2Packet.h"
#include "Manager/QuestMgr.h"
#include "Player.h"

View file

@ -188,6 +188,11 @@ const std::array< uint64_t, 15 >& Sapphire::FreeCompany::getActionStockArr() con
return m_actionStock;
}
uint64_t Sapphire::FreeCompany::getChatChannel() const
{
return m_chatChannelId;
}

View file

@ -18,7 +18,7 @@
#include <Network/GameConnection.h>
#include <Network/PacketDef/Zone/ServerZoneDef.h>
//#include <Network/PacketWrappers/FreeCompanyResultPacket.h>
#include <Network/PacketDef/ClientIpcs.h>
#include "Session.h"
@ -59,7 +59,7 @@ bool FreeCompanyMgr::loadFreeCompanies()
auto chatChannelId = chatChannelMgr.createChatChannel( Common::ChatChannelType::FreeCompanyChat );
auto fcPtr = std::make_shared< FreeCompany >( fcId, name, tag, chatChannelId, masterId );
auto fcPtr = std::make_shared< FreeCompany >( fcId, name, tag, masterId, chatChannelId );
m_fcIdMap[ fcId ] = fcPtr;
m_fcNameMap[ name ] = fcPtr;
@ -164,9 +164,11 @@ FreeCompanyPtr FreeCompanyMgr::createFreeCompany( const std::string& name, const
uint32_t createDate = Common::Util::getTimeSeconds();
auto fcPtr = std::make_shared< FreeCompany >( freeCompanyId, name, tag, chatChannelId, masterId );
auto fcPtr = std::make_shared< FreeCompany >( freeCompanyId, name, tag, masterId, chatChannelId );
fcPtr->setCreateDate( createDate );
fcPtr->setGrandCompany( player.getGc() );
fcPtr->setFcStatus( Common::FreeCompanyStatus::InviteStart );
fcPtr->setRank( 1 );
m_fcIdMap[ freeCompanyId ] = fcPtr;
m_fcNameMap[ name ] = fcPtr;
@ -196,6 +198,30 @@ FreeCompanyPtr FreeCompanyMgr::createFreeCompany( const std::string& name, const
return fcPtr;
}
void FreeCompanyMgr::sendFreeCompanyStatus( Entity::Player& player )
{
auto& server = Common::Service< World::WorldServer >::ref();
auto fcStatusResult = makeZonePacket< FFXIVIpcGetFcStatusResult >( player.getId() );
auto playerFc = getPlayerFreeCompany( player );
if( !playerFc )
return;
fcStatusResult->data().AuthorityList = 0;
fcStatusResult->data().ChannelID = playerFc->getChatChannel();
fcStatusResult->data().Param = 2; // this appears to control which packets are requested afterwards
fcStatusResult->data().CharaFcParam = 0;
fcStatusResult->data().CrestID = playerFc->getCrest();
fcStatusResult->data().FcRank = playerFc->getRank();
fcStatusResult->data().FcStatus = static_cast< uint8_t >( playerFc->getFcStatus() );
fcStatusResult->data().FreeCompanyID = playerFc->getId();
fcStatusResult->data().GrandCompanyID = playerFc->getGrandCompany();
server.queueForPlayer( player.getCharacterId(), fcStatusResult );
}
void FreeCompanyMgr::finishFreeCompanyAction( const std::string& name, uint32_t result, Entity::Player& player, uint8_t action )
{
auto& server = Common::Service< World::WorldServer >::ref();
@ -204,11 +230,12 @@ void FreeCompanyMgr::finishFreeCompanyAction( const std::string& name, uint32_t
FreeCompanyPtr FreeCompanyMgr::getPlayerFreeCompany( Entity::Player& player ) const
{
for( const auto &[ key, value ] : m_fcIdMap )
{
if( value->getMasterId() == player.getCharacterId() )
{
return value;
}
}
return nullptr;
}

View file

@ -8,7 +8,6 @@
#include <Network/PacketContainer.h>
#include "Network/GameConnection.h"
#include "Network/PacketWrappers/Notice2Packet.h"
#include "QuestMgr.h"
#include "AchievementMgr.h"

View file

@ -169,6 +169,8 @@ Sapphire::Network::GameConnection::GameConnection( Sapphire::Network::HivePtr pH
setZoneHandler( GetBlacklist, "GetBlacklist", &GameConnection::getBlacklistHandler );
setZoneHandler( BlacklistAdd, "BlacklistAdd", &GameConnection::blacklistAddHandler );
setZoneHandler( BlacklistRemove, "BlacklistRemove", &GameConnection::blacklistRemoveHandler );
setZoneHandler( GetFcInviteList, "GetFcInviteList", &GameConnection::getFcInviteListHandler );
}
Sapphire::Network::GameConnection::~GameConnection() = default;

View file

@ -244,6 +244,8 @@ namespace Sapphire::Network
DECLARE_HANDLER( getBlacklistHandler );
DECLARE_HANDLER( blacklistAddHandler );
DECLARE_HANDLER( blacklistRemoveHandler );
DECLARE_HANDLER( getFcInviteListHandler );
};
}

View file

@ -0,0 +1,50 @@
#include <Common.h>
#include <Network/CommonNetwork.h>
#include <Network/GamePacket.h>
#include <Network/PacketContainer.h>
#include <Exd/ExdData.h>
#include <Service.h>
#include <Network/PacketDef/Zone/ClientZoneDef.h>
#include <Network/PacketDef/Zone/ServerZoneDef.h>
#include "Network/GameConnection.h"
#include "Session.h"
#include "Actor/Player.h"
#include "FreeCompany/FreeCompany.h"
#include "Manager/FreeCompanyMgr.h"
#include <WorldServer.h>
using namespace Sapphire::Common;
using namespace Sapphire::Network::Packets;
using namespace Sapphire::Network::Packets::WorldPackets::Server;
using namespace Sapphire::Network::Packets::WorldPackets;
using namespace Sapphire::World::Manager;
void Sapphire::Network::GameConnection::getFcInviteListHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
{
auto& fcMgr = Common::Service< FreeCompanyMgr >::ref();
auto fc = fcMgr.getPlayerFreeCompany( player );
if( !fc )
return;
auto inviteListPacket = makeZonePacket< FFXIVIpcGetFcInviteListResult >( player.getId() );
inviteListPacket->data().GrandCompanyID = fc->getGrandCompany();
inviteListPacket->data().FreeCompanyID = fc->getId();
std::strcpy( inviteListPacket->data().FcTag, fc->getTag().c_str() );
std::strcpy( inviteListPacket->data().FreeCompanyName, fc->getName().c_str() );
inviteListPacket->data().MasterCharacter.GrandCompanyID = player.getGc();
inviteListPacket->data().MasterCharacter.CharacterID = player.getCharacterId();
strcpy( inviteListPacket->data().MasterCharacter.CharacterName, player.getName().c_str() );
inviteListPacket->data().MasterCharacter.SelectRegion = player.getSearchSelectRegion();
inviteListPacket->data().MasterCharacter.OnlineStatus = player.getOnlineStatusMask();
inviteListPacket->data().MasterCharacter.GrandCompanyRank[ 0 ] = player.getGcRankArray()[ 0 ];
inviteListPacket->data().MasterCharacter.GrandCompanyRank[ 1 ] = player.getGcRankArray()[ 1 ];
inviteListPacket->data().MasterCharacter.GrandCompanyRank[ 2 ] = player.getGcRankArray()[ 2 ];
auto& server = Common::Service< World::WorldServer >::ref();
server.queueForPlayer( player.getCharacterId(), inviteListPacket );
}