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

Merge branch 'SapphireServer:master' into master

This commit is contained in:
Pinapelz 2023-02-20 19:33:29 -08:00 committed by GitHub
commit 16961c757c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
40 changed files with 209 additions and 239 deletions

View file

@ -1379,7 +1379,7 @@ namespace Sapphire::Common
REJECT_INVITE = 0x05,
};
enum PlayerStateFlag : uint8_t
enum PlayerCondition : uint8_t
{
HideUILockChar = 1, // as the name suggests, hides the ui and logs the char...
InCombat = 2, // in Combat, locks gearchange/return/teleport
@ -1839,7 +1839,7 @@ namespace Sapphire::Common
Gatherer
};
using PlayerStateFlagList = std::vector< PlayerStateFlag >;
using PlayerStateFlagList = std::vector< PlayerCondition >;
struct BNPCInstanceObject
{

View file

@ -992,7 +992,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
* Structural representation of the packet sent by the server
* to set a players state
*/
struct FFXIVIpcPlayerStateFlags : FFXIVIpcBasePacket< Condition >
struct FFXIVIpcCondition : FFXIVIpcBasePacket< Condition >
{
uint8_t flags[12];
uint32_t padding;

View file

@ -32,8 +32,6 @@ public:
pPlayer->removeCurrency( Common::CurrencyType::Gil, teleportQuery.cost );
pPlayer->setZoningType( Common::ZoningType::Teleport );
warpMgr().requestPlayerTeleport( *pPlayer, teleportQuery.targetAetheryte, 1 );
pPlayer->clearTeleportQuery();

View file

@ -101,8 +101,8 @@ private:
void Scene00001Return( World::Quest& quest, Entity::Player& player, const Event::SceneResult& result )
{
playerMgr().onSetGc( player, OrderOfTwinAdder );
playerMgr().onSetGcRank( player, OrderOfTwinAdder, 1 );
playerMgr().setGrandCompany( player, OrderOfTwinAdder );
playerMgr().setGrandCompanyRank( player, OrderOfTwinAdder, 1 );
Scene00002( quest, player );
}

View file

@ -217,8 +217,7 @@ private:
if( result.getResult( 0 ) == 1 )
{
quest.setSeq( Seq2 );
player.changePosition( 10, 21, 13, -2 );
warpMgr().requestMoveTerritoryType( player, Common::WarpType::WARP_TYPE_NORMAL, Territorytype0 );
warpMgr().requestMoveTerritoryType( player, Common::WarpType::WARP_TYPE_NORMAL, Territorytype0, { 10, 21, 13 }, -2.f );
}
}
else

View file

@ -321,8 +321,8 @@ void Action::Action::start()
if( player )
{
player->setStateFlag( PlayerStateFlag::Casting );
Service< World::Manager::PlayerMgr >::ref().onSendStateFlags( *player, true );
player->setCondition( PlayerCondition::Casting );
Service< World::Manager::PlayerMgr >::ref().onConditionChanged( *player, true );
}
}
@ -376,7 +376,7 @@ void Action::Action::interrupt()
// reset state flag
//player->unsetStateFlag( PlayerStateFlag::Occupied1 );
pPlayer->setLastActionTick( 0 );
Service< World::Manager::PlayerMgr >::ref().onUnsetStateFlag( *pPlayer, PlayerStateFlag::Casting );
Service< World::Manager::PlayerMgr >::ref().removeCondition( *pPlayer, PlayerCondition::Casting );
}
if( hasCastTime() )
@ -423,7 +423,7 @@ void Action::Action::execute()
if( auto pPlayer = m_pSource->getAsPlayer(); pPlayer )
{
pPlayer->setLastActionTick( 0 );
Service< World::Manager::PlayerMgr >::ref().onUnsetStateFlag( *pPlayer, PlayerStateFlag::Casting );
Service< World::Manager::PlayerMgr >::ref().removeCondition( *pPlayer, PlayerCondition::Casting );
}
}

View file

