2018-11-22 01:17:19 +11:00
|
|
|
#include "PlayerMgr.h"
|
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
#include <Service.h>
|
|
|
|
|
|
|
|
#include <Exd/ExdData.h>
|
2018-11-22 01:17:19 +11:00
|
|
|
|
2019-07-21 22:33:33 +10:00
|
|
|
#include <Territory/Territory.h>
|
2018-11-22 01:17:19 +11:00
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
#include <Manager/TerritoryMgr.h>
|
2023-01-19 13:03:54 -03:00
|
|
|
#include <Manager/AchievementMgr.h>
|
2018-11-22 01:17:19 +11:00
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
#include "Script/ScriptMgr.h"
|
|
|
|
#include "WorldServer.h"
|
|
|
|
#include <Common.h>
|
|
|
|
|
|
|
|
#include <Network/PacketContainer.h>
|
|
|
|
#include <Network/GameConnection.h>
|
|
|
|
#include <Network/CommonActorControl.h>
|
|
|
|
#include <Network/PacketDef/Zone/ServerZoneDef.h>
|
|
|
|
#include <Network/PacketWrappers/ActorControlPacket.h>
|
|
|
|
#include <Network/PacketWrappers/ActorControlSelfPacket.h>
|
|
|
|
#include "Network/PacketWrappers/ActorControlTargetPacket.h"
|
|
|
|
#include <Network/PacketWrappers/ModelEquipPacket.h>
|
|
|
|
#include <Network/PacketWrappers/PlayerStateFlagsPacket.h>
|
|
|
|
#include <Network/PacketWrappers/UpdateHpMpTpPacket.h>
|
|
|
|
#include "Network/PacketWrappers/ServerNoticePacket.h"
|
|
|
|
#include "Network/PacketWrappers/ChatPacket.h"
|
|
|
|
#include "Network/PacketWrappers/HudParamPacket.h"
|
|
|
|
|
2018-11-22 01:17:19 +11:00
|
|
|
#include <Actor/Player.h>
|
2022-01-27 20:03:51 -03:00
|
|
|
#include <Actor/BNpc.h>
|
2018-11-22 01:17:19 +11:00
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
using namespace Sapphire;
|
2018-12-01 00:27:16 +11:00
|
|
|
using namespace Sapphire::World::Manager;
|
2021-11-27 00:53:57 +01:00
|
|
|
using namespace Sapphire::Network::Packets;
|
|
|
|
using namespace Sapphire::Network::Packets::WorldPackets::Server;
|
|
|
|
using namespace Sapphire::Network::ActorControl;
|
2018-11-22 01:17:19 +11:00
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
|
|
|
|
void PlayerMgr::onOnlineStatusChanged( Entity::Player& player, bool updateProfile )
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
auto& server = Common::Service< World::WorldServer >::ref();
|
|
|
|
|
|
|
|
auto statusPacket = makeZonePacket< FFXIVIpcSetOnlineStatus >( player.getId() );
|
|
|
|
statusPacket->data().onlineStatusFlags = player.getFullOnlineStatusMask();
|
|
|
|
server.queueForPlayer( player.getCharacterId(), statusPacket );
|
|
|
|
|
|
|
|
if( updateProfile )
|
|
|
|
{
|
|
|
|
auto searchInfoPacket = makeZonePacket< FFXIVIpcSetProfileResult >( player.getId());
|
|
|
|
searchInfoPacket->data().OnlineStatus = player.getFullOnlineStatusMask();
|
|
|
|
searchInfoPacket->data().Region = player.getSearchSelectRegion();
|
|
|
|
strcpy( searchInfoPacket->data().SearchComment, player.getSearchMessage());
|
|
|
|
server.queueForPlayer( player.getCharacterId(), searchInfoPacket );
|
|
|
|
}
|
|
|
|
|
|
|
|
player.sendToInRangeSet( makeActorControl( player.getId(), SetStatusIcon, static_cast< uint8_t >( player.getOnlineStatus() ) ), true );
|
|
|
|
}
|
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
void PlayerMgr::onEquipDisplayFlagsChanged( Entity::Player& player )
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
auto paramPacket = makeZonePacket< FFXIVIpcConfig >( player.getId() );
|
|
|
|
paramPacket->data().flag = player.getEquipDisplayFlags();
|
|
|
|
player.sendToInRangeSet( paramPacket, true );
|
|
|
|
}
|
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
void PlayerMgr::onSendStateFlags( Entity::Player& player, bool updateInRange )
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
auto& server = Common::Service< World::WorldServer >::ref();
|
|
|
|
server.queueForPlayer( player.getCharacterId(), std::make_shared< PlayerStateFlagsPacket >( player ) );
|
|
|
|
|
|
|
|
if( updateInRange )
|
|
|
|
player.sendToInRangeSet( makeActorControl( player.getId(), SetStatusIcon,
|
|
|
|
static_cast< uint8_t >( player.getOnlineStatus() ) ), true );
|
|
|
|
}
|
|
|
|
|
2023-01-19 13:03:54 -03:00
|
|
|
void PlayerMgr::onSendAchievementList( Entity::Player& player )
|
|
|
|
{
|
|
|
|
auto& server = Common::Service< World::WorldServer >::ref();
|
|
|
|
|
|
|
|
auto achvPacket = makeZonePacket< FFXIVIpcAchievement >( player.getId() );
|
|
|
|
std::memcpy( &achvPacket->data().complete[ 0 ], &player.getAchievementList()[ 0 ], sizeof( &achvPacket->data().complete ) );
|
|
|
|
|
|
|
|
server.queueForPlayer( player.getCharacterId(), achvPacket );
|
|
|
|
}
|
|
|
|
|
|
|
|
void PlayerMgr::onSendAchievementProgress( Entity::Player& player, uint32_t achievementId )
|
|
|
|
{
|
|
|
|
auto& server = Common::Service< World::WorldServer >::ref();
|
|
|
|
auto& achvMgr = Common::Service< Manager::AchievementMgr >::ref();
|
|
|
|
|
|
|
|
auto achvProgress = achvMgr.getAchievementDataById( player, achievementId );
|
|
|
|
|
|
|
|
auto pAchvProgressPacket = makeActorControl( player.getId(), AchievementSetRate, achievementId, achvProgress.first, achvProgress.second );
|
|
|
|
server.queueForPlayer( player.getCharacterId(), pAchvProgressPacket );
|
|
|
|
}
|
|
|
|
|
|
|
|
void PlayerMgr::onUnlockAchievement( Entity::Player& player, uint32_t achievementId )
|
|
|
|
{
|
|
|
|
auto& server = Common::Service< World::WorldServer >::ref();
|
|
|
|
|
|
|
|
onSendAchievementList( player );
|
|
|
|
|
|
|
|
server.queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), AchievementComplete, achievementId ) );
|
|
|
|
server.queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), AchievementObtainMsg, achievementId ) );
|
|
|
|
}
|
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
void PlayerMgr::onSendStats( Entity::Player& player )
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
std::array< uint32_t, 50 > statParams;
|
2023-01-17 11:27:25 +01:00
|
|
|
std::fill( std::begin( statParams ), std::end( statParams ), 0 );
|
2021-11-27 00:53:57 +01:00
|
|
|
|
|
|
|
auto& exd = Common::Service< Data::ExdData >::ref();
|
|
|
|
|
|
|
|
// todo: this is no doubt slow as shit...
|
2022-01-27 21:24:54 +01:00
|
|
|
auto idList = exd.getIdList< Excel::BaseParam >();
|
2021-11-27 00:53:57 +01:00
|
|
|
|
|
|
|
for( const auto id : idList )
|
|
|
|
{
|
2022-01-27 21:24:54 +01:00
|
|
|
auto row = exd.getRow< Excel::BaseParam >( id );
|
2021-11-27 00:53:57 +01:00
|
|
|
if( !row )
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( row->data().PacketIndex < 0 )
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
statParams[ row->data().PacketIndex ] = player.getStatValue( static_cast< Common::BaseParam >( id ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
auto& server = Common::Service< World::WorldServer >::ref();
|
|
|
|
|
|
|
|
auto statPacket = makeZonePacket< FFXIVIpcBaseParam >( player.getId() );
|
|
|
|
memcpy( statPacket->data().Param, statParams.data(), sizeof( uint32_t ) * statParams.size() );
|
|
|
|
|
|
|
|
server.queueForPlayer( player.getCharacterId(), statPacket );
|
|
|
|
}
|
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
void PlayerMgr::onPlayerStatusUpdate( Entity::Player& player )
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
auto& server = Common::Service< World::WorldServer >::ref();
|
|
|
|
|
|
|
|
auto playerStatusUpdate = makeZonePacket< FFXIVIpcPlayerStatusUpdate >( player.getId() );
|
|
|
|
playerStatusUpdate->data().ClassJob = static_cast< uint8_t >( player.getClass() );
|
|
|
|
playerStatusUpdate->data().Lv = player.getLevel();
|
2023-01-19 09:57:08 +01:00
|
|
|
playerStatusUpdate->data().Lv1 = player.getLevel();
|
2021-11-27 00:53:57 +01:00
|
|
|
playerStatusUpdate->data().LvSync = 0; //player.getLevelSync();
|
|
|
|
playerStatusUpdate->data().Exp = player.getExp();
|
|
|
|
|
|
|
|
server.queueForPlayer( player.getCharacterId(), playerStatusUpdate );
|
|
|
|
}
|
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
void PlayerMgr::onPlayerHpMpTpChanged( Entity::Player& player )
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
player.sendToInRangeSet( std::make_shared< UpdateHpMpTpPacket >( player ), true );
|
|
|
|
}
|
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
void PlayerMgr::onPlayerItemLevelUpdate( Entity::Player& player )
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
auto& server = Common::Service< World::WorldServer >::ref();
|
|
|
|
server.queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), SetItemLevel, player.getItemLevel(), 0 ) );
|
|
|
|
}
|
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
void PlayerMgr::onLevelUp( Entity::Player& player )
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
player.calculateStats();
|
|
|
|
player.sendStats();
|
2022-01-27 21:08:43 +01:00
|
|
|
onPlayerHpMpTpChanged( player );
|
2021-11-27 00:53:57 +01:00
|
|
|
|
|
|
|
player.sendToInRangeSet( makeHudParam( player ), true );
|
|
|
|
|
|
|
|
player.sendToInRangeSet( makeActorControl( player.getId(), LevelUpEffect, static_cast< uint8_t >( player.getClass() ),
|
|
|
|
player.getLevel(), player.getLevel() - 1 ), true );
|
2023-01-19 13:03:54 -03:00
|
|
|
|
|
|
|
auto& achvMgr = Common::Service< World::Manager::AchievementMgr >::ref();
|
|
|
|
achvMgr.progressAchievementByType< Common::Achievement::Type::Classjob >( player, static_cast< uint8_t >( player.getClass() ), player.getLevel() );
|
2021-11-27 00:53:57 +01:00
|
|
|
}
|
|
|
|
|
2023-01-19 13:03:54 -03:00
|
|
|
void PlayerMgr::onSetLevelForClass( Entity::Player& player, Common::ClassJob classJob )
|
|
|
|
{
|
|
|
|
auto& server = Common::Service< World::WorldServer >::ref();
|
|
|
|
auto& achvMgr = Common::Service< World::Manager::AchievementMgr >::ref();
|
|
|
|
|
|
|
|
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), Network::ActorControl::ClassJobUpdate,
|
|
|
|
static_cast< uint8_t >( classJob ), player.getLevelForClass( classJob ) ) );
|
|
|
|
|
|
|
|
achvMgr.progressAchievementByType< Common::Achievement::Type::Classjob >( player, static_cast< uint8_t >( classJob ), player.getLevel() );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
void PlayerMgr::onGainExp( Entity::Player& player, uint32_t exp )
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
auto& server = Common::Service< World::WorldServer >::ref();
|
|
|
|
|
|
|
|
if( exp != 0 )
|
|
|
|
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), GainExpMsg, static_cast< uint8_t >( player.getClass() ), exp ) );
|
|
|
|
|
2021-12-21 11:46:40 +01:00
|
|
|
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), UpdateUiExp, static_cast< uint8_t >( player.getClass() ), player.getExp() ) );
|
2021-11-27 00:53:57 +01:00
|
|
|
}
|
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
void PlayerMgr::onUnlockOrchestrion( Entity::Player& player, uint8_t songId, uint32_t itemId )
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
auto& server = Common::Service< World::WorldServer >::ref();
|
|
|
|
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), ToggleOrchestrionUnlock, songId, 1, itemId ) );
|
|
|
|
}
|
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
void PlayerMgr::onChangeGear( Entity::Player& player )
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
player.sendToInRangeSet( std::make_shared< ModelEquipPacket >( player ), true );
|
|
|
|
}
|
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
void PlayerMgr::onGcUpdate( Entity::Player& player )
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
auto& server = Common::Service< World::WorldServer >::ref();
|
2023-01-22 21:53:27 +01:00
|
|
|
auto gcAffPacket = makeZonePacket< FFXIVIpcGrandCompany >( player.getId() );
|
|
|
|
gcAffPacket->data().ActiveCompanyId = player.getGc();
|
|
|
|
gcAffPacket->data().MaelstromRank = player.getGcRankArray()[ 0 ];
|
|
|
|
gcAffPacket->data().TwinAdderRank = player.getGcRankArray()[ 1 ];
|
|
|
|
gcAffPacket->data().ImmortalFlamesRank = player.getGcRankArray()[ 2 ];
|
2021-11-27 00:53:57 +01:00
|
|
|
server.queueForPlayer( player.getCharacterId(), gcAffPacket );
|
|
|
|
}
|
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
void PlayerMgr::onMountUpdate( Entity::Player& player, uint32_t mountId )
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
if( mountId != 0 )
|
|
|
|
{
|
|
|
|
player.sendToInRangeSet( makeActorControl( player.getId(), ActorControlType::SetStatus,
|
|
|
|
static_cast< uint8_t >( Common::ActorStatus::Mounted ) ), true );
|
|
|
|
player.sendToInRangeSet( makeActorControlSelf( player.getId(), 0x39e, 12 ), true ); //?
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
player.sendToInRangeSet( makeActorControl( player.getId(), ActorControlType::SetStatus,
|
|
|
|
static_cast< uint8_t >( Common::ActorStatus::Idle ) ), true );
|
|
|
|
player.sendToInRangeSet( makeActorControlSelf( player.getId(), ActorControlType::Dismount, 1 ), true );
|
|
|
|
}
|
2022-02-21 01:49:01 +01:00
|
|
|
|
|
|
|
auto mountPacket = makeZonePacket< FFXIVIpcMount >( player.getId() );
|
|
|
|
mountPacket->data().id = mountId;
|
|
|
|
player.sendToInRangeSet( mountPacket, true );
|
2021-11-27 00:53:57 +01:00
|
|
|
}
|
|
|
|
|
2022-02-23 08:36:23 +01:00
|
|
|
void PlayerMgr::onMobKill( Entity::Player& player, Entity::BNpc& bnpc )
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref();
|
2022-02-23 08:36:23 +01:00
|
|
|
scriptMgr.onBNpcKill( player, bnpc );
|
2021-11-27 00:53:57 +01:00
|
|
|
|
2022-02-10 18:50:44 +01:00
|
|
|
if( player.hasReward( Common::UnlockEntry::HuntingLog ) )
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
2022-02-23 08:36:23 +01:00
|
|
|
player.updateHuntingLog( bnpc.getBNpcNameId() );
|
2021-11-27 00:53:57 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
void PlayerMgr::onHateListChanged( Entity::Player& player )
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
auto& server = Common::Service< World::WorldServer >::ref();
|
2022-01-27 20:03:51 -03:00
|
|
|
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
|
2021-11-27 00:53:57 +01:00
|
|
|
|
|
|
|
auto hateListPacket = makeZonePacket< FFXIVIpcHateList >( player.getId() );
|
|
|
|
auto hateRankPacket = makeZonePacket< FFXIVIpcHaterList >( player.getId() );
|
|
|
|
|
|
|
|
auto actorIdToHateSlotMap = player.getActorIdToHateSlotMap();
|
|
|
|
|
|
|
|
hateListPacket->data().Count = static_cast< uint8_t >( actorIdToHateSlotMap.size() );
|
|
|
|
|
|
|
|
hateRankPacket->data().Count = static_cast< uint8_t >( actorIdToHateSlotMap.size() );
|
|
|
|
auto it = actorIdToHateSlotMap.begin();
|
2022-01-27 20:03:51 -03:00
|
|
|
|
|
|
|
auto zone = teriMgr.getTerritoryByGuId( player.getTerritoryId() );
|
|
|
|
if( !zone )
|
|
|
|
return;
|
|
|
|
|
|
|
|
for( int32_t i = 0; it != actorIdToHateSlotMap.end(); ++it, ++i )
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
2022-01-27 20:03:51 -03:00
|
|
|
auto pBNpc = zone->getActiveBNpcByEntityId( it->first );
|
|
|
|
if( !pBNpc )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
auto hateValue = pBNpc->hateListGetValue( player.getAsChara() );
|
|
|
|
if( hateValue == 0 )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
auto hatePercent = ( hateValue / static_cast< float >( pBNpc->hateListGetHighestValue() ) ) * 100.f;
|
|
|
|
|
2022-01-06 20:25:50 +01:00
|
|
|
hateListPacket->data().List[ i ].Id = player.getId();
|
2022-01-27 20:03:51 -03:00
|
|
|
hateListPacket->data().List[ i ].Value = hateValue;
|
2021-11-27 00:53:57 +01:00
|
|
|
|
|
|
|
hateRankPacket->data().List[ i ].Id = it->first;
|
2022-01-27 20:03:51 -03:00
|
|
|
hateRankPacket->data().List[ i ].Rate = static_cast< uint8_t >( hatePercent );
|
2021-11-27 00:53:57 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
server.queueForPlayer( player.getCharacterId(), { hateListPacket, hateRankPacket } );
|
|
|
|
}
|
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
void PlayerMgr::onChangeClass( Entity::Player &player )
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
player.sendToInRangeSet( makeActorControl( player.getId(), ClassJobChange, 0x04 ), true );
|
|
|
|
player.sendStatusUpdate();
|
|
|
|
}
|
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
void PlayerMgr::onLogin( Entity::Player &player )
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
auto& server = Common::Service< World::WorldServer >::ref();
|
|
|
|
|
|
|
|
auto motd = server.getConfig().motd;
|
|
|
|
|
|
|
|
std::istringstream ss( motd );
|
|
|
|
std::string msg;
|
|
|
|
while( std::getline( ss, msg, ';' ) )
|
|
|
|
{
|
|
|
|
PlayerMgr::sendServerNotice( player, msg );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-15 22:03:44 +01:00
|
|
|
void PlayerMgr::onDeath( Entity::Player &player )
|
|
|
|
{
|
|
|
|
auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref();
|
|
|
|
scriptMgr.onPlayerDeath( player );
|
|
|
|
}
|
2021-11-27 00:53:57 +01:00
|
|
|
|
|
|
|
|
|
|
|
////////// Helper ///////////
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
void PlayerMgr::sendServerNotice( Entity::Player& player, const std::string& message ) //Purple Text
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
auto& server = Common::Service< World::WorldServer >::ref();
|
|
|
|
server.queueForPlayer( player.getCharacterId(), std::make_shared< ServerNoticePacket >( player.getId(), message ) );
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
void PlayerMgr::sendUrgent( Entity::Player& player, const std::string& message ) //Red Text
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
auto& server = Common::Service< World::WorldServer >::ref();
|
2022-01-27 21:08:43 +01:00
|
|
|
server.queueForPlayer( player.getCharacterId(), std::make_shared< ChatPacket >( player, Common::ChatType::ServerUrgent, message ) );
|
2021-11-27 00:53:57 +01:00
|
|
|
}
|
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
void PlayerMgr::sendDebug( Entity::Player& player, const std::string& message ) //Grey Text
|
2021-11-27 00:53:57 +01:00
|
|
|
{
|
|
|
|
auto& server = Common::Service< World::WorldServer >::ref();
|
2022-01-27 21:08:43 +01:00
|
|
|
server.queueForPlayer( player.getCharacterId(), std::make_shared< ChatPacket >( player, Common::ChatType::SystemMessage, message ) );
|
2021-11-27 00:53:57 +01:00
|
|
|
}
|
|
|
|
|
2022-01-27 21:08:43 +01:00
|
|
|
void PlayerMgr::sendLogMessage( Entity::Player& player, uint32_t messageId, uint32_t param2, uint32_t param3,
|
2021-11-27 00:53:57 +01:00
|
|
|
uint32_t param4, uint32_t param5, uint32_t param6 )
|
|
|
|
{
|
|
|
|
auto& server = Common::Service< World::WorldServer >::ref();
|
|
|
|
server.queueForPlayer( player.getCharacterId(), makeActorControlTarget( player.getId(), ActorControlType::LogMsg, messageId,
|
2021-11-27 18:19:13 +01:00
|
|
|
param2, param3, param4, param5, param6 ) );
|
2018-12-22 22:25:03 +01:00
|
|
|
}
|