1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-29 23:57: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;
}
Service< World::Manager::PlayerMgr >::ref().onHudParamChanged( *m_pSource->getAsPlayer() );
if( !hasLutEntry || m_hitActors.empty() )
{

View file

@ -627,7 +627,7 @@ void Sapphire::Entity::BNpc::onTick()
Chara::onTick();
if( m_state == BNpcState::Retreat )
{
regainHp();
restHp();
}
}
@ -792,19 +792,19 @@ void Sapphire::Entity::BNpc::update( uint64_t 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 );
if( this->m_hp + addHp < this->getMaxHp() )
this->m_hp += addHp;
if( m_hp + addHp < getMaxHp() )
m_hp += addHp;
else
this->m_hp = this->getMaxHp();
m_hp = getMaxHp();
}
this->sendStatusUpdate();
sendHudParam();
}
void Sapphire::Entity::BNpc::onActionHostile( Sapphire::Entity::CharaPtr pSource )

View file

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

View file

@ -13,7 +13,7 @@
#include "Network/GameConnection.h"
#include "Network/PacketWrappers/ActorControlPacket.h"
#include "Network/PacketWrappers/ActorControlTargetPacket.h"
#include "Network/PacketWrappers/UpdateHpMpTpPacket.h"
#include "Network/PacketWrappers/RestingPacket.h"
#include "Network/PacketWrappers/EffectPacket1.h"
#include "Network/PacketWrappers/HudParamPacket.h"
@ -214,42 +214,36 @@ uint32_t Sapphire::Entity::Chara::getMaxMp() const
void Sapphire::Entity::Chara::resetHp()
{
m_hp = getMaxHp();
sendStatusUpdate();
}
/*! \return reset mp to current max mp */
void Sapphire::Entity::Chara::resetMp()
{
m_mp = getMaxMp();
sendStatusUpdate();
}
/*! \param hp amount to set ( caps to maxHp ) */
void Sapphire::Entity::Chara::setHp( uint32_t hp )
{
m_hp = hp < getMaxHp() ? hp : getMaxHp();
sendStatusUpdate();
}
/*! \param mp amount to set ( caps to maxMp ) */
void Sapphire::Entity::Chara::setMp( uint32_t mp )
{
m_mp = mp < getMaxMp() ? mp : getMaxMp();
sendStatusUpdate();
}
/*! \param gp amount to set*/
void Sapphire::Entity::Chara::setGp( uint32_t gp )
{
m_gp = static_cast< uint16_t >( gp );
sendStatusUpdate();
}
/*! \param tp amount to set*/
void Sapphire::Entity::Chara::setTp( uint32_t tp )
{
m_tp = static_cast< uint16_t >( tp );
sendStatusUpdate();
}
/*! \param type invincibility type to set */
@ -427,8 +421,6 @@ void Sapphire::Entity::Chara::heal( uint32_t amount )
}
else
m_hp += amount;
sendStatusUpdate();
}
void Sapphire::Entity::Chara::restoreMP( uint32_t amount )
@ -439,8 +431,6 @@ void Sapphire::Entity::Chara::restoreMP( uint32_t amount )
}
else
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
*/
void Sapphire::Entity::Chara::sendStatusUpdate()
void Sapphire::Entity::Chara::sendHudParam()
{
FFXIVPacketBasePtr packet = std::make_shared< UpdateHpMpTpPacket >( *this );
server().queueForPlayers( getInRangePlayerIds(), packet );
FFXIVPacketBasePtr packet = makeHudParam( *this );
server().queueForPlayers( getInRangePlayerIds( isPlayer() ), packet );
}
/*! \return ActionPtr of the currently registered action, or nullptr */

View file

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

View file

@ -119,8 +119,6 @@ Player::~Player() = default;
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
updateSql();
// reset isLogin and loading sequences just in case
@ -655,10 +653,10 @@ void Player::levelUp()
Service< World::Manager::MapMgr >::ref().updateQuests( *this );
}
void Player::sendStatusUpdate()
void Player::sendHudParam()
{
// todo: overrides are funky
Service< World::Manager::PlayerMgr >::ref().onPlayerHpMpTpChanged( *this );
Service< World::Manager::PlayerMgr >::ref().onHudParamChanged( *this );
}
uint8_t Player::getLevel() const
@ -729,7 +727,7 @@ void Player::setClassJob( Common::ClassJob classJob )
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::MapMgr >::ref().updateQuests( *this );
}

View file

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

View file

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

View file

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

View file

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

View file

@ -38,20 +38,9 @@ namespace Sapphire::World::Manager
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 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 dbInsertMember( uint64_t fcId, uint64_t characterId, uint8_t hierarchyId );
@ -65,9 +54,6 @@ namespace Sapphire::World::Manager
FreeCompanyPtr getFreeCompanyById( uint64_t fcId );
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 onFcLogout( uint64_t characterId );
void onSignPetition( Entity::Player& source, Entity::Player& target );

