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

More cleanups.

This commit is contained in:
Mordred 2023-02-25 15:31:57 +01:00
parent 6ea6f8e190
commit e0ec74a6bc
16 changed files with 100 additions and 157 deletions

View file

@ -521,6 +521,7 @@ void Action::Action::buildEffects()
return; return;
} }
Service< World::Manager::PlayerMgr >::ref().onHudParamChanged( *m_pSource->getAsPlayer() );
if( !hasLutEntry || m_hitActors.empty() ) if( !hasLutEntry || m_hitActors.empty() )
{ {

View file

@ -627,7 +627,7 @@ void Sapphire::Entity::BNpc::onTick()
Chara::onTick(); Chara::onTick();
if( m_state == BNpcState::Retreat ) if( m_state == BNpcState::Retreat )
{ {
regainHp(); restHp();
} }
} }
@ -792,19 +792,19 @@ void Sapphire::Entity::BNpc::update( uint64_t tickCount )
Chara::update( tickCount ); Chara::update( tickCount );
} }
void Sapphire::Entity::BNpc::regainHp() void Sapphire::Entity::BNpc::restHp()
{ {
if( this->m_hp < this->getMaxHp() ) if( m_hp < getMaxHp() )
{ {
auto addHp = static_cast< uint32_t >( getMaxHp() * 0.1f + 1 ); auto addHp = static_cast< uint32_t >( getMaxHp() * 0.1f + 1 );
if( this->m_hp + addHp < this->getMaxHp() ) if( m_hp + addHp < getMaxHp() )
this->m_hp += addHp; m_hp += addHp;
else else
this->m_hp = this->getMaxHp(); m_hp = getMaxHp();
} }
this->sendStatusUpdate(); sendHudParam();
} }
void Sapphire::Entity::BNpc::onActionHostile( Sapphire::Entity::CharaPtr pSource ) void Sapphire::Entity::BNpc::onActionHostile( Sapphire::Entity::CharaPtr pSource )

View file

@ -127,7 +127,7 @@ namespace Sapphire::Entity
uint32_t getTimeOfDeath() const; uint32_t getTimeOfDeath() const;
void setTimeOfDeath( uint32_t timeOfDeath ); void setTimeOfDeath( uint32_t timeOfDeath );
void regainHp(); void restHp();
void checkAggro(); void checkAggro();

View file

