1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-27 22:57:45 +00:00

Changing various packet sending functions to clean up the project.

This commit is contained in:
Mordred 2023-02-17 15:34:51 +01:00
parent fbbd599969
commit 9b46b89c65
37 changed files with 326 additions and 393 deletions

View file

@ -159,7 +159,7 @@ private:
quest.setUI8CH( 1 ); // receive key item
// teleport to real gridania
player.forceZoneing( TERRITORYTYPE0 );
warpMgr().requestMoveTerritory( player, Common::WarpType::WARP_TYPE_NORMAL, TERRITORYTYPE0 );
}
void Scene00051( World::Quest& quest, Entity::Player& player )

View file

@ -229,7 +229,7 @@ private:
{
quest.setSeq( Seq1 );
quest.setUI8CH( 1 );
player.forceZoneing( 132 );
warpMgr().requestMoveTerritory( player, Common::WarpType::WARP_TYPE_NORMAL, 132 );
}
//////////////////////////////////////////////////////////////////////

View file

@ -230,7 +230,7 @@ private:
quest.setSeq( Seq1 );
quest.setUI8CH( 1 ); // receive key item
// event is done, need to teleport to real zone.
player.forceZoneing( Territorytype0 );
warpMgr().requestMoveTerritory( player, Common::WarpType::WARP_TYPE_NORMAL, Territorytype0 );
}
//////////////////////////////////////////////////////////////////////

View file

@ -229,7 +229,7 @@ private:
quest.setUI8CH( 1 ); // Receive key item
// Teleport to real ul'dah
player.forceZoneing( 130 );
warpMgr().requestMoveTerritory( player, Common::WarpType::WARP_TYPE_NORMAL, 130 );
}
};

View file

@ -244,7 +244,7 @@ private:
pQuest->setUI8CH( 1 ); // receive key item
// teleport to real ul'dah
player.forceZoneing( 130 );
warpMgr().requestMoveTerritory( player, Common::WarpType::WARP_TYPE_NORMAL, 130 );
} );
}
};

View file

@ -233,7 +233,7 @@ private:
quest.setUI8CH( 1 );// receive key item
// teleport to real Uldah
player.forceZoneing( Territorytype0 );
warpMgr().requestMoveTerritory( player, Common::WarpType::WARP_TYPE_NORMAL, Territorytype0 );
}
};

View file

@ -218,7 +218,7 @@ private:
{
quest.setSeq( Seq2 );
player.changePosition( 10, 21, 13, -2 );
player.forceZoneing( Territorytype0 ); //Teleport to real Limsa
warpMgr().requestMoveTerritory( player, Common::WarpType::WARP_TYPE_NORMAL, Territorytype0 );
}
}
else

View file

@ -15,6 +15,7 @@
#include "Territory/Territory.h"
#include "Manager/PlayerMgr.h"
#include "Manager/MgrUtil.h"
#include "Session.h"
#include "Network/GameConnection.h"
@ -37,6 +38,7 @@ using namespace Sapphire::Network::Packets::WorldPackets;
using namespace Sapphire::Network::Packets::WorldPackets::Server;
using namespace Sapphire::Network::ActorControl;
using namespace Sapphire::World;
using namespace Sapphire::World::Manager;
Action::Action::Action() = default;
@ -295,7 +297,6 @@ bool Action::Action::update()
void Action::Action::start()
{
assert( m_pSource );
auto& server = Common::Service< World::WorldServer >::ref();
m_startTime = Common::Util::getTimeMs();
auto player = m_pSource->getAsPlayer();
@ -316,21 +317,21 @@ void Action::Action::start()
data.TargetPos[ 2 ] = Common::Util::floatToUInt16( m_pSource->getPos().z );
data.Dir = m_pSource->getRot();
m_pSource->sendToInRangeSet( castPacket, true );
server().queueForPlayers( m_pSource->getInRangePlayerIds( true ), castPacket );
if( player )
{
Service< World::Manager::PlayerMgr >::ref().onSendStateFlags( *player, PlayerStateFlag::Casting );
player->setStateFlag( PlayerStateFlag::Casting );
Service< World::Manager::PlayerMgr >::ref().onSendStateFlags( *player, true );
}
}
// todo: m_recastTimeMs needs to be adjusted for player sks/sps
auto actionStartPkt = makeActorControlSelf( m_pSource->getId(), ActorControlType::ActionStart, m_cooldownGroup, getId(),
m_recastTimeMs / 10 );
auto actionStartPkt = makeActorControlSelf( m_pSource->getId(), ActorControlType::ActionStart, m_cooldownGroup, getId(), m_recastTimeMs / 10 );
player->setRecastGroup( m_cooldownGroup, static_cast< float >( m_castTimeMs ) / 1000.f );
server.queueForPlayer( player->getCharacterId(), actionStartPkt );
server().queueForPlayer( player->getCharacterId(), actionStartPkt );
onStart();
@ -389,7 +390,7 @@ void Action::Action::interrupt()
auto control = makeActorControl( m_pSource->getId(), ActorControlType::CastInterrupt,
0x219, 1, m_id, interruptEffect );
m_pSource->sendToInRangeSet( control, true );
server().queueForPlayers( m_pSource->getInRangePlayerIds( true ), control );
}
onInterrupt();
@ -419,11 +420,6 @@ void Action::Action::execute()
if( hasCastTime() )
{
// todo: what's this?
/*auto control = ActorControlSelfPacket( m_pTarget->getId(), ActorControlType::Unk7,
0x219, m_id, m_id, m_id, m_id );
m_pSource->sendToInRangeSet( control, true );*/
if( auto pPlayer = m_pSource->getAsPlayer(); pPlayer )
{
pPlayer->setLastActionTick( 0 );

View file

@ -7,9 +7,11 @@
#include <Network/PacketWrappers/EffectPacket.h>
#include "Manager/PlayerMgr.h"
#include "Manager/MgrUtil.h"
using namespace Sapphire;
using namespace Sapphire::World::Action;
using namespace Sapphire::World::Manager;
using namespace Sapphire::Network::Packets::WorldPackets::Server;
ItemAction::ItemAction( Sapphire::Entity::CharaPtr source, uint32_t itemId,
@ -84,8 +86,7 @@ void ItemAction::handleVFXItem()
effectPacket->setAnimationId( Common::ItemActionType::ItemActionVFX );
effectPacket->setDisplayType( Common::ActionEffectDisplayType::ShowItemName );
effectPacket->addTargetEffect( effect, static_cast< uint64_t >( getSourceChara()->getId() ) );
m_pSource->sendToInRangeSet( effectPacket, true );
server().queueForPlayers( m_pSource->getInRangePlayerIds( true ), effectPacket );
}
void ItemAction::handleCompanionItem()

View file

@ -1,10 +1,8 @@
#include "MountAction.h"
#include <Exd/ExdData.h>
#include <Actor/Player.h>
#include <Manager/PlayerMgr.h>
#include <Manager/MgrUtil.h>
#include <Network/GameConnection.h>
#include <Network/CommonActorControl.h>
@ -21,6 +19,7 @@ using namespace Sapphire::Network::Packets;
using namespace Sapphire::Network::Packets::WorldPackets::Server;
using namespace Sapphire::Network::ActorControl;
using namespace Sapphire::World::Action;
using namespace Sapphire::World::Manager;
MountAction::MountAction( Sapphire::Entity::CharaPtr source, uint16_t mountId, uint16_t sequence,
std::shared_ptr< Excel::ExcelStruct< Excel::Action > > actionData ) :
@ -58,15 +57,12 @@ void MountAction::start()
data.TargetPos[ 1 ] = Common::Util::floatToUInt16( pos.y );
data.TargetPos[ 2 ] = Common::Util::floatToUInt16( pos.z );
data.Dir = m_pSource->getRot();
m_pSource->sendToInRangeSet( castPacket, true );
server().queueForPlayers( m_pSource->getInRangePlayerIds( true ), castPacket );
Common::Service< World::Manager::PlayerMgr >::ref().onSetStateFlag( *player, Common::PlayerStateFlag::Casting );
auto actionStartPkt = makeActorControlSelf( m_pSource->getId(), ActorControlType::ActionStart, 1, getId(), m_recastTimeMs / 10 );
auto& server = Common::Service< World::WorldServer >::ref();
server.queueForPlayer( m_pSource->getAsPlayer()->getCharacterId(), actionStartPkt );
server().queueForPlayer( m_pSource->getAsPlayer()->getCharacterId(), actionStartPkt );
}
void MountAction::execute()

View file

@ -33,6 +33,7 @@
#include <Manager/RNGMgr.h>
#include <Manager/PlayerMgr.h>
#include <Manager/TaskMgr.h>
#include <Manager/MgrUtil.h>
#include <Script/ScriptMgr.h>
#include <Task/RemoveBNpcTask.h>
#include <Task/FadeBNpcTask.h>
@ -44,6 +45,7 @@ using namespace Sapphire::Common;
using namespace Sapphire::Network::Packets;
using namespace Sapphire::Network::Packets::WorldPackets::Server;
using namespace Sapphire::Network::ActorControl;
using namespace Sapphire::World::Manager;
Sapphire::Entity::BNpc::BNpc() :
Npc( ObjKind::BattleNpc )
@ -430,7 +432,7 @@ void Sapphire::Entity::BNpc::sendPositionUpdate()
animationType = 0;
auto movePacket = std::make_shared< MoveActorPacket >( *getAsChara(), 0x3A, animationType, 0, 0x5A / 4 );
sendToInRangeSet( movePacket );
server().queueForPlayers( getInRangePlayerIds(), movePacket );
}
void Sapphire::Entity::BNpc::hateListClear()
@ -595,7 +597,7 @@ void Sapphire::Entity::BNpc::aggro( const Sapphire::Entity::CharaPtr& pChara )
setStance( Stance::Active );
m_state = BNpcState::Combat;
sendToInRangeSet( makeActorControl( getId(), ActorControlType::SetBattle, 1, 0, 0 ) );
server().queueForPlayers( getInRangePlayerIds(), makeActorControl( getId(), ActorControlType::SetBattle, 1, 0, 0 ) );
changeTarget( pChara->getId() );
@ -615,8 +617,8 @@ void Sapphire::Entity::BNpc::deaggro( const Sapphire::Entity::CharaPtr& pChara )
if( pChara->isPlayer() )
{
PlayerPtr tmpPlayer = pChara->getAsPlayer();
sendToInRangeSet( makeActorControl( getId(), ActorControlType::ToggleWeapon, 0, 1, 1 ) );
sendToInRangeSet( makeActorControl( getId(), ActorControlType::SetBattle, 0, 0, 0 ) );
server().queueForPlayers( getInRangePlayerIds(), makeActorControl( getId(), ActorControlType::ToggleWeapon, 0, 1, 1 ) );
server().queueForPlayers( getInRangePlayerIds(), makeActorControl( getId(), ActorControlType::SetBattle, 0, 0, 0 ) );
tmpPlayer->onMobDeaggro( *this );
if( getTriggerOwnerId() == pChara->getId() )
@ -939,13 +941,12 @@ void Sapphire::Entity::BNpc::setOwner( const Sapphire::Entity::CharaPtr& m_pChar
auto setOwnerPacket = makeZonePacket< FFXIVIpcFirstAttack >( getId() );
setOwnerPacket->data().Type = 0x01;
setOwnerPacket->data().Id = targetId;
sendToInRangeSet( setOwnerPacket );
server().queueForPlayers( getInRangePlayerIds(), setOwnerPacket );
if( m_pChara != nullptr && m_pChara->isPlayer() )
{
auto letter = makeActorControl( getId(), ActorControlType::SetHateLetter, 1, getId(), 0 );
auto& server = Common::Service< World::WorldServer >::ref();
server.queueForPlayer( m_pChara->getAsPlayer()->getCharacterId(), letter );
server().queueForPlayer( m_pChara->getAsPlayer()->getCharacterId(), letter );
}
}
@ -999,14 +1000,12 @@ void Sapphire::Entity::BNpc::autoAttack( CharaPtr pTarget )
auto resultId = pZone->getNextEffectResultId();
effectPacket->setSequence( resultId );
effectPacket->addTargetEffect( effectEntry );
sendToInRangeSet( effectPacket );
server().queueForPlayers( getInRangePlayerIds(), effectPacket );
pTarget->takeDamage( static_cast< uint16_t >( damage.first ) );
auto& taskMgr = Common::Service< World::Manager::TaskMgr >::ref();
taskMgr.queueTask( Sapphire::World::makeActionIntegrityTask( resultId, pTarget, 500 ) );
}
}

