1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-04 17:57:47 +00:00

Statuseffect and hudparam fixes

This commit is contained in:
Lucy 2023-02-20 23:39:05 +01:00
parent 065c1817bd
commit 7b8cf18851
2 changed files with 53 additions and 3 deletions

View file

@ -15,6 +15,7 @@
#include "Network/PacketWrappers/ActorControlTargetPacket.h" #include "Network/PacketWrappers/ActorControlTargetPacket.h"
#include "Network/PacketWrappers/UpdateHpMpTpPacket.h" #include "Network/PacketWrappers/UpdateHpMpTpPacket.h"
#include "Network/PacketWrappers/EffectPacket1.h" #include "Network/PacketWrappers/EffectPacket1.h"
#include "Network/PacketWrappers/HudParamPacket.h"
#include "StatusEffect/StatusEffect.h" #include "StatusEffect/StatusEffect.h"
#include "Action/Action.h" #include "Action/Action.h"
@ -616,7 +617,10 @@ void Sapphire::Entity::Chara::removeStatusEffect( uint8_t effectSlotId )
m_statusEffectMap.erase( effectSlotId ); m_statusEffectMap.erase( effectSlotId );
sendStatusEffectUpdate(); if( isPlayer() )
server().queueForPlayers( getInRangePlayerIds( isPlayer() ), makeHudParam( *getAsPlayer() ) );
else if( isBattleNpc() )
server().queueForPlayers( getInRangePlayerIds( isPlayer() ), makeHudParam( *getAsBNpc() ) );
} }
std::map< uint8_t, Sapphire::StatusEffect::StatusEffectPtr > Sapphire::Entity::Chara::getStatusEffectMap() const std::map< uint8_t, Sapphire::StatusEffect::StatusEffectPtr > Sapphire::Entity::Chara::getStatusEffectMap() const

View file

@ -3,6 +3,8 @@
#include <Network/GamePacket.h> #include <Network/GamePacket.h>
#include <StatusEffect/StatusEffect.h> #include <StatusEffect/StatusEffect.h>
#include <Util/Util.h> #include <Util/Util.h>
#include <Actor/Player.h>
#include <Actor/BNpc.h>
#include "Forwards.h" #include "Forwards.h"
namespace Sapphire::Network::Packets::WorldPackets::Server namespace Sapphire::Network::Packets::WorldPackets::Server
@ -19,6 +21,11 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
initialize( player ); initialize( player );
}; };
HudParamPacket( Entity::BNpc& bnpc ) : ZoneChannelPacket< FFXIVIpcHudParam >( bnpc.getId(), bnpc.getId() )
{
initialize( bnpc );
};
private: private:
void initialize( Entity::Player& player ) void initialize( Entity::Player& player )
{ {
@ -32,19 +39,58 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
m_data.HpMax = player.getMaxHp(); m_data.HpMax = player.getMaxHp();
m_data.MpMax = player.getMaxMp(); m_data.MpMax = player.getMaxMp();
for( int i = 0; i < 30; ++i )
m_data.effect[ i ] = { 0, 0, 0.0f, 0 };
auto statusMap = player.getStatusEffectMap(); auto statusMap = player.getStatusEffectMap();
int i = 0; int i = 0;
for( const auto& [ key, val ] : statusMap ) 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 ].Id = val->getId();
m_data.effect[ i ].Source = val->getSrcActorId(); m_data.effect[ i ].Source = val->getSrcActorId();
m_data.effect[ i ].SystemParam = val->getParam(); m_data.effect[ i ].SystemParam = val->getParam();
m_data.effect[ i ].Time = ( val->getDuration() - ( Common::Util::getTimeMs() - val->getStartTimeMs() ) ) / 1000.f; if( timeLeft <= 0 )
m_data.effect[ i ].Time = 0.f;
else
m_data.effect[ i ].Time = timeLeft / 1000.f;
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 )