mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-04-29 15:47:46 +00:00
Changing various packet sending functions to clean up the project.
This commit is contained in:
parent
fbbd599969
commit
9b46b89c65
37 changed files with 326 additions and 393 deletions
|
@ -159,7 +159,7 @@ private:
|
||||||
quest.setUI8CH( 1 ); // receive key item
|
quest.setUI8CH( 1 ); // receive key item
|
||||||
|
|
||||||
// teleport to real gridania
|
// teleport to real gridania
|
||||||
player.forceZoneing( TERRITORYTYPE0 );
|
warpMgr().requestMoveTerritory( player, Common::WarpType::WARP_TYPE_NORMAL, TERRITORYTYPE0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene00051( World::Quest& quest, Entity::Player& player )
|
void Scene00051( World::Quest& quest, Entity::Player& player )
|
||||||
|
|
|
@ -229,7 +229,7 @@ private:
|
||||||
{
|
{
|
||||||
quest.setSeq( Seq1 );
|
quest.setSeq( Seq1 );
|
||||||
quest.setUI8CH( 1 );
|
quest.setUI8CH( 1 );
|
||||||
player.forceZoneing( 132 );
|
warpMgr().requestMoveTerritory( player, Common::WarpType::WARP_TYPE_NORMAL, 132 );
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -230,7 +230,7 @@ private:
|
||||||
quest.setSeq( Seq1 );
|
quest.setSeq( Seq1 );
|
||||||
quest.setUI8CH( 1 ); // receive key item
|
quest.setUI8CH( 1 ); // receive key item
|
||||||
// event is done, need to teleport to real zone.
|
// event is done, need to teleport to real zone.
|
||||||
player.forceZoneing( Territorytype0 );
|
warpMgr().requestMoveTerritory( player, Common::WarpType::WARP_TYPE_NORMAL, Territorytype0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -229,7 +229,7 @@ private:
|
||||||
quest.setUI8CH( 1 ); // Receive key item
|
quest.setUI8CH( 1 ); // Receive key item
|
||||||
|
|
||||||
// Teleport to real ul'dah
|
// Teleport to real ul'dah
|
||||||
player.forceZoneing( 130 );
|
warpMgr().requestMoveTerritory( player, Common::WarpType::WARP_TYPE_NORMAL, 130 );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -244,7 +244,7 @@ private:
|
||||||
pQuest->setUI8CH( 1 ); // receive key item
|
pQuest->setUI8CH( 1 ); // receive key item
|
||||||
|
|
||||||
// teleport to real ul'dah
|
// teleport to real ul'dah
|
||||||
player.forceZoneing( 130 );
|
warpMgr().requestMoveTerritory( player, Common::WarpType::WARP_TYPE_NORMAL, 130 );
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -233,7 +233,7 @@ private:
|
||||||
quest.setUI8CH( 1 );// receive key item
|
quest.setUI8CH( 1 );// receive key item
|
||||||
|
|
||||||
// teleport to real Uldah
|
// teleport to real Uldah
|
||||||
player.forceZoneing( Territorytype0 );
|
warpMgr().requestMoveTerritory( player, Common::WarpType::WARP_TYPE_NORMAL, Territorytype0 );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -218,7 +218,7 @@ private:
|
||||||
{
|
{
|
||||||
quest.setSeq( Seq2 );
|
quest.setSeq( Seq2 );
|
||||||
player.changePosition( 10, 21, 13, -2 );
|
player.changePosition( 10, 21, 13, -2 );
|
||||||
player.forceZoneing( Territorytype0 ); //Teleport to real Limsa
|
warpMgr().requestMoveTerritory( player, Common::WarpType::WARP_TYPE_NORMAL, Territorytype0 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include "Territory/Territory.h"
|
#include "Territory/Territory.h"
|
||||||
|
|
||||||
#include "Manager/PlayerMgr.h"
|
#include "Manager/PlayerMgr.h"
|
||||||
|
#include "Manager/MgrUtil.h"
|
||||||
|
|
||||||
#include "Session.h"
|
#include "Session.h"
|
||||||
#include "Network/GameConnection.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::Packets::WorldPackets::Server;
|
||||||
using namespace Sapphire::Network::ActorControl;
|
using namespace Sapphire::Network::ActorControl;
|
||||||
using namespace Sapphire::World;
|
using namespace Sapphire::World;
|
||||||
|
using namespace Sapphire::World::Manager;
|
||||||
|
|
||||||
|
|
||||||
Action::Action::Action() = default;
|
Action::Action::Action() = default;
|
||||||
|
@ -295,7 +297,6 @@ bool Action::Action::update()
|
||||||
void Action::Action::start()
|
void Action::Action::start()
|
||||||
{
|
{
|
||||||
assert( m_pSource );
|
assert( m_pSource );
|
||||||
auto& server = Common::Service< World::WorldServer >::ref();
|
|
||||||
m_startTime = Common::Util::getTimeMs();
|
m_startTime = Common::Util::getTimeMs();
|
||||||
|
|
||||||
auto player = m_pSource->getAsPlayer();
|
auto player = m_pSource->getAsPlayer();
|
||||||
|
@ -316,21 +317,21 @@ void Action::Action::start()
|
||||||
data.TargetPos[ 2 ] = Common::Util::floatToUInt16( m_pSource->getPos().z );
|
data.TargetPos[ 2 ] = Common::Util::floatToUInt16( m_pSource->getPos().z );
|
||||||
data.Dir = m_pSource->getRot();
|
data.Dir = m_pSource->getRot();
|
||||||
|
|
||||||
m_pSource->sendToInRangeSet( castPacket, true );
|
server().queueForPlayers( m_pSource->getInRangePlayerIds( true ), castPacket );
|
||||||
|
|
||||||
if( player )
|
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
|
// todo: m_recastTimeMs needs to be adjusted for player sks/sps
|
||||||
auto actionStartPkt = makeActorControlSelf( m_pSource->getId(), ActorControlType::ActionStart, m_cooldownGroup, getId(),
|
auto actionStartPkt = makeActorControlSelf( m_pSource->getId(), ActorControlType::ActionStart, m_cooldownGroup, getId(), m_recastTimeMs / 10 );
|
||||||
m_recastTimeMs / 10 );
|
|
||||||
|
|
||||||
player->setRecastGroup( m_cooldownGroup, static_cast< float >( m_castTimeMs ) / 1000.f );
|
player->setRecastGroup( m_cooldownGroup, static_cast< float >( m_castTimeMs ) / 1000.f );
|
||||||
|
|
||||||
server.queueForPlayer( player->getCharacterId(), actionStartPkt );
|
server().queueForPlayer( player->getCharacterId(), actionStartPkt );
|
||||||
|
|
||||||
onStart();
|
onStart();
|
||||||
|
|
||||||
|
@ -389,7 +390,7 @@ void Action::Action::interrupt()
|
||||||
auto control = makeActorControl( m_pSource->getId(), ActorControlType::CastInterrupt,
|
auto control = makeActorControl( m_pSource->getId(), ActorControlType::CastInterrupt,
|
||||||
0x219, 1, m_id, interruptEffect );
|
0x219, 1, m_id, interruptEffect );
|
||||||
|
|
||||||
m_pSource->sendToInRangeSet( control, true );
|
server().queueForPlayers( m_pSource->getInRangePlayerIds( true ), control );
|
||||||
}
|
}
|
||||||
|
|
||||||
onInterrupt();
|
onInterrupt();
|
||||||
|
@ -419,11 +420,6 @@ void Action::Action::execute()
|
||||||
|
|
||||||
if( hasCastTime() )
|
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 )
|
if( auto pPlayer = m_pSource->getAsPlayer(); pPlayer )
|
||||||
{
|
{
|
||||||
pPlayer->setLastActionTick( 0 );
|
pPlayer->setLastActionTick( 0 );
|
||||||
|
|
|
@ -7,9 +7,11 @@
|
||||||
#include <Network/PacketWrappers/EffectPacket.h>
|
#include <Network/PacketWrappers/EffectPacket.h>
|
||||||
|
|
||||||
#include "Manager/PlayerMgr.h"
|
#include "Manager/PlayerMgr.h"
|
||||||
|
#include "Manager/MgrUtil.h"
|
||||||
|
|
||||||
using namespace Sapphire;
|
using namespace Sapphire;
|
||||||
using namespace Sapphire::World::Action;
|
using namespace Sapphire::World::Action;
|
||||||
|
using namespace Sapphire::World::Manager;
|
||||||
using namespace Sapphire::Network::Packets::WorldPackets::Server;
|
using namespace Sapphire::Network::Packets::WorldPackets::Server;
|
||||||
|
|
||||||
ItemAction::ItemAction( Sapphire::Entity::CharaPtr source, uint32_t itemId,
|
ItemAction::ItemAction( Sapphire::Entity::CharaPtr source, uint32_t itemId,
|
||||||
|
@ -84,8 +86,7 @@ void ItemAction::handleVFXItem()
|
||||||
effectPacket->setAnimationId( Common::ItemActionType::ItemActionVFX );
|
effectPacket->setAnimationId( Common::ItemActionType::ItemActionVFX );
|
||||||
effectPacket->setDisplayType( Common::ActionEffectDisplayType::ShowItemName );
|
effectPacket->setDisplayType( Common::ActionEffectDisplayType::ShowItemName );
|
||||||
effectPacket->addTargetEffect( effect, static_cast< uint64_t >( getSourceChara()->getId() ) );
|
effectPacket->addTargetEffect( effect, static_cast< uint64_t >( getSourceChara()->getId() ) );
|
||||||
|
server().queueForPlayers( m_pSource->getInRangePlayerIds( true ), effectPacket );
|
||||||
m_pSource->sendToInRangeSet( effectPacket, true );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemAction::handleCompanionItem()
|
void ItemAction::handleCompanionItem()
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
#include "MountAction.h"
|
#include "MountAction.h"
|
||||||
|
|
||||||
#include <Exd/ExdData.h>
|
|
||||||
|
|
||||||
#include <Actor/Player.h>
|
#include <Actor/Player.h>
|
||||||
|
|
||||||
#include <Manager/PlayerMgr.h>
|
#include <Manager/PlayerMgr.h>
|
||||||
|
#include <Manager/MgrUtil.h>
|
||||||
|
|
||||||
#include <Network/GameConnection.h>
|
#include <Network/GameConnection.h>
|
||||||
#include <Network/CommonActorControl.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::Packets::WorldPackets::Server;
|
||||||
using namespace Sapphire::Network::ActorControl;
|
using namespace Sapphire::Network::ActorControl;
|
||||||
using namespace Sapphire::World::Action;
|
using namespace Sapphire::World::Action;
|
||||||
|
using namespace Sapphire::World::Manager;
|
||||||
|
|
||||||
MountAction::MountAction( Sapphire::Entity::CharaPtr source, uint16_t mountId, uint16_t sequence,
|
MountAction::MountAction( Sapphire::Entity::CharaPtr source, uint16_t mountId, uint16_t sequence,
|
||||||
std::shared_ptr< Excel::ExcelStruct< Excel::Action > > actionData ) :
|
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[ 1 ] = Common::Util::floatToUInt16( pos.y );
|
||||||
data.TargetPos[ 2 ] = Common::Util::floatToUInt16( pos.z );
|
data.TargetPos[ 2 ] = Common::Util::floatToUInt16( pos.z );
|
||||||
data.Dir = m_pSource->getRot();
|
data.Dir = m_pSource->getRot();
|
||||||
|
server().queueForPlayers( m_pSource->getInRangePlayerIds( true ), castPacket );
|
||||||
m_pSource->sendToInRangeSet( castPacket, true );
|
|
||||||
|
|
||||||
Common::Service< World::Manager::PlayerMgr >::ref().onSetStateFlag( *player, Common::PlayerStateFlag::Casting );
|
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 actionStartPkt = makeActorControlSelf( m_pSource->getId(), ActorControlType::ActionStart, 1, getId(), m_recastTimeMs / 10 );
|
||||||
|
server().queueForPlayer( m_pSource->getAsPlayer()->getCharacterId(), actionStartPkt );
|
||||||
auto& server = Common::Service< World::WorldServer >::ref();
|
|
||||||
server.queueForPlayer( m_pSource->getAsPlayer()->getCharacterId(), actionStartPkt );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MountAction::execute()
|
void MountAction::execute()
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include <Manager/RNGMgr.h>
|
#include <Manager/RNGMgr.h>
|
||||||
#include <Manager/PlayerMgr.h>
|
#include <Manager/PlayerMgr.h>
|
||||||
#include <Manager/TaskMgr.h>
|
#include <Manager/TaskMgr.h>
|
||||||
|
#include <Manager/MgrUtil.h>
|
||||||
#include <Script/ScriptMgr.h>
|
#include <Script/ScriptMgr.h>
|
||||||
#include <Task/RemoveBNpcTask.h>
|
#include <Task/RemoveBNpcTask.h>
|
||||||
#include <Task/FadeBNpcTask.h>
|
#include <Task/FadeBNpcTask.h>
|
||||||
|
@ -44,6 +45,7 @@ using namespace Sapphire::Common;
|
||||||
using namespace Sapphire::Network::Packets;
|
using namespace Sapphire::Network::Packets;
|
||||||
using namespace Sapphire::Network::Packets::WorldPackets::Server;
|
using namespace Sapphire::Network::Packets::WorldPackets::Server;
|
||||||
using namespace Sapphire::Network::ActorControl;
|
using namespace Sapphire::Network::ActorControl;
|
||||||
|
using namespace Sapphire::World::Manager;
|
||||||
|
|
||||||
Sapphire::Entity::BNpc::BNpc() :
|
Sapphire::Entity::BNpc::BNpc() :
|
||||||
Npc( ObjKind::BattleNpc )
|
Npc( ObjKind::BattleNpc )
|
||||||
|
@ -430,7 +432,7 @@ void Sapphire::Entity::BNpc::sendPositionUpdate()
|
||||||
animationType = 0;
|
animationType = 0;
|
||||||
|
|
||||||
auto movePacket = std::make_shared< MoveActorPacket >( *getAsChara(), 0x3A, animationType, 0, 0x5A / 4 );
|
auto movePacket = std::make_shared< MoveActorPacket >( *getAsChara(), 0x3A, animationType, 0, 0x5A / 4 );
|
||||||
sendToInRangeSet( movePacket );
|
server().queueForPlayers( getInRangePlayerIds(), movePacket );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sapphire::Entity::BNpc::hateListClear()
|
void Sapphire::Entity::BNpc::hateListClear()
|
||||||
|
@ -595,7 +597,7 @@ void Sapphire::Entity::BNpc::aggro( const Sapphire::Entity::CharaPtr& pChara )
|
||||||
setStance( Stance::Active );
|
setStance( Stance::Active );
|
||||||
m_state = BNpcState::Combat;
|
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() );
|
changeTarget( pChara->getId() );
|
||||||
|
|
||||||
|
@ -615,8 +617,8 @@ void Sapphire::Entity::BNpc::deaggro( const Sapphire::Entity::CharaPtr& pChara )
|
||||||
if( pChara->isPlayer() )
|
if( pChara->isPlayer() )
|
||||||
{
|
{
|
||||||
PlayerPtr tmpPlayer = pChara->getAsPlayer();
|
PlayerPtr tmpPlayer = pChara->getAsPlayer();
|
||||||
sendToInRangeSet( makeActorControl( getId(), ActorControlType::ToggleWeapon, 0, 1, 1 ) );
|
server().queueForPlayers( getInRangePlayerIds(), makeActorControl( getId(), ActorControlType::ToggleWeapon, 0, 1, 1 ) );
|
||||||
sendToInRangeSet( makeActorControl( getId(), ActorControlType::SetBattle, 0, 0, 0 ) );
|
server().queueForPlayers( getInRangePlayerIds(), makeActorControl( getId(), ActorControlType::SetBattle, 0, 0, 0 ) );
|
||||||
tmpPlayer->onMobDeaggro( *this );
|
tmpPlayer->onMobDeaggro( *this );
|
||||||
|
|
||||||
if( getTriggerOwnerId() == pChara->getId() )
|
if( getTriggerOwnerId() == pChara->getId() )
|
||||||
|
@ -939,13 +941,12 @@ void Sapphire::Entity::BNpc::setOwner( const Sapphire::Entity::CharaPtr& m_pChar
|
||||||
auto setOwnerPacket = makeZonePacket< FFXIVIpcFirstAttack >( getId() );
|
auto setOwnerPacket = makeZonePacket< FFXIVIpcFirstAttack >( getId() );
|
||||||
setOwnerPacket->data().Type = 0x01;
|
setOwnerPacket->data().Type = 0x01;
|
||||||
setOwnerPacket->data().Id = targetId;
|
setOwnerPacket->data().Id = targetId;
|
||||||
sendToInRangeSet( setOwnerPacket );
|
server().queueForPlayers( getInRangePlayerIds(), setOwnerPacket );
|
||||||
|
|
||||||
if( m_pChara != nullptr && m_pChara->isPlayer() )
|
if( m_pChara != nullptr && m_pChara->isPlayer() )
|
||||||
{
|
{
|
||||||
auto letter = makeActorControl( getId(), ActorControlType::SetHateLetter, 1, getId(), 0 );
|
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();
|
auto resultId = pZone->getNextEffectResultId();
|
||||||
effectPacket->setSequence( resultId );
|
effectPacket->setSequence( resultId );
|
||||||
effectPacket->addTargetEffect( effectEntry );
|
effectPacket->addTargetEffect( effectEntry );
|
||||||
|
server().queueForPlayers( getInRangePlayerIds(), effectPacket );
|
||||||
sendToInRangeSet( effectPacket );
|
|
||||||
|
|
||||||
pTarget->takeDamage( static_cast< uint16_t >( damage.first ) );
|
pTarget->takeDamage( static_cast< uint16_t >( damage.first ) );
|
||||||
|
|
||||||
auto& taskMgr = Common::Service< World::Manager::TaskMgr >::ref();
|
auto& taskMgr = Common::Service< World::Manager::TaskMgr >::ref();
|
||||||
taskMgr.queueTask( Sapphire::World::makeActionIntegrityTask( resultId, pTarget, 500 ) );
|
taskMgr.queueTask( Sapphire::World::makeActionIntegrityTask( resultId, pTarget, 500 ) );
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -148,8 +148,7 @@ void Sapphire::Entity::EventObject::spawn( Sapphire::Entity::PlayerPtr pTarget )
|
||||||
eobjStatePacket->data().Args2 = 0; // initial animation state
|
eobjStatePacket->data().Args2 = 0; // initial animation state
|
||||||
eobjStatePacket->data().Args3 = getHousingLink();
|
eobjStatePacket->data().Args3 = getHousingLink();
|
||||||
|
|
||||||
auto pSession = server.getSession( pTarget->getCharacterId() );
|
server.queueForPlayer( pTarget->getCharacterId(), eobjStatePacket );
|
||||||
pSession->getZoneConnection()->queueOutPacket( eobjStatePacket );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -178,8 +177,9 @@ uint8_t Sapphire::Entity::EventObject::getPermissionInvisibility() const
|
||||||
void Sapphire::Entity::EventObject::setPermissionInvisibility( uint8_t permissionInvisibility )
|
void Sapphire::Entity::EventObject::setPermissionInvisibility( uint8_t permissionInvisibility )
|
||||||
{
|
{
|
||||||
m_permissionInvisibility = permissionInvisibility;
|
m_permissionInvisibility = permissionInvisibility;
|
||||||
|
auto& server = Common::Service< World::WorldServer >::ref();
|
||||||
sendToInRangeSet( makeActorControl( getId(), DirectorEObjMod, permissionInvisibility ) );
|
auto inRangePlayerIds = getInRangePlayerIds();
|
||||||
|
server.queueForPlayers( inRangePlayerIds, makeActorControl( getId(), DirectorEObjMod, permissionInvisibility ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Sapphire::Entity::EventObject::getOwnerId() const
|
uint32_t Sapphire::Entity::EventObject::getOwnerId() const
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "Manager/WarpMgr.h"
|
#include "Manager/WarpMgr.h"
|
||||||
#include "Manager/FreeCompanyMgr.h"
|
#include "Manager/FreeCompanyMgr.h"
|
||||||
#include "Manager/MapMgr.h"
|
#include "Manager/MapMgr.h"
|
||||||
|
#include "Manager/MgrUtil.h"
|
||||||
|
|
||||||
#include "Territory/Territory.h"
|
#include "Territory/Territory.h"
|
||||||
#include "Territory/InstanceContent.h"
|
#include "Territory/InstanceContent.h"
|
||||||
|
@ -406,16 +407,6 @@ void Player::sendStats()
|
||||||
Service< World::Manager::PlayerMgr >::ref().onSendStats( *this );
|
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()
|
bool Player::exitInstance()
|
||||||
{
|
{
|
||||||
auto& teriMgr = Common::Service< TerritoryMgr >::ref();
|
auto& teriMgr = Common::Service< TerritoryMgr >::ref();
|
||||||
|
@ -482,7 +473,7 @@ void Player::registerAetheryte( uint8_t aetheryteId )
|
||||||
Util::valueToFlagByteIndexValue( aetheryteId, value, index );
|
Util::valueToFlagByteIndexValue( aetheryteId, value, index );
|
||||||
|
|
||||||
m_aetheryte[ index ] |= value;
|
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
|
bool Player::isAetheryteRegistered( uint8_t aetheryteId ) const
|
||||||
|
@ -597,7 +588,7 @@ void Player::setRewardFlag( Common::UnlockEntry unlockId )
|
||||||
|
|
||||||
m_unlocks[ index ] |= value;
|
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 )
|
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() );
|
Logger::debug( "Spawning {0} for {1}", getName(), pTarget->getName() );
|
||||||
auto spawnPacket = std::make_shared< PlayerSpawnPacket >( *this, *pTarget );
|
auto spawnPacket = std::make_shared< PlayerSpawnPacket >( *this, *pTarget );
|
||||||
pTarget->queuePacket( spawnPacket );
|
server().queueForPlayer( pTarget->getCharacterId(), spawnPacket );
|
||||||
}
|
}
|
||||||
|
|
||||||
// despawn
|
// despawn
|
||||||
|
@ -855,8 +846,7 @@ void Player::despawn( Entity::PlayerPtr pTarget )
|
||||||
Logger::debug( "Despawning {0} for {1}", getName(), pTarget->getName() );
|
Logger::debug( "Despawning {0} for {1}", getName(), pTarget->getName() );
|
||||||
|
|
||||||
pPlayer->freePlayerSpawnId( getId() );
|
pPlayer->freePlayerSpawnId( getId() );
|
||||||
|
server().queueForPlayer( pTarget->getCharacterId(), makeActorControlSelf( getId(), WarpStart, 0x04, getId(), 0x01 ) );
|
||||||
pPlayer->queuePacket( makeActorControlSelf( getId(), WarpStart, 0x04, getId(), 0x01 ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GameObjectPtr Player::lookupTargetById( uint64_t targetId )
|
GameObjectPtr Player::lookupTargetById( uint64_t targetId )
|
||||||
|
@ -961,7 +951,7 @@ void Player::freePlayerSpawnId( uint32_t actorId )
|
||||||
auto freeActorSpawnPacket = makeZonePacket< FFXIVIpcActorFreeSpawn >( getId() );
|
auto freeActorSpawnPacket = makeZonePacket< FFXIVIpcActorFreeSpawn >( getId() );
|
||||||
freeActorSpawnPacket->data().actorId = actorId;
|
freeActorSpawnPacket->data().actorId = actorId;
|
||||||
freeActorSpawnPacket->data().spawnId = spawnId;
|
freeActorSpawnPacket->data().spawnId = spawnId;
|
||||||
queuePacket( freeActorSpawnPacket );
|
server().queueForPlayer( getCharacterId(), freeActorSpawnPacket );
|
||||||
}
|
}
|
||||||
|
|
||||||
Player::AetheryteList& Player::getAetheryteArray()
|
Player::AetheryteList& Player::getAetheryteArray()
|
||||||
|
@ -973,8 +963,7 @@ Player::AetheryteList& Player::getAetheryteArray()
|
||||||
void Player::setHomepoint( uint8_t aetheryteId )
|
void Player::setHomepoint( uint8_t aetheryteId )
|
||||||
{
|
{
|
||||||
m_homePoint = aetheryteId;
|
m_homePoint = aetheryteId;
|
||||||
|
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), SetHomepoint, aetheryteId ) );
|
||||||
queuePacket( makeActorControlSelf( getId(), SetHomepoint, aetheryteId ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! get homepoint */
|
/*! get homepoint */
|
||||||
|
@ -1023,7 +1012,7 @@ void Player::unlockMount( uint32_t mountId )
|
||||||
|
|
||||||
m_mountGuide[ mount->data().MountOrder / 8 ] |= ( 1 << ( mount->data().MountOrder % 8 ) );
|
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 )
|
void Player::unlockCompanion( uint32_t companionId )
|
||||||
|
@ -1040,7 +1029,7 @@ void Player::unlockCompanion( uint32_t companionId )
|
||||||
|
|
||||||
m_minionGuide[ index ] |= value;
|
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()
|
Player::MinionList& Player::getMinionGuideBitmask()
|
||||||
|
@ -1073,13 +1062,6 @@ const std::array< uint8_t, 3 >& Player::getGcRankArray() const
|
||||||
return m_gcRank;
|
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
|
bool Player::isLoadingComplete() const
|
||||||
{
|
{
|
||||||
return m_bLoadingComplete;
|
return m_bLoadingComplete;
|
||||||
|
@ -1183,14 +1165,14 @@ const std::map< uint32_t, uint8_t >& Player::getActorIdToHateSlotMap()
|
||||||
void Player::onMobAggro( const BNpc& bnpc )
|
void Player::onMobAggro( const BNpc& bnpc )
|
||||||
{
|
{
|
||||||
hateListAdd( 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 )
|
void Player::onMobDeaggro( const BNpc& bnpc )
|
||||||
{
|
{
|
||||||
hateListRemove( bnpc );
|
hateListRemove( bnpc );
|
||||||
if( m_actorIdTohateSlotMap.empty() )
|
if( m_actorIdTohateSlotMap.empty() )
|
||||||
queuePacket( makeActorControl( getId(), SetBattle, 0, 0, 0 ) );
|
server().queueForPlayer( getCharacterId(), makeActorControl( getId(), SetBattle, 0, 0, 0 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Player::isLogin() const
|
bool Player::isLogin() const
|
||||||
|
@ -1232,8 +1214,7 @@ void Player::setTitle( uint16_t titleId )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_activeTitle = titleId;
|
m_activeTitle = titleId;
|
||||||
|
server().queueForPlayers( getInRangePlayerIds( true ), makeActorControl( getId(), SetTitle, titleId ) );
|
||||||
sendToInRangeSet( makeActorControl( getId(), SetTitle, titleId ), true );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const Player::AchievementData& Player::getAchievementData() const
|
const Player::AchievementData& Player::getAchievementData() const
|
||||||
|
@ -1250,7 +1231,7 @@ void Player::setMaxGearSets( uint8_t amount )
|
||||||
{
|
{
|
||||||
m_equippedMannequin = amount;
|
m_equippedMannequin = amount;
|
||||||
|
|
||||||
queuePacket( makeActorControlSelf( getId(), SetMaxGearSets, m_equippedMannequin ) );
|
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), SetMaxGearSets, m_equippedMannequin ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::addGearSet()
|
void Player::addGearSet()
|
||||||
|
@ -1338,23 +1319,14 @@ void Player::autoAttack( CharaPtr pTarget )
|
||||||
entry.Arg1 = 7;
|
entry.Arg1 = 7;
|
||||||
|
|
||||||
if( getClass() == ClassJob::Machinist || getClass() == ClassJob::Bard || getClass() == ClassJob::Archer )
|
if( getClass() == ClassJob::Machinist || getClass() == ClassJob::Bard || getClass() == ClassJob::Archer )
|
||||||
{
|
effectPacket->setActionId( 8 );
|
||||||
// effectPacket->setAnimationId( 8 );
|
|
||||||
//entry.Arg2 = 0x72;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//effectPacket->setAnimationId( 7 );
|
|
||||||
//entry.Arg2 = 0x73;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto resultId = pZone->getNextEffectResultId();
|
auto resultId = pZone->getNextEffectResultId();
|
||||||
effectPacket->setResultId( resultId );
|
effectPacket->setResultId( resultId );
|
||||||
|
|
||||||
effectPacket->setRotation( Util::floatToUInt16Rot( getRot() ) );
|
effectPacket->setRotation( Util::floatToUInt16Rot( getRot() ) );
|
||||||
effectPacket->addTargetEffect( entry );
|
effectPacket->addTargetEffect( entry );
|
||||||
|
|
||||||
sendToInRangeSet( effectPacket, true );
|
server().queueForPlayers( getInRangePlayerIds( true ), effectPacket );
|
||||||
|
|
||||||
pTarget->takeDamage( static_cast< uint32_t >( damage.first ) );
|
pTarget->takeDamage( static_cast< uint32_t >( damage.first ) );
|
||||||
|
|
||||||
|
@ -1418,7 +1390,7 @@ void Player::setEorzeaTimeOffset( uint64_t timestamp )
|
||||||
packet->data().timestamp = timestamp;
|
packet->data().timestamp = timestamp;
|
||||||
|
|
||||||
// Send to single player
|
// Send to single player
|
||||||
queuePacket( packet );
|
server().queueForPlayer( getCharacterId(), packet );
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Player::getPrevTerritoryTypeId() const
|
uint32_t Player::getPrevTerritoryTypeId() const
|
||||||
|
@ -1441,7 +1413,7 @@ void Player::sendTitleList()
|
||||||
auto titleListPacket = makeZonePacket< FFXIVIpcTitleList >( getId() );
|
auto titleListPacket = makeZonePacket< FFXIVIpcTitleList >( getId() );
|
||||||
memcpy( titleListPacket->data().TitleFlagsArray, getTitleList().data(), sizeof( titleListPacket->data().TitleFlagsArray ) );
|
memcpy( titleListPacket->data().TitleFlagsArray, getTitleList().data(), sizeof( titleListPacket->data().TitleFlagsArray ) );
|
||||||
|
|
||||||
queuePacket( titleListPacket );
|
server().queueForPlayer( getCharacterId(), titleListPacket );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::teleportQuery( uint16_t aetheryteId )
|
void Player::teleportQuery( uint16_t aetheryteId )
|
||||||
|
@ -1465,7 +1437,7 @@ void Player::teleportQuery( uint16_t aetheryteId )
|
||||||
|
|
||||||
bool insufficientGil = getCurrency( Common::CurrencyType::Gil ) < cost;
|
bool insufficientGil = getCurrency( Common::CurrencyType::Gil ) < cost;
|
||||||
// TODO: figure out what param1 really does
|
// 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 )
|
if( !insufficientGil )
|
||||||
{
|
{
|
||||||
|
@ -1542,7 +1514,7 @@ void Player::dyeItemFromDyeingInfo()
|
||||||
writeItem( itemToDye );
|
writeItem( itemToDye );
|
||||||
|
|
||||||
auto dyePkt = makeActorControlSelf( getId(), DyeMsg, itemToDye->getId(), shouldDye, invalidateGearSet );
|
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 )
|
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 )
|
if( shouldGlamour )
|
||||||
{
|
{
|
||||||
auto castGlamPkt = makeActorControlSelf( getId(), GlamourCastMsg, itemToGlamour->getId(), glamourToUse->getId(), invalidateGearSet );
|
auto castGlamPkt = makeActorControlSelf( getId(), GlamourCastMsg, itemToGlamour->getId(), glamourToUse->getId(), invalidateGearSet );
|
||||||
queuePacket( castGlamPkt );
|
server().queueForPlayer( getCharacterId(), castGlamPkt );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto dispelGlamPkt = makeActorControlSelf( getId(), GlamourRemoveMsg, itemToGlamour->getId(), invalidateGearSet );
|
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() );
|
auto freeObjectSpawnPacket = makeZonePacket< FFXIVIpcDeleteObject >( getId() );
|
||||||
freeObjectSpawnPacket->data().Index = spawnId;
|
freeObjectSpawnPacket->data().Index = spawnId;
|
||||||
queuePacket( freeObjectSpawnPacket );
|
server().queueForPlayer( getCharacterId(), freeObjectSpawnPacket );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Player::isObjSpawnIndexValid( uint8_t index )
|
bool Player::isObjSpawnIndexValid( uint8_t index )
|
||||||
|
@ -1695,7 +1667,7 @@ void Player::sendHuntingLog()
|
||||||
memcpy( huntPacket->data().killCount, entry.entries, sizeof( entry.entries ) );
|
memcpy( huntPacket->data().killCount, entry.entries, sizeof( entry.entries ) );
|
||||||
huntPacket->data().completeFlags = completionFlag;
|
huntPacket->data().completeFlags = completionFlag;
|
||||||
++count;
|
++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 ] )
|
if( note1->data().Monster == id && logEntry.entries[ i - 1 ][ x ] < note->data().NeededKills[ x ] )
|
||||||
{
|
{
|
||||||
logEntry.entries[ i - 1 ][ 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;
|
logChanged = true;
|
||||||
sectionChanged = true;
|
sectionChanged = true;
|
||||||
}
|
}
|
||||||
|
@ -1744,7 +1716,7 @@ void Player::updateHuntingLog( uint16_t id )
|
||||||
}
|
}
|
||||||
if( logChanged && sectionComplete && sectionChanged )
|
if( logChanged && sectionComplete && sectionChanged )
|
||||||
{
|
{
|
||||||
queuePacket( makeActorControlSelf( getId(), HuntingLogSectionFinish, monsterNoteId, i, 0 ) );
|
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), HuntingLogSectionFinish, monsterNoteId, i, 0 ) );
|
||||||
gainExp( note->data().RewardExp );
|
gainExp( note->data().RewardExp );
|
||||||
}
|
}
|
||||||
if( !sectionComplete )
|
if( !sectionComplete )
|
||||||
|
@ -1754,13 +1726,13 @@ void Player::updateHuntingLog( uint16_t id )
|
||||||
}
|
}
|
||||||
if( logChanged && allSectionsComplete )
|
if( logChanged && allSectionsComplete )
|
||||||
{
|
{
|
||||||
queuePacket( makeActorControlSelf( getId(), HuntingLogRankFinish, 4, 0, 0 ) );
|
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), HuntingLogRankFinish, 4, 0, 0 ) );
|
||||||
gainExp( rankRewards[ logEntry.rank ] );
|
gainExp( rankRewards[ logEntry.rank ] );
|
||||||
if( logEntry.rank < 4 )
|
if( logEntry.rank < 4 )
|
||||||
{
|
{
|
||||||
logEntry.rank++;
|
logEntry.rank++;
|
||||||
memset( logEntry.entries, 0, 40 );
|
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() );
|
auto recastGroupPaket = makeZonePacket< FFXIVIpcRecastGroup >( getId() );
|
||||||
memcpy( &recastGroupPaket->data().Recast, &m_recast, sizeof( m_recast ) );
|
memcpy( &recastGroupPaket->data().Recast, &m_recast, sizeof( m_recast ) );
|
||||||
memcpy( &recastGroupPaket->data().RecastMax, &m_recastMax, sizeof( m_recastMax ) );
|
memcpy( &recastGroupPaket->data().RecastMax, &m_recastMax, sizeof( m_recastMax ) );
|
||||||
queuePacket( recastGroupPaket );
|
server().queueForPlayer( getCharacterId(), recastGroupPaket );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::resetRecastGroups()
|
void Player::resetRecastGroups()
|
||||||
|
@ -1931,7 +1903,7 @@ void Player::setFalling( bool state, const Common::FFXIVARR_POSITION3& pos, bool
|
||||||
takeDamage( damage );
|
takeDamage( damage );
|
||||||
}
|
}
|
||||||
|
|
||||||
sendToInRangeSet( makeActorControl( getId(), SetFallDamage, damage ), true );
|
server().queueForPlayers( getInRangePlayerIds( true ), makeActorControl( getId(), SetFallDamage, damage ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -310,8 +310,6 @@ namespace Sapphire::Entity
|
||||||
|
|
||||||
void updatePrevTerritory();
|
void updatePrevTerritory();
|
||||||
|
|
||||||
void forceZoneing( uint32_t zoneId );
|
|
||||||
|
|
||||||
/*! change position, sends update too */
|
/*! change position, sends update too */
|
||||||
void changePosition( float x, float y, float z, float o );
|
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;
|
const Common::CharaLandData& getCharaLandData( Common::LandFlagsSlot slot ) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*! queue a packet for the player */
|
|
||||||
void queuePacket( Network::Packets::FFXIVPacketBasePtr pPacket );
|
|
||||||
|
|
||||||
using InventoryMap = std::map< uint16_t, ItemContainerPtr >;
|
using InventoryMap = std::map< uint16_t, ItemContainerPtr >;
|
||||||
|
|
||||||
uint64_t m_lastDBWrite;
|
uint64_t m_lastDBWrite;
|
||||||
|
|
|
@ -22,10 +22,12 @@
|
||||||
#include "Manager/InventoryMgr.h"
|
#include "Manager/InventoryMgr.h"
|
||||||
#include "Manager/ItemMgr.h"
|
#include "Manager/ItemMgr.h"
|
||||||
#include "Manager/PlayerMgr.h"
|
#include "Manager/PlayerMgr.h"
|
||||||
|
#include "Manager/MgrUtil.h"
|
||||||
|
|
||||||
#include <Service.h>
|
#include <Service.h>
|
||||||
|
|
||||||
using namespace Sapphire::Common;
|
using namespace Sapphire::Common;
|
||||||
|
using namespace Sapphire::World::Manager;
|
||||||
using namespace Sapphire::Network::Packets;
|
using namespace Sapphire::Network::Packets;
|
||||||
using namespace Sapphire::Network::Packets::WorldPackets::Server;
|
using namespace Sapphire::Network::Packets::WorldPackets::Server;
|
||||||
using namespace Sapphire::Network::ActorControl;
|
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().srcCatalogId = currItem->getId();
|
||||||
invUpdate->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
|
invUpdate->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
|
||||||
|
|
||||||
queuePacket( invUpdate );
|
server().queueForPlayer( getCharacterId(), invUpdate );
|
||||||
|
|
||||||
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
|
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
|
||||||
invTransFinPacket->data().contextId = seq;
|
invTransFinPacket->data().contextId = seq;
|
||||||
invTransFinPacket->data().operationId = seq;
|
invTransFinPacket->data().operationId = seq;
|
||||||
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
|
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 )
|
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().srcContainerIndex = static_cast< int16_t >( type ) - 1;
|
||||||
invUpdate->data().srcCatalogId = currItem->getId();
|
invUpdate->data().srcCatalogId = currItem->getId();
|
||||||
invUpdate->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
|
invUpdate->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
|
||||||
queuePacket( invUpdate );
|
server().queueForPlayer( getCharacterId(), invUpdate );
|
||||||
|
|
||||||
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
|
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
|
||||||
invTransFinPacket->data().contextId = seq;
|
invTransFinPacket->data().contextId = seq;
|
||||||
invTransFinPacket->data().operationId = seq;
|
invTransFinPacket->data().operationId = seq;
|
||||||
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
|
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().srcEntity = getId();
|
||||||
invUpdate->data().srcCatalogId = currItem->getId();
|
invUpdate->data().srcCatalogId = currItem->getId();
|
||||||
invUpdate->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
|
invUpdate->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
|
||||||
queuePacket( invUpdate );
|
server().queueForPlayer( getCharacterId(), invUpdate );
|
||||||
|
|
||||||
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
|
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
|
||||||
invTransFinPacket->data().contextId = seq;
|
invTransFinPacket->data().contextId = seq;
|
||||||
invTransFinPacket->data().operationId = seq;
|
invTransFinPacket->data().operationId = seq;
|
||||||
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
|
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
|
||||||
queuePacket( invTransFinPacket );
|
server().queueForPlayer( getCharacterId(), invTransFinPacket );
|
||||||
|
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), ItemObtainIcon, static_cast< uint8_t >( type ) + 1, amount ) );
|
||||||
queuePacket( makeActorControlSelf( getId(), ItemObtainIcon, static_cast< uint8_t >( type ) + 1, amount ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sapphire::Entity::Player::removeCrystal( Common::CrystalType type, uint32_t 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().srcEntity = getId();
|
||||||
invUpdate->data().srcCatalogId = currItem->getId();
|
invUpdate->data().srcCatalogId = currItem->getId();
|
||||||
invUpdate->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
|
invUpdate->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
|
||||||
queuePacket( invUpdate );
|
server().queueForPlayer( getCharacterId(), invUpdate );
|
||||||
|
|
||||||
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
|
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
|
||||||
invTransFinPacket->data().contextId = seq;
|
invTransFinPacket->data().contextId = seq;
|
||||||
invTransFinPacket->data().operationId = seq;
|
invTransFinPacket->data().operationId = seq;
|
||||||
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
|
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
|
||||||
queuePacket( invTransFinPacket );
|
server().queueForPlayer( getCharacterId(), invTransFinPacket );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sapphire::Entity::Player::sendInventory()
|
void Sapphire::Entity::Player::sendInventory()
|
||||||
|
@ -681,18 +682,18 @@ Sapphire::ItemPtr Sapphire::Entity::Player::addItem( uint32_t catalogId, uint32_
|
||||||
auto seq = getNextInventorySequence();
|
auto seq = getNextInventorySequence();
|
||||||
|
|
||||||
auto slotUpdate = std::make_shared< UpdateInventorySlotPacket >( getId(), slot, bag, *item, seq );
|
auto slotUpdate = std::make_shared< UpdateInventorySlotPacket >( getId(), slot, bag, *item, seq );
|
||||||
queuePacket( slotUpdate );
|
server().queueForPlayer( getCharacterId(), slotUpdate );
|
||||||
|
|
||||||
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
|
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
|
||||||
invTransFinPacket->data().contextId = seq;
|
invTransFinPacket->data().contextId = seq;
|
||||||
invTransFinPacket->data().operationId = seq;
|
invTransFinPacket->data().operationId = seq;
|
||||||
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
|
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
|
// return existing stack if we have no overflow - items fit into a preexisting stack
|
||||||
if( quantity == 0 )
|
if( quantity == 0 )
|
||||||
{
|
{
|
||||||
queuePacket( makeActorControlSelf( getId(), ItemObtainIcon, catalogId, originalQuantity ) );
|
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), ItemObtainIcon, catalogId, originalQuantity ) );
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -730,15 +731,14 @@ Sapphire::ItemPtr Sapphire::Entity::Player::addItem( uint32_t catalogId, uint32_
|
||||||
invTransPacket->data().dstStack = item->getStackSize();
|
invTransPacket->data().dstStack = item->getStackSize();
|
||||||
invTransPacket->data().dstContainerIndex = freeBagSlot.second;
|
invTransPacket->data().dstContainerIndex = freeBagSlot.second;
|
||||||
invTransPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_CREATEITEM;
|
invTransPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_CREATEITEM;
|
||||||
queuePacket( invTransPacket );
|
server().queueForPlayer( getCharacterId(), invTransPacket );
|
||||||
|
|
||||||
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
|
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
|
||||||
invTransFinPacket->data().contextId = seq;
|
invTransFinPacket->data().contextId = seq;
|
||||||
invTransFinPacket->data().operationId = seq;
|
invTransFinPacket->data().operationId = seq;
|
||||||
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_CREATEITEM;
|
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_CREATEITEM;
|
||||||
queuePacket( invTransFinPacket );
|
server().queueForPlayer( getCharacterId(), invTransFinPacket );
|
||||||
|
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), ItemObtainIcon, catalogId, originalQuantity ) );
|
||||||
queuePacket( makeActorControlSelf( getId(), ItemObtainIcon, catalogId, originalQuantity ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return item;
|
return item;
|
||||||
|
@ -982,13 +982,13 @@ void Sapphire::Entity::Player::discardItem( uint16_t fromInventoryId, uint16_t f
|
||||||
invTransPacket->data().srcStack = fromItem->getStackSize();
|
invTransPacket->data().srcStack = fromItem->getStackSize();
|
||||||
invTransPacket->data().srcContainerIndex = fromSlotId;
|
invTransPacket->data().srcContainerIndex = fromSlotId;
|
||||||
invTransPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_DELETEITEM;
|
invTransPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_DELETEITEM;
|
||||||
queuePacket( invTransPacket );
|
server().queueForPlayer( getCharacterId(), invTransPacket );
|
||||||
|
|
||||||
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
|
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
|
||||||
invTransFinPacket->data().contextId = sequence;
|
invTransFinPacket->data().contextId = sequence;
|
||||||
invTransFinPacket->data().operationId = sequence;
|
invTransFinPacket->data().operationId = sequence;
|
||||||
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_DELETEITEM;
|
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_DELETEITEM;
|
||||||
queuePacket( invTransFinPacket );
|
server().queueForPlayer( getCharacterId(), invTransFinPacket );
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t Sapphire::Entity::Player::calculateEquippedGearItemLevel()
|
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().dstStack = item->getStackSize();
|
||||||
invTransPacket->data().dstContainerIndex = slotId;
|
invTransPacket->data().dstContainerIndex = slotId;
|
||||||
invTransPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_DELETEITEM;
|
invTransPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_DELETEITEM;
|
||||||
queuePacket( invTransPacket );
|
server().queueForPlayer( getCharacterId(), invTransPacket );
|
||||||
|
|
||||||
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
|
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
|
||||||
invTransFinPacket->data().contextId = seq;
|
invTransFinPacket->data().contextId = seq;
|
||||||
invTransFinPacket->data().operationId = seq;
|
invTransFinPacket->data().operationId = seq;
|
||||||
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_DELETEITEM;
|
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_DELETEITEM;
|
||||||
queuePacket( invTransFinPacket );
|
server().queueForPlayer( getCharacterId(), invTransFinPacket );
|
||||||
|
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
@ -1193,14 +1193,13 @@ void Sapphire::Entity::Player::insertInventoryItem( Sapphire::Common::InventoryT
|
||||||
auto seq = getNextInventorySequence();
|
auto seq = getNextInventorySequence();
|
||||||
|
|
||||||
auto slotUpdate = std::make_shared< UpdateInventorySlotPacket >( getId(), slot, type, *item, seq );
|
auto slotUpdate = std::make_shared< UpdateInventorySlotPacket >( getId(), slot, type, *item, seq );
|
||||||
queuePacket( slotUpdate );
|
server().queueForPlayer( getCharacterId(), slotUpdate );
|
||||||
|
|
||||||
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
|
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( getId() );
|
||||||
invTransFinPacket->data().contextId = seq;
|
invTransFinPacket->data().contextId = seq;
|
||||||
invTransFinPacket->data().operationId = seq;
|
invTransFinPacket->data().operationId = seq;
|
||||||
invTransFinPacket->data().operationType = Common::ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
|
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,
|
bool Sapphire::Entity::Player::findFirstItemWithId( uint32_t catalogId,
|
||||||
|
|
|
@ -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;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
|
@ -369,7 +369,7 @@ void HousingMgr::sendLandSignFree( Entity::Player& player, const Common::LandIde
|
||||||
server.queueForPlayer( player.getCharacterId(), plotPricePacket );
|
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();
|
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 );
|
auto zone = std::dynamic_pointer_cast< HousingZone >( pZone );
|
||||||
assert( zone );
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1567,7 +1567,7 @@ bool HousingMgr::removeExternalItem( Entity::Player& player, HousingZone& terri,
|
||||||
}
|
}
|
||||||
|
|
||||||
if( shouldDespawnItem )
|
if( shouldDespawnItem )
|
||||||
terri.despawnYardObject( static_cast< uint16_t >( land.getLandIdent().landId ), slotId );
|
terri.despawnYardObject( land.getLandIdent().landId, slotId );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,7 +76,7 @@ namespace Sapphire::World::Manager
|
||||||
|
|
||||||
void sendLandSignOwned( Entity::Player& player, const Common::LandIdent ident );
|
void sendLandSignOwned( Entity::Player& player, const Common::LandIdent ident );
|
||||||
void sendLandSignFree( 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
|
* @brief Converts param1 of a client trigger into a Common::LandIndent
|
||||||
|
|
18
src/world/Manager/MgrUtil.cpp
Normal file
18
src/world/Manager/MgrUtil.cpp
Normal 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();
|
||||||
|
}
|
13
src/world/Manager/MgrUtil.h
Normal file
13
src/world/Manager/MgrUtil.h
Normal 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();
|
||||||
|
}
|
|
@ -14,7 +14,7 @@
|
||||||
#include <Manager/FreeCompanyMgr.h>
|
#include <Manager/FreeCompanyMgr.h>
|
||||||
|
|
||||||
#include <Script/ScriptMgr.h>
|
#include <Script/ScriptMgr.h>
|
||||||
#include <WorldServer.h>
|
#include <Worldserver.h>
|
||||||
#include <Common.h>
|
#include <Common.h>
|
||||||
|
|
||||||
#include <Network/PacketContainer.h>
|
#include <Network/PacketContainer.h>
|
||||||
|
@ -49,11 +49,9 @@ using namespace Sapphire::Network::ActorControl;
|
||||||
|
|
||||||
void PlayerMgr::onOnlineStatusChanged( Entity::Player& player, bool updateProfile )
|
void PlayerMgr::onOnlineStatusChanged( Entity::Player& player, bool updateProfile )
|
||||||
{
|
{
|
||||||
auto& server = Common::Service< World::WorldServer >::ref();
|
|
||||||
|
|
||||||
auto statusPacket = makeZonePacket< FFXIVIpcSetOnlineStatus >( player.getId() );
|
auto statusPacket = makeZonePacket< FFXIVIpcSetOnlineStatus >( player.getId() );
|
||||||
statusPacket->data().onlineStatusFlags = player.getFullOnlineStatusMask();
|
statusPacket->data().onlineStatusFlags = player.getFullOnlineStatusMask();
|
||||||
server.queueForPlayer( player.getCharacterId(), statusPacket );
|
server().queueForPlayer( player.getCharacterId(), statusPacket );
|
||||||
|
|
||||||
if( updateProfile )
|
if( updateProfile )
|
||||||
{
|
{
|
||||||
|
@ -61,61 +59,58 @@ void PlayerMgr::onOnlineStatusChanged( Entity::Player& player, bool updateProfil
|
||||||
searchInfoPacket->data().OnlineStatus = player.getFullOnlineStatusMask();
|
searchInfoPacket->data().OnlineStatus = player.getFullOnlineStatusMask();
|
||||||
searchInfoPacket->data().Region = player.getSearchSelectRegion();
|
searchInfoPacket->data().Region = player.getSearchSelectRegion();
|
||||||
strcpy( searchInfoPacket->data().SearchComment, player.getSearchMessage());
|
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 )
|
void PlayerMgr::onEquipDisplayFlagsChanged( Entity::Player& player )
|
||||||
{
|
{
|
||||||
auto paramPacket = makeZonePacket< FFXIVIpcConfig >( player.getId() );
|
auto paramPacket = makeZonePacket< FFXIVIpcConfig >( player.getId() );
|
||||||
paramPacket->data().flag = player.getEquipDisplayFlags();
|
paramPacket->data().flag = player.getEquipDisplayFlags();
|
||||||
player.sendToInRangeSet( paramPacket, true );
|
server().queueForPlayers( player.getInRangePlayerIds( true ), paramPacket );
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerMgr::onSendStateFlags( Entity::Player& player, bool updateInRange )
|
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 )
|
if( updateInRange )
|
||||||
player.sendToInRangeSet( makeActorControl( player.getId(), SetStatusIcon,
|
server().queueForPlayers( player.getInRangePlayerIds( true ),
|
||||||
static_cast< uint8_t >( player.getOnlineStatus() ) ), true );
|
makeActorControl( player.getId(), SetStatusIcon, static_cast< uint8_t >( player.getOnlineStatus() ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerMgr::onSendAchievementList( Entity::Player& player )
|
void PlayerMgr::onSendAchievementList( Entity::Player& player )
|
||||||
{
|
{
|
||||||
auto& server = Common::Service< World::WorldServer >::ref();
|
|
||||||
|
|
||||||
auto achvData = player.getAchievementData();
|
auto achvData = player.getAchievementData();
|
||||||
|
|
||||||
auto achvPacket = makeZonePacket< FFXIVIpcAchievement >( player.getId() );
|
auto achvPacket = makeZonePacket< FFXIVIpcAchievement >( player.getId() );
|
||||||
std::memcpy( &achvPacket->data().complete[ 0 ], &achvData.unlockList[ 0 ], sizeof( achvPacket->data().complete ) );
|
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 ) );
|
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 )
|
void PlayerMgr::onSendAchievementProgress( Entity::Player& player, uint32_t achievementId )
|
||||||
{
|
{
|
||||||
auto& server = Common::Service< World::WorldServer >::ref();
|
|
||||||
auto& achvMgr = Common::Service< Manager::AchievementMgr >::ref();
|
auto& achvMgr = Common::Service< Manager::AchievementMgr >::ref();
|
||||||
|
|
||||||
auto achvProgress = achvMgr.getAchievementDataById( player, achievementId );
|
auto achvProgress = achvMgr.getAchievementDataById( player, achievementId );
|
||||||
|
|
||||||
auto pAchvProgressPacket = makeActorControl( player.getId(), AchievementSetRate, achievementId, achvProgress.first, achvProgress.second );
|
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 )
|
void PlayerMgr::onUnlockAchievement( Entity::Player& player, uint32_t achievementId )
|
||||||
{
|
{
|
||||||
auto& server = Common::Service< World::WorldServer >::ref();
|
|
||||||
|
|
||||||
onSendAchievementList( player );
|
onSendAchievementList( player );
|
||||||
|
|
||||||
server.queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), AchievementComplete, achievementId ) );
|
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(), AchievementObtainMsg, achievementId ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerMgr::onSendStats( Entity::Player& player )
|
void PlayerMgr::onSendStats( Entity::Player& player )
|
||||||
|
@ -146,15 +141,11 @@ void PlayerMgr::onSendStats( Entity::Player& player )
|
||||||
|
|
||||||
auto statPacket = makeZonePacket< FFXIVIpcBaseParam >( player.getId() );
|
auto statPacket = makeZonePacket< FFXIVIpcBaseParam >( player.getId() );
|
||||||
memcpy( statPacket->data().Param, statParams.data(), sizeof( uint32_t ) * statParams.size() );
|
memcpy( statPacket->data().Param, statParams.data(), sizeof( uint32_t ) * statParams.size() );
|
||||||
|
server().queueForPlayer( player.getCharacterId(), statPacket );
|
||||||
auto& server = Common::Service< World::WorldServer >::ref();
|
|
||||||
server.queueForPlayer( player.getCharacterId(), statPacket );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerMgr::onPlayerStatusUpdate( Entity::Player& player )
|
void PlayerMgr::onPlayerStatusUpdate( Entity::Player& player )
|
||||||
{
|
{
|
||||||
auto& server = Common::Service< World::WorldServer >::ref();
|
|
||||||
|
|
||||||
auto playerStatusUpdate = makeZonePacket< FFXIVIpcPlayerStatusUpdate >( player.getId() );
|
auto playerStatusUpdate = makeZonePacket< FFXIVIpcPlayerStatusUpdate >( player.getId() );
|
||||||
playerStatusUpdate->data().ClassJob = static_cast< uint8_t >( player.getClass() );
|
playerStatusUpdate->data().ClassJob = static_cast< uint8_t >( player.getClass() );
|
||||||
playerStatusUpdate->data().Lv = player.getLevel();
|
playerStatusUpdate->data().Lv = player.getLevel();
|
||||||
|
@ -162,22 +153,19 @@ void PlayerMgr::onPlayerStatusUpdate( Entity::Player& player )
|
||||||
playerStatusUpdate->data().LvSync = 0; //player.getLevelSync();
|
playerStatusUpdate->data().LvSync = 0; //player.getLevelSync();
|
||||||
playerStatusUpdate->data().Exp = player.getExp();
|
playerStatusUpdate->data().Exp = player.getExp();
|
||||||
|
|
||||||
server.queueForPlayer( player.getCharacterId(), playerStatusUpdate );
|
server().queueForPlayer( player.getCharacterId(), playerStatusUpdate );
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerMgr::onPlayerHpMpTpChanged( Entity::Player& player )
|
void PlayerMgr::onPlayerHpMpTpChanged( Entity::Player& player )
|
||||||
{
|
{
|
||||||
auto& server = Common::Service< World::WorldServer >::ref();
|
server().queueForPlayers( player.getInRangePlayerIds( true ), std::make_shared< UpdateHpMpTpPacket >( player ) );
|
||||||
|
|
||||||
player.sendToInRangeSet( std::make_shared< UpdateHpMpTpPacket >( player ), true );
|
|
||||||
auto hudParamPacket = makeHudParam( player );
|
auto hudParamPacket = makeHudParam( player );
|
||||||
server.queueForPlayer( player.getCharacterId(), hudParamPacket );
|
server().queueForPlayer( player.getCharacterId(), hudParamPacket );
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerMgr::onPlayerItemLevelUpdate( Entity::Player& player )
|
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 )
|
void PlayerMgr::onLevelUp( Entity::Player& player )
|
||||||
|
@ -186,10 +174,11 @@ void PlayerMgr::onLevelUp( Entity::Player& player )
|
||||||
player.sendStats();
|
player.sendStats();
|
||||||
onPlayerHpMpTpChanged( player );
|
onPlayerHpMpTpChanged( player );
|
||||||
|
|
||||||
player.sendToInRangeSet( makeHudParam( player ), true );
|
auto inRangePlayerIds = player.getInRangePlayerIds( true );
|
||||||
|
|
||||||
player.sendToInRangeSet( makeActorControl( player.getId(), LevelUpEffect, static_cast< uint8_t >( player.getClass() ),
|
server().queueForPlayers( inRangePlayerIds, makeHudParam( player ) );
|
||||||
player.getLevel(), player.getLevel() - 1 ), true );
|
server().queueForPlayers( inRangePlayerIds, makeActorControl( player.getId(), LevelUpEffect, static_cast< uint8_t >( player.getClass() ),
|
||||||
|
player.getLevel(), player.getLevel() - 1 ) );
|
||||||
|
|
||||||
onPlayerStatusUpdate( player );
|
onPlayerStatusUpdate( player );
|
||||||
|
|
||||||
|
@ -199,10 +188,9 @@ void PlayerMgr::onLevelUp( Entity::Player& player )
|
||||||
|
|
||||||
void PlayerMgr::onSetLevelForClass( Entity::Player& player, Common::ClassJob classJob )
|
void PlayerMgr::onSetLevelForClass( Entity::Player& player, Common::ClassJob classJob )
|
||||||
{
|
{
|
||||||
auto& server = Common::Service< World::WorldServer >::ref();
|
|
||||||
auto& achvMgr = Common::Service< World::Manager::AchievementMgr >::ref();
|
auto& achvMgr = Common::Service< World::Manager::AchievementMgr >::ref();
|
||||||
|
|
||||||
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), Network::ActorControl::ClassJobUpdate,
|
server().queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), Network::ActorControl::ClassJobUpdate,
|
||||||
static_cast< uint8_t >( classJob ), player.getLevelForClass( classJob ) ) );
|
static_cast< uint8_t >( classJob ), player.getLevelForClass( classJob ) ) );
|
||||||
|
|
||||||
achvMgr.progressAchievementByType< Common::Achievement::Type::Classjob >( player, static_cast< uint32_t >( 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 )
|
void PlayerMgr::onGainExp( Entity::Player& player, uint32_t exp )
|
||||||
{
|
{
|
||||||
auto& server = Common::Service< World::WorldServer >::ref();
|
|
||||||
|
|
||||||
if( exp != 0 )
|
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 )
|
void PlayerMgr::onUnlockOrchestrion( Entity::Player& player, uint8_t songId, uint32_t itemId )
|
||||||
{
|
{
|
||||||
player.learnSong( songId, 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 )
|
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 )
|
void PlayerMgr::onGcUpdate( Entity::Player& player )
|
||||||
{
|
{
|
||||||
auto& server = Common::Service< World::WorldServer >::ref();
|
|
||||||
|
|
||||||
auto gcAffPacket = makeZonePacket< FFXIVIpcGrandCompany >( player.getId() );
|
auto gcAffPacket = makeZonePacket< FFXIVIpcGrandCompany >( player.getId() );
|
||||||
gcAffPacket->data().ActiveCompanyId = player.getGc();
|
gcAffPacket->data().ActiveCompanyId = player.getGc();
|
||||||
gcAffPacket->data().MaelstromRank = player.getGcRankArray()[ 0 ];
|
gcAffPacket->data().MaelstromRank = player.getGcRankArray()[ 0 ];
|
||||||
gcAffPacket->data().TwinAdderRank = player.getGcRankArray()[ 1 ];
|
gcAffPacket->data().TwinAdderRank = player.getGcRankArray()[ 1 ];
|
||||||
gcAffPacket->data().ImmortalFlamesRank = player.getGcRankArray()[ 2 ];
|
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 )
|
void PlayerMgr::onSetGc( Entity::Player& player, uint8_t gc )
|
||||||
|
@ -268,28 +252,29 @@ void PlayerMgr::onCompanionUpdate( Entity::Player& player, uint8_t companionId )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
player.setCompanion( companionId );
|
player.setCompanion( companionId );
|
||||||
|
server().queueForPlayers( player.getInRangePlayerIds( true ), makeActorControl( player.getId(), ActorControlType::ToggleCompanion, companionId ) );
|
||||||
player.sendToInRangeSet( makeActorControl( player.getId(), ActorControlType::ToggleCompanion, companionId ), true );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerMgr::onMountUpdate( Entity::Player& player, uint32_t mountId )
|
void PlayerMgr::onMountUpdate( Entity::Player& player, uint32_t mountId )
|
||||||
{
|
{
|
||||||
|
|
||||||
|
auto inRangePlayerIds = player.getInRangePlayerIds( true );
|
||||||
if( mountId != 0 )
|
if( mountId != 0 )
|
||||||
{
|
{
|
||||||
player.sendToInRangeSet( makeActorControl( player.getId(), ActorControlType::SetStatus,
|
server().queueForPlayers( inRangePlayerIds,
|
||||||
static_cast< uint8_t >( Common::ActorStatus::Mounted ) ), true );
|
makeActorControl( player.getId(), ActorControlType::SetStatus, static_cast< uint8_t >( Common::ActorStatus::Mounted ) ) );
|
||||||
player.sendToInRangeSet( makeActorControlSelf( player.getId(), 0x39e, 12 ), true ); //?
|
server().queueForPlayers( inRangePlayerIds, makeActorControlSelf( player.getId(), 0x39e, 12 ) );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
player.sendToInRangeSet( makeActorControl( player.getId(), ActorControlType::SetStatus,
|
server().queueForPlayers( inRangePlayerIds,
|
||||||
static_cast< uint8_t >( Common::ActorStatus::Idle ) ), true );
|
makeActorControl( player.getId(), ActorControlType::SetStatus, static_cast< uint8_t >( Common::ActorStatus::Idle ) ) );
|
||||||
player.sendToInRangeSet( makeActorControlSelf( player.getId(), ActorControlType::Dismount, 1 ), true );
|
server().queueForPlayers( inRangePlayerIds, makeActorControlSelf( player.getId(), ActorControlType::Dismount, 1 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
auto mountPacket = makeZonePacket< FFXIVIpcMount >( player.getId() );
|
auto mountPacket = makeZonePacket< FFXIVIpcMount >( player.getId() );
|
||||||
mountPacket->data().id = mountId;
|
mountPacket->data().id = mountId;
|
||||||
player.sendToInRangeSet( mountPacket, true );
|
server().queueForPlayers( inRangePlayerIds, mountPacket );
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerMgr::onMobKill( Entity::Player& player, Entity::BNpc& bnpc )
|
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 )
|
void PlayerMgr::onHateListChanged( Entity::Player& player )
|
||||||
{
|
{
|
||||||
auto& server = Common::Service< World::WorldServer >::ref();
|
|
||||||
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
|
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
|
||||||
|
|
||||||
auto hateListPacket = makeZonePacket< FFXIVIpcHateList >( player.getId() );
|
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 );
|
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 )
|
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 );
|
onPlayerHpMpTpChanged( player );
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerMgr::onLogin( Entity::Player& 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::istringstream ss( motd );
|
||||||
std::string msg;
|
std::string msg;
|
||||||
|
@ -386,8 +368,6 @@ void PlayerMgr::onZone( Sapphire::Entity::Player& player )
|
||||||
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
|
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
|
||||||
auto& housingMgr = Common::Service< HousingMgr >::ref();
|
auto& housingMgr = Common::Service< HousingMgr >::ref();
|
||||||
auto& partyMgr = Common::Service< World::Manager::PartyMgr >::ref();
|
auto& partyMgr = Common::Service< World::Manager::PartyMgr >::ref();
|
||||||
auto& server = Common::Service< World::WorldServer >::ref();
|
|
||||||
|
|
||||||
|
|
||||||
auto pZone = teriMgr.getTerritoryByGuId( player.getTerritoryId() );
|
auto pZone = teriMgr.getTerritoryByGuId( player.getTerritoryId() );
|
||||||
if( !pZone )
|
if( !pZone )
|
||||||
|
@ -400,25 +380,14 @@ void PlayerMgr::onZone( Sapphire::Entity::Player& player )
|
||||||
auto initPacket = makeZonePacket< FFXIVIpcLogin >( player.getId() );
|
auto initPacket = makeZonePacket< FFXIVIpcLogin >( player.getId() );
|
||||||
initPacket->data().playerActorId = player.getId();
|
initPacket->data().playerActorId = player.getId();
|
||||||
|
|
||||||
server.queueForPlayer( player.getCharacterId(), initPacket );
|
server().queueForPlayer( player.getCharacterId(), initPacket );
|
||||||
|
|
||||||
player.sendInventory();
|
player.sendInventory();
|
||||||
|
|
||||||
if( player.isLogin() )
|
if( player.isLogin() )
|
||||||
{
|
{
|
||||||
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), 0x169, 0 ) ); // unknown
|
server().queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), SetConfigFlags, player.getEquipDisplayFlags(), 1 ) );
|
||||||
server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), 0x54, 0 ) ); // something treasure map related?
|
server().queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), SetMaxGearSets, player.getMaxGearSets() ) );
|
||||||
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() ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// set flags, will be reset automatically by zoning ( only on client side though )
|
// 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() )
|
if( player.isLogin() )
|
||||||
{
|
{
|
||||||
player.sendItemLevel();
|
player.sendItemLevel();
|
||||||
server.queueForPlayer( player.getCharacterId(), makePlayerSetup( player ) );
|
server().queueForPlayer( player.getCharacterId(), makePlayerSetup( player ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
player.sendStats();
|
player.sendStats();
|
||||||
|
@ -442,16 +411,16 @@ void PlayerMgr::onZone( Sapphire::Entity::Player& player )
|
||||||
classInfo->data().Lv1 = player.getLevel();
|
classInfo->data().Lv1 = player.getLevel();
|
||||||
if( player.isLogin() )
|
if( player.isLogin() )
|
||||||
classInfo->data().Login = 1;
|
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.
|
// only initialize the UI if the player in fact just logged in.
|
||||||
if( player.isLogin() )
|
if( player.isLogin() )
|
||||||
{
|
{
|
||||||
auto contentFinderList = makeZonePacket< FFXIVIpcContentAttainFlags >( player.getId() );
|
auto contentFinderList = makeZonePacket< FFXIVIpcContentAttainFlags >( player.getId() );
|
||||||
std::memset( &contentFinderList->data(), 0xFF, sizeof( contentFinderList->data() ) );
|
std::memset( &contentFinderList->data(), 0xFF, sizeof( contentFinderList->data() ) );
|
||||||
|
|
||||||
server.queueForPlayer( player.getCharacterId(), contentFinderList );
|
server().queueForPlayer( player.getCharacterId(), contentFinderList );
|
||||||
|
|
||||||
player.clearSoldItems();
|
player.clearSoldItems();
|
||||||
}
|
}
|
||||||
|
@ -472,13 +441,13 @@ void PlayerMgr::onZone( Sapphire::Entity::Player& player )
|
||||||
|
|
||||||
housingMgr.sendLandFlags( player );
|
housingMgr.sendLandFlags( player );
|
||||||
|
|
||||||
server.queueForPlayer( player.getCharacterId(), makeInitZone( player, teri ) );
|
server().queueForPlayer( player.getCharacterId(), makeInitZone( player, teri ) );
|
||||||
|
|
||||||
teri.onPlayerZoneIn( player );
|
teri.onPlayerZoneIn( player );
|
||||||
|
|
||||||
if( player.isLogin() )
|
if( player.isLogin() )
|
||||||
{
|
{
|
||||||
server.queueForPlayer( player.getCharacterId(),
|
server().queueForPlayer( player.getCharacterId(),
|
||||||
{
|
{
|
||||||
makeZonePacket< FFXIVIpcQuestRepeatFlags >( player.getId() ),
|
makeZonePacket< FFXIVIpcQuestRepeatFlags >( player.getId() ),
|
||||||
makeZonePacket< FFXIVIpcDailyQuests >( player.getId() )
|
makeZonePacket< FFXIVIpcDailyQuests >( player.getId() )
|
||||||
|
@ -503,9 +472,7 @@ void PlayerMgr::onUpdate( Entity::Player& player, uint64_t tickCount )
|
||||||
if( !player.isAlive() )
|
if( !player.isAlive() )
|
||||||
return;
|
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 );
|
auto mainWeap = player.getItemAt( Common::GearSet0, Common::GearSetSlot::MainHand );
|
||||||
|
|
||||||
|
@ -537,7 +504,6 @@ void PlayerMgr::onUpdate( Entity::Player& player, uint64_t tickCount )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void PlayerMgr::onSetStateFlag( Sapphire::Entity::Player& player, Common::PlayerStateFlag flag )
|
void PlayerMgr::onSetStateFlag( Sapphire::Entity::Player& player, Common::PlayerStateFlag flag )
|
||||||
{
|
{
|
||||||
|
@ -561,31 +527,24 @@ void PlayerMgr::onUnsetStateFlag( Sapphire::Entity::Player& player, Common::Play
|
||||||
|
|
||||||
////////// Helper ///////////
|
////////// Helper ///////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void PlayerMgr::sendServerNotice( Entity::Player& player, const std::string& message ) //Purple Text
|
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
|
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
|
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,
|
void PlayerMgr::sendLogMessage( Entity::Player& player, uint32_t messageId, uint32_t param2, uint32_t param3,
|
||||||
uint32_t param4, uint32_t param5, uint32_t param6 )
|
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,
|
||||||
server.queueForPlayer( player.getCharacterId(), makeActorControlTarget( player.getId(), ActorControlType::LogMsg, messageId,
|
|
||||||
param2, param3, param4, param5, param6 ) );
|
param2, param3, param4, param5, param6 ) );
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include "ForwardsZone.h"
|
#include "ForwardsZone.h"
|
||||||
#include <spdlog/fmt/fmt.h>
|
#include <spdlog/fmt/fmt.h>
|
||||||
|
#include "MgrUtil.h"
|
||||||
|
|
||||||
namespace Sapphire::World::Manager
|
namespace Sapphire::World::Manager
|
||||||
{
|
{
|
||||||
|
|
|
@ -17,8 +17,9 @@
|
||||||
|
|
||||||
#include <Manager/PlayerMgr.h>
|
#include <Manager/PlayerMgr.h>
|
||||||
#include <Manager/MapMgr.h>
|
#include <Manager/MapMgr.h>
|
||||||
|
#include <Manager/MgrUtil.h>
|
||||||
|
#include "WorldServer.h"
|
||||||
|
|
||||||
#include "Territory/Territory.h"
|
|
||||||
#include "Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include <Territory/InstanceObjectCache.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 )
|
uint32_t targetTerritoryId, Common::FFXIVARR_POSITION3 targetPos, float targetRot )
|
||||||
{
|
{
|
||||||
auto& teriMgr = Common::Service< TerritoryMgr >::ref();
|
auto& teriMgr = Common::Service< TerritoryMgr >::ref();
|
||||||
auto& server = Common::Service< WorldServer >::ref();
|
|
||||||
|
|
||||||
auto pTeri = teriMgr.getTerritoryByGuId( targetTerritoryId );
|
auto pTeri = teriMgr.getTerritoryByGuId( targetTerritoryId );
|
||||||
if( !pTeri )
|
if( !pTeri )
|
||||||
|
@ -52,12 +52,19 @@ void WarpMgr::requestMoveTerritory( Entity::Player& player, Common::WarpType war
|
||||||
taskMgr.queueTask( makeMoveTerritoryTask( player, warpType, targetTerritoryId, targetPos, targetRot, 1000 ) );
|
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 )
|
void WarpMgr::requestWarp( Entity::Player& player, Common::WarpType warpType, Common::FFXIVARR_POSITION3 targetPos, float targetRot )
|
||||||
{
|
{
|
||||||
m_entityIdToWarpInfoMap[ player.getId() ] = { 0, warpType, targetPos, targetRot };
|
m_entityIdToWarpInfoMap[ player.getId() ] = { 0, warpType, targetPos, targetRot };
|
||||||
|
|
||||||
player.sendToInRangeSet( makeActorControlSelf( player.getId(), WarpStart, warpType, warpType, 0, player.getTerritoryTypeId(), 1 ), true );
|
server().queueForPlayers( player.getInRangePlayerIds( true ),
|
||||||
player.sendToInRangeSet( makeActorControl( player.getId(), ActorDespawnEffect, warpType, player.getTerritoryTypeId() ) );
|
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();
|
auto& taskMgr = Common::Service< TaskMgr >::ref();
|
||||||
taskMgr.queueTask( makeWarpTask( player, warpType, targetPos, targetRot, 1000 ) );
|
taskMgr.queueTask( makeWarpTask( player, warpType, targetPos, targetRot, 1000 ) );
|
||||||
|
@ -96,12 +103,10 @@ void WarpMgr::finishWarp( Entity::Player& player )
|
||||||
player.setZoningType( Common::ZoningType::None );
|
player.setZoningType( Common::ZoningType::None );
|
||||||
|
|
||||||
if( !player.getGmInvis() )
|
if( !player.getGmInvis() )
|
||||||
player.sendToInRangeSet( zoneInPacket );
|
server().queueForPlayers( player.getInRangePlayerIds(), zoneInPacket );
|
||||||
|
|
||||||
auto& server = Common::Service< WorldServer >::ref();
|
server().queueForPlayer( player.getCharacterId(), zoneInPacket );
|
||||||
server.queueForPlayer( player.getCharacterId(), zoneInPacket );
|
server().queueForPlayers( player.getInRangePlayerIds( true ), setStatusPacket );
|
||||||
|
|
||||||
player.sendToInRangeSet( setStatusPacket, true );
|
|
||||||
|
|
||||||
playerMgr.onUnsetStateFlag( player, PlayerStateFlag::BetweenAreas );
|
playerMgr.onUnsetStateFlag( player, PlayerStateFlag::BetweenAreas );
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,15 @@ namespace Sapphire::World::Manager
|
||||||
/// <param name="targetRot"></param>
|
/// <param name="targetRot"></param>
|
||||||
void requestMoveTerritory( Entity::Player& player, Common::WarpType warpType, uint32_t targetTerritoryId, Common::FFXIVARR_POSITION3 targetPos, float targetRot );
|
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>
|
/// <summary>
|
||||||
/// handle player state pre-warp and tells client to warp player
|
/// handle player state pre-warp and tells client to warp player
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include "Manager/TerritoryMgr.h"
|
#include "Manager/TerritoryMgr.h"
|
||||||
#include "Manager/PlayerMgr.h"
|
#include "Manager/PlayerMgr.h"
|
||||||
#include "Manager/WarpMgr.h"
|
#include "Manager/WarpMgr.h"
|
||||||
|
#include "Manager/MgrUtil.h"
|
||||||
#include "Territory/Territory.h"
|
#include "Territory/Territory.h"
|
||||||
#include "Territory/InstanceContent.h"
|
#include "Territory/InstanceContent.h"
|
||||||
|
|
||||||
|
@ -86,7 +87,6 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR
|
||||||
if( player.getGmRank() <= 0 )
|
if( player.getGmRank() <= 0 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto& server = Common::Service< World::WorldServer >::ref();
|
|
||||||
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
|
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
|
||||||
auto& exdData = Common::Service< Data::ExdData >::ref();
|
auto& exdData = Common::Service< Data::ExdData >::ref();
|
||||||
|
|
||||||
|
@ -233,7 +233,7 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR
|
||||||
}
|
}
|
||||||
case GmCommand::Speed:
|
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 );
|
PlayerMgr::sendServerNotice( player, "Speed for {0} was set to {1}", targetPlayer->getName(), param1 );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -270,11 +270,10 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR
|
||||||
searchInfoPacket->data().OnlineStatus = param1;
|
searchInfoPacket->data().OnlineStatus = param1;
|
||||||
searchInfoPacket->data().Region = targetPlayer->getSearchSelectRegion();
|
searchInfoPacket->data().Region = targetPlayer->getSearchSelectRegion();
|
||||||
strcpy( searchInfoPacket->data().SearchComment, targetPlayer->getSearchMessage() );
|
strcpy( searchInfoPacket->data().SearchComment, targetPlayer->getSearchMessage() );
|
||||||
server.queueForPlayer( targetPlayer->getCharacterId(), searchInfoPacket );
|
server().queueForPlayer( targetPlayer->getCharacterId(), searchInfoPacket );
|
||||||
|
|
||||||
targetPlayer->sendToInRangeSet( makeActorControl( player.getId(), SetStatusIcon,
|
server().queueForPlayers( targetPlayer->getInRangePlayerIds( true ), makeActorControl( player.getId(), SetStatusIcon,
|
||||||
static_cast< uint8_t >( player.getOnlineStatus() ) ),
|
static_cast< uint8_t >( player.getOnlineStatus() ) ) );
|
||||||
true );
|
|
||||||
PlayerMgr::sendServerNotice( player, "Icon for {0} was set to {1}", targetPlayer->getName(), param1 );
|
PlayerMgr::sendServerNotice( player, "Icon for {0} was set to {1}", targetPlayer->getName(), param1 );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -474,7 +473,7 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR
|
||||||
}
|
}
|
||||||
case GmCommand::Wireframe:
|
case GmCommand::Wireframe:
|
||||||
{
|
{
|
||||||
server.queueForPlayer( player.getCharacterId(),
|
server().queueForPlayer( player.getCharacterId(),
|
||||||
std::make_shared< ActorControlSelfPacket >( player.getId(), ActorControlType::ToggleWireframeRendering ) );
|
std::make_shared< ActorControlSelfPacket >( player.getId(), ActorControlType::ToggleWireframeRendering ) );
|
||||||
PlayerMgr::sendServerNotice( player, "Wireframe Rendering for {0} was toggled", player.getName() );
|
PlayerMgr::sendServerNotice( player, "Wireframe Rendering for {0} was toggled", player.getName() );
|
||||||
break;
|
break;
|
||||||
|
@ -601,7 +600,6 @@ void Sapphire::Network::GameConnection::gmCommandNameHandler( const Packets::FFX
|
||||||
if( player.getGmRank() <= 0 )
|
if( player.getGmRank() <= 0 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto& server = Common::Service< World::WorldServer >::ref();
|
|
||||||
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
|
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
|
||||||
|
|
||||||
const auto packet = ZoneChannelPacket< Client::FFXIVIpcGmCommandName >( inPacket );
|
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}",
|
Logger::debug( "{0} used GM2 commandId: {1}, params: {2}, {3}, {4}, {5}, target: {6}",
|
||||||
player.getName(), commandId, param1, param2, param3, param4, target );
|
player.getName(), commandId, param1, param2, param3, param4, target );
|
||||||
|
|
||||||
auto targetSession = server.getSession( target );
|
auto targetSession = server().getSession( target );
|
||||||
Sapphire::Entity::CharaPtr targetActor;
|
Sapphire::Entity::CharaPtr targetActor;
|
||||||
|
|
||||||
if( targetSession != nullptr )
|
if( targetSession != nullptr )
|
||||||
|
@ -652,10 +650,10 @@ void Sapphire::Network::GameConnection::gmCommandNameHandler( const Packets::FFX
|
||||||
targetPlayer->resetMp();
|
targetPlayer->resetMp();
|
||||||
targetPlayer->setStatus( Common::ActorStatus::Idle );
|
targetPlayer->setStatus( Common::ActorStatus::Idle );
|
||||||
|
|
||||||
targetPlayer->sendToInRangeSet( makeActorControlSelf( player.getId(), Appear, 0x01, 0x01, 0, 113 ), true );
|
server().queueForPlayers( targetPlayer->getInRangePlayerIds( true ), makeActorControlSelf( player.getId(), Appear, 0x01, 0x01, 0, 113 ) );
|
||||||
targetPlayer->sendToInRangeSet( makeActorControl( player.getId(), SetStatus,
|
server().queueForPlayers( targetPlayer->getInRangePlayerIds( true ), makeActorControl( player.getId(), SetStatus,
|
||||||
static_cast< uint8_t >( Common::ActorStatus::Idle ) ),
|
static_cast< uint8_t >( Common::ActorStatus::Idle ) ) );
|
||||||
true );
|
|
||||||
PlayerMgr::sendServerNotice( player, "Raised {0}", targetPlayer->getName());
|
PlayerMgr::sendServerNotice( player, "Raised {0}", targetPlayer->getName());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -666,7 +666,7 @@ void Sapphire::Network::GameConnection::commandHandler( const Packets::FFXIVARR_
|
||||||
}*/
|
}*/
|
||||||
case PacketCommand::EVENT_HANDLER:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,6 +56,7 @@
|
||||||
#include "Manager/WarpMgr.h"
|
#include "Manager/WarpMgr.h"
|
||||||
#include "Manager/ItemMgr.h"
|
#include "Manager/ItemMgr.h"
|
||||||
#include "Manager/FreeCompanyMgr.h"
|
#include "Manager/FreeCompanyMgr.h"
|
||||||
|
#include "Manager/MgrUtil.h"
|
||||||
|
|
||||||
#include "Action/Action.h"
|
#include "Action/Action.h"
|
||||||
|
|
||||||
|
@ -100,8 +101,8 @@ void Sapphire::Network::GameConnection::setProfileHandler( const Packets::FFXIVA
|
||||||
strcpy( searchInfoPacket->data().SearchComment, player.getSearchMessage() );
|
strcpy( searchInfoPacket->data().SearchComment, player.getSearchMessage() );
|
||||||
queueOutPacket( searchInfoPacket );
|
queueOutPacket( searchInfoPacket );
|
||||||
|
|
||||||
player.sendToInRangeSet( makeActorControl( player.getId(), SetStatusIcon,
|
server().queueForPlayers( player.getInRangePlayerIds( true ), makeActorControl( player.getId(), SetStatusIcon,
|
||||||
static_cast< uint8_t >( player.getOnlineStatus() ) ), true );
|
static_cast< uint8_t >( player.getOnlineStatus() ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sapphire::Network::GameConnection::getProfileHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
|
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 )
|
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 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 );
|
Logger::debug( "getSearchCommentHandler: {0}", targetId );
|
||||||
|
|
||||||
|
@ -131,23 +130,18 @@ void Sapphire::Network::GameConnection::getSearchCommentHandler( const Packets::
|
||||||
auto searchInfoPacket = makeZonePacket< FFXIVIpcGetSearchCommentResult >( player.getId() );
|
auto searchInfoPacket = makeZonePacket< FFXIVIpcGetSearchCommentResult >( player.getId() );
|
||||||
searchInfoPacket->data().TargetEntityID = targetId;
|
searchInfoPacket->data().TargetEntityID = targetId;
|
||||||
strcpy( searchInfoPacket->data().SearchComment, pPlayer->getSearchMessage() );
|
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 )
|
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 targetId = *reinterpret_cast< const uint32_t* >( &inPacket.data[ 0x18 ] );
|
||||||
|
auto pPlayer = server().getPlayer( targetId );
|
||||||
auto& server = Common::Service< World::WorldServer >::ref();
|
|
||||||
auto pPlayer = server.getPlayer( targetId );
|
|
||||||
|
|
||||||
Logger::debug( "reqExamineFcInfo: {0}", targetId );
|
Logger::debug( "reqExamineFcInfo: {0}", targetId );
|
||||||
|
|
||||||
if( pPlayer )
|
if( !pPlayer || pPlayer->isActingAsGm() || pPlayer->getTerritoryTypeId() != player.getTerritoryTypeId() )
|
||||||
{
|
|
||||||
if( pPlayer->isActingAsGm() || pPlayer->getTerritoryTypeId() != player.getTerritoryTypeId() )
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// retail sends the requester's id as both (isForSelf)
|
// retail sends the requester's id as both (isForSelf)
|
||||||
|
@ -155,9 +149,7 @@ void Sapphire::Network::GameConnection::reqExamineFcInfo( const Packets::FFXIVAR
|
||||||
examineFcInfoPacket->data().TargetEntityID = targetId;
|
examineFcInfoPacket->data().TargetEntityID = targetId;
|
||||||
// todo: populate with fc info
|
// todo: populate with fc info
|
||||||
|
|
||||||
server.queueForPlayer( player.getCharacterId(), examineFcInfoPacket );
|
server().queueForPlayer( player.getCharacterId(), examineFcInfoPacket );
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sapphire::Network::GameConnection::joinChatChannelHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
|
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 );
|
chatChannelMgr.addToChannel( joinChannelPacket.data().ChannelID, player );
|
||||||
|
|
||||||
auto chatChannelResultPacket = makeZonePacket< FFXIVIpcChatChannelResult >( player.getId() );
|
auto chatChannelResultPacket = makeZonePacket< FFXIVIpcChatChannelResult >( player.getId() );
|
||||||
|
|
||||||
chatChannelResultPacket->data().ChannelID = channelIdReq;
|
chatChannelResultPacket->data().ChannelID = channelIdReq;
|
||||||
chatChannelResultPacket->data().TargetCharacterID = player.getId();
|
chatChannelResultPacket->data().TargetCharacterID = player.getId();
|
||||||
chatChannelResultPacket->data().CommunityID = player.getCharacterId();
|
chatChannelResultPacket->data().CommunityID = player.getCharacterId();
|
||||||
chatChannelResultPacket->data().UpPacketNo = 0; // todo: define behavior
|
chatChannelResultPacket->data().UpPacketNo = 0; // todo: define behavior
|
||||||
chatChannelResultPacket->data().Result = 0; // todo: define behavior
|
chatChannelResultPacket->data().Result = 0; // todo: define behavior
|
||||||
|
|
||||||
queueOutPacket( chatChannelResultPacket );
|
queueOutPacket( chatChannelResultPacket );
|
||||||
|
|
||||||
auto joinChannelResultPacket = makeChatPacket< Packets::Server::FFXIVJoinChannelResult >( player.getId() );
|
auto joinChannelResultPacket = makeChatPacket< Packets::Server::FFXIVJoinChannelResult >( player.getId() );
|
||||||
|
|
||||||
joinChannelResultPacket->data().channelID = channelIdReq;
|
joinChannelResultPacket->data().channelID = channelIdReq;
|
||||||
joinChannelResultPacket->data().characterID = player.getId();
|
joinChannelResultPacket->data().characterID = player.getId();
|
||||||
joinChannelResultPacket->data().result = 0;
|
joinChannelResultPacket->data().result = 0;
|
||||||
|
queueOutPacket( joinChannelResultPacket );
|
||||||
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 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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, animationType, animationState, animationSpeed, unknownRotation );
|
||||||
auto movePacket = std::make_shared< MoveActorPacket >( player, headRotation, data.flag, data.flag2, 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 )
|
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& teriMgr = Common::Service< TerritoryMgr >::ref();
|
||||||
auto& instanceObjectCache = Common::Service< InstanceObjectCache >::ref();
|
auto& instanceObjectCache = Common::Service< InstanceObjectCache >::ref();
|
||||||
auto& server = Common::Service< World::WorldServer >::ref();
|
|
||||||
|
|
||||||
auto pTeri = teriMgr.getTerritoryByGuId( player.getTerritoryId() );
|
auto pTeri = teriMgr.getTerritoryByGuId( player.getTerritoryId() );
|
||||||
auto tInfo = pTeri->getTerritoryTypeInfo();
|
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 )
|
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& teriMgr = Common::Service< TerritoryMgr >::ref();
|
||||||
auto& instanceObjectCache = Common::Service< InstanceObjectCache >::ref();
|
auto& instanceObjectCache = Common::Service< InstanceObjectCache >::ref();
|
||||||
auto pTeri = teriMgr.getTerritoryByGuId( player.getTerritoryId() );
|
auto pTeri = teriMgr.getTerritoryByGuId( player.getTerritoryId() );
|
||||||
|
@ -359,7 +336,7 @@ void Sapphire::Network::GameConnection::newDiscoveryHandler( const Packets::FFXI
|
||||||
auto discoveryPacket = makeZonePacket< FFXIVIpcDiscoveryReply >( player.getId() );
|
auto discoveryPacket = makeZonePacket< FFXIVIpcDiscoveryReply >( player.getId() );
|
||||||
discoveryPacket->data().mapId = tInfo->data().Map;
|
discoveryPacket->data().mapId = tInfo->data().Map;
|
||||||
discoveryPacket->data().mapPartId = pRefInfo->data.discoveryIndex;
|
discoveryPacket->data().mapPartId = pRefInfo->data.discoveryIndex;
|
||||||
server.queueForPlayer( player.getCharacterId(), discoveryPacket );
|
server().queueForPlayer( player.getCharacterId(), discoveryPacket );
|
||||||
player.discover( tInfo->data().Map, pRefInfo->data.discoveryIndex );
|
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 )
|
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 );
|
const auto packet = ZoneChannelPacket< Client::FFXIVIpcPingHandler >( inPacket );
|
||||||
auto& data = packet.data();
|
auto& data = packet.data();
|
||||||
|
|
||||||
queueOutPacket( std::make_shared< WorldPackets::Server::PingPacket >( player, data.clientTimeValue ) );
|
queueOutPacket( std::make_shared< WorldPackets::Server::PingPacket >( player, data.clientTimeValue ) );
|
||||||
|
|
||||||
auto pSession = server.getSession( player.getCharacterId() );
|
auto pSession = server().getSession( player.getCharacterId() );
|
||||||
if( !pSession )
|
if( !pSession )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -633,9 +609,6 @@ void Sapphire::Network::GameConnection::gearSetEquip( const Packets::FFXIVARR_PA
|
||||||
const auto packet = ZoneChannelPacket< Client::FFXIVIpcGearSetEquip >( inPacket );
|
const auto packet = ZoneChannelPacket< Client::FFXIVIpcGearSetEquip >( inPacket );
|
||||||
const auto contextId = packet.data().contextId;
|
const auto contextId = packet.data().contextId;
|
||||||
|
|
||||||
auto& server = Common::Service< World::WorldServer >::ref();
|
|
||||||
auto& playerMgr = Common::Service< PlayerMgr >::ref();
|
|
||||||
|
|
||||||
// Loop over all slots
|
// Loop over all slots
|
||||||
for( int slot = 0; slot < 14; ++slot )
|
for( int slot = 0; slot < 14; ++slot )
|
||||||
{
|
{
|
||||||
|
@ -651,14 +624,14 @@ void Sapphire::Network::GameConnection::gearSetEquip( const Packets::FFXIVARR_PA
|
||||||
if( fromItem && equippedItem )
|
if( fromItem && equippedItem )
|
||||||
{
|
{
|
||||||
player.swapItem( fromContainer, fromSlot, Common::GearSet0, slot );
|
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(), 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(), slot, Common::GearSet0, *fromItem, contextId ) );
|
||||||
}
|
}
|
||||||
else if( fromItem && !equippedItem )
|
else if( fromItem && !equippedItem )
|
||||||
{
|
{
|
||||||
player.moveItem( fromContainer, fromSlot, Common::GearSet0, slot );
|
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(), 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(), slot, Common::GearSet0, *fromItem, contextId ) );
|
||||||
}
|
}
|
||||||
else if( !fromItem && equippedItem )
|
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
|
// TODO: the gearset handler shouldn't equip -anything- if there's ever too little inventory space
|
||||||
continue;
|
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(), 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(), slot, Common::GearSet0, contextId ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -682,14 +655,14 @@ void Sapphire::Network::GameConnection::gearSetEquip( const Packets::FFXIVARR_PA
|
||||||
|
|
||||||
if( packet.data().contextId < 0xFE )
|
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() );
|
auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( player.getId() );
|
||||||
invTransFinPacket->data().contextId = contextId;
|
invTransFinPacket->data().contextId = contextId;
|
||||||
invTransFinPacket->data().operationId = contextId;
|
invTransFinPacket->data().operationId = contextId;
|
||||||
invTransFinPacket->data().operationType = ITEM_OPERATION_TYPE::ITEM_OPERATION_TYPE_UPDATEITEM;
|
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 )
|
void Sapphire::Network::GameConnection::marketBoardRequestItemInfo( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
|
||||||
|
|
|
@ -41,9 +41,9 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
|
||||||
std::memcpy( &m_data.CalcResult.CalcResultCt[ m_sourceEffectCount++ ], &effect, sizeof( Common::CalcResultParam ) );
|
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 )
|
void setDisplayType( Common::ActionEffectDisplayType displayType )
|
||||||
|
|
|
@ -46,7 +46,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
|
||||||
{
|
{
|
||||||
m_data.handlerId = directorId;
|
m_data.handlerId = directorId;
|
||||||
m_data.messageId = msgId;
|
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 );
|
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.handlerId = directorId;
|
||||||
m_data.messageId = msgId;
|
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 );
|
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.handlerId = directorId;
|
||||||
m_data.messageId = msgId;
|
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 );
|
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.handlerId = directorId;
|
||||||
m_data.messageId = msgId;
|
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 );
|
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.handlerId = directorId;
|
||||||
m_data.messageId = msgId;
|
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 );
|
std::copy( args.begin(), args.end(), m_data.args );
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -45,15 +45,7 @@ void ActionIntegrityTask::execute()
|
||||||
data.ResultId = m_resultId;
|
data.ResultId = m_resultId;
|
||||||
data.Target = m_pTarget->getId();
|
data.Target = m_pTarget->getId();
|
||||||
|
|
||||||
|
server.queueForPlayers( inRangePlayers, integrityPacket );
|
||||||
for( auto& charId : inRangePlayers )
|
|
||||||
{
|
|
||||||
auto pPlayer = server.getPlayer( charId );
|
|
||||||
Logger::debug( "Sending to {}", charId );
|
|
||||||
integrityPacket->setTargetActor( pPlayer->getId() );
|
|
||||||
|
|
||||||
server.queueForPlayer( charId, integrityPacket );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
#include <Logging/Logger.h>
|
#include <Logging/Logger.h>
|
||||||
#include <Actor/BNpc.h>
|
#include <Actor/BNpc.h>
|
||||||
#include <Manager/TerritoryMgr.h>
|
#include <Manager/TerritoryMgr.h>
|
||||||
|
#include <Manager/MgrUtil.h>
|
||||||
|
#include "WorldServer.h"
|
||||||
#include <Service.h>
|
#include <Service.h>
|
||||||
|
|
||||||
#include <Territory/Territory.h>
|
#include <Territory/Territory.h>
|
||||||
|
@ -12,6 +14,7 @@
|
||||||
#include <Network/PacketWrappers/ActorControlPacket.h>
|
#include <Network/PacketWrappers/ActorControlPacket.h>
|
||||||
|
|
||||||
using namespace Sapphire::World;
|
using namespace Sapphire::World;
|
||||||
|
using namespace Sapphire::World::Manager;
|
||||||
using namespace Sapphire::Network::ActorControl;
|
using namespace Sapphire::Network::ActorControl;
|
||||||
using namespace Sapphire::Network::Packets::WorldPackets::Server;
|
using namespace Sapphire::Network::Packets::WorldPackets::Server;
|
||||||
|
|
||||||
|
@ -28,15 +31,14 @@ void FadeBNpcTask::onQueue()
|
||||||
|
|
||||||
void FadeBNpcTask::execute()
|
void FadeBNpcTask::execute()
|
||||||
{
|
{
|
||||||
|
|
||||||
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
|
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
|
||||||
auto pZone = teriMgr.getTerritoryByGuId( m_pBNpc->getTerritoryId() );
|
auto pZone = teriMgr.getTerritoryByGuId( m_pBNpc->getTerritoryId() );
|
||||||
|
|
||||||
if( !pZone )
|
if( !pZone )
|
||||||
return;
|
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()
|
std::string FadeBNpcTask::toString()
|
||||||
|
|
|
@ -40,8 +40,13 @@ void MoveTerritoryTask::execute()
|
||||||
if( !pPlayer )
|
if( !pPlayer )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pPlayer->sendToInRangeSet( makeActorControlSelf( pPlayer->getId(), WarpStart, m_warpInfo.m_warpType, 1, 0, m_warpInfo.m_targetTerritoryId, 1 ), true );
|
auto inRangePlayerIds = pPlayer->getInRangePlayerIds();
|
||||||
pPlayer->sendToInRangeSet( makeActorControl( pPlayer->getId(), ActorDespawnEffect, m_warpInfo.m_warpType, m_warpInfo.m_targetTerritoryId ) );
|
|
||||||
|
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 );
|
Common::Service< PlayerMgr >::ref().onSetStateFlag( *pPlayer, Common::PlayerStateFlag::BetweenAreas );
|
||||||
|
|
||||||
auto moveTerritoryPacket = makeZonePacket< WorldPackets::Server::FFXIVIpcMoveTerritory >( pPlayer->getId() );
|
auto moveTerritoryPacket = makeZonePacket< WorldPackets::Server::FFXIVIpcMoveTerritory >( pPlayer->getId() );
|
||||||
|
|
|
@ -32,7 +32,11 @@ void WarpTask::execute()
|
||||||
if( !pPlayer )
|
if( !pPlayer )
|
||||||
return;
|
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 );
|
pPlayer->setPos( m_warpInfo.m_targetPos, false );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -225,7 +225,7 @@ void Sapphire::HousingZone::sendLandSet( Entity::Player& player )
|
||||||
server.queueForPlayer( player.getCharacterId(), landsetInitializePacket );
|
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& server = Common::Service< World::WorldServer >::ref();
|
||||||
auto pLand = getLand( landId );
|
auto pLand = getLand( landId );
|
||||||
|
@ -282,7 +282,7 @@ uint32_t Sapphire::HousingZone::getLandSetId() const
|
||||||
return m_landSetId;
|
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 );
|
auto it = m_landPtrMap.find( id );
|
||||||
if( it == m_landPtrMap.end() )
|
if( it == m_landPtrMap.end() )
|
||||||
|
@ -291,7 +291,7 @@ Sapphire::LandPtr Sapphire::HousingZone::getLand( uint8_t id )
|
||||||
return it->second;
|
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 );
|
auto land = getLand( landId );
|
||||||
assert( land );
|
assert( land );
|
||||||
|
@ -332,7 +332,7 @@ Sapphire::Entity::EventObjectPtr Sapphire::HousingZone::registerEstateEntranceEO
|
||||||
return eObj;
|
return eObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sapphire::HousingZone::removeEstateEntranceEObj( uint8_t landId )
|
void Sapphire::HousingZone::removeEstateEntranceEObj( uint16_t landId )
|
||||||
{
|
{
|
||||||
auto land = getLand( landId );
|
auto land = getLand( landId );
|
||||||
assert( land );
|
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& server = Common::Service< World::WorldServer >::ref();
|
||||||
auto bounds = m_yardObjectArrayBounds[ landId ];
|
auto bounds = m_yardObjectArrayBounds[ landId ];
|
||||||
|
|
|
@ -39,7 +39,7 @@ namespace Sapphire
|
||||||
void onUpdate( uint64_t tickCount ) override;
|
void onUpdate( uint64_t tickCount ) override;
|
||||||
|
|
||||||
void sendLandSet( Entity::Player& player );
|
void sendLandSet( Entity::Player& player );
|
||||||
void sendLandUpdate( uint8_t landId );
|
void sendLandUpdate( uint16_t landId );
|
||||||
bool isPlayerSubInstance( Entity::Player& player );
|
bool isPlayerSubInstance( Entity::Player& player );
|
||||||
|
|
||||||
bool onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId );
|
bool onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId );
|
||||||
|
@ -48,19 +48,19 @@ namespace Sapphire
|
||||||
uint8_t getWardNum() const;
|
uint8_t getWardNum() const;
|
||||||
|
|
||||||
uint32_t getLandSetId() const;
|
uint32_t getLandSetId() const;
|
||||||
Sapphire::LandPtr getLand( uint8_t id );
|
Sapphire::LandPtr getLand( uint16_t id );
|
||||||
|
|
||||||
Entity::EventObjectPtr registerEstateEntranceEObj( uint8_t landId );
|
Entity::EventObjectPtr registerEstateEntranceEObj( uint16_t landId );
|
||||||
void removeEstateEntranceEObj( uint8_t landId );
|
void removeEstateEntranceEObj( uint16_t landId );
|
||||||
|
|
||||||
void updateYardObjects( Common::LandIdent ident );
|
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,
|
void updateYardObjectPos( Entity::Player& sourcePlayer, uint16_t slot, uint16_t landId,
|
||||||
Inventory::HousingItem& item );
|
Inventory::HousingItem& item );
|
||||||
void despawnYardObject( uint16_t landId, uint16_t slot );
|
void despawnYardObject( uint16_t landId, uint16_t slot );
|
||||||
|
|
||||||
private:
|
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 */
|
/*! @brief global storage for all yard items in the ward */
|
||||||
using YardObjectArray = std::array< Common::Furniture, 1200 >;
|
using YardObjectArray = std::array< Common::Furniture, 1200 >;
|
||||||
|
|
|
@ -688,7 +688,15 @@ void WorldServer::queueForPlayer( uint64_t characterId, Sapphire::Network::Packe
|
||||||
auto pZoneCon = pSession->getZoneConnection();
|
auto pZoneCon = pSession->getZoneConnection();
|
||||||
if( pZoneCon )
|
if( pZoneCon )
|
||||||
pZoneCon->queueOutPacket( pPacket );
|
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 )
|
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 )
|
void WorldServer::queueForLinkshell( uint64_t lsId, Sapphire::Network::Packets::FFXIVPacketBasePtr pPacket, std::set< uint64_t > exceptionCharIdList )
|
||||||
{
|
{
|
||||||
auto lsMgr = Common::Service< Manager::LinkshellMgr >::ref();
|
auto lsMgr = Common::Service< Manager::LinkshellMgr >::ref();
|
||||||
|
|
|
@ -52,7 +52,9 @@ namespace Sapphire::World
|
||||||
std::string getPlayerNameFromDb( uint64_t characterId, bool forceDbLoad = false );
|
std::string getPlayerNameFromDb( uint64_t characterId, bool forceDbLoad = false );
|
||||||
|
|
||||||
void queueForPlayer( uint64_t characterId, Sapphire::Network::Packets::FFXIVPacketBasePtr pPacket );
|
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 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 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 = {} );
|
void queueForFreeCompany( uint64_t fcId, Sapphire::Network::Packets::FFXIVPacketBasePtr pPacket, std::set< uint64_t > exceptionCharIdList = {} );
|
||||||
|
|
Loading…
Add table
Reference in a new issue