View file

@ -148,8 +148,7 @@ void Sapphire::Entity::EventObject::spawn( Sapphire::Entity::PlayerPtr pTarget )
eobjStatePacket->data().Args2 = 0; // initial animation state
eobjStatePacket->data().Args3 = getHousingLink();
auto pSession = server.getSession( pTarget->getCharacterId() );
pSession->getZoneConnection()->queueOutPacket( eobjStatePacket );
server.queueForPlayer( pTarget->getCharacterId(), eobjStatePacket );
}
@ -178,8 +177,9 @@ uint8_t Sapphire::Entity::EventObject::getPermissionInvisibility() const
void Sapphire::Entity::EventObject::setPermissionInvisibility( uint8_t permissionInvisibility )
{
m_permissionInvisibility = permissionInvisibility;
sendToInRangeSet( makeActorControl( getId(), DirectorEObjMod, permissionInvisibility ) );
auto& server = Common::Service< World::WorldServer >::ref();
auto inRangePlayerIds = getInRangePlayerIds();
server.queueForPlayers( inRangePlayerIds, makeActorControl( getId(), DirectorEObjMod, permissionInvisibility ) );
}
uint32_t Sapphire::Entity::EventObject::getOwnerId() const

View file

@ -22,6 +22,7 @@
#include "Manager/WarpMgr.h"
#include "Manager/FreeCompanyMgr.h"
#include "Manager/MapMgr.h"
#include "Manager/MgrUtil.h"
#include "Territory/Territory.h"
#include "Territory/InstanceContent.h"
@ -406,16 +407,6 @@ void Player::sendStats()
Service< World::Manager::PlayerMgr >::ref().onSendStats( *this );
}
void Player::forceZoneing( uint32_t zoneId )
{
auto& teriMgr = Common::Service< TerritoryMgr >::ref();
auto& warpMgr = Common::Service< WarpMgr >::ref();
auto pTeri = teriMgr.getZoneByTerritoryTypeId( zoneId );
if( !pTeri )
return;
warpMgr.requestMoveTerritory( *this, WarpType::WARP_TYPE_NORMAL, pTeri->getGuId(), getPos(), getRot() );
}
bool Player::exitInstance()
{
auto& teriMgr = Common::Service< TerritoryMgr >::ref();
@ -482,7 +473,7 @@ void Player::registerAetheryte( uint8_t aetheryteId )
Util::valueToFlagByteIndexValue( aetheryteId, value, index );
m_aetheryte[ index ] |= value;
queuePacket( makeActorControlSelf( getId(), LearnTeleport, aetheryteId, 1 ) );
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), LearnTeleport, aetheryteId, 1 ) );
}
bool Player::isAetheryteRegistered( uint8_t aetheryteId ) const
@ -597,7 +588,7 @@ void Player::setRewardFlag( Common::UnlockEntry unlockId )
m_unlocks[ index ] |= value;
queuePacket( makeActorControlSelf( getId(), SetRewardFlag, unlock, 1 ) );
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), SetRewardFlag, unlock, 1 ) );
}
void Player::learnSong( uint8_t songId, uint32_t itemId )
@ -845,7 +836,7 @@ void Player::spawn( Entity::PlayerPtr pTarget )
{
Logger::debug( "Spawning {0} for {1}", getName(), pTarget->getName() );
auto spawnPacket = std::make_shared< PlayerSpawnPacket >( *this, *pTarget );
pTarget->queuePacket( spawnPacket );
server().queueForPlayer( pTarget->getCharacterId(), spawnPacket );
}
// despawn
@ -855,8 +846,7 @@ void Player::despawn( Entity::PlayerPtr pTarget )
Logger::debug( "Despawning {0} for {1}", getName(), pTarget->getName() );
pPlayer->freePlayerSpawnId( getId() );
pPlayer->queuePacket( makeActorControlSelf( getId(), WarpStart, 0x04, getId(), 0x01 ) );
server().queueForPlayer( pTarget->getCharacterId(), makeActorControlSelf( getId(), WarpStart, 0x04, getId(), 0x01 ) );
}
GameObjectPtr Player::lookupTargetById( uint64_t targetId )
@ -961,7 +951,7 @@ void Player::freePlayerSpawnId( uint32_t actorId )
auto freeActorSpawnPacket = makeZonePacket< FFXIVIpcActorFreeSpawn >( getId() );
freeActorSpawnPacket->data().actorId = actorId;
freeActorSpawnPacket->data().spawnId = spawnId;
queuePacket( freeActorSpawnPacket );
server().queueForPlayer( getCharacterId(), freeActorSpawnPacket );
}
Player::AetheryteList& Player::getAetheryteArray()
@ -973,8 +963,7 @@ Player::AetheryteList& Player::getAetheryteArray()
void Player::setHomepoint( uint8_t aetheryteId )
{
m_homePoint = aetheryteId;
queuePacket( makeActorControlSelf( getId(), SetHomepoint, aetheryteId ) );
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), SetHomepoint, aetheryteId ) );
}
/*! get homepoint */
@ -1023,7 +1012,7 @@ void Player::unlockMount( uint32_t mountId )
m_mountGuide[ mount->data().MountOrder / 8 ] |= ( 1 << ( mount->data().MountOrder % 8 ) );
queuePacket( makeActorControlSelf( getId(), Network::ActorControl::SetMountBitmask, mount->data().MountOrder, 1 ) );
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), Network::ActorControl::SetMountBitmask, mount->data().MountOrder, 1 ) );
}
void Player::unlockCompanion( uint32_t companionId )
@ -1040,7 +1029,7 @@ void Player::unlockCompanion( uint32_t companionId )
m_minionGuide[ index ] |= value;
queuePacket( makeActorControlSelf( getId(), Network::ActorControl::LearnCompanion, companionId, 1 ) );
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), Network::ActorControl::LearnCompanion, companionId, 1 ) );
}
Player::MinionList& Player::getMinionGuideBitmask()
@ -1073,13 +1062,6 @@ const std::array< uint8_t, 3 >& Player::getGcRankArray() const
return m_gcRank;
}
void Player::queuePacket( Network::Packets::FFXIVPacketBasePtr pPacket )
{
auto& server = Common::Service< World::WorldServer >::ref();
server.queueForPlayer( getCharacterId(), std::move( pPacket ) );
}
bool Player::isLoadingComplete() const
{
return m_bLoadingComplete;
@ -1183,14 +1165,14 @@ const std::map< uint32_t, uint8_t >& Player::getActorIdToHateSlotMap()
void Player::onMobAggro( const BNpc& bnpc )
{
hateListAdd( bnpc );
queuePacket( makeActorControl( getId(), SetBattle, 1, 0, 0 ) );
server().queueForPlayer( getCharacterId(), makeActorControl( getId(), SetBattle, 1, 0, 0 ) );
}
void Player::onMobDeaggro( const BNpc& bnpc )
{
hateListRemove( bnpc );
if( m_actorIdTohateSlotMap.empty() )
queuePacket( makeActorControl( getId(), SetBattle, 0, 0, 0 ) );
server().queueForPlayer( getCharacterId(), makeActorControl( getId(), SetBattle, 0, 0, 0 ) );
}
bool Player::isLogin() const
@ -1232,8 +1214,7 @@ void Player::setTitle( uint16_t titleId )
return;
m_activeTitle = titleId;
sendToInRangeSet( makeActorControl( getId(), SetTitle, titleId ), true );
server().queueForPlayers( getInRangePlayerIds( true ), makeActorControl( getId(), SetTitle, titleId ) );
}
const Player::AchievementData& Player::getAchievementData() const
@ -1250,7 +1231,7 @@ void Player::setMaxGearSets( uint8_t amount )
{
m_equippedMannequin = amount;
queuePacket( makeActorControlSelf( getId(), SetMaxGearSets, m_equippedMannequin ) );
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), SetMaxGearSets, m_equippedMannequin ) );
}
void Player::addGearSet()
@ -1338,23 +1319,14 @@ void Player::autoAttack( CharaPtr pTarget )
entry.Arg1 = 7;
if( getClass() == ClassJob::Machinist || getClass() == ClassJob::Bard || getClass() == ClassJob::Archer )
{
// effectPacket->setAnimationId( 8 );
//entry.Arg2 = 0x72;
}
else
{
//effectPacket->setAnimationId( 7 );
//entry.Arg2 = 0x73;
}
effectPacket->setActionId( 8 );
auto resultId = pZone->getNextEffectResultId();
effectPacket->setResultId( resultId );
effectPacket->setRotation( Util::floatToUInt16Rot( getRot() ) );
effectPacket->addTargetEffect( entry );
sendToInRangeSet( effectPacket, true );
server().queueForPlayers( getInRangePlayerIds( true ), effectPacket );
pTarget->takeDamage( static_cast< uint32_t >( damage.first ) );
@ -1418,7 +1390,7 @@ void Player::setEorzeaTimeOffset( uint64_t timestamp )
packet->data().timestamp = timestamp;
// Send to single player
queuePacket( packet );
server().queueForPlayer( getCharacterId(), packet );
}
uint32_t Player::getPrevTerritoryTypeId() const
@ -1441,7 +1413,7 @@ void Player::sendTitleList()
auto titleListPacket = makeZonePacket< FFXIVIpcTitleList >( getId() );
memcpy( titleListPacket->data().TitleFlagsArray, getTitleList().data(), sizeof( titleListPacket->data().TitleFlagsArray ) );
queuePacket( titleListPacket );
server().queueForPlayer( getCharacterId(), titleListPacket );
}
void Player::teleportQuery( uint16_t aetheryteId )
@ -1465,7 +1437,7 @@ void Player::teleportQuery( uint16_t aetheryteId )
bool insufficientGil = getCurrency( Common::CurrencyType::Gil ) < cost;
// TODO: figure out what param1 really does
queuePacket( makeActorControlSelf( getId(), OnExecuteTelepo, insufficientGil ? 2 : 0, aetheryteId ) );
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), OnExecuteTelepo, insufficientGil ? 2 : 0, aetheryteId ) );
if( !insufficientGil )
{
@ -1542,7 +1514,7 @@ void Player::dyeItemFromDyeingInfo()
writeItem( itemToDye );
auto dyePkt = makeActorControlSelf( getId(), DyeMsg, itemToDye->getId(), shouldDye, invalidateGearSet );
queuePacket( dyePkt );
server().queueForPlayer( getCharacterId(), dyePkt );
}
void Player::setGlamouringInfo( uint32_t itemToGlamourContainer, uint32_t itemToGlamourSlot, uint32_t glamourBagContainer, uint32_t glamourBagSlot, bool shouldGlamour )
@ -1598,12 +1570,12 @@ void Player::glamourItemFromGlamouringInfo()
if( shouldGlamour )
{
auto castGlamPkt = makeActorControlSelf( getId(), GlamourCastMsg, itemToGlamour->getId(), glamourToUse->getId(), invalidateGearSet );
queuePacket( castGlamPkt );
server().queueForPlayer( getCharacterId(), castGlamPkt );
}
else
{
auto dispelGlamPkt = makeActorControlSelf( getId(), GlamourRemoveMsg, itemToGlamour->getId(), invalidateGearSet );
queuePacket( dispelGlamPkt );
server().queueForPlayer( getCharacterId(), dispelGlamPkt );
}
}
@ -1622,7 +1594,7 @@ void Player::freeObjSpawnIndexForActorId( uint32_t actorId )
auto freeObjectSpawnPacket = makeZonePacket< FFXIVIpcDeleteObject >( getId() );
freeObjectSpawnPacket->data().Index = spawnId;
queuePacket( freeObjectSpawnPacket );
server().queueForPlayer( getCharacterId(), freeObjectSpawnPacket );
}
bool Player::isObjSpawnIndexValid( uint8_t index )
@ -1695,7 +1667,7 @@ void Player::sendHuntingLog()
memcpy( huntPacket->data().killCount, entry.entries, sizeof( entry.entries ) );
huntPacket->data().completeFlags = completionFlag;
++count;
queuePacket( huntPacket );
server().queueForPlayer( getCharacterId(), huntPacket );
}
}
@ -1735,7 +1707,7 @@ void Player::updateHuntingLog( uint16_t id )
if( note1->data().Monster == id && logEntry.entries[ i - 1 ][ x ] < note->data().NeededKills[ x ] )
{
logEntry.entries[ i - 1 ][ x ]++;
queuePacket( makeActorControlSelf( getId(), HuntingLogEntryUpdate, monsterNoteId, x, logEntry.entries[ i - 1 ][ x ] ) );
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), HuntingLogEntryUpdate, monsterNoteId, x, logEntry.entries[ i - 1 ][ x ] ) );
logChanged = true;
sectionChanged = true;
}
@ -1744,7 +1716,7 @@ void Player::updateHuntingLog( uint16_t id )
}
if( logChanged && sectionComplete && sectionChanged )
{
queuePacket( makeActorControlSelf( getId(), HuntingLogSectionFinish, monsterNoteId, i, 0 ) );
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), HuntingLogSectionFinish, monsterNoteId, i, 0 ) );
gainExp( note->data().RewardExp );
}
if( !sectionComplete )
@ -1754,13 +1726,13 @@ void Player::updateHuntingLog( uint16_t id )
}
if( logChanged && allSectionsComplete )
{
queuePacket( makeActorControlSelf( getId(), HuntingLogRankFinish, 4, 0, 0 ) );
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), HuntingLogRankFinish, 4, 0, 0 ) );
gainExp( rankRewards[ logEntry.rank ] );
if( logEntry.rank < 4 )
{
logEntry.rank++;
memset( logEntry.entries, 0, 40 );
queuePacket( makeActorControlSelf( getId(), HuntingLogRankUnlock, currentClassId, logEntry.rank + 1, 0 ) );
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), HuntingLogRankUnlock, currentClassId, logEntry.rank + 1, 0 ) );
}
}
@ -1816,7 +1788,7 @@ void Player::sendRecastGroups()
auto recastGroupPaket = makeZonePacket< FFXIVIpcRecastGroup >( getId() );
memcpy( &recastGroupPaket->data().Recast, &m_recast, sizeof( m_recast ) );
memcpy( &recastGroupPaket->data().RecastMax, &m_recastMax, sizeof( m_recastMax ) );
queuePacket( recastGroupPaket );
server().queueForPlayer( getCharacterId(), recastGroupPaket );
}
void Player::resetRecastGroups()
@ -1931,7 +1903,7 @@ void Player::setFalling( bool state, const Common::FFXIVARR_POSITION3& pos, bool
takeDamage( damage );
}
sendToInRangeSet( makeActorControl( getId(), SetFallDamage, damage ), true );
server().queueForPlayers( getInRangePlayerIds( true ), makeActorControl( getId(), SetFallDamage, damage ) );
}
}
}