@ -13,7 +13,7 @@
#include "Network/GameConnection.h" #include "Network/GameConnection.h"
#include "Network/PacketWrappers/ActorControlPacket.h" #include "Network/PacketWrappers/ActorControlPacket.h"
#include "Network/PacketWrappers/ActorControlTargetPacket.h" #include "Network/PacketWrappers/ActorControlTargetPacket.h"
#include "Network/PacketWrappers/UpdateHpMpTpPacket.h" #include "Network/PacketWrappers/RestingPacket.h"
#include "Network/PacketWrappers/EffectPacket1.h" #include "Network/PacketWrappers/EffectPacket1.h"
#include "Network/PacketWrappers/HudParamPacket.h" #include "Network/PacketWrappers/HudParamPacket.h"
@ -214,42 +214,36 @@ uint32_t Sapphire::Entity::Chara::getMaxMp() const
void Sapphire::Entity::Chara::resetHp() void Sapphire::Entity::Chara::resetHp()
{ {
m_hp = getMaxHp(); m_hp = getMaxHp();
sendStatusUpdate();
} }
/*! \return reset mp to current max mp */ /*! \return reset mp to current max mp */
void Sapphire::Entity::Chara::resetMp() void Sapphire::Entity::Chara::resetMp()
{ {
m_mp = getMaxMp(); m_mp = getMaxMp();
sendStatusUpdate();
} }
/*! \param hp amount to set ( caps to maxHp ) */ /*! \param hp amount to set ( caps to maxHp ) */
void Sapphire::Entity::Chara::setHp( uint32_t hp ) void Sapphire::Entity::Chara::setHp( uint32_t hp )
{ {
m_hp = hp < getMaxHp() ? hp : getMaxHp(); m_hp = hp < getMaxHp() ? hp : getMaxHp();
sendStatusUpdate();
} }
/*! \param mp amount to set ( caps to maxMp ) */ /*! \param mp amount to set ( caps to maxMp ) */
void Sapphire::Entity::Chara::setMp( uint32_t mp ) void Sapphire::Entity::Chara::setMp( uint32_t mp )
{ {
m_mp = mp < getMaxMp() ? mp : getMaxMp(); m_mp = mp < getMaxMp() ? mp : getMaxMp();
sendStatusUpdate();
} }
/*! \param gp amount to set*/ /*! \param gp amount to set*/
void Sapphire::Entity::Chara::setGp( uint32_t gp ) void Sapphire::Entity::Chara::setGp( uint32_t gp )
{ {
m_gp = static_cast< uint16_t >( gp ); m_gp = static_cast< uint16_t >( gp );
sendStatusUpdate();
} }
/*! \param tp amount to set*/ /*! \param tp amount to set*/
void Sapphire::Entity::Chara::setTp( uint32_t tp ) void Sapphire::Entity::Chara::setTp( uint32_t tp )
{ {
m_tp = static_cast< uint16_t >( tp ); m_tp = static_cast< uint16_t >( tp );
sendStatusUpdate();
} }
/*! \param type invincibility type to set */ /*! \param type invincibility type to set */
@ -427,8 +421,6 @@ void Sapphire::Entity::Chara::heal( uint32_t amount )
} }
else else
m_hp += amount; m_hp += amount;
sendStatusUpdate();
} }
void Sapphire::Entity::Chara::restoreMP( uint32_t amount ) void Sapphire::Entity::Chara::restoreMP( uint32_t amount )
@ -439,8 +431,6 @@ void Sapphire::Entity::Chara::restoreMP( uint32_t amount )
} }
else else
m_mp += amount; m_mp += amount;
sendStatusUpdate();
} }
/*! /*!
@ -450,10 +440,10 @@ so players can have their own version and we can abolish the param.
\param true if the update should also be sent to the actor ( player ) himself \param true if the update should also be sent to the actor ( player ) himself
*/ */
void Sapphire::Entity::Chara::sendStatusUpdate() void Sapphire::Entity::Chara::sendHudParam()
{ {
FFXIVPacketBasePtr packet = std::make_shared< UpdateHpMpTpPacket >( *this ); FFXIVPacketBasePtr packet = makeHudParam( *this );
server().queueForPlayers( getInRangePlayerIds(), packet ); server().queueForPlayers( getInRangePlayerIds( isPlayer() ), packet );
} }
/*! \return ActionPtr of the currently registered action, or nullptr */ /*! \return ActionPtr of the currently registered action, or nullptr */

View file

@ -223,7 +223,7 @@ namespace Sapphire::Entity
virtual uint8_t getLevel() const; virtual uint8_t getLevel() const;
virtual void sendStatusUpdate(); virtual void sendHudParam();
virtual void takeDamage( uint32_t damage ); virtual void takeDamage( uint32_t damage );

View file

@ -119,8 +119,6 @@ Player::~Player() = default;
void Player::unload() void Player::unload()
{ {
auto& partyMgr = Common::Service< World::Manager::PartyMgr >::ref();
auto& fcMgr = Common::Service< World::Manager::FreeCompanyMgr >::ref();
// do one last update to db // do one last update to db
updateSql(); updateSql();
// reset isLogin and loading sequences just in case // reset isLogin and loading sequences just in case
@ -655,10 +653,10 @@ void Player::levelUp()
Service< World::Manager::MapMgr >::ref().updateQuests( *this ); Service< World::Manager::MapMgr >::ref().updateQuests( *this );
} }
void Player::sendStatusUpdate() void Player::sendHudParam()
{ {
// todo: overrides are funky // todo: overrides are funky
Service< World::Manager::PlayerMgr >::ref().onPlayerHpMpTpChanged( *this ); Service< World::Manager::PlayerMgr >::ref().onHudParamChanged( *this );
} }
uint8_t Player::getLevel() const uint8_t Player::getLevel() const
@ -729,7 +727,7 @@ void Player::setClassJob( Common::ClassJob classJob )
m_tp = 0; m_tp = 0;
Service< World::Manager::PlayerMgr >::ref().onPlayerStatusUpdate( *this ); Service< World::Manager::PlayerMgr >::ref().sendStatusUpdate( *this );
Service< World::Manager::PlayerMgr >::ref().onClassChanged( *this ); Service< World::Manager::PlayerMgr >::ref().onClassChanged( *this );
Service< World::Manager::MapMgr >::ref().updateQuests( *this ); Service< World::Manager::MapMgr >::ref().updateQuests( *this );
} }