@ -112,11 +112,6 @@ void EffectBuilder::buildAndSendPackets( const std::vector< Entity::CharaPtr >&
Logger::debug( "EffectBuilder result: " );
Logger::debug( "Targets afflicted: {}", targetList.size() );
auto& teriMgr = Common::Service< Sapphire::World::Manager::TerritoryMgr >::ref();
auto zone = teriMgr.getTerritoryByTypeId( m_sourceChara->getTerritoryTypeId() );
auto globalSequence = zone ? zone->getNextEffectResultId() : 0;
do // we want to send at least one packet even nothing is hit so other players can see
{
auto packet = buildNextEffectPacket( targetList );
@ -136,7 +131,8 @@ std::shared_ptr< FFXIVPacketBase > EffectBuilder::buildNextEffectPacket( const s
{
auto effectPacket = std::make_shared< EffectPacket >( m_sourceChara->getId(), m_actionId );
effectPacket->setRotation( Common::Util::floatToUInt16Rot( m_sourceChara->getRot() ) );
effectPacket->setSequence( resultId, m_sequence );
effectPacket->setRequestId( m_sequence );
effectPacket->setResultId( resultId );
effectPacket->setTargetActor( targetList[ 0 ]->getId() );
uint8_t targetIndex = 0;
@ -184,7 +180,8 @@ std::shared_ptr< FFXIVPacketBase > EffectBuilder::buildNextEffectPacket( const s
auto effectPacket = std::make_shared< EffectPacket1 >( m_sourceChara->getId(), targetList[ 0 ]->getId(), m_actionId );
effectPacket->setRotation( Common::Util::floatToUInt16Rot( m_sourceChara->getRot() ) );
effectPacket->setSequence( resultId, m_sequence );
effectPacket->setRequestId( m_sequence );
effectPacket->setResultId( resultId );
for( auto it = m_actorEffectsMap.begin(); it != m_actorEffectsMap.end(); )
{

View file

@ -61,8 +61,8 @@ void Action::EventAction::start()
server().queueForPlayers( m_pSource->getInRangePlayerIds( true ), control );
if( pPlayer->hasStateFlag( PlayerStateFlag::InNpcEvent ) )
Service< World::Manager::PlayerMgr >::ref().onUnsetStateFlag( *pPlayer, PlayerStateFlag::InNpcEvent );
if( pPlayer->hasCondition( PlayerCondition::InNpcEvent ) )
Service< World::Manager::PlayerMgr >::ref().removeCondition( *pPlayer, PlayerCondition::InNpcEvent );
}
else
server().queueForPlayers( m_pSource->getInRangePlayerIds(), control );

View file

@ -59,7 +59,7 @@ void MountAction::start()
data.Dir = m_pSource->getRot();
server().queueForPlayers( m_pSource->getInRangePlayerIds( true ), castPacket );
Common::Service< World::Manager::PlayerMgr >::ref().onSetStateFlag( *player, Common::PlayerStateFlag::Casting );
Common::Service< World::Manager::PlayerMgr >::ref().setCondition( *player, Common::PlayerCondition::Casting );
auto actionStartPkt = makeActorControlSelf( m_pSource->getId(), ActorControlType::ActionStart, 1, getId(), m_recastTimeMs / 10 );
server().queueForPlayer( m_pSource->getAsPlayer()->getCharacterId(), actionStartPkt );
@ -69,7 +69,7 @@ void MountAction::execute()
{
assert( m_pSource );
Common::Service< World::Manager::PlayerMgr >::ref().onUnsetStateFlag( *m_pSource->getAsPlayer(), Common::PlayerStateFlag::Casting );
Common::Service< World::Manager::PlayerMgr >::ref().removeCondition( *m_pSource->getAsPlayer(), Common::PlayerCondition::Casting );
m_effectBuilder->mount( m_pSource, m_mountId );
m_effectBuilder->buildAndSendPackets( { m_pSource } );
}

View file

@ -993,12 +993,10 @@ void Sapphire::Entity::BNpc::autoAttack( CharaPtr pTarget )
Common::CalcResultParam effectEntry{};
effectEntry.Value = static_cast< int16_t >( damage.first );
effectEntry.Type = ActionEffectType::CALC_RESULT_TYPE_DAMAGE_HP;
//effectEntry.Flag = 128;
effectEntry.Arg0 = 3;
effectEntry.Arg1 = 7;
//effectEntry.Arg2 = 0x71;
auto resultId = pZone->getNextEffectResultId();
effectPacket->setSequence( resultId );
effectPacket->setResultId( resultId );
effectPacket->addTargetEffect( effectEntry );
server().queueForPlayers( getInRangePlayerIds(), effectPacket );

View file

@ -3,8 +3,6 @@
#include <Util/UtilMath.h>
#include <Logging/Logger.h>
#include <Exd/ExdData.h>
#include <datReader/DatCategories/bg/LgbTypes.h>
#include <datReader/DatCategories/bg/lgb.h>
#include <cmath>
#include <utility>
@ -14,7 +12,6 @@
#include "Player.h"
#include "BNpc.h"
#include "Manager/HousingMgr.h"
#include "Manager/TerritoryMgr.h"
#include "Manager/RNGMgr.h"
#include "Manager/PlayerMgr.h"
@ -23,18 +20,15 @@
#include "Manager/FreeCompanyMgr.h"
#include "Manager/MapMgr.h"
#include "Manager/MgrUtil.h"
#include "Manager/ActionMgr.h"
#include "Territory/Territory.h"
#include "Territory/InstanceContent.h"
#include "Territory/InstanceObjectCache.h"
#include "Territory/Land.h"
#include "Network/GameConnection.h"
#include "Network/PacketContainer.h"
#include "Network/CommonActorControl.h"
#include "Network/PacketWrappers/ActorControlPacket.h"
#include "Network/PacketWrappers/ActorControlSelfPacket.h"
#include "Network/PacketWrappers/PlayerSetupPacket.h"
#include "Network/PacketWrappers/PlayerSpawnPacket.h"
#include "Network/PacketWrappers/EffectPacket1.h"
@ -76,7 +70,6 @@ Player::Player() :
m_lastActionTick( 0 ),
m_bInCombat( false ),
m_bLoadingComplete( false ),
m_zoningType( Common::ZoningType::None ),
m_bAutoattack( false ),
m_markedForRemoval( false ),
m_mount( 0 ),
@ -100,7 +93,7 @@ Player::Player() :
memset( m_name, 0, sizeof( m_name ) );
memset( m_searchMessage, 0, sizeof( m_searchMessage ) );
std::fill( std::begin( m_questTracking ), std::end( m_questTracking ), 0 );
std::fill( std::begin( m_stateFlags ), std::end( m_stateFlags ), 0 );
std::fill( std::begin( m_condition ), std::end( m_condition ), 0 );
std::fill( std::begin( m_classArray ), std::end( m_classArray ), 0 );
std::fill( std::begin( m_expArray ), std::end( m_expArray ), 0 );
@ -404,23 +397,17 @@ bool Player::isAutoattackOn() const
void Player::sendStats()
{
Service< World::Manager::PlayerMgr >::ref().onSendStats( *this );
Service< World::Manager::PlayerMgr >::ref().onStatsChanged( *this );
}
bool Player::exitInstance()
{
auto& teriMgr = Common::Service< TerritoryMgr >::ref();
auto& warpMgr = Common::Service< WarpMgr >::ref();
resetHp();
resetMp();
m_pos = m_prevPos;
m_rot = m_prevRot;
m_territoryTypeId = m_prevTerritoryTypeId;
m_territoryId = m_prevTerritoryId;
warpMgr.requestMoveTerritory( *this, WarpType::WARP_TYPE_CONTENT_END_RETURN, m_prevTerritoryId, m_prevPos, m_prevRot );
warpMgr.requestMoveTerritory( *this, WarpType::WARP_TYPE_CONTENT_END_RETURN, getPrevTerritoryId(), getPrevPos(), getPrevRot() );
return true;
}
@ -572,13 +559,6 @@ void Player::resetDiscovery()
memset( m_discovery.data(), 0, m_discovery.size() );
}
void Player::changePosition( float x, float y, float z, float o )
{
auto& warpMgr = Common::Service< WarpMgr >::ref();
Common::FFXIVARR_POSITION3 pos{ x, y, z };
warpMgr.requestWarp( *this, Common::WARP_TYPE_NORMAL, pos, getRot() );
}
void Player::setRewardFlag( Common::UnlockEntry unlockId )
{
uint16_t index;
@ -750,7 +730,7 @@ void Player::setClassJob( Common::ClassJob classJob )
m_tp = 0;
Service< World::Manager::PlayerMgr >::ref().onPlayerStatusUpdate( *this );
Service< World::Manager::PlayerMgr >::ref().onChangeClass( *this );
Service< World::Manager::PlayerMgr >::ref().onClassChanged( *this );
Service< World::Manager::MapMgr >::ref().updateQuests( *this );
}
@ -776,7 +756,7 @@ void Player::setLevelForClass( uint8_t level, Common::ClassJob classjob )
void Player::sendModel()
{
Service< World::Manager::PlayerMgr >::ref().onChangeGear( *this );
Service< World::Manager::PlayerMgr >::ref().onGearChanged( *this );
}
uint32_t Player::getModelForSlot( Common::GearModelSlot slot )
@ -881,12 +861,12 @@ void Player::setGcRankAt( uint8_t index, uint8_t rank )
m_gcRank[ index ] = rank;
}
const Player::StateFlags& Player::getStateFlags() const
const Player::Condition& Player::getConditions() const
{
return m_stateFlags;
return m_condition;
}
bool Player::hasStateFlag( Common::PlayerStateFlag flag ) const
bool Player::hasCondition( Common::PlayerCondition flag ) const
{
auto iFlag = static_cast< int32_t >( flag );
@ -894,10 +874,10 @@ bool Player::hasStateFlag( Common::PlayerStateFlag flag ) const
uint8_t value;
Util::valueToFlagByteIndexValue( iFlag, value, index );
return ( m_stateFlags[ index ] & value ) != 0;
return ( m_condition[ index ] & value ) != 0;
}
void Player::setStateFlag( Common::PlayerStateFlag flag )
void Player::setCondition( Common::PlayerCondition flag )
{
auto iFlag = static_cast< int32_t >( flag );
@ -905,12 +885,12 @@ void Player::setStateFlag( Common::PlayerStateFlag flag )
uint8_t value;
Util::valueToFlagByteIndexValue( iFlag, value, index );
m_stateFlags[ index ] |= value;
m_condition[ index ] |= value;
}
void Player::unsetStateFlag( Common::PlayerStateFlag flag )
void Player::removeCondition( Common::PlayerCondition flag )
{
if( !hasStateFlag( flag ) )
if( !hasCondition( flag ) )
return;
auto iFlag = static_cast< int32_t >( flag );
@ -919,7 +899,7 @@ void Player::unsetStateFlag( Common::PlayerStateFlag flag )
uint8_t value;
Util::valueToFlagByteIndexValue( iFlag, value, index );
m_stateFlags[ index ] ^= value;
m_condition[ index ] ^= value;
}
void Player::update( uint64_t tickCount )
@ -1072,16 +1052,6 @@ void Player::setLoadingComplete( bool bComplete )
m_bLoadingComplete = bComplete;
}
ZoningType Player::getZoningType() const
{
return m_zoningType;
}
void Player::setZoningType( Common::ZoningType zoneingType )
{
m_zoningType = zoneingType;
}
void Player::setSearchInfo( uint8_t selectRegion, uint8_t selectClass, const char* searchMessage )
{
m_searchSelectRegion = selectRegion;
@ -1296,17 +1266,19 @@ uint32_t Player::getPersistentEmote() const
void Player::autoAttack( CharaPtr pTarget )
{
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
auto& actionMgr = Common::Service< World::Manager::ActionMgr >::ref();
auto& exdData = Common::Service< Data::ExdData >::ref();
auto pZone = teriMgr.getTerritoryByGuId( getTerritoryId() );
auto mainWeap = getItemAt( Common::GearSet0, Common::GearSetSlot::MainHand );
pTarget->onActionHostile( getAsChara() );
//uint64_t tick = Util::getTimeMs();
//srand(static_cast< uint32_t >(tick));
auto& RNGMgr = Common::Service< World::Manager::RNGMgr >::ref();
auto variation = static_cast< uint32_t >( RNGMgr.getRandGenerator< float >( 0, 3 ).next() );
//actionMgr.handleTargetedPlayerAction( *this, 7, exdData.getRow< Excel::Action >( 7 ), pTarget->getId(), 0 );
auto damage = Math::CalcStats::calcAutoAttackDamage( *this );
auto effectPacket = std::make_shared< EffectPacket1 >( getId(), pTarget->getId(), 7 );
@ -1436,7 +1408,6 @@ void Player::teleportQuery( uint16_t aetheryteId )
cost = std::min< uint16_t >( 999, cost );
bool insufficientGil = getCurrency( Common::CurrencyType::Gil ) < cost;
// TODO: figure out what param1 really does
server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), OnExecuteTelepo, insufficientGil ? 2 : 0, aetheryteId ) );
if( !insufficientGil )
@ -1494,7 +1465,7 @@ void Player::dyeItemFromDyeingInfo()
uint32_t dyeBagContainer = m_dyeingInfo.dyeBagContainer;
uint32_t dyeBagSlot = m_dyeingInfo.dyeBagSlot;
Service< World::Manager::PlayerMgr >::ref().onSendStateFlags( *this, true ); // Retail sends all 0s to unlock player after a dye? Possibly not setting a flag when the action is started in the backend..?
Service< World::Manager::PlayerMgr >::ref().onConditionChanged( *this, true ); // Retail sends all 0s to unlock player after a dye? Possibly not setting a flag when the action is started in the backend..?
auto itemToDye = getItemAt( itemToDyeContainer, itemToDyeSlot );
auto dyeToUse = getItemAt( dyeBagContainer, dyeBagSlot );
@ -1536,7 +1507,7 @@ void Player::glamourItemFromGlamouringInfo()
uint32_t glamourBagSlot = m_glamouringInfo.glamourBagSlot;
bool shouldGlamour = m_glamouringInfo.shouldGlamour;
playerMgr.onSendStateFlags( *this, true );
playerMgr.onConditionChanged( *this, true );
auto itemToGlamour = getItemAt( itemToGlamourContainer, itemToGlamourSlot );
auto glamourToUse = getItemAt( glamourBagContainer, glamourBagSlot );
@ -1840,7 +1811,7 @@ void Player::setPartyId( uint64_t partyId )
m_partyId = partyId;
}
Player::FriendListIDVec& Player::getFriendListID()
Player::FriendListIDVec& Player::getFriendListId()
{
return m_friendList;
}
@ -1850,7 +1821,7 @@ Player::FriendListDataVec& Player::getFriendListData()
return m_friendInviteList;
}
Player::FriendListIDVec& Player::getBlacklistID()
Player::FriendListIDVec& Player::getBlacklistId()
{
return m_blacklist;
}
@ -1933,17 +1904,6 @@ float Player::getPrevRot() const
return m_prevRot;
}
std::optional< Sapphire::World::Quest > Player::getQuest( uint32_t questId )
{
if( !hasQuest( questId ) )
return std::nullopt;
auto idx = getQuestIndex( questId );
auto quest = getQuestByIndex( idx );
return { quest };
}
bool Player::isConnected() const
{
return m_bIsConnected;

View file

@ -34,7 +34,7 @@ namespace Sapphire::Entity
using AetheryteList = std::array< uint8_t, Common::ARRSIZE_AETHERYTES >;
using UnlockList = std::array< uint8_t, Common::ARRSIZE_UNLOCKS >;
using OrchestrionList = std::array< uint8_t, Common::ARRSIZE_ORCHESTRION >;
using StateFlags = std::array< uint8_t, 12 >;
using Condition = std::array< uint8_t, 12 >;
using ClassList = std::array< uint16_t, Common::ARRSIZE_CLASSJOB >;
using ExpList = std::array< uint32_t, Common::ARRSIZE_CLASSJOB >;
@ -310,9 +310,6 @@ namespace Sapphire::Entity
void updatePrevTerritory();
/*! change position, sends update too */
void changePosition( float x, float y, float z, float o );
/*! return the characterId */
uint64_t getCharacterId() const;
@ -529,19 +526,19 @@ namespace Sapphire::Entity
// Player State Handling
//////////////////////////////////////////////////////////////////////////////////////////////////////
/* return a const pointer to the state flag array */
const StateFlags& getStateFlags() const;
const Condition& getConditions() const;
/* set a specified state flag */
void setStateFlag( Common::PlayerStateFlag flag );
void setCondition( Common::PlayerCondition flag );
/* set a specified state flag */
void setStateFlags( std::vector< Common::PlayerStateFlag > flags );
void setConditions( std::vector< Common::PlayerCondition > flags );
/* check if a specified flag is set */
bool hasStateFlag( Common::PlayerStateFlag flag ) const;
bool hasCondition( Common::PlayerCondition flag ) const;
/* reset a specified flag */
void unsetStateFlag( Common::PlayerStateFlag flag );
void removeCondition( Common::PlayerCondition flag );
/*! return the userlevel */
uint8_t getUserLevel() const;
@ -598,10 +595,6 @@ namespace Sapphire::Entity
/*! set the loading complete bool */
void setLoadingComplete( bool bComplete );
Common::ZoningType getZoningType() const;
void setZoningType( Common::ZoningType zoneingType );
void setSearchInfo( uint8_t selectRegion, uint8_t selectClass, const char* searchMessage );
const char* getSearchMessage() const;
@ -812,10 +805,10 @@ namespace Sapphire::Entity
uint64_t getPartyId() const;
void setPartyId( uint64_t partyId );
FriendListIDVec& getFriendListID();
FriendListIDVec& getFriendListId();
FriendListDataVec& getFriendListData();
BlacklistIDVec& getBlacklistID();
BlacklistIDVec& getBlacklistId();
uint64_t m_lastMoveTime{};
uint8_t m_lastMoveflag{};
@ -908,7 +901,7 @@ namespace Sapphire::Entity
OrchestrionList m_orchestrion{};
ClassList m_classArray{};
ExpList m_expArray{};
StateFlags m_stateFlags{};
Condition m_condition{};
Common::ClassJob m_firstClass{};
@ -940,8 +933,6 @@ namespace Sapphire::Entity
bool m_bIsConnected;
Common::ZoningType m_zoningType;
bool m_bNewAdventurer{};
uint64_t m_onlineStatus;
uint64_t m_onlineStatusCustom;

View file

@ -117,6 +117,17 @@ bool Sapphire::Entity::Player::addQuest( const World::Quest& quest )
return true;
}
std::optional< Sapphire::World::Quest > Sapphire::Entity::Player::getQuest( uint32_t questId )
{
if( !hasQuest( questId ) )
return std::nullopt;
auto idx = getQuestIndex( questId );
auto quest = getQuestByIndex( idx );
return { quest };
}
int8_t Sapphire::Entity::Player::getFreeQuestSlot()
{
int8_t result = -1;

View file

@ -22,16 +22,14 @@ namespace Sapphire::World::Manager
bool cacheActionLut();
void handleItemManipulationAction( Entity::Player& player, uint32_t actionId,
Excel::ExcelStructPtr< Excel::Action > actionData, uint16_t sequence );
void handleItemManipulationAction( Entity::Player& player, uint32_t actionId, Excel::ExcelStructPtr< Excel::Action > actionData, uint16_t sequence );
void handleTargetedPlayerAction( Entity::Player& player, uint32_t actionId,
std::shared_ptr< Excel::ExcelStruct< Excel::Action > > actionData, uint64_t targetId, uint16_t sequence );
void handlePlacedPlayerAction( Entity::Player& player, uint32_t actionId,
std::shared_ptr< Excel::ExcelStruct< Excel::Action > > actionData, Common::FFXIVARR_POSITION3 pos, uint16_t sequence );
void handleItemAction( Entity::Player& player, uint32_t itemId,
std::shared_ptr< Excel::ExcelStruct< Excel::ItemAction > > itemActionData,
void handleItemAction( Entity::Player& player, uint32_t itemId, std::shared_ptr< Excel::ExcelStruct< Excel::ItemAction > > itemActionData,
uint16_t itemSourceSlot, uint16_t itemSourceContainer );
void handleEventItemAction( Entity::Player& player, uint32_t itemId,

View file

@ -59,7 +59,7 @@ bool BlacklistMgr::onAddCharacter( Entity::Player& source, const std::string& ta
}
// add target ID to blacklist
auto& sourceBL = source.getBlacklistID();
auto& sourceBL = source.getBlacklistId();
sourceBL[sourceIdx] = target.getCharacterId();
source.updateDbBlacklist();
@ -100,7 +100,7 @@ bool BlacklistMgr::onRemoveCharacter( Entity::Player& source, const std::string&
}
// set target slot to 0
auto& sourceBL = source.getBlacklistID();
auto& sourceBL = source.getBlacklistId();
sourceBL[sourceIdx] = 0;
source.updateDbBlacklist();
@ -124,7 +124,7 @@ bool BlacklistMgr::onGetBlacklistPage( Entity::Player& source, uint8_t key, uint
// get array offset/last page sent from client packet
auto offset = nextIdx;
auto& idVec = source.getBlacklistID();
auto& idVec = source.getBlacklistId();
for( size_t i = offset; i < offset + itemsPerPage; ++i )
{
@ -172,7 +172,7 @@ bool BlacklistMgr::isBlacklisted( Entity::Player& source, const Entity::Player&
ptrdiff_t BlacklistMgr::getEntryIndex( Entity::Player& source, uint64_t characterId ) const
{
auto& sourceBL = source.getBlacklistID();
auto& sourceBL = source.getBlacklistId();
auto sourceBlIt = std::find( std::begin( sourceBL ), std::end( sourceBL ), characterId );
// not found

View file

@ -541,9 +541,7 @@ void DebugCommandMgr::add( char* data, Entity::Player& player, std::shared_ptr<
entry.Arg0 = static_cast< uint8_t >( Common::ActionHitSeverityType::NormalDamage );
effectPacket->addTargetEffect( entry, static_cast< uint64_t >( player.getId() ) );
auto sequence = pCurrentZone->getNextEffectResultId();
effectPacket->setSequence( sequence );
effectPacket->setResultId( pCurrentZone->getNextEffectResultId() );
server().queueForPlayer( player.getCharacterId(), effectPacket );
}

View file

@ -550,13 +550,13 @@ void EventMgr::eventFinish( Sapphire::Entity::Player& player, uint32_t eventId,
}
}
if( player.hasStateFlag( Common::PlayerStateFlag::WatchingCutscene ) )
Common::Service< World::Manager::PlayerMgr >::ref().onUnsetStateFlag( player, Common::PlayerStateFlag::WatchingCutscene );
if( player.hasCondition( Common::PlayerCondition::WatchingCutscene ) )
Common::Service< World::Manager::PlayerMgr >::ref().removeCondition( player, Common::PlayerCondition::WatchingCutscene );
player.removeEvent( pEvent->getId() );
if( freePlayer == 1 )
Common::Service< World::Manager::PlayerMgr >::ref().onUnsetStateFlag( player, Common::PlayerStateFlag::InNpcEvent );
Common::Service< World::Manager::PlayerMgr >::ref().removeCondition( player, Common::PlayerCondition::InNpcEvent );
}
void EventMgr::eventStart( Entity::Player& player, uint64_t actorId, uint32_t eventId, Event::EventHandler::EventType eventType, uint8_t eventParam1,
@ -567,7 +567,7 @@ void EventMgr::eventStart( Entity::Player& player, uint64_t actorId, uint32_t ev
newEvent->setEventFinishCallback( std::move( callback ) );
player.addEvent( newEvent );
Common::Service< World::Manager::PlayerMgr >::ref().onSetStateFlag( player, Common::PlayerStateFlag::InNpcEvent );
Common::Service< World::Manager::PlayerMgr >::ref().setCondition( player, Common::PlayerCondition::InNpcEvent );
server.queueForPlayer( player.getCharacterId(), std::make_shared< EventStartPacket >( player.getId(), actorId,
eventId, eventType, eventParam1, eventParam2 ) );
@ -838,7 +838,7 @@ Sapphire::Event::EventHandlerPtr EventMgr::bootstrapSceneEvent( Entity::Player&
}
if( flags & CONDITION_CUTSCENE )
Common::Service< World::Manager::PlayerMgr >::ref().onSetStateFlag( player, Common::PlayerStateFlag::WatchingCutscene );
Common::Service< World::Manager::PlayerMgr >::ref().setCondition( player, Common::PlayerCondition::WatchingCutscene );
return pEvent;
}

View file

@ -10,8 +10,8 @@ using namespace Sapphire::World::Manager;
bool FriendListMgr::onInviteCreate( Entity::Player& source, Entity::Player& target )
{
auto& sourceFL = source.getFriendListID();
auto& targetFL = target.getFriendListID();
auto& sourceFL = source.getFriendListId();
auto& targetFL = target.getFriendListId();
// check if player already has been invited or friends
if( isFriend( source, target ) )
@ -96,8 +96,8 @@ bool FriendListMgr::onInviteDecline( Entity::Player& source, Entity::Player& tar
return false;
}
auto& sourceFL = source.getFriendListID();
auto& targetFL = target.getFriendListID();
auto& sourceFL = source.getFriendListId();
auto& targetFL = target.getFriendListId();
auto& sourceFLData = source.getFriendListData();
auto& targetFLData = target.getFriendListData();
@ -149,7 +149,7 @@ bool FriendListMgr::isFriend( Entity::Player& source, Entity::Player& target ) c
ptrdiff_t FriendListMgr::getEntryIndex( Entity::Player& source, uint64_t characterId ) const
{
auto& sourceFL = source.getFriendListID();
auto& sourceFL = source.getFriendListId();
auto sourceInvIt = std::find( std::begin( sourceFL ), std::end( sourceFL ), characterId );
// not found

View file

@ -28,7 +28,7 @@
#include <Network/PacketWrappers/InitZonePacket.h>
#include <Network/PacketWrappers/ModelEquipPacket.h>
#include <Network/PacketWrappers/PlayerSetupPacket.h>
#include <Network/PacketWrappers/PlayerStateFlagsPacket.h>
#include <Network/PacketWrappers/ConditionPacket.h>
#include <Network/PacketWrappers/UpdateHpMpTpPacket.h>
#include <Network/PacketWrappers/ServerNoticePacket.h>
#include <Network/PacketWrappers/ChatPacket.h>
@ -74,17 +74,17 @@ void PlayerMgr::onEquipDisplayFlagsChanged( Entity::Player& player )
server().queueForPlayers( player.getInRangePlayerIds( true ), paramPacket );
}
void PlayerMgr::onSendStateFlags( Entity::Player& player, bool updateInRange )
void PlayerMgr::onConditionChanged( Entity::Player& player, bool updateInRange )
{
server().queueForPlayer( player.getCharacterId(), std::make_shared< PlayerStateFlagsPacket >( player ) );
server().queueForPlayer( player.getCharacterId(), std::make_shared< ConditionPacket >( player ) );
if( updateInRange )
server().queueForPlayers( player.getInRangePlayerIds( true ),
makeActorControl( player.getId(), SetStatusIcon, static_cast< uint8_t >( player.getOnlineStatus() ) ) );
}
void PlayerMgr::onSendAchievementList( Entity::Player& player )
void PlayerMgr::onAchievementListChanged( Entity::Player& player )
{
auto achvData = player.getAchievementData();
@ -95,7 +95,7 @@ void PlayerMgr::onSendAchievementList( Entity::Player& player )
server().queueForPlayer( player.getCharacterId(), achvPacket );
}
void PlayerMgr::onSendAchievementProgress( Entity::Player& player, uint32_t achievementId )
void PlayerMgr::onAchievementProgressChanged( Entity::Player& player, uint32_t achievementId )
{
auto& achvMgr = Common::Service< Manager::AchievementMgr >::ref();
@ -108,15 +108,15 @@ void PlayerMgr::onSendAchievementProgress( Entity::Player& player, uint32_t achi
void PlayerMgr::onUnlockAchievement( Entity::Player& player, uint32_t achievementId )
{
onSendAchievementList( player );
onAchievementListChanged( player );
server().queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), AchievementComplete, achievementId ) );
server().queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), AchievementObtainMsg, achievementId ) );
}
void PlayerMgr::onSendStats( Entity::Player& player )
void PlayerMgr::onStatsChanged( Entity::Player& player )
{
std::array< uint32_t, 50 > statParams;
std::array< uint32_t, 50 > statParams{};
std::fill( std::begin( statParams ), std::end( statParams ), 0 );
auto& exd = Common::Service< Data::ExdData >::ref();
@ -202,9 +202,11 @@ void PlayerMgr::onGainExp( Entity::Player& player, uint32_t exp )
{
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 )
@ -214,12 +216,12 @@ void PlayerMgr::onUnlockOrchestrion( Entity::Player& player, uint8_t songId, uin
server().queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), ToggleOrchestrionUnlock, songId, 1, itemId ) );
}
void PlayerMgr::onChangeGear( Entity::Player& player )
void PlayerMgr::onGearChanged( Entity::Player& player )
{
server().queueForPlayers( player.getInRangePlayerIds( true ), std::make_shared< ModelEquipPacket >( player ) );
}
void PlayerMgr::onGcUpdate( Entity::Player& player )
void PlayerMgr::onGrandCompanyChanged( Entity::Player& player )
{
auto gcAffPacket = makeZonePacket< FFXIVIpcGrandCompany >( player.getId() );
gcAffPacket->data().ActiveCompanyId = player.getGc();
@ -230,18 +232,18 @@ void PlayerMgr::onGcUpdate( Entity::Player& player )
server().queueForPlayer( player.getCharacterId(), gcAffPacket );
}
void PlayerMgr::onSetGc( Entity::Player& player, uint8_t gc )
void PlayerMgr::setGrandCompany( Entity::Player& player, uint8_t gc )
{
player.setGc( gc );
onGcUpdate( player );
onGrandCompanyChanged( player );
}
void PlayerMgr::onSetGcRank( Entity::Player& player, uint8_t gc, uint8_t rank )
void PlayerMgr::setGrandCompanyRank( Entity::Player& player, uint8_t gc, uint8_t rank )
{
player.setGcRankAt( gc, rank );
onGcUpdate( player );
onGrandCompanyChanged( player );
}
void PlayerMgr::onCompanionUpdate( Entity::Player& player, uint8_t companionId )
@ -329,7 +331,7 @@ void PlayerMgr::onHateListChanged( Entity::Player& player )
server().queueForPlayer( player.getCharacterId(), { hateListPacket, hateRankPacket } );
}
void PlayerMgr::onChangeClass( Entity::Player& player )
void PlayerMgr::onClassChanged( Entity::Player& player )
{
server().queueForPlayers( player.getInRangePlayerIds( true ), makeActorControl( player.getId(), ClassJobChange, 0x04 ) );
onPlayerHpMpTpChanged( player );
@ -364,7 +366,7 @@ void PlayerMgr::onDeath( Entity::Player& player )
scriptMgr.onPlayerDeath( player );
}
void PlayerMgr::onZone( Sapphire::Entity::Player& player )
void PlayerMgr::onMoveZone( Sapphire::Entity::Player& player )
{
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
auto& housingMgr = Common::Service< HousingMgr >::ref();
@ -452,7 +454,7 @@ void PlayerMgr::onZone( Sapphire::Entity::Player& player )
auto &questMgr = Common::Service< World::Manager::QuestMgr >::ref();
questMgr.sendQuestsInfo( player );
onGcUpdate( player );
onGrandCompanyChanged( player );
}
if( player.getPartyId() != 0 )
@ -506,24 +508,24 @@ void PlayerMgr::onUpdate( Entity::Player& player, uint64_t tickCount )
}
}
void PlayerMgr::onSetStateFlag( Sapphire::Entity::Player& player, Common::PlayerStateFlag flag )
void PlayerMgr::setCondition( Sapphire::Entity::Player& player, Common::PlayerCondition flag )
{
auto prevOnlineStatus = player.getOnlineStatus();
player.setStateFlag( flag );
player.setCondition( flag );
auto newOnlineStatus = player.getOnlineStatus();
onSendStateFlags( player, prevOnlineStatus != newOnlineStatus );
onConditionChanged( player, prevOnlineStatus != newOnlineStatus );
}
void PlayerMgr::onUnsetStateFlag( Sapphire::Entity::Player& player, Common::PlayerStateFlag flag )
void PlayerMgr::removeCondition( Sapphire::Entity::Player& player, Common::PlayerCondition flag )
{
auto prevOnlineStatus = player.getOnlineStatus();
player.unsetStateFlag( flag );
player.removeCondition( flag );
auto newOnlineStatus = player.getOnlineStatus();
onSendStateFlags( player, prevOnlineStatus != newOnlineStatus );
onConditionChanged( player, prevOnlineStatus != newOnlineStatus );
}
////////// Helper ///////////

