1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-27 14:57:44 +00:00

Another batch of FC boilerplate

This commit is contained in:
Mordred 2023-02-06 15:49:47 +01:00
parent a36f53e5de
commit 6a36433235
6 changed files with 195 additions and 77 deletions

View file

@ -13,6 +13,8 @@
// Event Name: Small Talk
// Event ID: 720972
using namespace Sapphire;
using namespace Sapphire::World;
using namespace Sapphire::World::Manager;
class ComDefFreeCompany : public Sapphire::ScriptAPI::EventScript
{
@ -97,7 +99,6 @@ class ComDefFreeCompany : public Sapphire::ScriptAPI::EventScript
eventMgr().resumeScene( player, eventId, sceneId, yieldId, { 3051 } );
return;
}
pFcMgr.writeFreeCompany( pFc->getId() );
eventMgr().resumeScene( player, eventId, sceneId, yieldId, { 0 } );
pFcMgr.sendFreeCompanyStatus( player );
}

View file

@ -4,6 +4,7 @@
#include <set>
#include <string>
#include <array>
#include <optional>
namespace Sapphire
{
@ -56,6 +57,8 @@ namespace Sapphire
std::set< uint64_t > m_inviteIds;
/*! chat channel ID associated with fc */
uint64_t m_chatChannelId;
/*! List of players on petition list */
std::array< uint64_t, 3 > m_inviteList;
public:
FreeCompany( uint64_t id,

View file

@ -195,6 +195,8 @@ FreeCompanyPtr FreeCompanyMgr::createFreeCompany( const std::string& name, const
db.directExecute( stmt );
sendFreeCompanyResult( player, freeCompanyId, FreeCompanyMgr::ResultType::Create, 2, 0, FreeCompanyMgr::UpdateStatus::Execute );
return fcPtr;
}
@ -222,12 +224,6 @@ void FreeCompanyMgr::sendFreeCompanyStatus( Entity::Player& player )
}
void FreeCompanyMgr::finishFreeCompanyAction( const std::string& name, uint32_t result, Entity::Player& player, uint8_t action )
{
auto& server = Common::Service< World::WorldServer >::ref();
}
FreeCompanyPtr FreeCompanyMgr::getPlayerFreeCompany( Entity::Player& player ) const
{
for( const auto &[ key, value ] : m_fcIdMap )
@ -239,3 +235,83 @@ FreeCompanyPtr FreeCompanyMgr::getPlayerFreeCompany( Entity::Player& player ) co
}
return nullptr;
}
void FreeCompanyMgr::sendFcInviteList( Entity::Player& player )
{
auto fc = getPlayerFreeCompany( player );
if( !fc )
return;
auto& server = Common::Service< World::WorldServer >::ref();
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() );
// fill master character data
auto masterCharacter = server.getPlayer( fc->getMasterId() );
if( !masterCharacter )
Logger::error( "FreeCompanyMgr: Unable to look up master character#{}!", fc->getMasterId() );
inviteListPacket->data().MasterCharacter.GrandCompanyID = masterCharacter->getGc();
inviteListPacket->data().MasterCharacter.CharacterID = masterCharacter->getCharacterId();
strcpy( inviteListPacket->data().MasterCharacter.CharacterName, masterCharacter->getName().c_str() );
inviteListPacket->data().MasterCharacter.SelectRegion = masterCharacter->getSearchSelectRegion();
inviteListPacket->data().MasterCharacter.OnlineStatus = masterCharacter->getOnlineStatusMask();
inviteListPacket->data().MasterCharacter.GrandCompanyRank[ 0 ] = masterCharacter->getGcRankArray()[ 0 ];
inviteListPacket->data().MasterCharacter.GrandCompanyRank[ 1 ] = masterCharacter->getGcRankArray()[ 1 ];
inviteListPacket->data().MasterCharacter.GrandCompanyRank[ 2 ] = masterCharacter->getGcRankArray()[ 2 ];
// todo - fill invite characters
server.queueForPlayer( player.getCharacterId(), inviteListPacket );
}
void FreeCompanyMgr::sendFreeCompanyResult( Entity::Player& player, uint64_t fcId, ResultType resultType, uint64_t target, uint32_t result,
FreeCompanyMgr::UpdateStatus updateStatus )
{
auto fc = getFreeCompanyById( fcId );
if( !fc )
return;
auto& server = Common::Service< World::WorldServer >::ref();
auto fcResult = makeZonePacket< FFXIVIpcFreeCompanyResult >( player.getId() );
auto& fcResultData = fcResult->data();
fcResultData.FreeCompanyID = fcId;
std::strcpy( fcResultData.FreeCompanyName, fc->getName().c_str() );
std::strcpy( fcResultData.TargetName, fc->getName().c_str() );
fcResultData.Result = result;
fcResultData.TargetCharacterID = target;
fcResultData.Type = resultType;
fcResultData.UpdateStatus = updateStatus;
server.queueForPlayer( player.getCharacterId(), fcResult );
}
void FreeCompanyMgr::sendFcStatus( Entity::Player& player )
{
auto fc = getPlayerFreeCompany( player );
auto fcResultPacket = makeZonePacket< FFXIVIpcGetFcStatusResult >( player.getId() );
auto& resultData = fcResultPacket->data();
resultData.CharaFcParam = 1;
if( fc )
{
resultData.FreeCompanyID = fc->getId();
resultData.AuthorityList = 0;
resultData.HierarchyType = 0;
resultData.GrandCompanyID = fc->getGrandCompany();
resultData.FcRank = fc->getRank();
resultData.CrestID = fc->getCrest();
resultData.FcStatus = static_cast< uint8_t >( fc->getFcStatus() );
resultData.ChannelID = fc->getChatChannel();
resultData.CharaFcParam = 0;
}
auto& server = Common::Service< World::WorldServer >::ref();
server.queueForPlayer( player.getCharacterId(), fcResultPacket );
}