View file

@ -4,21 +4,17 @@
#include <Exd/ExdData.h>
#include <Territory/Territory.h>
#include <Territory/Land.h>
#include <Manager/TerritoryMgr.h>
#include <Manager/AchievementMgr.h>
#include <Manager/PartyMgr.h>
#include <Manager/HousingMgr.h>
#include <Manager/FreeCompanyMgr.h>
#include <Manager/QuestMgr.h>
#include <Script/ScriptMgr.h>
#include <WorldServer.h>
#include <Common.h>
#include <Network/PacketContainer.h>
#include <Network/GameConnection.h>
#include <Network/CommonActorControl.h>
#include <Network/PacketDef/Zone/ServerZoneDef.h>
@ -29,7 +25,7 @@
#include <Network/PacketWrappers/ModelEquipPacket.h>
#include <Network/PacketWrappers/PlayerSetupPacket.h>
#include <Network/PacketWrappers/ConditionPacket.h>
#include <Network/PacketWrappers/UpdateHpMpTpPacket.h>
#include <Network/PacketWrappers/RestingPacket.h>
#include <Network/PacketWrappers/ServerNoticePacket.h>
#include <Network/PacketWrappers/ChatPacket.h>
#include <Network/PacketWrappers/HudParamPacket.h>
@ -145,7 +141,7 @@ void PlayerMgr::onStatsChanged( Entity::Player& player )
server().queueForPlayer( player.getCharacterId(), statPacket );
}
void PlayerMgr::onPlayerStatusUpdate( Entity::Player& player )
void PlayerMgr::sendStatusUpdate( Entity::Player& player )
{
auto playerStatusUpdate = makeZonePacket< FFXIVIpcPlayerStatusUpdate >( player.getId() );
playerStatusUpdate->data().ClassJob = static_cast< uint8_t >( player.getClass() );
@ -157,14 +153,18 @@ void PlayerMgr::onPlayerStatusUpdate( Entity::Player& player )
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 );
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 ) );
}
@ -173,15 +173,15 @@ void PlayerMgr::onLevelUp( Entity::Player& player )
{
player.calculateStats();
player.sendStats();
onPlayerHpMpTpChanged( player );
player.sendHudParam();
auto inRangePlayerIds = player.getInRangePlayerIds( true );
server().queueForPlayers( inRangePlayerIds, makeHudParam( player ) );
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();
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 ) );
}
void PlayerMgr::onGrandCompanyChanged( Entity::Player& player )
void PlayerMgr::sendGrandCompany( Entity::Player& player )
{
auto gcAffPacket = makeZonePacket< FFXIVIpcGrandCompany >( player.getId() );
gcAffPacket->data().ActiveCompanyId = player.getGc();
@ -235,15 +235,13 @@ void PlayerMgr::onGrandCompanyChanged( Entity::Player& player )
void PlayerMgr::setGrandCompany( Entity::Player& player, uint8_t gc )
{
player.setGc( gc );
onGrandCompanyChanged( player );
sendGrandCompany( player );
}
void PlayerMgr::setGrandCompanyRank( Entity::Player& player, uint8_t gc, uint8_t rank )
{
player.setGcRankAt( gc, rank );
onGrandCompanyChanged( player );
sendGrandCompany( player );
}
void PlayerMgr::onCompanionUpdate( Entity::Player& player, uint8_t companionId )
@ -265,13 +263,13 @@ void PlayerMgr::onMountUpdate( Entity::Player& player, uint32_t mountId )
if( mountId != 0 )
{
server().queueForPlayers( inRangePlayerIds,
makeActorControl( player.getId(), ActorControlType::SetStatus, static_cast< uint8_t >( Common::ActorStatus::Mounted ) ) );
makeActorControl( player.getId(), ActorControlType::SetStatus, static_cast< uint8_t >( Common::ActorStatus::Mounted ) ) );
server().queueForPlayers( inRangePlayerIds, makeActorControlSelf( player.getId(), 0x39e, 12 ) );
}
else
{
server().queueForPlayers( inRangePlayerIds,
makeActorControl( player.getId(), ActorControlType::SetStatus, static_cast< uint8_t >( Common::ActorStatus::Idle ) ) );
makeActorControl( player.getId(), ActorControlType::SetStatus, static_cast< uint8_t >( Common::ActorStatus::Idle ) ) );
server().queueForPlayers( inRangePlayerIds, makeActorControlSelf( player.getId(), ActorControlType::Dismount, 1 ) );
}
@ -334,7 +332,7 @@ void PlayerMgr::onHateListChanged( Entity::Player& player )
void PlayerMgr::onClassChanged( Entity::Player& player )
{
server().queueForPlayers( player.getInRangePlayerIds( true ), makeActorControl( player.getId(), ClassJobChange, 0x04 ) );
onPlayerHpMpTpChanged( player );
onHudParamChanged( 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::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 )
@ -405,7 +399,7 @@ void PlayerMgr::onMoveZone( Sapphire::Entity::Player& player )
player.sendRecastGroups();
player.sendStats();
player.sendItemLevel();
sendItemLevel( player );
if( player.isLogin() )
{
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();
questMgr.sendQuestsInfo( player );
onGrandCompanyChanged( player );
sendGrandCompany( player );
}
}
@ -471,33 +465,31 @@ void PlayerMgr::onUpdate( Entity::Player& player, uint64_t tickCount )
if( !player.isAlive() )
return;
if( !player.checkAction() && ( player.getTargetId() && player.getStance() == Common::Stance::Active && player.isAutoattackOn() ) )
auto mainWeap = player.getItemAt( Common::GearSet0, Common::GearSetSlot::MainHand );
if( mainWeap && !player.checkAction() && ( player.getTargetId() && player.getStance() == Common::Stance::Active && player.isAutoattackOn() ) )
{
auto mainWeap = player.getItemAt( Common::GearSet0, Common::GearSetSlot::MainHand );
// @TODO i dislike this, iterating over all in range actors when you already know the id of the actor you need...
for( const auto& actor : player.getInRangeActors() )
{
if( actor->getId() == player.getTargetId() && actor->getAsChara()->isAlive() && mainWeap )
if( actor->getId() != player.getTargetId() || !actor->getAsChara()->isAlive() )
continue;
auto chara = actor->getAsChara();
// default autoattack range
float range = 3.f + chara->getRadius() + player.getRadius() * 0.5f;
// default autoattack range for ranged classes
auto classJob = player.getClass();
if( classJob == Common::ClassJob::Machinist || classJob == Common::ClassJob::Bard || classJob == Common::ClassJob::Archer )
range = 25.f + chara->getRadius() + player.getRadius() * 0.5f;
if( Common::Util::distance( player.getPos(), actor->getPos() ) <= range )
{
auto chara = actor->getAsChara();
// default autoattack range
float range = 3.f + chara->getRadius() + player.getRadius() * 0.5f;
// default autoattack range for ranged classes
auto classJob = player.getClass();
if( classJob == Common::ClassJob::Machinist || classJob == Common::ClassJob::Bard || classJob == Common::ClassJob::Archer )
range = 25.f + chara->getRadius() + player.getRadius() * 0.5f;
if( Common::Util::distance( player.getPos(), actor->getPos() ) <= range )
if( ( tickCount - player.getLastAttack() ) > mainWeap->getDelay() )
{
if( ( tickCount - player.getLastAttack() ) > mainWeap->getDelay() )
{
player.setLastAttack( tickCount );
player.autoAttack( actor->getAsChara() );
}
player.setLastAttack( tickCount );
player.autoAttack( actor->getAsChara() );
}
}
}

View file

@ -15,13 +15,15 @@ namespace Sapphire::World::Manager
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 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 );
@ -53,7 +55,7 @@ namespace Sapphire::World::Manager
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 sendGrandCompany( Sapphire::Entity::Player& player );
void onClassChanged( Sapphire::Entity::Player& player );
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 >
{
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:
void initialize( Entity::Player& player )
void initialize( Entity::Chara& chara )
{
m_data.ClassJob = static_cast< uint8_t >( player.getClass() );
m_data.Lv = player.getLevel();
m_data.OrgLv = player.getLevel();
m_data.ClassJob = static_cast< uint8_t >( chara.getClass() );
m_data.Lv = chara.getLevel();
m_data.OrgLv = chara.getLevel();
m_data.LvSync = 0; //player.getLevelSync();
m_data.Hp = player.getHp();
m_data.Mp = player.getMp();
m_data.Tp = player.getTp();
m_data.HpMax = player.getMaxHp();
m_data.MpMax = player.getMaxMp();
m_data.Hp = chara.getHp();
m_data.Mp = chara.getMp();
m_data.Tp = chara.getTp();
m_data.HpMax = chara.getMaxHp();
m_data.MpMax = chara.getMaxMp();
for( int i = 0; i < 30; ++i )
m_data.effect[ i ] = { 0, 0, 0.0f, 0 };
auto statusMap = player.getStatusEffectMap();
auto statusMap = chara.getStatusEffectMap();
int i = 0;
for( const auto& [ key, val ] : statusMap )
@ -59,38 +55,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
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 >
std::shared_ptr< HudParamPacket > makeHudParam( Args... args )

View file

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

View file

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