View file

@ -15,18 +15,8 @@ class PlayerMgr
void onEquipDisplayFlagsChanged( Sapphire::Entity::Player& player );
void onSendStateFlags( Sapphire::Entity::Player& player, bool updateInRange );
void onSendStats( Sapphire::Entity::Player& player );
void onPlayerStatusUpdate( Sapphire::Entity::Player& player );
void onChangeClass( Sapphire::Entity::Player& player );
void onSendAchievementList( Sapphire::Entity::Player& player );
void onSendAchievementProgress( Sapphire::Entity::Player& player, uint32_t achievementId );
void onUnlockAchievement( Sapphire::Entity::Player& player, uint32_t achievementId );
void onPlayerHpMpTpChanged( Sapphire::Entity::Player& player );
@ -41,14 +31,6 @@ class PlayerMgr
void onUnlockOrchestrion( Sapphire::Entity::Player& player, uint8_t songId, uint32_t itemId );
void onChangeGear( Sapphire::Entity::Player& player );
void onGcUpdate( Sapphire::Entity::Player& player );
void onSetGc( Sapphire::Entity::Player& player, uint8_t gc );
void onSetGcRank( Sapphire::Entity::Player& player, uint8_t gc, uint8_t rank );
void onCompanionUpdate( Entity::Player& player, uint8_t companionId );
void onMountUpdate( Sapphire::Entity::Player& player, uint32_t mountId );
@ -59,16 +41,23 @@ class PlayerMgr
void onLogin( Sapphire::Entity::Player& player );
void onLogout( Sapphire::Entity::Player& player );
void onDeath( Sapphire::Entity::Player& player );
void onZone( Sapphire::Entity::Player& player );
void onMoveZone( Sapphire::Entity::Player& player );
void onUpdate( Sapphire::Entity::Player& player, uint64_t tickCount );
void onSetStateFlag( Sapphire::Entity::Player& player, Common::PlayerStateFlag flag );
void onConditionChanged( Sapphire::Entity::Player& player, bool updateInRange );
void onStatsChanged( Sapphire::Entity::Player& player );
void onAchievementListChanged( Sapphire::Entity::Player& player );
void onAchievementProgressChanged( Sapphire::Entity::Player& player, uint32_t achievementId );
void onGearChanged( Sapphire::Entity::Player& player );
void onGrandCompanyChanged( Sapphire::Entity::Player& player );
void onClassChanged( Sapphire::Entity::Player& player );
void onUnsetStateFlag( Sapphire::Entity::Player& player, Common::PlayerStateFlag flag );
void setCondition( Sapphire::Entity::Player& player, Common::PlayerCondition flag );
void removeCondition( Sapphire::Entity::Player& player, Common::PlayerCondition flag );
void setGrandCompany( Sapphire::Entity::Player& player, uint8_t gc );
void setGrandCompanyRank( Sapphire::Entity::Player& player, uint8_t gc, uint8_t rank );
//////////// Helpers

