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

fix actionresult, hudparam, resting packet; comment action filter for sprint false selftarget; warp vfx on exit range; fix status duration;

This commit is contained in:
Alice Ogeda 2023-02-13 16:27:36 -03:00
parent 1ba6ea02d5
commit d5022516f5
5 changed files with 41 additions and 14 deletions

View file

@ -470,15 +470,15 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
};
struct IntegrityStatus {
uint8_t Slot;
uint8_t __padding1;
uint8_t paddingmaybe;
uint16_t Id;
int16_t SystemParam;
uint8_t __padding2;
uint8_t __padding3;
float Time;
uint32_t Source;
uint8_t unknown_3_2;
};
/**
@ -499,8 +499,9 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
uint32_t HpMax;
uint16_t MpMax;
uint8_t StatusCount;
uint8_t __padding3;
uint8_t unknown_E0;
IntegrityStatus Status[4];
uint32_t unk_1;
};
/**
@ -550,14 +551,15 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
/**
* Structural representation of the packet sent by the server
* to update HP / MP / TP
* to update HP / MP / TP / GP
*/
struct FFXIVIpcResting : FFXIVIpcBasePacket< Resting >
{
/* 0000 */ uint32_t Hp;
/* 0004 */ uint16_t Mp;
/* 0006 */ uint16_t Tp;
/* 0008 */ uint16_t Gp;
uint32_t Hp;
uint16_t Mp;
uint16_t Tp;
uint16_t Gp;
uint32_t Unknown_3_2;
};
struct FFXIVIpcRecastGroup : FFXIVIpcBasePacket< RecastGroup >
@ -617,6 +619,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
uint64_t Target;
uint32_t BallistaEntityId;
Common::CalcResult CalcResult;
uint32_t __padding2;
};
struct MountStruct

View file

@ -839,9 +839,10 @@ bool Action::Action::preFilterActor( Sapphire::Entity::GameObject& actor ) const
// todo: are there any server side eobjs that players can hit?
if( kind != ObjKind::BattleNpc && kind != ObjKind::Player )
return false;
if( !m_canTargetSelf && chara->getId() == m_pSource->getId() )
return false;
// todo: evaluate other actions that can hit condition (eg. sprint)
/* if( !m_canTargetSelf && chara->getId() == m_pSource->getId() )
return false;*/
if( ( m_lutEntry.potency > 0 || m_lutEntry.curePotency > 0 ) && !chara->isAlive() ) // !m_canTargetDead not working for aoe
return false;

View file

@ -530,13 +530,21 @@ void Sapphire::Entity::Chara::addStatusEffect( StatusEffect::StatusEffectPtr pEf
statusEffectAdd->data().MpMax = static_cast< uint16_t >( getMaxMp() );
statusEffectAdd->data().ClassJob = static_cast< uint8_t >( getClass() );
statusEffectAdd->data().StatusCount = 1;
statusEffectAdd->data().unknown_E0 = 0xE0;
// set all status sources to u32 invalid game obj
// todo: chara status effect map should be filled instead, since hudparam also uses invalid gameobj
for( int i = 0; i < 4; ++i )
{
statusEffectAdd->data().Status[ i ].Source = INVALID_GAME_OBJECT_ID;
}
auto& status = statusEffectAdd->data().Status[ 0 ];
status.Source = pEffect->getSrcActorId();
status.Time = static_cast< float >( pEffect->getDuration() ) / 1000;
status.Id = static_cast< uint16_t >( pEffect->getId() );
status.Slot = static_cast< uint8_t >( nextSlot );
status.Slot = static_cast< uint8_t >( nextSlot + 1 );
status.SystemParam = static_cast< int16_t >( pEffect->getParam() );
sendToInRangeSet( statusEffectAdd, isPlayer() );

View file

@ -335,7 +335,7 @@ void Sapphire::Network::GameConnection::zoneJumpHandler( const Packets::FFXIVARR
return;
auto& warpMgr = Common::Service< WarpMgr >::ref();
warpMgr.requestMoveTerritory( player, Common::WARP_TYPE_EXIT_RANGE, pTargetTeri->getGuId(), targetPos, rotation );
warpMgr.requestMoveTerritory( player, Common::WARP_TYPE_NORMAL_POS, pTargetTeri->getGuId(), targetPos, rotation );
}

View file

@ -1,6 +1,8 @@
#pragma once
#include <Network/GamePacket.h>
#include <StatusEffect/StatusEffect.h>
#include <Util/Util.h>
#include "Forwards.h"
namespace Sapphire::Network::Packets::WorldPackets::Server
@ -28,7 +30,20 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
m_data.Mp = player.getMp();
m_data.Tp = player.getTp();
m_data.HpMax = player.getMaxHp();
m_data.MpMax = player.getMaxMp();;
m_data.MpMax = player.getMaxMp();
auto statusMap = player.getStatusEffectMap();
int i = 0;
for( const auto& [ key, val ] : statusMap )
{
m_data.effect[ i ].Id = val->getId();
m_data.effect[ i ].Source = val->getSrcActorId();
m_data.effect[ i ].SystemParam = val->getParam();
m_data.effect[ i ].Time = ( val->getDuration() - ( Common::Util::getTimeMs() - val->getStartTimeMs() ) ) / 1000.f;
i++;
}
};
};
template< typename... Args >