View file

@ -310,8 +310,6 @@ namespace Sapphire::Entity
void updatePrevTerritory();
void forceZoneing( uint32_t zoneId );
/*! change position, sends update too */
void changePosition( float x, float y, float z, float o );
@ -838,9 +836,6 @@ namespace Sapphire::Entity
const Common::CharaLandData& getCharaLandData( Common::LandFlagsSlot slot ) const;
private:
/*! queue a packet for the player */
void queuePacket( Network::Packets::FFXIVPacketBasePtr pPacket );
using InventoryMap = std::map< uint16_t, ItemContainerPtr >;
uint64_t m_lastDBWrite;

View file

@ -22,10 +22,12 @@
#include "Manager/InventoryMgr.h"
#include "Manager/ItemMgr.h"
#include "Manager/PlayerMgr.h"
#include "Manager/MgrUtil.h"
#include <Service.h>
using namespace Sapphire::Common;
using namespace Sapphire::World::Manager;
using namespace Sapphire::Network::Packets;
using namespace Sapphire::Network::Packets::WorldPackets::Server;
using namespace Sapphire::Network::ActorControl;
@ -330,14 +332,14 @@ void Sapphire::Entity::Player::addCurrency( CurrencyType type, uint32_t amount )
invUpdate->data().srcCatalogId = currItem->getId();
invUpdate->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
queuePacket( invUpdate );
server().queueForPlayer( getCharacterId(), invUpdate );
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
invTransFinPacket->data().contextId = seq;
invTransFinPacket->data().operationId = seq;
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
queuePacket( invTransFinPacket );
server().queueForPlayer( getCharacterId(), invTransFinPacket );
}
void Sapphire::Entity::Player::removeCurrency( Common::CurrencyType type, uint32_t amount )
@ -364,13 +366,13 @@ void Sapphire::Entity::Player::removeCurrency( Common::CurrencyType type, uint32
invUpdate->data().srcContainerIndex = static_cast< int16_t >( type ) - 1;
invUpdate->data().srcCatalogId = currItem->getId();
invUpdate->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
queuePacket( invUpdate );
server().queueForPlayer( getCharacterId(), invUpdate );
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
invTransFinPacket->data().contextId = seq;
invTransFinPacket->data().operationId = seq;
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
queuePacket( invTransFinPacket );
server().queueForPlayer( getCharacterId(), invTransFinPacket );
}
@ -403,15 +405,14 @@ void Sapphire::Entity::Player::addCrystal( Common::CrystalType type, uint32_t am
invUpdate->data().srcEntity = getId();
invUpdate->data().srcCatalogId = currItem->getId();
invUpdate->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
queuePacket( invUpdate );
server().queueForPlayer( getCharacterId(), invUpdate );
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
invTransFinPacket->data().contextId = seq;
invTransFinPacket->data().operationId = seq;
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
queuePacket( invTransFinPacket );
queuePacket( makeActorControlSelf( getId(), ItemObtainIcon, static_cast< uint8_t >( type ) + 1, amount ) );
server().queueForPlayer( getCharacterId(), invTransFinPacket );
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), ItemObtainIcon, static_cast< uint8_t >( type ) + 1, amount ) );
}
void Sapphire::Entity::Player::removeCrystal( Common::CrystalType type, uint32_t amount )
@ -439,13 +440,13 @@ void Sapphire::Entity::Player::removeCrystal( Common::CrystalType type, uint32_t
invUpdate->data().srcEntity = getId();
invUpdate->data().srcCatalogId = currItem->getId();
invUpdate->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
queuePacket( invUpdate );
server().queueForPlayer( getCharacterId(), invUpdate );
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
invTransFinPacket->data().contextId = seq;
invTransFinPacket->data().operationId = seq;
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
queuePacket( invTransFinPacket );
server().queueForPlayer( getCharacterId(), invTransFinPacket );
}
void Sapphire::Entity::Player::sendInventory()
@ -681,18 +682,18 @@ Sapphire::ItemPtr Sapphire::Entity::Player::addItem( uint32_t catalogId, uint32_
auto seq = getNextInventorySequence();
auto slotUpdate = std::make_shared< UpdateInventorySlotPacket >( getId(), slot, bag, *item, seq );
queuePacket( slotUpdate );
server().queueForPlayer( getCharacterId(), slotUpdate );
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
invTransFinPacket->data().contextId = seq;
invTransFinPacket->data().operationId = seq;
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
queuePacket( invTransFinPacket );
server().queueForPlayer( getCharacterId(), invTransFinPacket );
// return existing stack if we have no overflow - items fit into a preexisting stack
if( quantity == 0 )
{
queuePacket( makeActorControlSelf( getId(), ItemObtainIcon, catalogId, originalQuantity ) );
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), ItemObtainIcon, catalogId, originalQuantity ) );
return item;
}
@ -730,15 +731,14 @@ Sapphire::ItemPtr Sapphire::Entity::Player::addItem( uint32_t catalogId, uint32_
invTransPacket->data().dstStack = item->getStackSize();
invTransPacket->data().dstContainerIndex = freeBagSlot.second;
invTransPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_CREATEITEM;
queuePacket( invTransPacket );
server().queueForPlayer( getCharacterId(), invTransPacket );
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
invTransFinPacket->data().contextId = seq;
invTransFinPacket->data().operationId = seq;
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_CREATEITEM;
queuePacket( invTransFinPacket );
queuePacket( makeActorControlSelf( getId(), ItemObtainIcon, catalogId, originalQuantity ) );
server().queueForPlayer( getCharacterId(), invTransFinPacket );
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), ItemObtainIcon, catalogId, originalQuantity ) );
}
return item;
@ -982,13 +982,13 @@ void Sapphire::Entity::Player::discardItem( uint16_t fromInventoryId, uint16_t f
invTransPacket->data().srcStack = fromItem->getStackSize();
invTransPacket->data().srcContainerIndex = fromSlotId;
invTransPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_DELETEITEM;
queuePacket( invTransPacket );
server().queueForPlayer( getCharacterId(), invTransPacket );
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
invTransFinPacket->data().contextId = sequence;
invTransFinPacket->data().operationId = sequence;
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_DELETEITEM;
queuePacket( invTransFinPacket );
server().queueForPlayer( getCharacterId(), invTransFinPacket );
}
uint16_t Sapphire::Entity::Player::calculateEquippedGearItemLevel()
@ -1133,13 +1133,13 @@ Sapphire::ItemPtr Sapphire::Entity::Player::dropInventoryItem( Sapphire::Common:
invTransPacket->data().dstStack = item->getStackSize();
invTransPacket->data().dstContainerIndex = slotId;
invTransPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_DELETEITEM;
queuePacket( invTransPacket );
server().queueForPlayer( getCharacterId(), invTransPacket );
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
invTransFinPacket->data().contextId = seq;
invTransFinPacket->data().operationId = seq;
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_DELETEITEM;
queuePacket( invTransFinPacket );
server().queueForPlayer( getCharacterId(), invTransFinPacket );
return item;
}
@ -1193,14 +1193,13 @@ void Sapphire::Entity::Player::insertInventoryItem( Sapphire::Common::InventoryT
auto seq = getNextInventorySequence();
auto slotUpdate = std::make_shared< UpdateInventorySlotPacket >( getId(), slot, type, *item, seq );
queuePacket( slotUpdate );
server().queueForPlayer( getCharacterId(), slotUpdate );
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
invTransFinPacket->data().contextId = seq;
invTransFinPacket->data().operationId = seq;
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
queuePacket( invTransFinPacket );
server().queueForPlayer( getCharacterId(), invTransFinPacket );
}
bool Sapphire::Entity::Player::findFirstItemWithId( uint32_t catalogId,

View file

@ -1,23 +0,0 @@
#pragma once
#include "ForwardsZone.h"
namespace Sapphire::World::Manager
{
class BaseManager
{
public:
explicit BaseManager( FrameworkPtr pFw ) : m_pFw( std::move( pFw ) ) {};
virtual ~BaseManager() = default;
FrameworkPtr framework() const
{ return m_pFw; }
void setFw( FrameworkPtr pFw )
{ m_pFw = pFw; }
private:
FrameworkPtr m_pFw;
};
}

View file

@ -369,7 +369,7 @@ void HousingMgr::sendLandSignFree( Entity::Player& player, const Common::LandIde
server.queueForPlayer( player.getCharacterId(), plotPricePacket );
}
LandPurchaseResult HousingMgr::purchaseLand( Entity::Player& player, HousingZone& zone, uint8_t plot, uint8_t state )
LandPurchaseResult HousingMgr::purchaseLand( Entity::Player& player, HousingZone& zone, uint16_t plot, uint8_t state )
{
auto plotPrice = zone.getLand( plot )->getCurrentPrice();
@ -1182,7 +1182,7 @@ bool HousingMgr::placeExternalItem( Entity::Player& player, Inventory::HousingIt
auto zone = std::dynamic_pointer_cast< HousingZone >( pZone );
assert( zone );
zone->spawnYardObject( static_cast< uint8_t >( ident.landId ), static_cast< uint16_t >( freeSlot ), *item );
zone->spawnYardObject( ident.landId, static_cast< uint16_t >( freeSlot ), *item );
return true;
}
@ -1567,7 +1567,7 @@ bool HousingMgr::removeExternalItem( Entity::Player& player, HousingZone& terri,
}
if( shouldDespawnItem )
terri.despawnYardObject( static_cast< uint16_t >( land.getLandIdent().landId ), slotId );
terri.despawnYardObject( land.getLandIdent().landId, slotId );
return true;
}

View file

@ -76,7 +76,7 @@ namespace Sapphire::World::Manager
void sendLandSignOwned( Entity::Player& player, const Common::LandIdent ident );
void sendLandSignFree( Entity::Player& player, const Common::LandIdent ident );
LandPurchaseResult purchaseLand( Entity::Player& player, HousingZone& zone, uint8_t plot, uint8_t state );
LandPurchaseResult purchaseLand( Entity::Player& player, HousingZone& zone, uint16_t plot, uint8_t state );
/*!
* @brief Converts param1 of a client trigger into a Common::LandIndent

View file

@ -0,0 +1,18 @@
#include "ForwardsZone.h"
#include <Service.h>
#include "WorldServer.h"
#include "MgrUtil.h"
#include "PlayerMgr.h"
using namespace Sapphire;
using namespace Sapphire::World::Manager;
World::Manager::PlayerMgr& Sapphire::World::Manager::playerMgr()
{
return Common::Service< World::Manager::PlayerMgr >::ref();
}
World::WorldServer& Sapphire::World::Manager::server()
{
return Common::Service< World::WorldServer >::ref();
}

View file

@ -0,0 +1,13 @@
#pragma once
#include "ForwardsZone.h"
#include <Service.h>
#include "WorldServer.h"
namespace Sapphire::World::Manager
{
class PlayerMgr;
World::Manager::PlayerMgr& playerMgr();
World::WorldServer& server();
}

View file

@ -14,7 +14,7 @@
#include <Manager/FreeCompanyMgr.h>
#include <Script/ScriptMgr.h>
#include <WorldServer.h>
#include <Worldserver.h>
#include <Common.h>
#include <Network/PacketContainer.h>
@ -49,11 +49,9 @@ using namespace Sapphire::Network::ActorControl;
void PlayerMgr::onOnlineStatusChanged( Entity::Player& player, bool updateProfile )
{
auto& server = Common::Service< World::WorldServer >::ref();
auto statusPacket = makeZonePacket< FFXIVIpcSetOnlineStatus >( player.getId() );
statusPacket->data().onlineStatusFlags = player.getFullOnlineStatusMask();
server.queueForPlayer( player.getCharacterId(), statusPacket );
server().queueForPlayer( player.getCharacterId(), statusPacket );
if( updateProfile )
{
@ -61,61 +59,58 @@ void PlayerMgr::onOnlineStatusChanged( Entity::Player& player, bool updateProfil
searchInfoPacket->data().OnlineStatus = player.getFullOnlineStatusMask();
searchInfoPacket->data().Region = player.getSearchSelectRegion();
strcpy( searchInfoPacket->data().SearchComment, player.getSearchMessage());
server.queueForPlayer( player.getCharacterId(), searchInfoPacket );
server().queueForPlayer( player.getCharacterId(), searchInfoPacket );
}
player.sendToInRangeSet( makeActorControl( player.getId(), SetStatusIcon, static_cast< uint8_t >( player.getOnlineStatus() ) ), true );
server().queueForPlayers( player.getInRangePlayerIds( true ),
makeActorControl( player.getId(), SetStatusIcon, static_cast< uint8_t >( player.getOnlineStatus() ) ) );
}
void PlayerMgr::onEquipDisplayFlagsChanged( Entity::Player& player )
{
auto paramPacket = makeZonePacket< FFXIVIpcConfig >( player.getId() );
paramPacket->data().flag = player.getEquipDisplayFlags();
player.sendToInRangeSet( paramPacket, true );
server().queueForPlayers( player.getInRangePlayerIds( true ), paramPacket );
}
void PlayerMgr::onSendStateFlags( Entity::Player& player, bool updateInRange )
{
auto& server = Common::Service< World::WorldServer >::ref();
server.queueForPlayer( player.getCharacterId(), std::make_shared< PlayerStateFlagsPacket >( player ) );
server().queueForPlayer( player.getCharacterId(), std::make_shared< PlayerStateFlagsPacket >( player ) );
if( updateInRange )
player.sendToInRangeSet( makeActorControl( player.getId(), SetStatusIcon,
static_cast< uint8_t >( player.getOnlineStatus() ) ), true );
server().queueForPlayers( player.getInRangePlayerIds( true ),
makeActorControl( player.getId(), SetStatusIcon, static_cast< uint8_t >( player.getOnlineStatus() ) ) );
}
void PlayerMgr::onSendAchievementList( Entity::Player& player )
{
auto& server = Common::Service< World::WorldServer >::ref();
auto achvData = player.getAchievementData();
auto achvPacket = makeZonePacket< FFXIVIpcAchievement >( player.getId() );
std::memcpy( &achvPacket->data().complete[ 0 ], &achvData.unlockList[ 0 ], sizeof( achvPacket->data().complete ) );
std::memcpy( &achvPacket->data().history[ 0 ], &achvData.history[ 0 ], sizeof( achvPacket->data().history ) );
server.queueForPlayer( player.getCharacterId(), achvPacket );
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 );
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 ) );
server().queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), AchievementComplete, achievementId ) );
server().queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), AchievementObtainMsg, achievementId ) );
}
void PlayerMgr::onSendStats( Entity::Player& player )
@ -146,15 +141,11 @@ void PlayerMgr::onSendStats( Entity::Player& player )
auto statPacket = makeZonePacket< FFXIVIpcBaseParam >( player.getId() );
memcpy( statPacket->data().Param, statParams.data(), sizeof( uint32_t ) * statParams.size() );
auto& server = Common::Service< World::WorldServer >::ref();
server.queueForPlayer( player.getCharacterId(), statPacket );
server().queueForPlayer( player.getCharacterId(), statPacket );
}
void PlayerMgr::onPlayerStatusUpdate( Entity::Player& player )
{
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();
@ -162,22 +153,19 @@ void PlayerMgr::onPlayerStatusUpdate( Entity::Player& player )
playerStatusUpdate->data().LvSync = 0; //player.getLevelSync();
playerStatusUpdate->data().Exp = player.getExp();
server.queueForPlayer( player.getCharacterId(), playerStatusUpdate );
server().queueForPlayer( player.getCharacterId(), playerStatusUpdate );
}
void PlayerMgr::onPlayerHpMpTpChanged( Entity::Player& player )
{
auto& server = Common::Service< World::WorldServer >::ref();
player.sendToInRangeSet( std::make_shared< UpdateHpMpTpPacket >( player ), true );
server().queueForPlayers( player.getInRangePlayerIds( true ), std::make_shared< UpdateHpMpTpPacket >( player ) );
auto hudParamPacket = makeHudParam( player );
server.queueForPlayer( player.getCharacterId(), hudParamPacket );
server().queueForPlayer( player.getCharacterId(), hudParamPacket );
}
void PlayerMgr::onPlayerItemLevelUpdate( Entity::Player& player )
{
auto& server = Common::Service< World::WorldServer >::ref();
server.queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), SetItemLevel, player.getItemLevel(), 0 ) );
server().queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), SetItemLevel, player.getItemLevel(), 0 ) );
}
void PlayerMgr::onLevelUp( Entity::Player& player )
@ -186,10 +174,11 @@ void PlayerMgr::onLevelUp( Entity::Player& player )
player.sendStats();
onPlayerHpMpTpChanged( player );
player.sendToInRangeSet( makeHudParam( player ), true );
auto inRangePlayerIds = player.getInRangePlayerIds( true );
player.sendToInRangeSet( makeActorControl( player.getId(), LevelUpEffect, static_cast< uint8_t >( player.getClass() ),
player.getLevel(), player.getLevel() - 1 ), true );
server().queueForPlayers( inRangePlayerIds, makeHudParam( player ) );
server().queueForPlayers( inRangePlayerIds, makeActorControl( player.getId(), LevelUpEffect, static_cast< uint8_t >( player.getClass() ),
player.getLevel(), player.getLevel() - 1 ) );
onPlayerStatusUpdate( player );
@ -199,11 +188,10 @@ void PlayerMgr::onLevelUp( Entity::Player& player )
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 ) ) );
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< uint32_t >( classJob ) );
}
@ -211,38 +199,34 @@ void PlayerMgr::onSetLevelForClass( Entity::Player& player, Common::ClassJob cla
void PlayerMgr::onGainExp( Entity::Player& player, uint32_t exp )
{
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 ) );
server().queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), GainExpMsg, static_cast< uint8_t >( player.getClass() ), exp ) );
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), UpdateUiExp, static_cast< uint8_t >( player.getClass() ), player.getExp() ) );
server().queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), UpdateUiExp, static_cast< uint8_t >( player.getClass() ), player.getExp() ) );
}
void PlayerMgr::onUnlockOrchestrion( Entity::Player& player, uint8_t songId, uint32_t itemId )
{
player.learnSong( songId, itemId );
auto& server = Common::Service< World::WorldServer >::ref();
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), ToggleOrchestrionUnlock, songId, 1, itemId ) );
server().queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), ToggleOrchestrionUnlock, songId, 1, itemId ) );
}
void PlayerMgr::onChangeGear( Entity::Player& player )
{
player.sendToInRangeSet( std::make_shared< ModelEquipPacket >( player ), true );
server().queueForPlayers( player.getInRangePlayerIds( true ), std::make_shared< ModelEquipPacket >( player ) );
}
void PlayerMgr::onGcUpdate( Entity::Player& player )
{
auto& server = Common::Service< World::WorldServer >::ref();
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 ];
server.queueForPlayer( player.getCharacterId(), gcAffPacket );
server().queueForPlayer( player.getCharacterId(), gcAffPacket );
}
void PlayerMgr::onSetGc( Entity::Player& player, uint8_t gc )
@ -268,28 +252,29 @@ void PlayerMgr::onCompanionUpdate( Entity::Player& player, uint8_t companionId )
return;
player.setCompanion( companionId );
player.sendToInRangeSet( makeActorControl( player.getId(), ActorControlType::ToggleCompanion, companionId ), true );
server().queueForPlayers( player.getInRangePlayerIds( true ), makeActorControl( player.getId(), ActorControlType::ToggleCompanion, companionId ) );
}
void PlayerMgr::onMountUpdate( Entity::Player& player, uint32_t mountId )
{
auto inRangePlayerIds = player.getInRangePlayerIds( true );
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 ); //?
server().queueForPlayers( inRangePlayerIds,
makeActorControl( player.getId(), ActorControlType::SetStatus, static_cast< uint8_t >( Common::ActorStatus::Mounted ) ) );
server().queueForPlayers( inRangePlayerIds, makeActorControlSelf( player.getId(), 0x39e, 12 ) );
}
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 );
server().queueForPlayers( inRangePlayerIds,
makeActorControl( player.getId(), ActorControlType::SetStatus, static_cast< uint8_t >( Common::ActorStatus::Idle ) ) );
server().queueForPlayers( inRangePlayerIds, makeActorControlSelf( player.getId(), ActorControlType::Dismount, 1 ) );
}
auto mountPacket = makeZonePacket< FFXIVIpcMount >( player.getId() );
mountPacket->data().id = mountId;
player.sendToInRangeSet( mountPacket, true );
server().queueForPlayers( inRangePlayerIds, mountPacket );
}
void PlayerMgr::onMobKill( Entity::Player& player, Entity::BNpc& bnpc )
@ -305,7 +290,6 @@ void PlayerMgr::onMobKill( Entity::Player& player, Entity::BNpc& bnpc )
void PlayerMgr::onHateListChanged( Entity::Player& player )
{
auto& server = Common::Service< World::WorldServer >::ref();
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
auto hateListPacket = makeZonePacket< FFXIVIpcHateList >( player.getId() );
@ -341,20 +325,18 @@ void PlayerMgr::onHateListChanged( Entity::Player& player )
hateRankPacket->data().List[ i ].Rate = static_cast< uint8_t >( hatePercent );
}
server.queueForPlayer( player.getCharacterId(), { hateListPacket, hateRankPacket } );
server().queueForPlayer( player.getCharacterId(), { hateListPacket, hateRankPacket } );
}
void PlayerMgr::onChangeClass( Entity::Player& player )
{
player.sendToInRangeSet( makeActorControl( player.getId(), ClassJobChange, 0x04 ), true );
server().queueForPlayers( player.getInRangePlayerIds( true ), makeActorControl( player.getId(), ClassJobChange, 0x04 ) );
onPlayerHpMpTpChanged( player );
}
void PlayerMgr::onLogin( Entity::Player& player )
{
auto& server = Common::Service< World::WorldServer >::ref();
auto motd = server.getConfig().motd;
auto motd = server().getConfig().motd;
std::istringstream ss( motd );
std::string msg;
@ -386,8 +368,6 @@ void PlayerMgr::onZone( Sapphire::Entity::Player& player )
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
auto& housingMgr = Common::Service< HousingMgr >::ref();
auto& partyMgr = Common::Service< World::Manager::PartyMgr >::ref();
auto& server = Common::Service< World::WorldServer >::ref();
auto pZone = teriMgr.getTerritoryByGuId( player.getTerritoryId() );
if( !pZone )
@ -400,25 +380,14 @@ void PlayerMgr::onZone( Sapphire::Entity::Player& player )
auto initPacket = makeZonePacket< FFXIVIpcLogin >( player.getId() );
initPacket->data().playerActorId = player.getId();
server.queueForPlayer( player.getCharacterId(), initPacket );
server().queueForPlayer( player.getCharacterId(), initPacket );
player.sendInventory();
if( player.isLogin() )
{
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), 0x169, 0 ) ); // unknown
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), 0x54, 0 ) ); // something treasure map related?
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), 0x23D, 0 ) ); // unknown
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), 0x16F, 0 ) ); // SalvageSkill
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), 0x16F, 1 ) ); // SalvageSkill
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), 0x16F, 2 ) ); // SalvageSkill
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), 0x16F, 3 ) ); // SalvageSkill
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), 0x16F, 4 ) ); // SalvageSkill
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), 0x16F, 5 ) ); // SalvageSkill
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), 0x16F, 6 ) ); // SalvageSkill
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), 0x16F, 7 ) ); // SalvageSkill
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), SetConfigFlags, player.getEquipDisplayFlags(), 1 ) );
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), SetMaxGearSets, player.getMaxGearSets() ) );
server().queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), SetConfigFlags, player.getEquipDisplayFlags(), 1 ) );
server().queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), SetMaxGearSets, player.getMaxGearSets() ) );
}
// set flags, will be reset automatically by zoning ( only on client side though )
@ -430,7 +399,7 @@ void PlayerMgr::onZone( Sapphire::Entity::Player& player )
if( player.isLogin() )
{
player.sendItemLevel();
server.queueForPlayer( player.getCharacterId(), makePlayerSetup( player ) );
server().queueForPlayer( player.getCharacterId(), makePlayerSetup( player ) );
}
player.sendStats();
@ -442,16 +411,16 @@ void PlayerMgr::onZone( Sapphire::Entity::Player& player )
classInfo->data().Lv1 = player.getLevel();
if( player.isLogin() )
classInfo->data().Login = 1;
server.queueForPlayer( player.getCharacterId(), classInfo );
server().queueForPlayer( player.getCharacterId(), classInfo );
server.queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), 0x112, 0x24 ) ); // unknown
server().queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), 0x112, 0x24 ) ); // unknown
// only initialize the UI if the player in fact just logged in.
if( player.isLogin() )
{
auto contentFinderList = makeZonePacket< FFXIVIpcContentAttainFlags >( player.getId() );
std::memset( &contentFinderList->data(), 0xFF, sizeof( contentFinderList->data() ) );
server.queueForPlayer( player.getCharacterId(), contentFinderList );
server().queueForPlayer( player.getCharacterId(), contentFinderList );
player.clearSoldItems();
}
@ -472,17 +441,17 @@ void PlayerMgr::onZone( Sapphire::Entity::Player& player )
housingMgr.sendLandFlags( player );
server.queueForPlayer( player.getCharacterId(), makeInitZone( player, teri ) );
server().queueForPlayer( player.getCharacterId(), makeInitZone( player, teri ) );
teri.onPlayerZoneIn( player );
if( player.isLogin() )
{
server.queueForPlayer( player.getCharacterId(),
{
makeZonePacket< FFXIVIpcQuestRepeatFlags >( player.getId() ),
makeZonePacket< FFXIVIpcDailyQuests >( player.getId() )
} );
server().queueForPlayer( player.getCharacterId(),
{
makeZonePacket< FFXIVIpcQuestRepeatFlags >( player.getId() ),
makeZonePacket< FFXIVIpcDailyQuests >( player.getId() )
} );
}
if( player.getPartyId() != 0 )
@ -503,35 +472,32 @@ void PlayerMgr::onUpdate( Entity::Player& player, uint64_t tickCount )
if( !player.isAlive() )
return;
if( !player.checkAction() )
if( !player.checkAction() && ( player.getTargetId() && player.getStance() == Common::Stance::Active && player.isAutoattackOn() ) )
{
if( player.getTargetId() && player.getStance() == Common::Stance::Active && player.isAutoattackOn() )
auto mainWeap = player.getItemAt( Common::GearSet0, Common::GearSetSlot::MainHand );
// @TODO i dislike this, iterating over all in range actors when you already know the id of the actor you need...
for( const auto& actor : player.getInRangeActors() )
{
auto mainWeap = player.getItemAt( Common::GearSet0, Common::GearSetSlot::MainHand );
// @TODO i dislike this, iterating over all in range actors when you already know the id of the actor you need...
for( const auto& actor : player.getInRangeActors() )
if( actor->getId() == player.getTargetId() && actor->getAsChara()->isAlive() && mainWeap )
{
if( actor->getId() == player.getTargetId() && actor->getAsChara()->isAlive() && mainWeap )
auto chara = actor->getAsChara();
// default autoattack range
float range = 3.f + chara->getRadius() + player.getRadius() * 0.5f;
// default autoattack range for ranged classes
auto classJob = player.getClass();
if( classJob == Common::ClassJob::Machinist || classJob == Common::ClassJob::Bard || classJob == Common::ClassJob::Archer )
range = 25.f + chara->getRadius() + player.getRadius() * 0.5f;
if( Common::Util::distance( player.getPos(), actor->getPos() ) <= range )
{
auto chara = actor->getAsChara();
// default autoattack range
float range = 3.f + chara->getRadius() + player.getRadius() * 0.5f;
// default autoattack range for ranged classes
auto classJob = player.getClass();
if( classJob == Common::ClassJob::Machinist || classJob == Common::ClassJob::Bard || classJob == Common::ClassJob::Archer )
range = 25.f + chara->getRadius() + player.getRadius() * 0.5f;
if( Common::Util::distance( player.getPos(), actor->getPos() ) <= range )
if( ( tickCount - player.getLastAttack() ) > mainWeap->getDelay() )
{
if( ( tickCount - player.getLastAttack() ) > mainWeap->getDelay() )
{
player.setLastAttack( tickCount );
player.autoAttack( actor->getAsChara() );
}
player.setLastAttack( tickCount );
player.autoAttack( actor->getAsChara() );
}
}
}
@ -561,31 +527,24 @@ void PlayerMgr::onUnsetStateFlag( Sapphire::Entity::Player& player, Common::Play
////////// Helper ///////////
void PlayerMgr::sendServerNotice( Entity::Player& player, const std::string& message ) //Purple Text
{
auto& server = Common::Service< World::WorldServer >::ref();
server.queueForPlayer( player.getCharacterId(), std::make_shared< ServerNoticePacket >( player.getId(), message ) );
server().queueForPlayer( player.getCharacterId(), std::make_shared< ServerNoticePacket >( player.getId(), message ) );
}
void PlayerMgr::sendUrgent( Entity::Player& player, const std::string& message ) //Red Text
{
auto& server = Common::Service< World::WorldServer >::ref();
server.queueForPlayer( player.getCharacterId(), std::make_shared< ChatPacket >( player, Common::ChatType::ServerUrgent, message ) );
server().queueForPlayer( player.getCharacterId(), std::make_shared< ChatPacket >( player, Common::ChatType::ServerUrgent, message ) );
}
void PlayerMgr::sendDebug( Entity::Player& player, const std::string& message ) //Grey Text
{
auto& server = Common::Service< World::WorldServer >::ref();
server.queueForPlayer( player.getCharacterId(), std::make_shared< ChatPacket >( player, Common::ChatType::SystemMessage, message ) );
server().queueForPlayer( player.getCharacterId(), std::make_shared< ChatPacket >( player, Common::ChatType::SystemMessage, message ) );
}
void PlayerMgr::sendLogMessage( Entity::Player& player, uint32_t messageId, uint32_t param2, uint32_t param3,
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,
param2, param3, param4, param5, param6 ) );
server().queueForPlayer( player.getCharacterId(), makeActorControlTarget( player.getId(), ActorControlType::LogMsg, messageId,
param2, param3, param4, param5, param6 ) );
}

View file

@ -2,6 +2,7 @@
#include "ForwardsZone.h"
#include <spdlog/fmt/fmt.h>
#include "MgrUtil.h"
namespace Sapphire::World::Manager
{

View file

@ -17,8 +17,9 @@
#include <Manager/PlayerMgr.h>
#include <Manager/MapMgr.h>
#include <Manager/MgrUtil.h>
#include "WorldServer.h"
#include "Territory/Territory.h"
#include "Actor/Player.h"
#include <Territory/InstanceObjectCache.h>
@ -34,7 +35,6 @@ void WarpMgr::requestMoveTerritory( Entity::Player& player, Common::WarpType war
uint32_t targetTerritoryId, Common::FFXIVARR_POSITION3 targetPos, float targetRot )
{
auto& teriMgr = Common::Service< TerritoryMgr >::ref();
auto& server = Common::Service< WorldServer >::ref();
auto pTeri = teriMgr.getTerritoryByGuId( targetTerritoryId );
if( !pTeri )
@ -52,12 +52,19 @@ void WarpMgr::requestMoveTerritory( Entity::Player& player, Common::WarpType war
taskMgr.queueTask( makeMoveTerritoryTask( player, warpType, targetTerritoryId, targetPos, targetRot, 1000 ) );
}
void WarpMgr::requestMoveTerritory( Entity::Player& player, Common::WarpType warpType, uint32_t targetTerritoryId )
{
requestMoveTerritory( player, warpType, targetTerritoryId, player.getPos(), player.getRot() );
}
void WarpMgr::requestWarp( Entity::Player& player, Common::WarpType warpType, Common::FFXIVARR_POSITION3 targetPos, float targetRot )
{
m_entityIdToWarpInfoMap[ player.getId() ] = { 0, warpType, targetPos, targetRot };
player.sendToInRangeSet( makeActorControlSelf( player.getId(), WarpStart, warpType, warpType, 0, player.getTerritoryTypeId(), 1 ), true );
player.sendToInRangeSet( makeActorControl( player.getId(), ActorDespawnEffect, warpType, player.getTerritoryTypeId() ) );
server().queueForPlayers( player.getInRangePlayerIds( true ),
makeActorControlSelf( player.getId(), WarpStart, warpType, warpType, 0, player.getTerritoryTypeId(), 1 ) );
server().queueForPlayers( player.getInRangePlayerIds(),
makeActorControl( player.getId(), ActorDespawnEffect, warpType, player.getTerritoryTypeId() ) );
auto& taskMgr = Common::Service< TaskMgr >::ref();
taskMgr.queueTask( makeWarpTask( player, warpType, targetPos, targetRot, 1000 ) );
@ -96,12 +103,10 @@ void WarpMgr::finishWarp( Entity::Player& player )
player.setZoningType( Common::ZoningType::None );
if( !player.getGmInvis() )
player.sendToInRangeSet( zoneInPacket );
server().queueForPlayers( player.getInRangePlayerIds(), zoneInPacket );
auto& server = Common::Service< WorldServer >::ref();
server.queueForPlayer( player.getCharacterId(), zoneInPacket );
player.sendToInRangeSet( setStatusPacket, true );
server().queueForPlayer( player.getCharacterId(), zoneInPacket );
server().queueForPlayers( player.getInRangePlayerIds( true ), setStatusPacket );
playerMgr.onUnsetStateFlag( player, PlayerStateFlag::BetweenAreas );
@ -142,9 +147,9 @@ void WarpMgr::requestPlayerTeleport( Entity::Player& player, uint16_t aetheryteI
auto aetherytePlace = exdData.getRow< Excel::PlaceName >( data.TransferName );
PlayerMgr::sendDebug( player, "Teleport: {0} - {1} ({2})",
townPlace->getString( townPlace->data().Text.SGL ),
aetherytePlace->getString( aetherytePlace->data().Text.SGL ),
data.TerritoryType );
townPlace->getString( townPlace->data().Text.SGL ),
aetherytePlace->getString( aetherytePlace->data().Text.SGL ),
data.TerritoryType );
// if it is a teleport in the same zone, we want to do warp instead of moveTerri
bool sameTerritory = player.getTerritoryTypeId() == data.TerritoryType;

View file

@ -32,6 +32,15 @@ namespace Sapphire::World::Manager
/// <param name="targetRot"></param>
void requestMoveTerritory( Entity::Player& player, Common::WarpType warpType, uint32_t targetTerritoryId, Common::FFXIVARR_POSITION3 targetPos, float targetRot );
/// <summary>
/// request to move a player to specified territorytype with given WarpType, position will be the same as before
/// </summary>
/// <param name="player"></param>
/// <param name="warpType"></param>
/// <param name="targetTerritoryId"></param>
void requestMoveTerritory( Entity::Player& player, Common::WarpType warpType, uint32_t targetTerritoryId );
/// <summary>
/// handle player state pre-warp and tells client to warp player
/// </summary>

View file

@ -15,6 +15,7 @@
#include "Manager/TerritoryMgr.h"
#include "Manager/PlayerMgr.h"
#include "Manager/WarpMgr.h"
#include "Manager/MgrUtil.h"
#include "Territory/Territory.h"
#include "Territory/InstanceContent.h"
@ -86,7 +87,6 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR
if( player.getGmRank() <= 0 )
return;
auto& server = Common::Service< World::WorldServer >::ref();
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
auto& exdData = Common::Service< Data::ExdData >::ref();
@ -233,7 +233,7 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR
}
case GmCommand::Speed:
{
server.queueForPlayer( targetPlayer->getCharacterId(), makeActorControlSelf( player.getId(), Flee, param1 ) );
server().queueForPlayer( targetPlayer->getCharacterId(), makeActorControlSelf( player.getId(), Flee, param1 ) );
PlayerMgr::sendServerNotice( player, "Speed for {0} was set to {1}", targetPlayer->getName(), param1 );
break;
}
@ -270,11 +270,10 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR
searchInfoPacket->data().OnlineStatus = param1;
searchInfoPacket->data().Region = targetPlayer->getSearchSelectRegion();
strcpy( searchInfoPacket->data().SearchComment, targetPlayer->getSearchMessage() );
server.queueForPlayer( targetPlayer->getCharacterId(), searchInfoPacket );
server().queueForPlayer( targetPlayer->getCharacterId(), searchInfoPacket );
targetPlayer->sendToInRangeSet( makeActorControl( player.getId(), SetStatusIcon,
static_cast< uint8_t >( player.getOnlineStatus() ) ),
true );
server().queueForPlayers( targetPlayer->getInRangePlayerIds( true ), makeActorControl( player.getId(), SetStatusIcon,
static_cast< uint8_t >( player.getOnlineStatus() ) ) );
PlayerMgr::sendServerNotice( player, "Icon for {0} was set to {1}", targetPlayer->getName(), param1 );
break;
}
@ -449,7 +448,7 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR
Service< World::Manager::PlayerMgr >::ref().onSetGcRank( player, static_cast< uint8_t >( gcId ), static_cast< uint8_t >( param1 ) );
PlayerMgr::sendServerNotice( player, "GC Rank for {0} for GC {1} was set to {2}", targetPlayer->getName(), targetPlayer->getGc(),
targetPlayer->getGcRankArray()[ targetPlayer->getGc() - 1 ] );
targetPlayer->getGcRankArray()[ targetPlayer->getGc() - 1 ] );
break;
}
case GmCommand::Aetheryte:
@ -474,7 +473,7 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR
}
case GmCommand::Wireframe:
{
server.queueForPlayer( player.getCharacterId(),
server().queueForPlayer( player.getCharacterId(),
std::make_shared< ActorControlSelfPacket >( player.getId(), ActorControlType::ToggleWireframeRendering ) );
PlayerMgr::sendServerNotice( player, "Wireframe Rendering for {0} was toggled", player.getName() );
break;
@ -601,7 +600,6 @@ void Sapphire::Network::GameConnection::gmCommandNameHandler( const Packets::FFX
if( player.getGmRank() <= 0 )
return;
auto& server = Common::Service< World::WorldServer >::ref();
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
const auto packet = ZoneChannelPacket< Client::FFXIVIpcGmCommandName >( inPacket );
@ -616,7 +614,7 @@ void Sapphire::Network::GameConnection::gmCommandNameHandler( const Packets::FFX
Logger::debug( "{0} used GM2 commandId: {1}, params: {2}, {3}, {4}, {5}, target: {6}",
player.getName(), commandId, param1, param2, param3, param4, target );
auto targetSession = server.getSession( target );
auto targetSession = server().getSession( target );
Sapphire::Entity::CharaPtr targetActor;
if( targetSession != nullptr )
@ -652,10 +650,10 @@ void Sapphire::Network::GameConnection::gmCommandNameHandler( const Packets::FFX
targetPlayer->resetMp();
targetPlayer->setStatus( Common::ActorStatus::Idle );
targetPlayer->sendToInRangeSet( makeActorControlSelf( player.getId(), Appear, 0x01, 0x01, 0, 113 ), true );
targetPlayer->sendToInRangeSet( makeActorControl( player.getId(), SetStatus,
static_cast< uint8_t >( Common::ActorStatus::Idle ) ),
true );
server().queueForPlayers( targetPlayer->getInRangePlayerIds( true ), makeActorControlSelf( player.getId(), Appear, 0x01, 0x01, 0, 113 ) );
server().queueForPlayers( targetPlayer->getInRangePlayerIds( true ), makeActorControl( player.getId(), SetStatus,
static_cast< uint8_t >( Common::ActorStatus::Idle ) ) );
PlayerMgr::sendServerNotice( player, "Raised {0}", targetPlayer->getName());
break;
}

View file

@ -666,7 +666,7 @@ void Sapphire::Network::GameConnection::commandHandler( const Packets::FFXIVARR_
}*/
case PacketCommand::EVENT_HANDLER:
{
pZone->onEventHandlerOrder( player, param11, param12, param2, param3, param4 );
pZone->onEventHandlerOrder( player, param11, param12, param2, static_cast< uint32_t >( param3 ), param4 );
break;
}

View file

@ -56,6 +56,7 @@
#include "Manager/WarpMgr.h"
#include "Manager/ItemMgr.h"
#include "Manager/FreeCompanyMgr.h"
#include "Manager/MgrUtil.h"
#include "Action/Action.h"
@ -100,8 +101,8 @@ void Sapphire::Network::GameConnection::setProfileHandler( const Packets::FFXIVA
strcpy( searchInfoPacket->data().SearchComment, player.getSearchMessage() );
queueOutPacket( searchInfoPacket );
player.sendToInRangeSet( makeActorControl( player.getId(), SetStatusIcon,
static_cast< uint8_t >( player.getOnlineStatus() ) ), true );
server().queueForPlayers( player.getInRangePlayerIds( true ), makeActorControl( player.getId(), SetStatusIcon,
static_cast< uint8_t >( player.getOnlineStatus() ) ) );
}
void Sapphire::Network::GameConnection::getProfileHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
@ -115,10 +116,8 @@ void Sapphire::Network::GameConnection::getProfileHandler( const Packets::FFXIVA
void Sapphire::Network::GameConnection::getSearchCommentHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
{
auto targetId = *reinterpret_cast< const uint32_t* >( &inPacket.data[ 0x10 ] );
auto& server = Common::Service< World::WorldServer >::ref();
auto pPlayer = server.getPlayer( targetId );
auto pPlayer = server().getPlayer( targetId );
Logger::debug( "getSearchCommentHandler: {0}", targetId );
@ -131,33 +130,26 @@ void Sapphire::Network::GameConnection::getSearchCommentHandler( const Packets::
auto searchInfoPacket = makeZonePacket< FFXIVIpcGetSearchCommentResult >( player.getId() );
searchInfoPacket->data().TargetEntityID = targetId;
strcpy( searchInfoPacket->data().SearchComment, pPlayer->getSearchMessage() );
server.queueForPlayer( player.getCharacterId(), searchInfoPacket );
server().queueForPlayer( player.getCharacterId(), searchInfoPacket );
}
}
void Sapphire::Network::GameConnection::reqExamineFcInfo( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
{
auto targetId = *reinterpret_cast< const uint32_t* >( &inPacket.data[ 0x18 ] );
auto& server = Common::Service< World::WorldServer >::ref();
auto pPlayer = server.getPlayer( targetId );
auto pPlayer = server().getPlayer( targetId );
Logger::debug( "reqExamineFcInfo: {0}", targetId );
if( pPlayer )
{
if( pPlayer->isActingAsGm() || pPlayer->getTerritoryTypeId() != player.getTerritoryTypeId() )
return;
if( !pPlayer || pPlayer->isActingAsGm() || pPlayer->getTerritoryTypeId() != player.getTerritoryTypeId() )
return;
// retail sends the requester's id as both (isForSelf)
auto examineFcInfoPacket = makeZonePacket< FFXIVIpcGetFcProfileResult >( player.getId() );
examineFcInfoPacket->data().TargetEntityID = targetId;
// todo: populate with fc info
server.queueForPlayer( player.getCharacterId(), examineFcInfoPacket );
}
// retail sends the requester's id as both (isForSelf)
auto examineFcInfoPacket = makeZonePacket< FFXIVIpcGetFcProfileResult >( player.getId() );
examineFcInfoPacket->data().TargetEntityID = targetId;
// todo: populate with fc info
server().queueForPlayer( player.getCharacterId(), examineFcInfoPacket );
}
void Sapphire::Network::GameConnection::joinChatChannelHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
@ -173,31 +165,18 @@ void Sapphire::Network::GameConnection::joinChatChannelHandler( const Packets::F
chatChannelMgr.addToChannel( joinChannelPacket.data().ChannelID, player );
auto chatChannelResultPacket = makeZonePacket< FFXIVIpcChatChannelResult >( player.getId() );
chatChannelResultPacket->data().ChannelID = channelIdReq;
chatChannelResultPacket->data().TargetCharacterID = player.getId();
chatChannelResultPacket->data().CommunityID = player.getCharacterId();
chatChannelResultPacket->data().UpPacketNo = 0; // todo: define behavior
chatChannelResultPacket->data().Result = 0; // todo: define behavior
queueOutPacket( chatChannelResultPacket );
auto joinChannelResultPacket = makeChatPacket< Packets::Server::FFXIVJoinChannelResult >( player.getId() );
joinChannelResultPacket->data().channelID = channelIdReq;
joinChannelResultPacket->data().characterID = player.getId();
joinChannelResultPacket->data().result = 0;
auto& server = Common::Service< World::WorldServer >::ref();
auto pSession = server.getSession( player.getCharacterId() );
if( !pSession )
{
Logger::error( std::string( __FUNCTION__ ) + ": Session not found for player#{}", player.getCharacterId() );
return;
}
pSession->getChatConnection()->queueOutPacket( joinChannelResultPacket );
queueOutPacket( joinChannelResultPacket );
}
@ -286,7 +265,7 @@ void Sapphire::Network::GameConnection::moveHandler( const Packets::FFXIVARR_PAC
//auto movePacket = std::make_shared< MoveActorPacket >( player, headRotation, animationType, animationState, animationSpeed, unknownRotation );
auto movePacket = std::make_shared< MoveActorPacket >( player, headRotation, data.flag, data.flag2, animationSpeed, unknownRotation );
player.sendToInRangeSet( movePacket );
server().queueForPlayers( player.getInRangePlayerIds(), movePacket );
}
void Sapphire::Network::GameConnection::configHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
@ -305,7 +284,6 @@ void Sapphire::Network::GameConnection::zoneJumpHandler( const Packets::FFXIVARR
auto& teriMgr = Common::Service< TerritoryMgr >::ref();
auto& instanceObjectCache = Common::Service< InstanceObjectCache >::ref();
auto& server = Common::Service< World::WorldServer >::ref();
auto pTeri = teriMgr.getTerritoryByGuId( player.getTerritoryId() );
auto tInfo = pTeri->getTerritoryTypeInfo();
@ -342,7 +320,6 @@ void Sapphire::Network::GameConnection::zoneJumpHandler( const Packets::FFXIVARR
void Sapphire::Network::GameConnection::newDiscoveryHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
{
auto& server = Common::Service< World::WorldServer >::ref();
auto& teriMgr = Common::Service< TerritoryMgr >::ref();
auto& instanceObjectCache = Common::Service< InstanceObjectCache >::ref();
auto pTeri = teriMgr.getTerritoryByGuId( player.getTerritoryId() );
@ -359,7 +336,7 @@ void Sapphire::Network::GameConnection::newDiscoveryHandler( const Packets::FFXI
auto discoveryPacket = makeZonePacket< FFXIVIpcDiscoveryReply >( player.getId() );
discoveryPacket->data().mapId = tInfo->data().Map;
discoveryPacket->data().mapPartId = pRefInfo->data.discoveryIndex;
server.queueForPlayer( player.getCharacterId(), discoveryPacket );
server().queueForPlayer( player.getCharacterId(), discoveryPacket );
player.discover( tInfo->data().Map, pRefInfo->data.discoveryIndex );
}
@ -378,13 +355,12 @@ void Sapphire::Network::GameConnection::loginHandler( const Packets::FFXIVARR_PA
void Sapphire::Network::GameConnection::syncHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
{
auto& server = Common::Service< World::WorldServer >::ref();
const auto packet = ZoneChannelPacket< Client::FFXIVIpcPingHandler >( inPacket );
auto& data = packet.data();
queueOutPacket( std::make_shared< WorldPackets::Server::PingPacket >( player, data.clientTimeValue ) );
auto pSession = server.getSession( player.getCharacterId() );
auto pSession = server().getSession( player.getCharacterId() );
if( !pSession )
return;
@ -633,9 +609,6 @@ void Sapphire::Network::GameConnection::gearSetEquip( const Packets::FFXIVARR_PA
const auto packet = ZoneChannelPacket< Client::FFXIVIpcGearSetEquip >( inPacket );
const auto contextId = packet.data().contextId;
auto& server = Common::Service< World::WorldServer >::ref();
auto& playerMgr = Common::Service< PlayerMgr >::ref();
// Loop over all slots
for( int slot = 0; slot < 14; ++slot )
{
@ -651,14 +624,14 @@ void Sapphire::Network::GameConnection::gearSetEquip( const Packets::FFXIVARR_PA
if( fromItem && equippedItem )
{
player.swapItem( fromContainer, fromSlot, Common::GearSet0, slot );
server.queueForPlayer( player.getCharacterId(), std::make_shared< UpdateInventorySlotPacket >( player.getId(), fromSlot, fromContainer, *equippedItem, contextId ) );
server.queueForPlayer( player.getCharacterId(), std::make_shared< UpdateInventorySlotPacket >( player.getId(), slot, Common::GearSet0, *fromItem, contextId ) );
server().queueForPlayer( player.getCharacterId(), std::make_shared< UpdateInventorySlotPacket >( player.getId(), fromSlot, fromContainer, *equippedItem, contextId ) );
server().queueForPlayer( player.getCharacterId(), std::make_shared< UpdateInventorySlotPacket >( player.getId(), slot, Common::GearSet0, *fromItem, contextId ) );
}
else if( fromItem && !equippedItem )
{
player.moveItem( fromContainer, fromSlot, Common::GearSet0, slot );
server.queueForPlayer( player.getCharacterId(), std::make_shared< UpdateInventorySlotPacket >( player.getId(), fromSlot, fromContainer, contextId ) );
server.queueForPlayer( player.getCharacterId(), std::make_shared< UpdateInventorySlotPacket >( player.getId(), slot, Common::GearSet0, *fromItem, contextId ) );
server().queueForPlayer( player.getCharacterId(), std::make_shared< UpdateInventorySlotPacket >( player.getId(), fromSlot, fromContainer, contextId ) );
server().queueForPlayer( player.getCharacterId(), std::make_shared< UpdateInventorySlotPacket >( player.getId(), slot, Common::GearSet0, *fromItem, contextId ) );
}
else if( !fromItem && equippedItem )
{
@ -672,8 +645,8 @@ void Sapphire::Network::GameConnection::gearSetEquip( const Packets::FFXIVARR_PA
// TODO: the gearset handler shouldn't equip -anything- if there's ever too little inventory space
continue;
}
server.queueForPlayer( player.getCharacterId(), std::make_shared< UpdateInventorySlotPacket >( player.getId(), freeContainerSlot.second, freeContainerSlot.first, *equippedItem, contextId ) );
server.queueForPlayer( player.getCharacterId(), std::make_shared< UpdateInventorySlotPacket >( player.getId(), slot, Common::GearSet0, contextId ) );
server().queueForPlayer( player.getCharacterId(), std::make_shared< UpdateInventorySlotPacket >( player.getId(), freeContainerSlot.second, freeContainerSlot.first, *equippedItem, contextId ) );
server().queueForPlayer( player.getCharacterId(), std::make_shared< UpdateInventorySlotPacket >( player.getId(), slot, Common::GearSet0, contextId ) );
}
}
@ -682,14 +655,14 @@ void Sapphire::Network::GameConnection::gearSetEquip( const Packets::FFXIVARR_PA
if( packet.data().contextId < 0xFE )
{
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), Network::ActorControl::GearSetEquipMsg, packet.data().contextId ) );
server().queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), Network::ActorControl::GearSetEquipMsg, packet.data().contextId ) );
}
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( player.getId() );
invTransFinPacket->data().contextId = contextId;
invTransFinPacket->data().operationId = contextId;
invTransFinPacket->data().operationType = ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
server.queueForPlayer( player.getCharacterId(), invTransFinPacket );
server().queueForPlayer( player.getCharacterId(), invTransFinPacket );
}
void Sapphire::Network::GameConnection::marketBoardRequestItemInfo( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )

View file

@ -41,9 +41,9 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
std::memcpy( &m_data.CalcResult.CalcResultCt[ m_sourceEffectCount++ ], &effect, sizeof( Common::CalcResultParam ) );
}
void setAnimationId( uint16_t animationId )
void setActionId( uint16_t actionId )
{
m_data.Action = animationId;
m_data.Action = actionId;
}
void setDisplayType( Common::ActionEffectDisplayType displayType )

View file

@ -46,7 +46,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
{
m_data.handlerId = directorId;
m_data.messageId = msgId;
m_data.numOfArgs = args.size();
m_data.numOfArgs = static_cast< uint8_t >( args.size() );
std::copy( args.begin(), args.end(), m_data.args );
};
};
@ -64,7 +64,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
{
m_data.handlerId = directorId;
m_data.messageId = msgId;
m_data.numOfArgs = args.size();
m_data.numOfArgs = static_cast< uint8_t >( args.size() );
std::copy( args.begin(), args.end(), m_data.args );
};
};
@ -82,7 +82,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
{
m_data.handlerId = directorId;
m_data.messageId = msgId;
m_data.numOfArgs = args.size();
m_data.numOfArgs = static_cast< uint8_t >( args.size() );
std::copy( args.begin(), args.end(), m_data.args );
};
};
@ -100,7 +100,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
{
m_data.handlerId = directorId;
m_data.messageId = msgId;
m_data.numOfArgs = args.size();
m_data.numOfArgs = static_cast< uint8_t >( args.size() );
std::copy( args.begin(), args.end(), m_data.args );
};
};
@ -118,7 +118,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
{
m_data.handlerId = directorId;
m_data.messageId = msgId;
m_data.numOfArgs = args.size();
m_data.numOfArgs = static_cast< uint8_t >( args.size() );
std::copy( args.begin(), args.end(), m_data.args );
};
};

