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:
parent
a36f53e5de
commit
6a36433235
6 changed files with 195 additions and 77 deletions
|
@ -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 );
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 );
|
||||
|
||||
}
|
|
@ -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 )
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue