diff --git a/sql/migrations/20230702121200_ChangeFcFieldSizes.sql b/sql/migrations/20230702121200_ChangeFcFieldSizes.sql new file mode 100644 index 00000000..a571ce70 --- /dev/null +++ b/sql/migrations/20230702121200_ChangeFcFieldSizes.sql @@ -0,0 +1,32 @@ + +ALTER TABLE `freecompany` CHANGE `FreeCompanyId` `FreeCompanyId` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `MasterCharacterId` `MasterCharacterId` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `FcCredit` `FcCredit` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `FcCreditAccumu` `FcCreditAccumu` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `FcPoint` `FcPoint` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `CrestId` `CrestId` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `Reputation_0` `Reputation_0` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `Reputation_1` `Reputation_1` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `Reputation_2` `Reputation_2` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `MoveGcDate` `MoveGcDate` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `ActiveActionList_0` `ActiveActionList_0` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `ActiveActionList_1` `ActiveActionList_1` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `ActiveActionList_2` `ActiveActionList_2` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `ActiveActionLeftTime_0` `ActiveActionLeftTime_0` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `ActiveActionLeftTime_1` `ActiveActionLeftTime_1` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `ActiveActionLeftTime_2` `ActiveActionLeftTime_2` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `StockActionList_0` `StockActionList_0` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `StockActionList_1` `StockActionList_1` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `StockActionList_2` `StockActionList_2` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `StockActionList_3` `StockActionList_3` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `StockActionList_4` `StockActionList_4` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `StockActionList_5` `StockActionList_5` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `StockActionList_6` `StockActionList_6` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `StockActionList_7` `StockActionList_7` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `StockActionList_8` `StockActionList_8` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `StockActionList_9` `StockActionList_9` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `StockActionList_10` `StockActionList_10` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `StockActionList_11` `StockActionList_11` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `StockActionList_12` `StockActionList_12` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `StockActionList_13` `StockActionList_13` BIGINT(20) NULL DEFAULT NULL; +ALTER TABLE `freecompany` CHANGE `StockActionList_14` `StockActionList_14` BIGINT(20) NULL DEFAULT NULL; \ No newline at end of file diff --git a/src/world/Manager/FreeCompanyMgr.cpp b/src/world/Manager/FreeCompanyMgr.cpp index d6caf5ba..70e54d16 100644 --- a/src/world/Manager/FreeCompanyMgr.cpp +++ b/src/world/Manager/FreeCompanyMgr.cpp @@ -18,7 +18,7 @@ #include #include - +#include #include #include "Session.h" @@ -161,6 +161,7 @@ FreeCompanyPtr FreeCompanyMgr::createFreeCompany( const std::string& name, const chatChannelMgr.addToChannel( chatChannelId, player ); uint64_t masterId = player.getCharacterId(); + Logger::debug( "MasterID# {}", masterId ); uint32_t createDate = Common::Util::getTimeSeconds(); @@ -195,7 +196,14 @@ FreeCompanyPtr FreeCompanyMgr::createFreeCompany( const std::string& name, const db.directExecute( stmt ); - sendFreeCompanyResult( player, freeCompanyId, FreeCompanyMgr::ResultType::Create, 2, 0, FreeCompanyMgr::UpdateStatus::Execute ); + auto& server = Common::Service< World::WorldServer >::ref(); + + auto fcResult = makeFcResult( player, freeCompanyId, + 2, FreeCompanyResultPacket::ResultType::Create, + 0, FreeCompanyResultPacket::UpdateStatus::Execute, + fcPtr->getName(), fcPtr->getTag() ); + + server.queueForPlayer( player.getCharacterId(), fcResult ); return fcPtr; } @@ -269,29 +277,6 @@ void FreeCompanyMgr::sendFcInviteList( Entity::Player& player ) 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 ); @@ -315,3 +300,24 @@ void FreeCompanyMgr::sendFcStatus( Entity::Player& player ) auto& server = Common::Service< World::WorldServer >::ref(); server.queueForPlayer( player.getCharacterId(), fcResultPacket ); } + +void FreeCompanyMgr::onFcLogin( uint64_t characterId ) +{ + auto& server = Common::Service< World::WorldServer >::ref(); + auto player = server.getPlayer( characterId ); + if( !player ) + return; + + auto fc = getPlayerFreeCompany( *player ); + if( !fc ) + return; + + auto fcResult = makeFcResult( *player, fc->getId(), + 2, FreeCompanyResultPacket::ResultType::FcLogin, + 0, FreeCompanyResultPacket::UpdateStatus::Execute, + fc->getName(), fc->getTag() ); + + server.queueForPlayer( player->getCharacterId(), fcResult ); + + // todo - send packet to rest of fc members +} diff --git a/src/world/Manager/FreeCompanyMgr.h b/src/world/Manager/FreeCompanyMgr.h index 61816f89..b7267420 100644 --- a/src/world/Manager/FreeCompanyMgr.h +++ b/src/world/Manager/FreeCompanyMgr.h @@ -19,68 +19,7 @@ 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, - ForceDisband = 0xC, - SetCompanyBoard = 0xD, - ChangeMaster = 0xE, - FcLogin = 0xF, - FcLogout = 0x10, - RenameCreate = 0x11, - Rename = 0x12, - RenameTag = 0x13, - FcRankUp = 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; @@ -93,7 +32,8 @@ namespace Sapphire::World::Manager bool renameFreeCompany( uint64_t fcId, const std::string& name, const std::string& tag, Entity::Player& player ); - void sendFreeCompanyResult( Entity::Player& player, uint64_t fcId, ResultType resultType, uint64_t target, uint32_t result, UpdateStatus updateStatus ); + //void sendFreeCompanyResult( Entity::Player& player, uint64_t fcId, ResultType resultType, uint64_t target, + // uint32_t result, UpdateStatus updateStatus, std::string targetName ); void sendFcInviteList( Entity::Player& player ); void sendFcStatus( Entity::Player& player ); @@ -116,6 +56,7 @@ namespace Sapphire::World::Manager // void leaveLinkshell( uint64_t lsId, uint64_t characterId ); // void joinLinkshell( uint64_t lsId, uint64_t characterId ); + void onFcLogin( uint64_t characterId ); }; diff --git a/src/world/Manager/LinkshellMgr.cpp b/src/world/Manager/LinkshellMgr.cpp index 20da3b30..80528583 100644 --- a/src/world/Manager/LinkshellMgr.cpp +++ b/src/world/Manager/LinkshellMgr.cpp @@ -498,4 +498,4 @@ bool LinkshellMgr::renameLinkshell( uint64_t linkshellId, const std::string &nam writeLinkshell( lsPtr->getId() ); return true; -} +} \ No newline at end of file diff --git a/src/world/Manager/LinkshellMgr.h b/src/world/Manager/LinkshellMgr.h index 14b579a0..1cec0570 100644 --- a/src/world/Manager/LinkshellMgr.h +++ b/src/world/Manager/LinkshellMgr.h @@ -58,7 +58,6 @@ namespace Sapphire::World::Manager void leaveLinkshell( uint64_t lsId, uint64_t characterId ); void joinLinkshell( uint64_t lsId, uint64_t characterId ); - }; } diff --git a/src/world/Manager/PlayerMgr.cpp b/src/world/Manager/PlayerMgr.cpp index 565a87b4..060ce7ed 100644 --- a/src/world/Manager/PlayerMgr.cpp +++ b/src/world/Manager/PlayerMgr.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include "Script/ScriptMgr.h" #include "WorldServer.h" @@ -341,6 +342,7 @@ void PlayerMgr::onZone( Sapphire::Entity::Player& player ) auto& housingMgr = Common::Service< HousingMgr >::ref(); auto& partyMgr = Common::Service< World::Manager::PartyMgr >::ref(); auto& server = Common::Service< World::WorldServer >::ref(); + auto& fcMgr = Common::Service< World::Manager::FreeCompanyMgr >::ref(); auto pZone = teriMgr.getTerritoryByGuId( player.getTerritoryId() ); if( !pZone ) @@ -421,6 +423,8 @@ void PlayerMgr::onZone( Sapphire::Entity::Player& player ) partyMgr.onMoveZone( player ); } + fcMgr.onFcLogin( player.getCharacterId() ); + } ////////// Helper /////////// diff --git a/src/world/Network/PacketWrappers/FreeCompanyResultPacket.h b/src/world/Network/PacketWrappers/FreeCompanyResultPacket.h new file mode 100644 index 00000000..b13dc9d9 --- /dev/null +++ b/src/world/Network/PacketWrappers/FreeCompanyResultPacket.h @@ -0,0 +1,105 @@ +#pragma once + +#include +#include "Forwards.h" +#include +#include +#include + +namespace Sapphire::Network::Packets::WorldPackets::Server +{ + + class FreeCompanyResultPacket : public ZoneChannelPacket< FFXIVIpcFreeCompanyResult > + { + 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, + ForceDisband = 0xC, + SetCompanyBoard = 0xD, + ChangeMaster = 0xE, + FcLogin = 0xF, + FcLogout = 0x10, + RenameCreate = 0x11, + Rename = 0x12, + RenameTag = 0x13, + FcRankUp = 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, + }; + + FreeCompanyResultPacket( Entity::Player& player, uint64_t fcId, uint64_t targetId, + ResultType type, uint32_t result, UpdateStatus updateStatus, const std::string& fcName, const std::string& targetName ) : + + ZoneChannelPacket< FFXIVIpcFreeCompanyResult >( player.getId(), player.getId() ) + { + initialize( player, fcId, targetId, type, result, updateStatus, fcName, targetName ); + }; + + private: + void initialize( Entity::Player& player, uint64_t fcId, uint64_t targetId, + ResultType type, uint32_t result, UpdateStatus updateStatus, const std::string& fcName, const std::string& targetName ) + { + m_data.FreeCompanyID = fcId; + m_data.Identity = 0xFF; + m_data.Type = static_cast< uint32_t >( type ); + m_data.Result = result; + m_data.UpdateStatus = updateStatus; + m_data.TargetCharacterID = targetId; + strcpy( m_data.FreeCompanyName, fcName.c_str() ); + strcpy( m_data.TargetName, targetName.c_str() ); + }; + }; + template< typename... Args > + std::shared_ptr< FreeCompanyResultPacket > makeFcResult( Args... args ) + { + return std::make_shared< FreeCompanyResultPacket >( args... ); + } +}