View file

@ -581,7 +581,7 @@ namespace Sapphire::Entity
void sendModel(); void sendModel();
/*! send status update */ /*! send status update */
void sendStatusUpdate() override; void sendHudParam() override;
/*! send the entire inventory sequence */ /*! send the entire inventory sequence */
void sendInventory(); void sendInventory();
@ -749,7 +749,7 @@ namespace Sapphire::Entity
bool updateContainer( uint16_t storageId, uint16_t slotId, ItemPtr pItem ); bool updateContainer( uint16_t storageId, uint16_t slotId, ItemPtr pItem );
/*! calculate and return player ilvl based off equipped gear */ /*! calculate and return player ilvl based off equipped gear */
uint16_t calculateEquippedGearItemLevel(); uint16_t calculateItemLevel();
/*! calculate bonus stats from gear */ /*! calculate bonus stats from gear */
@ -1003,6 +1003,7 @@ namespace Sapphire::Entity
int8_t getFreeQuestSlot(); int8_t getFreeQuestSlot();
bool performResting();
}; };
} }

View file

@ -11,6 +11,7 @@
#include "Action/EventAction.h" #include "Action/EventAction.h"
#include "Manager/PlayerMgr.h" #include "Manager/PlayerMgr.h"
#include "Service.h" #include "Service.h"
#include <Network/PacketWrappers/RestingPacket.h>
using namespace Sapphire::Common; using namespace Sapphire::Common;
using namespace Sapphire::Network::Packets; using namespace Sapphire::Network::Packets;
@ -64,11 +65,18 @@ void Sapphire::Entity::Player::onTick()
// add 3 seconds to total play time // add 3 seconds to total play time
m_playTime += 3; m_playTime += 3;
bool sendUpdate = false;
if( !isAlive() || !isLoadingComplete() ) if( !isAlive() || !isLoadingComplete() )
return; return;
bool sendUpdate = performResting();
if( sendUpdate )
server().queueForPlayers( getInRangePlayerIds( true ), std::make_shared< RestingPacket >( *this ) );
}
bool Sapphire::Entity::Player::performResting()
{
bool sendUpdate = false;
auto addHp = static_cast< uint32_t >( static_cast< float >( getMaxHp() ) * 0.1f + 1 ); auto addHp = static_cast< uint32_t >( static_cast< float >( getMaxHp() ) * 0.1f + 1 );
auto addMp = static_cast< uint32_t >( static_cast< float >( getMaxMp() ) * 0.06f + 1 ); auto addMp = static_cast< uint32_t >( static_cast< float >( getMaxMp() ) * 0.06f + 1 );
uint32_t addTp = 100; uint32_t addTp = 100;
@ -111,7 +119,5 @@ void Sapphire::Entity::Player::onTick()
sendUpdate = true; sendUpdate = true;
} }
return sendUpdate;
if( sendUpdate )
sendStatusUpdate();
} }

View file

@ -99,13 +99,12 @@ void Sapphire::Entity::Player::initInventory()
setupContainer( HandIn, 10, "", true, false ); setupContainer( HandIn, 10, "", true, false );
loadInventory(); loadInventory();
calculateItemLevel();
} }
void Sapphire::Entity::Player::sendItemLevel() void Sapphire::Entity::Player::sendItemLevel()
{ {
calculateEquippedGearItemLevel(); Service< World::Manager::PlayerMgr >::ref().sendItemLevel( *this );
Service< World::Manager::PlayerMgr >::ref().onPlayerItemLevelUpdate( *this );
} }
void Sapphire::Entity::Player::equipWeapon( const Item& item ) void Sapphire::Entity::Player::equipWeapon( const Item& item )
@ -227,12 +226,13 @@ void Sapphire::Entity::Player::equipItem( Common::GearSetSlot equipSlotId, Item&
updateModels( equipSlotId, item ); updateModels( equipSlotId, item );
calculateStats(); calculateStats();
calculateItemLevel();
if( sendUpdate ) if( sendUpdate )
{ {
sendModel(); sendModel();
sendItemLevel(); sendItemLevel();
sendStats(); sendStats();
sendStatusUpdate(); sendHudParam();
} }
} }
@ -247,13 +247,14 @@ void Sapphire::Entity::Player::unequipItem( Common::GearSetSlot equipSlotId, Ite
unequipSoulCrystal(); unequipSoulCrystal();
calculateStats(); calculateStats();
calculateItemLevel();
if( sendUpdate ) if( sendUpdate )
{ {
sendModel(); sendModel();
sendItemLevel(); sendItemLevel();
sendStats(); sendStats();
sendStatusUpdate(); sendHudParam();
} }
} }
@ -991,7 +992,7 @@ void Sapphire::Entity::Player::discardItem( uint16_t fromInventoryId, uint16_t f
server().queueForPlayer( getCharacterId(), invTransFinPacket ); server().queueForPlayer( getCharacterId(), invTransFinPacket );
} }
uint16_t Sapphire::Entity::Player::calculateEquippedGearItemLevel() uint16_t Sapphire::Entity::Player::calculateItemLevel()
{ {
uint32_t iLvlResult = 0; uint32_t iLvlResult = 0;

View file

@ -142,8 +142,6 @@ namespace Sapphire
void addMember( uint64_t memberId, uint8_t hierarchyId, uint32_t lastLogout ); void addMember( uint64_t memberId, uint8_t hierarchyId, uint32_t lastLogout );
void removeMember( uint64_t memberId ); void removeMember( uint64_t memberId );
}; };
} }

