diff --git a/src/scripts/common/ComDefFreeCompany.cpp b/src/scripts/common/ComDefFreeCompany.cpp index 1b80bdc2..f4ae23a4 100644 --- a/src/scripts/common/ComDefFreeCompany.cpp +++ b/src/scripts/common/ComDefFreeCompany.cpp @@ -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 ); } diff --git a/src/world/FreeCompany/FreeCompany.h b/src/world/FreeCompany/FreeCompany.h index 754038d8..5bf63f4f 100644 --- a/src/world/FreeCompany/FreeCompany.h +++ b/src/world/FreeCompany/FreeCompany.h @@ -4,6 +4,7 @@ #include #include #include +#include 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, diff --git a/src/world/Manager/FreeCompanyMgr.cpp b/src/world/Manager/FreeCompanyMgr.cpp index 13206cdb..d6caf5ba 100644 --- a/src/world/Manager/FreeCompanyMgr.cpp +++ b/src/world/Manager/FreeCompanyMgr.cpp @@ -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 ); +} diff --git a/src/world/Manager/FreeCompanyMgr.h b/src/world/Manager/FreeCompanyMgr.h index bebd9617..31971841 100644 --- a/src/world/Manager/FreeCompanyMgr.h +++ b/src/world/Manager/FreeCompanyMgr.h @@ -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 ); diff --git a/src/world/Network/Handlers/FreeCompanyHandlers.cpp b/src/world/Network/Handlers/FreeCompanyHandlers.cpp index 1bcb0a0c..d438ffe3 100644 --- a/src/world/Network/Handlers/FreeCompanyHandlers.cpp +++ b/src/world/Network/Handlers/FreeCompanyHandlers.cpp @@ -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 ); + +} \ No newline at end of file diff --git a/src/world/Network/Handlers/PacketHandlers.cpp b/src/world/Network/Handlers/PacketHandlers.cpp index 1affc4b1..571505db 100644 --- a/src/world/Network/Handlers/PacketHandlers.cpp +++ b/src/world/Network/Handlers/PacketHandlers.cpp @@ -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 ) {