View file

@ -45,15 +45,7 @@ void ActionIntegrityTask::execute()
data.ResultId = m_resultId;
data.Target = m_pTarget->getId();
for( auto& charId : inRangePlayers )
{
auto pPlayer = server.getPlayer( charId );
Logger::debug( "Sending to {}", charId );
integrityPacket->setTargetActor( pPlayer->getId() );
server.queueForPlayer( charId, integrityPacket );
}
server.queueForPlayers( inRangePlayers, integrityPacket );
}

View file

@ -3,6 +3,8 @@
#include <Logging/Logger.h>
#include <Actor/BNpc.h>
#include <Manager/TerritoryMgr.h>
#include <Manager/MgrUtil.h>
#include "WorldServer.h"
#include <Service.h>
#include <Territory/Territory.h>
@ -12,6 +14,7 @@
#include <Network/PacketWrappers/ActorControlPacket.h>
using namespace Sapphire::World;
using namespace Sapphire::World::Manager;
using namespace Sapphire::Network::ActorControl;
using namespace Sapphire::Network::Packets::WorldPackets::Server;
@ -28,15 +31,14 @@ void FadeBNpcTask::onQueue()
void FadeBNpcTask::execute()
{
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
auto pZone = teriMgr.getTerritoryByGuId( m_pBNpc->getTerritoryId() );
if( !pZone )
return;
m_pBNpc->sendToInRangeSet( makeActorControl( m_pBNpc->getId(), ActorControlType::DeadFadeOut, 0, 0, 0 ) );
auto inRangePlayerIds = m_pBNpc->getInRangePlayerIds();
server().queueForPlayers( inRangePlayerIds, makeActorControl( m_pBNpc->getId(), ActorControlType::DeadFadeOut, 0, 0, 0 ) );
}
std::string FadeBNpcTask::toString()