View file

@ -38,20 +38,9 @@ namespace Sapphire::World::Manager
void addMember( uint64_t fcId, uint64_t memberId ); void addMember( uint64_t fcId, uint64_t memberId );
//void sendFreeCompanyResult( Entity::Player& player, uint64_t fcId, ResultType resultType, uint64_t target,
// uint32_t result, UpdateStatus updateStatus, std::string targetName );
void sendFcInviteList( Entity::Player& player ); void sendFcInviteList( Entity::Player& player );
void sendFcStatus( Entity::Player& player ); void sendFcStatus( Entity::Player& player );
/* void invitePlayer( Entity::Player& sourcePlayer, Entity::Player& invitedPlayer, uint64_t linkshellId );
void kickPlayer( Entity::Player& sourcePlayer, Entity::Player& kickedPlayer, uint64_t linkshellId );
void addLeader( Entity::Player& sourcePlayer, Entity::Player& newLeaderPlayer, uint64_t linkshellId );
void removeLeader( Entity::Player& sourcePlayer, Entity::Player& leaderPlayer, uint64_t linkshellId );
void declineLeader( Entity::Player& sourcePlayer, uint64_t linkshellId );
void changeMaster( Entity::Player& sourcePlayer, Entity::Player& nextMasterPlayer, uint64_t linkshellId ); */
void sendFreeCompanyStatus( Entity::Player& player ); void sendFreeCompanyStatus( Entity::Player& player );
void dbInsertMember( uint64_t fcId, uint64_t characterId, uint8_t hierarchyId ); void dbInsertMember( uint64_t fcId, uint64_t characterId, uint8_t hierarchyId );
@ -65,9 +54,6 @@ namespace Sapphire::World::Manager
FreeCompanyPtr getFreeCompanyById( uint64_t fcId ); FreeCompanyPtr getFreeCompanyById( uint64_t fcId );
FreeCompanyPtr getFreeCompanyByName( const std::string& name ); FreeCompanyPtr getFreeCompanyByName( const std::string& name );
// void leaveLinkshell( uint64_t lsId, uint64_t characterId );
// void joinLinkshell( uint64_t lsId, uint64_t characterId );
void onFcLogin( uint64_t characterId ); void onFcLogin( uint64_t characterId );
void onFcLogout( uint64_t characterId ); void onFcLogout( uint64_t characterId );
void onSignPetition( Entity::Player& source, Entity::Player& target ); void onSignPetition( Entity::Player& source, Entity::Player& target );

View file