View file

@ -592,7 +592,7 @@ bool TerritoryMgr::movePlayer( Sapphire::Territory& teri, Entity::Player& player
auto pPrevZone = getTerritoryByGuId( player.getTerritoryId() );
player.setStateFlag( Common::PlayerStateFlag::BetweenAreas );
player.setCondition( Common::PlayerCondition::BetweenAreas );
player.initSpawnIdQueue();
@ -613,7 +613,7 @@ bool TerritoryMgr::movePlayer( Sapphire::Territory& teri, Entity::Player& player
m_playerIdToInstanceMap[ player.getId() ] = teri.getGuId();
teri.onBeforePlayerZoneIn( player );
playerMgr.onZone( player );
playerMgr.onMoveZone( player );
return true;
}

View file

@ -71,6 +71,21 @@ void WarpMgr::requestMoveTerritoryType( Entity::Player& player, Common::WarpType
requestMoveTerritory( player, warpType, pTeri->getGuId() );
}
void WarpMgr::requestMoveTerritoryType( Entity::Player& player, Common::WarpType warpType, uint32_t targetTerritoryTypeId,
Common::FFXIVARR_POSITION3 targetPos, float targetRot )
{
auto& teriMgr = Common::Service< TerritoryMgr >::ref();
auto pTeri = teriMgr.getTerritoryByTypeId( targetTerritoryTypeId );
if( !pTeri )
{
Logger::error( "Unable to find target territory instance for type {}", targetTerritoryTypeId );
return;
}
requestMoveTerritory( player, warpType, pTeri->getGuId(), player.getPos(), player.getRot() );
}
void WarpMgr::requestWarp( Entity::Player& player, Common::WarpType warpType, Common::FFXIVARR_POSITION3 targetPos, float targetRot )
{
m_entityIdToWarpInfoMap[ player.getId() ] = { 0, warpType, targetPos, targetRot };
@ -114,7 +129,6 @@ void WarpMgr::finishWarp( Entity::Player& player )
auto zoneInPacket = makeActorControlSelf( player.getId(), Appear, warpFinishAnim, raiseAnim, 0, 0 );
auto setStatusPacket = makeActorControl( player.getId(), SetStatus, static_cast< uint8_t >( Common::ActorStatus::Idle ) );
player.setZoningType( Common::ZoningType::None );
if( !player.getGmInvis() )
server().queueForPlayers( player.getInRangePlayerIds(), zoneInPacket );
@ -122,7 +136,7 @@ void WarpMgr::finishWarp( Entity::Player& player )
server().queueForPlayer( player.getCharacterId(), zoneInPacket );
server().queueForPlayers( player.getInRangePlayerIds( true ), setStatusPacket );
playerMgr.onUnsetStateFlag( player, PlayerStateFlag::BetweenAreas );
playerMgr.removeCondition( player, PlayerCondition::BetweenAreas );
Common::Service< MapMgr >::ref().updateAll( player );
}
@ -173,17 +187,14 @@ void WarpMgr::requestPlayerTeleport( Entity::Player& player, uint16_t aetheryteI
if( teleportType == 1 || teleportType == 2 ) // teleport
{
warpType = WarpType::WARP_TYPE_TELEPO;
player.setZoningType( Common::ZoningType::Teleport );
}
else if( teleportType == 3 ) // return
{
warpType = WarpType::WARP_TYPE_EXIT_RANGE;
player.setZoningType( Common::ZoningType::Return );
}
else if( teleportType == 4 ) // return dead
{
warpType = WarpType::WARP_TYPE_EXIT_RANGE;
player.setZoningType( Common::ZoningType::ReturnDead );
}
if( sameTerritory )

View file

@ -32,6 +32,17 @@ namespace Sapphire::World::Manager
/// <param name="targetRot"></param>
void requestMoveTerritory( Entity::Player& player, Common::WarpType warpType, uint32_t targetTerritoryId, Common::FFXIVARR_POSITION3 targetPos, float targetRot );
/// <summary>
/// request to move a player to specified territory type and position, with given WarpType
/// </summary>
/// <param name="player"></param>
/// <param name="warpType"></param>
/// <param name="targetTerritoryTypeId"></param>
/// <param name="targetPos"></param>
/// <param name="targetRot"></param>
void requestMoveTerritoryType( Entity::Player& player, Common::WarpType warpType, uint32_t targetTerritoryId, Common::FFXIVARR_POSITION3 targetPos, float targetRot );
/// <summary>
/// request to move a player to specified territory guid with given WarpType, position will be the same as before

View file

@ -12,7 +12,7 @@
#include "Network/GameConnection.h"
#include "Network/PacketWrappers/ServerNoticePacket.h"
#include "Network/PacketWrappers/PlayerStateFlagsPacket.h"
#include "Network/PacketWrappers/ConditionPacket.h"
#include "ContentFinder/ContentFinder.h"

View file

@ -195,7 +195,7 @@ void Sapphire::Network::GameConnection::getCommonlistHandler( const Packets::FFX
}
else if( data.ListType == 0x0b )
{ // friend list
auto& friendList = player.getFriendListID();
auto& friendList = player.getFriendListId();
auto& friendListData = player.getFriendListData();
std::vector< Common::HierarchyData > hierarchyData( friendListData.begin(), friendListData.end() );

View file

@ -6,7 +6,7 @@
#include <Network/PacketDef/Zone/ClientZoneDef.h>
#include "Network/GameConnection.h"
#include "Network/PacketWrappers/PlayerStateFlagsPacket.h"
#include "Network/PacketWrappers/ConditionPacket.h"
#include "Script/ScriptMgr.h"

View file

@ -89,6 +89,7 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR
auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
auto& exdData = Common::Service< Data::ExdData >::ref();
auto& warpMgr = Common::Service< World::Manager::WarpMgr >::ref();
const auto packet = ZoneChannelPacket< FFXIVIpcGmCommand >( inPacket );
const auto commandId = packet.data().Id;
@ -201,11 +202,11 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR
{
auto& warpMgr = Common::Service< WarpMgr >::ref();
warpMgr.requestMoveTerritory( *targetPlayer, WarpType::WARP_TYPE_GM,
player.getTerritoryId(), { player.getPos().x, player.getPos().y, player.getPos().z },
player.getRot() );
player.getTerritoryId(), player.getPos(), player.getRot() );
}
else
targetPlayer->changePosition( player.getPos().x, player.getPos().y, player.getPos().z, player.getRot() );
warpMgr.requestMoveTerritory( *targetPlayer, Common::WarpType::WARP_TYPE_NORMAL, player.getTerritoryId(),
player.getPos(), player.getRot() );
PlayerMgr::sendServerNotice( player, "Calling {0}", targetPlayer->getName() );
break;
}
@ -421,7 +422,7 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR
return;
}
Service< World::Manager::PlayerMgr >::ref().onSetGc( player, static_cast< uint8_t >( param1 ) );
Service< World::Manager::PlayerMgr >::ref().setGrandCompany( player, static_cast< uint8_t >( param1 ) );
// if we're changing them to a GC, check if they have a rank and if not, set it to the lowest rank
if( param1 > 0 )
@ -446,7 +447,7 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR
return;
}
Service< World::Manager::PlayerMgr >::ref().onSetGcRank( player, static_cast< uint8_t >( gcId ), static_cast< uint8_t >( param1 ) );
Service< World::Manager::PlayerMgr >::ref().setGrandCompanyRank( player, static_cast< uint8_t >( gcId ), static_cast< uint8_t >( param1 ) );
PlayerMgr::sendServerNotice( player, "GC Rank for {0} for GC {1} was set to {2}", targetPlayer->getName(), targetPlayer->getGc(),
targetPlayer->getGcRankArray()[ targetPlayer->getGc() - 1 ] );
break;
@ -578,12 +579,9 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR
}
case GmCommand::Jump:
{
// todo - what was the intention here?
auto inRange = player.getInRangeActors();
player.changePosition( targetActor->getPos().x, targetActor->getPos().y, targetActor->getPos().z,
targetActor->getRot() );
warpMgr.requestWarp( player, WarpType::WARP_TYPE_GM, targetActor->getPos(), targetActor->getRot() );
PlayerMgr::sendServerNotice( player, "Jumping to {0} in range.", targetPlayer->getName() );
break;
}