View file

@ -40,8 +40,13 @@ void MoveTerritoryTask::execute()
if( !pPlayer )
return;
pPlayer->sendToInRangeSet( makeActorControlSelf( pPlayer->getId(), WarpStart, m_warpInfo.m_warpType, 1, 0, m_warpInfo.m_targetTerritoryId, 1 ), true );
pPlayer->sendToInRangeSet( makeActorControl( pPlayer->getId(), ActorDespawnEffect, m_warpInfo.m_warpType, m_warpInfo.m_targetTerritoryId ) );
auto inRangePlayerIds = pPlayer->getInRangePlayerIds();
auto warpStart = makeActorControlSelf( pPlayer->getId(), WarpStart, m_warpInfo.m_warpType, 1, 0, m_warpInfo.m_targetTerritoryId, 1 );
server.queueForPlayers( inRangePlayerIds, warpStart );
server.queueForPlayer( pPlayer->getCharacterId(), warpStart );
server.queueForPlayers( inRangePlayerIds, makeActorControl( pPlayer->getId(), ActorDespawnEffect, m_warpInfo.m_warpType, m_warpInfo.m_targetTerritoryId ) );
Common::Service< PlayerMgr >::ref().onSetStateFlag( *pPlayer, Common::PlayerStateFlag::BetweenAreas );
auto moveTerritoryPacket = makeZonePacket< WorldPackets::Server::FFXIVIpcMoveTerritory >( pPlayer->getId() );