@ -4,21 +4,17 @@
#include <Exd/ExdData.h> #include <Exd/ExdData.h>
#include <Territory/Territory.h>
#include <Territory/Land.h> #include <Territory/Land.h>
#include <Manager/TerritoryMgr.h> #include <Manager/TerritoryMgr.h>
#include <Manager/AchievementMgr.h> #include <Manager/AchievementMgr.h>
#include <Manager/PartyMgr.h> #include <Manager/PartyMgr.h>
#include <Manager/HousingMgr.h> #include <Manager/HousingMgr.h>
#include <Manager/FreeCompanyMgr.h>
#include <Manager/QuestMgr.h> #include <Manager/QuestMgr.h>
#include <Script/ScriptMgr.h> #include <Script/ScriptMgr.h>
#include <WorldServer.h>
#include <Common.h> #include <Common.h>
#include <Network/PacketContainer.h>
#include <Network/GameConnection.h> #include <Network/GameConnection.h>
#include <Network/CommonActorControl.h> #include <Network/CommonActorControl.h>
#include <Network/PacketDef/Zone/ServerZoneDef.h> #include <Network/PacketDef/Zone/ServerZoneDef.h>
@ -29,7 +25,7 @@
#include <Network/PacketWrappers/ModelEquipPacket.h> #include <Network/PacketWrappers/ModelEquipPacket.h>
#include <Network/PacketWrappers/PlayerSetupPacket.h> #include <Network/PacketWrappers/PlayerSetupPacket.h>
#include <Network/PacketWrappers/ConditionPacket.h> #include <Network/PacketWrappers/ConditionPacket.h>
#include <Network/PacketWrappers/UpdateHpMpTpPacket.h> #include <Network/PacketWrappers/RestingPacket.h>
#include <Network/PacketWrappers/ServerNoticePacket.h> #include <Network/PacketWrappers/ServerNoticePacket.h>
#include <Network/PacketWrappers/ChatPacket.h> #include <Network/PacketWrappers/ChatPacket.h>
#include <Network/PacketWrappers/HudParamPacket.h> #include <Network/PacketWrappers/HudParamPacket.h>
@ -145,7 +141,7 @@ void PlayerMgr::onStatsChanged( Entity::Player& player )
server().queueForPlayer( player.getCharacterId(), statPacket ); server().queueForPlayer( player.getCharacterId(), statPacket );
} }
void PlayerMgr::onPlayerStatusUpdate( Entity::Player& player ) void PlayerMgr::sendStatusUpdate( Entity::Player& player )
{ {
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() );
@ -157,14 +153,18 @@ void PlayerMgr::onPlayerStatusUpdate( Entity::Player& player )
server().queueForPlayer( player.getCharacterId(), playerStatusUpdate ); server().queueForPlayer( player.getCharacterId(), playerStatusUpdate );
} }
void PlayerMgr::onPlayerHpMpTpChanged( Entity::Player& player ) void PlayerMgr::onHudParamChanged( Entity::Player& player )
{ {
server().queueForPlayers( player.getInRangePlayerIds( true ), std::make_shared< UpdateHpMpTpPacket >( player ) );
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::onRestingTick( Entity::Player& player )
{
server().queueForPlayers( player.getInRangePlayerIds( true ), std::make_shared< RestingPacket >( player ) );
}
void PlayerMgr::sendItemLevel( Entity::Player& player )
{ {
server().queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), SetItemLevel, player.getItemLevel(), 0 ) ); server().queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), SetItemLevel, player.getItemLevel(), 0 ) );
} }
@ -173,7 +173,7 @@ void PlayerMgr::onLevelUp( Entity::Player& player )
{ {
player.calculateStats(); player.calculateStats();
player.sendStats(); player.sendStats();
onPlayerHpMpTpChanged( player ); player.sendHudParam();
auto inRangePlayerIds = player.getInRangePlayerIds( true ); auto inRangePlayerIds = player.getInRangePlayerIds( true );
@ -181,7 +181,7 @@ void PlayerMgr::onLevelUp( Entity::Player& player )
server().queueForPlayers( inRangePlayerIds, makeActorControl( player.getId(), LevelUpEffect, static_cast< uint8_t >( player.getClass() ), server().queueForPlayers( inRangePlayerIds, makeActorControl( player.getId(), LevelUpEffect, static_cast< uint8_t >( player.getClass() ),
player.getLevel(), player.getLevel() - 1 ) ); player.getLevel(), player.getLevel() - 1 ) );
onPlayerStatusUpdate( player ); sendStatusUpdate( player );
auto& achvMgr = Common::Service< World::Manager::AchievementMgr >::ref(); auto& achvMgr = Common::Service< World::Manager::AchievementMgr >::ref();
achvMgr.progressAchievementByType< Common::Achievement::Type::Classjob >( player, static_cast< uint32_t >( player.getClass() ) ); achvMgr.progressAchievementByType< Common::Achievement::Type::Classjob >( player, static_cast< uint32_t >( player.getClass() ) );
@ -221,7 +221,7 @@ void PlayerMgr::onGearChanged( Entity::Player& player )
server().queueForPlayers( player.getInRangePlayerIds( true ), std::make_shared< ModelEquipPacket >( player ) ); server().queueForPlayers( player.getInRangePlayerIds( true ), std::make_shared< ModelEquipPacket >( player ) );
} }
void PlayerMgr::onGrandCompanyChanged( Entity::Player& player ) void PlayerMgr::sendGrandCompany( Entity::Player& player )
{ {
auto gcAffPacket = makeZonePacket< FFXIVIpcGrandCompany >( player.getId() ); auto gcAffPacket = makeZonePacket< FFXIVIpcGrandCompany >( player.getId() );
gcAffPacket->data().ActiveCompanyId = player.getGc(); gcAffPacket->data().ActiveCompanyId = player.getGc();
@ -235,15 +235,13 @@ void PlayerMgr::onGrandCompanyChanged( Entity::Player& player )
void PlayerMgr::setGrandCompany( Entity::Player& player, uint8_t gc ) void PlayerMgr::setGrandCompany( Entity::Player& player, uint8_t gc )
{ {
player.setGc( gc ); player.setGc( gc );
sendGrandCompany( player );
onGrandCompanyChanged( player );
} }
void PlayerMgr::setGrandCompanyRank( 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 ); player.setGcRankAt( gc, rank );
sendGrandCompany( player );
onGrandCompanyChanged( player );
} }
void PlayerMgr::onCompanionUpdate( Entity::Player& player, uint8_t companionId ) void PlayerMgr::onCompanionUpdate( Entity::Player& player, uint8_t companionId )
@ -334,7 +332,7 @@ void PlayerMgr::onHateListChanged( Entity::Player& player )
void PlayerMgr::onClassChanged( Entity::Player& player ) void PlayerMgr::onClassChanged( Entity::Player& player )
{ {
server().queueForPlayers( player.getInRangePlayerIds( true ), makeActorControl( player.getId(), ClassJobChange, 0x04 ) ); server().queueForPlayers( player.getInRangePlayerIds( true ), makeActorControl( player.getId(), ClassJobChange, 0x04 ) );
onPlayerHpMpTpChanged( player ); onHudParamChanged( player );
} }
void PlayerMgr::sendLoginMessage( Entity::Player& player ) void PlayerMgr::sendLoginMessage( Entity::Player& player )
@ -351,14 +349,10 @@ void PlayerMgr::sendLoginMessage( Entity::Player& player )
void PlayerMgr::onLogin( Entity::Player &player ) void PlayerMgr::onLogin( Entity::Player &player )
{ {
} }
void PlayerMgr::onLogout( Entity::Player &player ) void PlayerMgr::onLogout( Entity::Player &player )
{ {
auto& partyMgr = Common::Service< World::Manager::PartyMgr >::ref();
// send updates to mgrs
partyMgr.onMemberDisconnect( player );
} }
void PlayerMgr::onDeath( Entity::Player& player ) void PlayerMgr::onDeath( Entity::Player& player )
@ -405,7 +399,7 @@ void PlayerMgr::onMoveZone( Sapphire::Entity::Player& player )
player.sendRecastGroups(); player.sendRecastGroups();
player.sendStats(); player.sendStats();
player.sendItemLevel(); sendItemLevel( player );
if( player.isLogin() ) if( player.isLogin() )
{ {
auto classInfo = makeZonePacket< FFXIVIpcChangeClass >( player.getId() ); auto classInfo = makeZonePacket< FFXIVIpcChangeClass >( player.getId() );
@ -455,7 +449,7 @@ void PlayerMgr::onMoveZone( Sapphire::Entity::Player& player )
auto &questMgr = Common::Service< World::Manager::QuestMgr >::ref(); auto &questMgr = Common::Service< World::Manager::QuestMgr >::ref();
questMgr.sendQuestsInfo( player ); questMgr.sendQuestsInfo( player );
onGrandCompanyChanged( player ); sendGrandCompany( player );
} }
} }
@ -471,15 +465,14 @@ void PlayerMgr::onUpdate( Entity::Player& player, uint64_t tickCount )
if( !player.isAlive() ) if( !player.isAlive() )
return; return;
if( !player.checkAction() && ( 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 );
if( mainWeap && !player.checkAction() && ( player.getTargetId() && player.getStance() == Common::Stance::Active && player.isAutoattackOn() ) )
{
// @TODO i dislike this, iterating over all in range actors when you already know the id of the actor you need... // @TODO i dislike this, iterating over all in range actors when you already know the id of the actor you need...
for( const auto& actor : player.getInRangeActors() ) for( const auto& actor : player.getInRangeActors() )
{ {
if( actor->getId() == player.getTargetId() && actor->getAsChara()->isAlive() && mainWeap ) if( actor->getId() != player.getTargetId() || !actor->getAsChara()->isAlive() )
{ continue;
auto chara = actor->getAsChara(); auto chara = actor->getAsChara();
// default autoattack range // default autoattack range
@ -502,7 +495,6 @@ void PlayerMgr::onUpdate( Entity::Player& player, uint64_t tickCount )
} }
} }
} }
}
void PlayerMgr::setCondition( Sapphire::Entity::Player& player, Common::PlayerCondition flag ) void PlayerMgr::setCondition( Sapphire::Entity::Player& player, Common::PlayerCondition flag )
{ {

View file

@ -15,13 +15,15 @@ namespace Sapphire::World::Manager
void onEquipDisplayFlagsChanged( Sapphire::Entity::Player& player ); void onEquipDisplayFlagsChanged( Sapphire::Entity::Player& player );
void onPlayerStatusUpdate( Sapphire::Entity::Player& player ); void sendStatusUpdate( Sapphire::Entity::Player& player );
void onUnlockAchievement( Sapphire::Entity::Player& player, uint32_t achievementId ); void onUnlockAchievement( Sapphire::Entity::Player& player, uint32_t achievementId );
void onPlayerHpMpTpChanged( Sapphire::Entity::Player& player ); void onHudParamChanged( Sapphire::Entity::Player& player );
void onPlayerItemLevelUpdate( Sapphire::Entity::Player& player ); void onRestingTick( Sapphire::Entity::Player& player );
void sendItemLevel( Sapphire::Entity::Player& player );
void onLevelUp( Sapphire::Entity::Player& player ); void onLevelUp( Sapphire::Entity::Player& player );
@ -53,7 +55,7 @@ namespace Sapphire::World::Manager
void onAchievementListChanged( Sapphire::Entity::Player& player ); void onAchievementListChanged( Sapphire::Entity::Player& player );
void onAchievementProgressChanged( Sapphire::Entity::Player& player, uint32_t achievementId ); void onAchievementProgressChanged( Sapphire::Entity::Player& player, uint32_t achievementId );
void onGearChanged( Sapphire::Entity::Player& player ); void onGearChanged( Sapphire::Entity::Player& player );
void onGrandCompanyChanged( Sapphire::Entity::Player& player ); void sendGrandCompany( Sapphire::Entity::Player& player );
void onClassChanged( Sapphire::Entity::Player& player ); void onClassChanged( Sapphire::Entity::Player& player );
void setCondition( Sapphire::Entity::Player& player, Common::PlayerCondition flag ); void setCondition( Sapphire::Entity::Player& player, Common::PlayerCondition flag );

View file

@ -16,33 +16,29 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
class HudParamPacket : public ZoneChannelPacket< FFXIVIpcHudParam > class HudParamPacket : public ZoneChannelPacket< FFXIVIpcHudParam >
{ {
public: public:
HudParamPacket( Entity::Player& player ) : ZoneChannelPacket< FFXIVIpcHudParam >( player.getId(), player.getId() )
{
initialize( player );
};
HudParamPacket( Entity::BNpc& bnpc ) : ZoneChannelPacket< FFXIVIpcHudParam >( bnpc.getId(), bnpc.getId() ) HudParamPacket( Entity::Chara& chara ) : ZoneChannelPacket< FFXIVIpcHudParam >( chara.getId(), chara.getId() )
{ {
initialize( bnpc ); initialize( chara );
}; };
private: private:
void initialize( Entity::Player& player ) void initialize( Entity::Chara& chara )
{ {
m_data.ClassJob = static_cast< uint8_t >( player.getClass() ); m_data.ClassJob = static_cast< uint8_t >( chara.getClass() );
m_data.Lv = player.getLevel(); m_data.Lv = chara.getLevel();
m_data.OrgLv = player.getLevel(); m_data.OrgLv = chara.getLevel();
m_data.LvSync = 0; //player.getLevelSync(); m_data.LvSync = 0; //player.getLevelSync();
m_data.Hp = player.getHp(); m_data.Hp = chara.getHp();
m_data.Mp = player.getMp(); m_data.Mp = chara.getMp();
m_data.Tp = player.getTp(); m_data.Tp = chara.getTp();
m_data.HpMax = player.getMaxHp(); m_data.HpMax = chara.getMaxHp();
m_data.MpMax = player.getMaxMp(); m_data.MpMax = chara.getMaxMp();
for( int i = 0; i < 30; ++i ) for( int i = 0; i < 30; ++i )
m_data.effect[ i ] = { 0, 0, 0.0f, 0 }; m_data.effect[ i ] = { 0, 0, 0.0f, 0 };
auto statusMap = player.getStatusEffectMap(); auto statusMap = chara.getStatusEffectMap();
int i = 0; int i = 0;
for( const auto& [ key, val ] : statusMap ) for( const auto& [ key, val ] : statusMap )
@ -59,38 +55,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
i++; i++;
} }
} }
void initialize( Entity::BNpc& bnpc )
{
m_data.ClassJob = static_cast< uint8_t >( bnpc.getClass() );
m_data.Lv = bnpc.getLevel();
m_data.OrgLv = bnpc.getLevel();
m_data.LvSync = 0;
m_data.Hp = bnpc.getHp();
m_data.Mp = bnpc.getMp();
m_data.Tp = bnpc.getTp();
m_data.HpMax = bnpc.getMaxHp();
m_data.MpMax = bnpc.getMaxMp();
for( int i = 0; i < 30; ++i )
m_data.effect[ i ] = { 0, 0, 0.0f, 0 };
auto statusMap = bnpc.getStatusEffectMap();
int i = 0;
for( const auto& [ key, val ] : statusMap )
{
auto timeLeft = static_cast< int32_t >( val->getDuration() - ( Common::Util::getTimeMs() - val->getStartTimeMs() ) );
m_data.effect[ i ].Id = val->getId();
m_data.effect[ i ].Source = val->getSrcActorId();
m_data.effect[ i ].SystemParam = val->getParam();
if( timeLeft <= 0 )
m_data.effect[ i ].Time = 0.f;
else
m_data.effect[ i ].Time = timeLeft / 1000.f;
i++;
}
}
}; };
template< typename... Args > template< typename... Args >
std::shared_ptr< HudParamPacket > makeHudParam( Args... args ) std::shared_ptr< HudParamPacket > makeHudParam( Args... args )

