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:
parent
6e9d47b6a3
commit
0df9fca281
10 changed files with 120 additions and 13 deletions
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,8 +2,6 @@
|
|||
#include <Exd/ExdData.h>
|
||||
#include <Service.h>
|
||||
|
||||
#include "Network/PacketWrappers/Notice2Packet.h"
|
||||
|
||||
#include "Manager/QuestMgr.h"
|
||||
|
||||
#include "Player.h"
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
#include <Network/PacketContainer.h>
|
||||
|
||||
#include "Network/GameConnection.h"
|
||||
#include "Network/PacketWrappers/Notice2Packet.h"
|
||||
|
||||
#include "QuestMgr.h"
|
||||
#include "AchievementMgr.h"
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -244,6 +244,8 @@ namespace Sapphire::Network
|
|||
DECLARE_HANDLER( getBlacklistHandler );
|
||||
DECLARE_HANDLER( blacklistAddHandler );
|
||||
DECLARE_HANDLER( blacklistRemoveHandler );
|
||||
|
||||
DECLARE_HANDLER( getFcInviteListHandler );
|
||||
};
|
||||
|
||||
}
|
||||
|
|
50
src/world/Network/Handlers/FreeCompanyHandlers.cpp
Normal file
50
src/world/Network/Handlers/FreeCompanyHandlers.cpp
Normal 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 );
|
||||
|
||||
}
|
Loading…
Add table
Reference in a new issue