View file

@ -31,8 +31,12 @@ void WarpTask::execute()
auto pPlayer = server.getPlayer( m_playerId );
if( !pPlayer )
return;
pPlayer->sendToInRangeSet( makeWarp( pPlayer->getId(), m_warpInfo.m_warpType, m_warpInfo.m_targetPos, m_warpInfo.m_targetRot ), true );
auto inRangePlayerIds = pPlayer->getInRangePlayerIds();
auto warpPacket = makeWarp( pPlayer->getId(), m_warpInfo.m_warpType, m_warpInfo.m_targetPos, m_warpInfo.m_targetRot );
server.queueForPlayers( inRangePlayerIds, warpPacket );
server.queueForPlayer( pPlayer->getCharacterId(), warpPacket );
pPlayer->setPos( m_warpInfo.m_targetPos, false );
}

View file

@ -225,7 +225,7 @@ void Sapphire::HousingZone::sendLandSet( Entity::Player& player )
server.queueForPlayer( player.getCharacterId(), landsetInitializePacket );
}
void Sapphire::HousingZone::sendLandUpdate( uint8_t landId )
void Sapphire::HousingZone::sendLandUpdate( uint16_t landId )
{
auto& server = Common::Service< World::WorldServer >::ref();
auto pLand = getLand( landId );
@ -282,7 +282,7 @@ uint32_t Sapphire::HousingZone::getLandSetId() const
return m_landSetId;
}
Sapphire::LandPtr Sapphire::HousingZone::getLand( uint8_t id )
Sapphire::LandPtr Sapphire::HousingZone::getLand( uint16_t id )
{
auto it = m_landPtrMap.find( id );
if( it == m_landPtrMap.end() )
@ -291,7 +291,7 @@ Sapphire::LandPtr Sapphire::HousingZone::getLand( uint8_t id )
return it->second;
}
Sapphire::Entity::EventObjectPtr Sapphire::HousingZone::registerEstateEntranceEObj( uint8_t landId )
Sapphire::Entity::EventObjectPtr Sapphire::HousingZone::registerEstateEntranceEObj( uint16_t landId )
{
auto land = getLand( landId );
assert( land );
@ -332,7 +332,7 @@ Sapphire::Entity::EventObjectPtr Sapphire::HousingZone::registerEstateEntranceEO
return eObj;
}
void Sapphire::HousingZone::removeEstateEntranceEObj( uint8_t landId )
void Sapphire::HousingZone::removeEstateEntranceEObj( uint16_t landId )
{
auto land = getLand( landId );
assert( land );
@ -369,7 +369,7 @@ void Sapphire::HousingZone::updateYardObjects( Sapphire::Common::LandIdent ident
}
}
void Sapphire::HousingZone::spawnYardObject( uint8_t landId, uint16_t slotId, Inventory::HousingItem& item )
void Sapphire::HousingZone::spawnYardObject( uint16_t landId, uint16_t slotId, Inventory::HousingItem& item )
{
auto& server = Common::Service< World::WorldServer >::ref();
auto bounds = m_yardObjectArrayBounds[ landId ];

View file

@ -39,7 +39,7 @@ namespace Sapphire
void onUpdate( uint64_t tickCount ) override;
void sendLandSet( Entity::Player& player );
void sendLandUpdate( uint8_t landId );
void sendLandUpdate( uint16_t landId );
bool isPlayerSubInstance( Entity::Player& player );
bool onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId );
@ -48,19 +48,19 @@ namespace Sapphire
uint8_t getWardNum() const;
uint32_t getLandSetId() const;
Sapphire::LandPtr getLand( uint8_t id );
Sapphire::LandPtr getLand( uint16_t id );
Entity::EventObjectPtr registerEstateEntranceEObj( uint8_t landId );
void removeEstateEntranceEObj( uint8_t landId );
Entity::EventObjectPtr registerEstateEntranceEObj( uint16_t landId );
void removeEstateEntranceEObj( uint16_t landId );
void updateYardObjects( Common::LandIdent ident );
void spawnYardObject( uint8_t landId, uint16_t slotId, Sapphire::Inventory::HousingItem& item );
void spawnYardObject( uint16_t landId, uint16_t slotId, Sapphire::Inventory::HousingItem& item );
void updateYardObjectPos( Entity::Player& sourcePlayer, uint16_t slot, uint16_t landId,
Inventory::HousingItem& item );
void despawnYardObject( uint16_t landId, uint16_t slot );
private:
using LandPtrMap = std::unordered_map< uint8_t, Sapphire::LandPtr >;
using LandPtrMap = std::unordered_map< uint16_t, Sapphire::LandPtr >;
/*! @brief global storage for all yard items in the ward */
using YardObjectArray = std::array< Common::Furniture, 1200 >;