View file

@ -613,12 +613,12 @@ void Sapphire::Network::GameConnection::commandHandler( const Packets::FFXIVARR_
}
case PacketCommand::ACHIEVEMENT_REQUEST_RATE:
{
Service< World::Manager::PlayerMgr >::ref().onSendAchievementProgress( player, param11 );
Service< World::Manager::PlayerMgr >::ref().onAchievementProgressChanged( player, param11 );
break;
}
case PacketCommand::ACHIEVEMENT_REQUEST:
{
Service< World::Manager::PlayerMgr >::ref().onSendAchievementList( player );
Service< World::Manager::PlayerMgr >::ref().onAchievementListChanged( player );
break;
}
case PacketCommand::TELEPO_INQUIRY: // Teleport

View file

@ -39,7 +39,7 @@
#include "Network/PacketWrappers/ActorControlTargetPacket.h"
#include "Network/PacketWrappers/EventStartPacket.h"
#include "Network/PacketWrappers/EventFinishPacket.h"
#include "Network/PacketWrappers/PlayerStateFlagsPacket.h"
#include "Network/PacketWrappers/ConditionPacket.h"
#include "Network/PacketWrappers/UpdateInventorySlotPacket.h"
#include "Manager/DebugCommandMgr.h"
@ -182,7 +182,7 @@ void Sapphire::Network::GameConnection::joinChatChannelHandler( const Packets::F
void Sapphire::Network::GameConnection::moveHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
{
if( player.hasStateFlag( Common::BetweenAreas ) )
if( player.hasCondition( Common::BetweenAreas ) )
return;
const auto updatePositionPacket = ZoneChannelPacket< Client::FFXIVIpcUpdatePosition >( inPacket );
auto& data = updatePositionPacket.data();
@ -523,7 +523,7 @@ void Sapphire::Network::GameConnection::tellHandler( const Packets::FFXIVARR_PAC
auto pTargetPlayer = pSession->getPlayer();
if( pTargetPlayer->hasStateFlag( PlayerStateFlag::BetweenAreas ) )
if( pTargetPlayer->hasCondition( PlayerCondition::BetweenAreas ) )
{
// send error for player between areas
// TODO: implement me
@ -538,7 +538,7 @@ void Sapphire::Network::GameConnection::tellHandler( const Packets::FFXIVARR_PAC
return;
}
if( pTargetPlayer->hasStateFlag( PlayerStateFlag::BoundByDuty ) && !player.isActingAsGm() )
if( pTargetPlayer->hasCondition( PlayerCondition::BoundByDuty ) && !player.isActingAsGm() )
{
auto boundPacket = makeChatPacket< Packets::Server::FFXIVRecvFinderStatus >( player.getId() );
strcpy( boundPacket->data().toName, data.toName );

View file

@ -11,17 +11,17 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
/**
* @brief Packet sent to set a players state, this impacts which actions he can perform.
*/
class PlayerStateFlagsPacket : public ZoneChannelPacket< FFXIVIpcPlayerStateFlags >
class ConditionPacket : public ZoneChannelPacket< FFXIVIpcCondition >
{
public:
PlayerStateFlagsPacket( Entity::Player& player ) :
ZoneChannelPacket< FFXIVIpcPlayerStateFlags >( player.getId(), player.getId() )
ConditionPacket( Entity::Player& player ) :
ZoneChannelPacket< FFXIVIpcCondition >( player.getId(), player.getId() )
{
initialize( player.getStateFlags().data() );
initialize( player.getConditions().data() );
}
PlayerStateFlagsPacket( Entity::Player& player, std::vector< Common::PlayerStateFlag > flags ) :
ZoneChannelPacket< FFXIVIpcPlayerStateFlags >( player.getId(), player.getId() )
ConditionPacket( Entity::Player& player, std::vector< Common::PlayerCondition > flags ) :
ZoneChannelPacket< FFXIVIpcCondition >( player.getId(), player.getId() )
{
uint8_t newFlags[ 12 ];
memset( newFlags, 0, 12 );

View file

@ -85,10 +85,14 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
FFXIVPacketBase::setTargetActor( targetId );
}
void setSequence( uint32_t sequence, uint16_t sourceSequence = 0 )
void setRequestId( uint16_t requestId )
{
m_data.RequestId = static_cast< uint32_t >( sourceSequence );
m_data.ResultId = static_cast< uint32_t>( sequence );
m_data.RequestId = static_cast< uint32_t >( requestId );
}
void setResultId( uint32_t resultId )
{
m_data.ResultId = static_cast< uint32_t >( resultId );
}
private:
uint8_t m_targetEffectCount{ 0 };

View file

@ -68,10 +68,9 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
FFXIVPacketBase::setTargetActor( targetId );
}
void setSequence( uint32_t sequence, uint16_t sourceSequence = 0 )
void setRequestId( uint16_t requestId )
{
m_data.RequestId = static_cast< uint32_t >( sourceSequence );
m_data.ResultId = static_cast< uint32_t>( sequence );
m_data.RequestId = static_cast< uint32_t >( requestId );
}
void setResultId( uint32_t resultId )

View file

@ -110,7 +110,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
m_data.ActiveType = player.getStance();
m_data.Flag = 0;
if( player.getZoningType() != Common::ZoningType::None || player.getGmInvis() )
if( player.getGmInvis() )
{
m_data.Flag |= static_cast< uint16_t >( Common::DisplayFlags::Invisible );
}

View file

@ -47,7 +47,7 @@ void MoveTerritoryTask::execute()
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().setCondition( *pPlayer, Common::PlayerCondition::BetweenAreas );
auto moveTerritoryPacket = makeZonePacket< WorldPackets::Server::FFXIVIpcMoveTerritory >( pPlayer->getId() );
moveTerritoryPacket->data().index = -1;

View file

@ -156,8 +156,7 @@ bool Sapphire::HousingZone::isPlayerSubInstance( Entity::Player& player )
void Sapphire::HousingZone::onPlayerZoneIn( Entity::Player& player )
{
auto& server = Common::Service< World::WorldServer >::ref();
Logger::debug( "HousingZone::onPlayerZoneIn: Territory#{0}|{1}, Entity#{2}",
getGuId(), getTerritoryTypeId(), player.getId() );
Logger::debug( "HousingZone::onPlayerZoneIn: Territory#{0}|{1}, Entity#{2}", getGuId(), getTerritoryTypeId(), player.getId() );
auto isInSubdivision = isPlayerSubInstance( player );
@ -185,8 +184,8 @@ void Sapphire::HousingZone::sendLandSet( Entity::Player& player )
auto landsetInitializePacket = makeZonePacket< FFXIVIpcHouseList >( player.getId() );
landsetInitializePacket->data().LandSetId.wardNum = m_wardNum;
landsetInitializePacket->data().LandSetId.landId = m_landSetId;
landsetInitializePacket->data().LandSetId.territoryTypeId = m_territoryTypeId;
landsetInitializePacket->data().LandSetId.landId = static_cast< uint16_t >( m_landSetId );
landsetInitializePacket->data().LandSetId.territoryTypeId = static_cast< uint16_t >( m_territoryTypeId );
landsetInitializePacket->data().LandSetId.worldId = server.getWorldId();
auto isInSubdivision = isPlayerSubInstance( player );
@ -337,7 +336,7 @@ void Sapphire::HousingZone::removeEstateEntranceEObj( uint16_t landId )
auto land = getLand( landId );
assert( land );
for( auto entry : m_eventObjects )
for( const auto& entry : m_eventObjects )
{
auto eObj = entry.second;
if( eObj->getHousingLink() == static_cast< uint32_t >( landId ) << 8 )

View file

@ -99,7 +99,7 @@ void Sapphire::InstanceContent::onPlayerZoneIn( Entity::Player& player )
}
// mark player as "bound by duty"
Common::Service< World::Manager::PlayerMgr >::ref().onSetStateFlag( player, PlayerStateFlag::BoundByDuty );
Common::Service< World::Manager::PlayerMgr >::ref().setCondition( player, PlayerCondition::BoundByDuty );
sendDirectorInit( player );
}
@ -140,7 +140,7 @@ void Sapphire::InstanceContent::onUpdate( uint64_t tickCount )
auto player = it->second;
if( !player->isLoadingComplete() ||
!player->isDirectorInitialized() ||
player->hasStateFlag( PlayerStateFlag::WatchingCutscene ) )
player->hasCondition( PlayerCondition::WatchingCutscene ) )
return;
}
@ -614,7 +614,7 @@ void Sapphire::InstanceContent::clearDirector( Entity::Player& player )
player.setDirectorInitialized( false );
// remove "bound by duty" state
Service< World::Manager::PlayerMgr >::ref().onUnsetStateFlag( player, PlayerStateFlag::BoundByDuty );
Service< World::Manager::PlayerMgr >::ref().removeCondition( player, PlayerCondition::BoundByDuty );
}
uint32_t Sapphire::InstanceContent::getExpireValue()

View file

@ -80,7 +80,7 @@ void Sapphire::QuestBattle::onPlayerZoneIn( Entity::Player& player )
m_pPlayer = player.getAsPlayer();
// mark player as "bound by duty"
player.setStateFlag( PlayerStateFlag::BoundByDuty );
player.setCondition( PlayerCondition::BoundByDuty );
sendDirectorInit( player );
@ -118,7 +118,7 @@ void Sapphire::QuestBattle::onUpdate( uint64_t tickCount )
if( !m_pPlayer->isLoadingComplete() ||
!m_pPlayer->isDirectorInitialized() ||
!m_pPlayer->isOnEnterEventDone() ||
m_pPlayer->hasStateFlag( PlayerStateFlag::WatchingCutscene ) )
m_pPlayer->hasCondition( PlayerCondition::WatchingCutscene ) )
return;
if( m_instanceCommenceTime == 0 )
@ -301,7 +301,7 @@ void Sapphire::QuestBattle::clearDirector( Entity::Player& player )
player.setDirectorInitialized( false );
// remove "bound by duty" state
player.unsetStateFlag( PlayerStateFlag::BoundByDuty );
player.removeCondition( PlayerCondition::BoundByDuty );
}
void Sapphire::QuestBattle::success()