View file

@ -12,10 +12,10 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
/** /**
* @brief The Ping response packet. * @brief The Ping response packet.
*/ */
class UpdateHpMpTpPacket : public ZoneChannelPacket< FFXIVIpcResting > class RestingPacket : public ZoneChannelPacket< FFXIVIpcResting >
{ {
public: public:
UpdateHpMpTpPacket( Entity::Chara& actor ) : ZoneChannelPacket< FFXIVIpcResting >( actor.getId(), actor.getId() ) RestingPacket( Entity::Chara& actor ) : ZoneChannelPacket< FFXIVIpcResting >( actor.getId(), actor.getId() )
{ {
initialize( actor ); initialize( actor );
}; };

View file

@ -10,6 +10,7 @@
#include "WorldServer.h" #include "WorldServer.h"
#include "Manager/PlayerMgr.h" #include "Manager/PlayerMgr.h"
#include "Manager/FreeCompanyMgr.h" #include "Manager/FreeCompanyMgr.h"
#include "Manager/PartyMgr.h"
#include "Session.h" #include "Session.h"
@ -80,8 +81,10 @@ void Sapphire::World::Session::close()
{ {
auto& playerMgr = Common::Service< World::Manager::PlayerMgr >::ref(); auto& playerMgr = Common::Service< World::Manager::PlayerMgr >::ref();
auto& fcMgr = Common::Service< World::Manager::FreeCompanyMgr >::ref(); auto& fcMgr = Common::Service< World::Manager::FreeCompanyMgr >::ref();
auto& partyMgr = Common::Service< World::Manager::PartyMgr >::ref();
playerMgr.onLogout( *m_pPlayer ); playerMgr.onLogout( *m_pPlayer );
fcMgr.onFcLogout( m_pPlayer->getCharacterId() ); fcMgr.onFcLogout( m_pPlayer->getCharacterId() );
partyMgr.onMemberDisconnect( *m_pPlayer );
m_pPlayer->unload(); m_pPlayer->unload();
} }
} }