View file

@ -8,6 +8,8 @@
namespace Sapphire::World::Manager
{
class FreeCompanyMgr
{
private:
@ -17,6 +19,69 @@ namespace Sapphire::World::Manager
FreeCompanyPtr getFcByName( const std::string& name );
public:
enum ResultType : int32_t
{
Create = 0x1,
LEave = 0x2,
Kick = 0x3,
Disband = 0x4,
SetHierarchyName = 0x5,
SetAuthorityList = 0x6,
MoveHierarchy = 0x7,
AddHierarchy = 0x8,
RemoveHierarchy = 0x9,
SortHierarchy = 0xA,
CreateComplete = 0xB,
ForceDistband = 0xC,
SetCompanyBoard = 0xD,
ChangeMaster = 0xE,
FcLogin = 0xF,
FcLogout = 0x10,
RenameCreate = 0x11,
Rename = 0x12,
RenameTag = 0x13,
FcRankUo = 0x14,
FcReputationUp = 0x15,
MoveGrandCompany = 0x16,
MoveGcComplete = 0x17,
SetCompanyMotto = 0x18,
SetCrestId = 0x19,
ChestLock = 0x1A,
BuyFcAction = 0x1B,
RemoveFcAction = 0x1C,
ExecuteFcAction = 0x1D,
CancelFcAction = 0x1E,
ClearFcParams = 0x1F,
TimeoutFcAction = 0x20,
MoveZone = 0x21,
Reload = 0x22,
LandGet = 0x23,
LandRemove = 0x24,
LandAutoRemove = 0x25,
HouseBuild = 0x26,
HouseRemove = 0x27,
SetFcMemo = 0x28,
HouseLock = 0x29,
HouseUnlock = 0x2A,
AddJoinRequest = 0x2B,
RemoveJoinRequest = 0x2C,
SetInfoFcData = 0x2D,
DisbandJoinRequest = 0x2E,
MasterDemote = 0x2F,
PRoomGet = 0x30,
PRoomRemove = 0x31,
PRoomAutoRemove = 0x32,
FcCreateAccept = 0x65,
Join = 0x66,
};
enum UpdateStatus : uint8_t
{
Execute = 0xA,
Target = 0xB,
Member = 0xC,
};
FreeCompanyMgr() = default;
// initialize all fcs from db to memory
@ -28,7 +93,10 @@ namespace Sapphire::World::Manager
bool renameFreeCompany( uint64_t fcId, const std::string& name, const std::string& tag, Entity::Player& player );
void finishFreeCompanyAction( const std::string& name, uint32_t result, Entity::Player& player, uint8_t action );
void sendFreeCompanyResult( Entity::Player& player, uint64_t fcId, ResultType resultType, uint64_t target, uint32_t result, UpdateStatus updateStatus );
void sendFcInviteList( Entity::Player& player );
void sendFcStatus( Entity::Player& player );
/* void invitePlayer( Entity::Player& sourcePlayer, Entity::Player& invitedPlayer, uint64_t linkshellId );
void kickPlayer( Entity::Player& sourcePlayer, Entity::Player& kickedPlayer, uint64_t linkshellId );

View file

@ -25,26 +25,47 @@ 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();
fcMgr.sendFcInviteList( player );
}
auto fc = fcMgr.getPlayerFreeCompany( player );
if( !fc )
return;
void Sapphire::Network::GameConnection::getFcStatus( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
{
auto& fcMgr = Common::Service< FreeCompanyMgr >::ref();
fcMgr.sendFcStatus( player );
}
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 ];
void Sapphire::Network::GameConnection::getFcProfile( const Sapphire::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
{
const auto packet = ZoneChannelPacket< Client::FFXIVIpcGetFcProfile >( inPacket );
auto& server = Common::Service< World::WorldServer >::ref();
server.queueForPlayer( player.getCharacterId(), inviteListPacket );
}
auto resultPacket = makeZonePacket< WorldPackets::Server::FFXIVIpcGetFcProfileResult >( player.getId() );
resultPacket->data().TargetCharacterID = packet.data().TargetCharacterID;
resultPacket->data().TargetEntityID = packet.data().TargetEntityID;
// haha test code
resultPacket->data().FreeCompanyID = 1;
resultPacket->data().CrestID = 0x0001000100010001;
resultPacket->data().LandID = Common::INVALID_GAME_OBJECT_ID64;
resultPacket->data().OnlineMemberCount = 69;
resultPacket->data().TotalMemberCount = 420;
resultPacket->data().JoinRequestCount = 69;
resultPacket->data().FcRank = 1;
resultPacket->data().FcStatus = 1;
resultPacket->data().FcRole = 1;
resultPacket->data().FcActivity = 1;
resultPacket->data().GrandCompanyID = 1;
resultPacket->data().CreateDate = 1587305592;
resultPacket->data().Reputation = 500;
resultPacket->data().FcActiveTimeFlag = 0xFF;
resultPacket->data().FcJoinRequestFlag = 0xFF;
strcpy( resultPacket->data().MasterCharacterName, "Biggus Dickus" );
strcpy( resultPacket->data().FcTag, "Wang" );
strcpy( resultPacket->data().FreeCompanyName, "Test FC" );
strcpy( resultPacket->data().CompanyMotto, "nobody here but us chickens" );
server.queueForPlayer( player.getCharacterId(), resultPacket );
}

View file

@ -700,57 +700,6 @@ void Sapphire::Network::GameConnection::marketBoardRequestItemListings( const Pa
marketMgr.requestItemListings( player, packet.data().itemCatalogId );
}
void Sapphire::Network::GameConnection::getFcStatus( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
{
//Todo implement proper FC handling
auto& server = Common::Service< World::WorldServer >::ref();
auto fcResultPacket = makeZonePacket< FFXIVIpcGetFcStatusResult >( player.getId() );
fcResultPacket->data().FreeCompanyID = 0;
fcResultPacket->data().AuthorityList = 0;
fcResultPacket->data().HierarchyType = 0;
fcResultPacket->data().GrandCompanyID = 0;
fcResultPacket->data().FcRank = 0;
fcResultPacket->data().CrestID = 0;
fcResultPacket->data().CharaFcParam = 1;
server.queueForPlayer( player.getCharacterId(), fcResultPacket );
}
void Sapphire::Network::GameConnection::getFcProfile( const Sapphire::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
{
const auto packet = ZoneChannelPacket< Client::FFXIVIpcGetFcProfile >( inPacket );
auto& server = Common::Service< World::WorldServer >::ref();
auto resultPacket = makeZonePacket< WorldPackets::Server::FFXIVIpcGetFcProfileResult >( player.getId() );
resultPacket->data().TargetCharacterID = packet.data().TargetCharacterID;
resultPacket->data().TargetEntityID = packet.data().TargetEntityID;
// haha test code
resultPacket->data().FreeCompanyID = 1;
resultPacket->data().CrestID = 0x0001000100010001;
resultPacket->data().LandID = Common::INVALID_GAME_OBJECT_ID64;
resultPacket->data().OnlineMemberCount = 69;
resultPacket->data().TotalMemberCount = 420;
resultPacket->data().JoinRequestCount = 69;
resultPacket->data().FcRank = 1;
resultPacket->data().FcStatus = 1;
resultPacket->data().FcRole = 1;
resultPacket->data().FcActivity = 1;
resultPacket->data().GrandCompanyID = 1;
resultPacket->data().CreateDate = 1587305592;
resultPacket->data().Reputation = 500;
resultPacket->data().FcActiveTimeFlag = 0xFF;
resultPacket->data().FcJoinRequestFlag = 0xFF;
strcpy( resultPacket->data().MasterCharacterName, "Biggus Dickus" );
strcpy( resultPacket->data().FcTag, "Wang" );
strcpy( resultPacket->data().FreeCompanyName, "Test FC" );
strcpy( resultPacket->data().CompanyMotto, "nobody here but us chickens" );
server.queueForPlayer( player.getCharacterId(), resultPacket );
}
void Sapphire::Network::GameConnection::getRequestItemListHandler( const Sapphire::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
{