View file

@ -882,7 +882,6 @@ void Territory::addEffectResult( World::Action::EffectResultPtr result )
}
void Territory::processEffectResults( uint64_t tickCount )
{
// todo: move this to generic territory/instance delay wrapper cause it might be useful scheduling other things
for( auto it = m_effectResults.begin(); it != m_effectResults.end(); )

View file

@ -348,11 +348,17 @@ void WorldServer::mainLoop()
auto& taskMgr = Common::Service< World::Manager::TaskMgr >::ref();
while( isRunning() )
{
auto tickCount = Common::Util::getTimeMs();
if( tickCount - m_lastServerTick < 300 )
{
std::this_thread::sleep_for( std::chrono::milliseconds( 50 ) );
continue;
}
m_lastServerTick = tickCount;
auto currTime = Common::Util::getTimeSeconds();
auto tickCount = Common::Util::getTimeMs();
taskMgr.update( tickCount );
terriMgr.updateTerritoryInstances( tickCount );
@ -361,8 +367,6 @@ void WorldServer::mainLoop()
updateSessions( currTime );
DbKeepAlive( currTime );
}
}
@ -395,6 +399,9 @@ void WorldServer::updateSessions( uint32_t currTime )
// remove session of players marked for removal ( logoff / kick )
if( ( player.isMarkedForRemoval() && diff > 5 ) || diff > 20 )
{
player.removeOnlineStatus( Common::OnlineStatus::Online );
player.addOnlineStatus( Common::OnlineStatus::Offline );
Logger::info( "[{0}] Session removal", session->getId() );
session->close();
sessionRemovalQueue.push( session->getId() );

View file

@ -74,6 +74,7 @@ namespace Sapphire::World
uint16_t m_port;
std::string m_ip;
int64_t m_lastDBPingTime;
uint64_t m_lastServerTick{ 0 };
bool m_bRunning;
uint16_t m_worldId;