View file

@ -688,7 +688,15 @@ void WorldServer::queueForPlayer( uint64_t characterId, Sapphire::Network::Packe
auto pZoneCon = pSession->getZoneConnection();
if( pZoneCon )
pZoneCon->queueOutPacket( pPacket );
}
void WorldServer::queueForPlayers( const std::set< uint64_t >& characterIds, Sapphire::Network::Packets::FFXIVPacketBasePtr pPacket )
{
if( characterIds.empty() )
return;
for( auto& characterId : characterIds )
queueForPlayer( characterId, pPacket );
}
void WorldServer::queueForPlayer( uint64_t characterId, std::vector< Sapphire::Network::Packets::FFXIVPacketBasePtr > packets )
@ -705,6 +713,15 @@ void WorldServer::queueForPlayer( uint64_t characterId, std::vector< Sapphire::N
}
}
void WorldServer::queueForPlayers( const std::set< uint64_t >& characterIds, std::vector< Sapphire::Network::Packets::FFXIVPacketBasePtr > packets )
{
for( auto& characterId : characterIds )
for( auto& packet : packets )
{
queueForPlayer( characterId, packet );
}
}
void WorldServer::queueForLinkshell( uint64_t lsId, Sapphire::Network::Packets::FFXIVPacketBasePtr pPacket, std::set< uint64_t > exceptionCharIdList )
{
auto lsMgr = Common::Service< Manager::LinkshellMgr >::ref();

View file

@ -52,7 +52,9 @@ namespace Sapphire::World
std::string getPlayerNameFromDb( uint64_t characterId, bool forceDbLoad = false );
void queueForPlayer( uint64_t characterId, Sapphire::Network::Packets::FFXIVPacketBasePtr pPacket );
void queueForPlayers( const std::set< uint64_t >& characterIds, Sapphire::Network::Packets::FFXIVPacketBasePtr pPacket );
void queueForPlayer( uint64_t characterId, std::vector< Sapphire::Network::Packets::FFXIVPacketBasePtr > packets );
void queueForPlayers( const std::set< uint64_t >& characterIds, std::vector< Sapphire::Network::Packets::FFXIVPacketBasePtr > packets );
void queueForLinkshell( uint64_t lsId, Sapphire::Network::Packets::FFXIVPacketBasePtr pPacket, std::set< uint64_t > exceptionCharIdList = {} );
void queueForFreeCompany( uint64_t fcId, Sapphire::Network::Packets::FFXIVPacketBasePtr pPacket, std::set< uint64_t > exceptionCharIdList = {} );