2021-11-27 00:53:57 +01:00
|
|
|
#include <Exd/ExdData.h>
|
2018-03-06 22:22:19 +01:00
|
|
|
#include <Util/Util.h>
|
|
|
|
#include <Network/PacketDef/Zone/ServerZoneDef.h>
|
|
|
|
#include <Logging/Logger.h>
|
2017-08-08 13:53:47 +02:00
|
|
|
|
|
|
|
#include <algorithm>
|
2020-03-01 01:00:57 +11:00
|
|
|
#include <Service.h>
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-02-20 22:46:44 +01:00
|
|
|
#include "Actor/Chara.h"
|
2021-11-27 00:53:57 +01:00
|
|
|
#include "Actor/GameObject.h"
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-03-02 07:22:25 -03:00
|
|
|
#include "Script/ScriptMgr.h"
|
2017-08-08 13:53:47 +02:00
|
|
|
|
|
|
|
#include "StatusEffect.h"
|
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
using namespace Sapphire::Common;
|
|
|
|
using namespace Sapphire::Network::Packets;
|
2021-11-27 00:53:57 +01:00
|
|
|
//using namespace Sapphire::Network::Packets::WorldPackets::Server;
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2023-03-06 23:13:45 +01:00
|
|
|
Sapphire::StatusEffect::StatusEffect::StatusEffect( uint32_t id, Entity::CharaPtr sourceActor, Entity::CharaPtr targetActor,
|
|
|
|
uint32_t duration, std::vector< World::Action::StatusModifier >& modifiers, uint32_t tickRate ) :
|
|
|
|
StatusEffect( id, sourceActor, targetActor, duration, tickRate )
|
|
|
|
{
|
|
|
|
m_modifiers = std::move( modifiers );
|
|
|
|
}
|
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
Sapphire::StatusEffect::StatusEffect::StatusEffect( uint32_t id, Entity::CharaPtr sourceActor, Entity::CharaPtr targetActor,
|
2020-03-01 01:00:57 +11:00
|
|
|
uint32_t duration, uint32_t tickRate ) :
|
2018-12-29 00:53:52 +01:00
|
|
|
m_id( id ),
|
|
|
|
m_sourceActor( sourceActor ),
|
|
|
|
m_targetActor( targetActor ),
|
|
|
|
m_duration( duration ),
|
2023-03-06 23:13:45 +01:00
|
|
|
m_modifiers( 0 ),
|
2018-12-29 00:53:52 +01:00
|
|
|
m_startTime( 0 ),
|
|
|
|
m_tickRate( tickRate ),
|
2020-03-01 01:00:57 +11:00
|
|
|
m_lastTick( 0 )
|
2018-12-29 00:53:52 +01:00
|
|
|
{
|
2021-11-27 00:53:57 +01:00
|
|
|
auto& exdData = Common::Service< Data::ExdData >::ref();
|
2022-01-27 21:24:54 +01:00
|
|
|
auto entry = exdData.getRow< Excel::Status >( id );
|
2021-11-27 00:53:57 +01:00
|
|
|
m_name = entry->getString( entry->data().Text.Name );
|
2018-08-29 21:40:59 +02:00
|
|
|
|
|
|
|
std::replace( m_name.begin(), m_name.end(), ' ', '_' );
|
|
|
|
std::replace( m_name.begin(), m_name.end(), ':', '_' );
|
|
|
|
std::replace( m_name.begin(), m_name.end(), '&', '_' );
|
|
|
|
std::replace( m_name.begin(), m_name.end(), '+', 'p' );
|
2018-10-26 08:25:20 +02:00
|
|
|
Util::eraseAll( m_name, '\'' );
|
|
|
|
Util::eraseAll( m_name, '&' );
|
|
|
|
Util::eraseAll( m_name, '-' );
|
|
|
|
Util::eraseAll( m_name, '(' );
|
|
|
|
Util::eraseAll( m_name, ')' );
|
2017-08-08 13:53:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
Sapphire::StatusEffect::StatusEffect::~StatusEffect()
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
void Sapphire::StatusEffect::StatusEffect::registerTickEffect( uint8_t type, uint32_t param )
|
2017-08-15 11:51:59 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
m_currTickEffect = std::make_pair( type, param );
|
2017-08-15 11:51:59 +02:00
|
|
|
}
|
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
std::pair< uint8_t, uint32_t > Sapphire::StatusEffect::StatusEffect::getTickEffect()
|
2017-08-15 11:51:59 +02:00
|
|
|
{
|
2023-02-21 20:11:17 +01:00
|
|
|
return m_currTickEffect;
|
2017-08-15 11:51:59 +02:00
|
|
|
}
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
void Sapphire::StatusEffect::StatusEffect::onTick()
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
m_lastTick = Util::getTimeMs();
|
2020-03-01 01:00:57 +11:00
|
|
|
|
|
|
|
auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref();
|
|
|
|
scriptMgr.onStatusTick( m_targetActor, *this );
|
2017-08-08 13:53:47 +02:00
|
|
|
}
|
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
uint32_t Sapphire::StatusEffect::StatusEffect::getSrcActorId() const
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_sourceActor->getId();
|
2017-08-08 13:53:47 +02:00
|
|
|
}
|
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
uint32_t Sapphire::StatusEffect::StatusEffect::getTargetActorId() const
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_targetActor->getId();
|
2017-08-08 13:53:47 +02:00
|
|
|
}
|
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
uint16_t Sapphire::StatusEffect::StatusEffect::getParam() const
|
2017-08-10 16:12:54 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_param;
|
2017-08-10 16:12:54 +02:00
|
|
|
}
|
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
void Sapphire::StatusEffect::StatusEffect::applyStatus()
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
m_startTime = Util::getTimeMs();
|
2020-03-01 01:00:57 +11:00
|
|
|
auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref();
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2023-03-06 23:13:45 +01:00
|
|
|
for( const auto& mod : m_modifiers )
|
|
|
|
{
|
|
|
|
// TODO: ticks
|
|
|
|
if( mod.modifier != Common::ParamModifier::TickDamage && mod.modifier != Common::ParamModifier::TickHeal )
|
|
|
|
m_targetActor->addModifier( mod.modifier, mod.value );
|
|
|
|
}
|
|
|
|
|
|
|
|
m_targetActor->calculateStats();
|
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
// this is only right when an action is being used by the player
|
|
|
|
// else you probably need to use an actorcontrol
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
//GamePacketNew< FFXIVIpcEffect > effectPacket( m_sourceActor->getId() );
|
|
|
|
//effectPacket.data().targetId = m_sourceActor->getId();
|
|
|
|
//effectPacket.data().actionAnimationId = 3;
|
|
|
|
//effectPacket.data().unknown_3 = 1;
|
|
|
|
//effectPacket.data().actionTextId = 3;
|
|
|
|
//effectPacket.data().unknown_5 = 1;
|
|
|
|
//effectPacket.data().unknown_6 = 321;
|
|
|
|
//effectPacket.data().rotation = ( uint16_t ) ( 0x8000 * ( ( m_sourceActor->getPos().getR() + 3.1415926 ) ) / 3.1415926 );
|
|
|
|
//effectPacket.data().effectTargetId = m_sourceActor->getId();
|
|
|
|
//effectPacket.data().effects[4].unknown_1 = 17;
|
|
|
|
//effectPacket.data().effects[4].bonusPercent = 30;
|
|
|
|
//effectPacket.data().effects[4].param1 = m_id;
|
|
|
|
//effectPacket.data().effects[4].unknown_5 = 0x80;
|
|
|
|
//m_sourceActor->sendToInRangeSet( effectPacket, true );
|
2017-08-08 13:53:47 +02:00
|
|
|
|
2020-03-01 01:00:57 +11:00
|
|
|
scriptMgr.onStatusReceive( m_targetActor, m_id );
|
2017-08-08 13:53:47 +02:00
|
|
|
}
|
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
void Sapphire::StatusEffect::StatusEffect::removeStatus()
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
2020-03-01 01:00:57 +11:00
|
|
|
auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref();
|
2023-03-06 23:13:45 +01:00
|
|
|
|
|
|
|
for( const auto& mod : m_modifiers )
|
|
|
|
{
|
|
|
|
if( mod.modifier != Common::ParamModifier::TickDamage && mod.modifier != Common::ParamModifier::TickHeal )
|
|
|
|
m_targetActor->delModifier( mod.modifier, mod.value );
|
|
|
|
}
|
|
|
|
|
|
|
|
m_targetActor->calculateStats();
|
|
|
|
|
2020-03-01 01:00:57 +11:00
|
|
|
scriptMgr.onStatusTimeOut( m_targetActor, m_id );
|
2017-08-08 13:53:47 +02:00
|
|
|
}
|
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
uint32_t Sapphire::StatusEffect::StatusEffect::getId() const
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_id;
|
2017-08-08 13:53:47 +02:00
|
|
|
}
|
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
uint32_t Sapphire::StatusEffect::StatusEffect::getDuration() const
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_duration;
|
2017-08-08 13:53:47 +02:00
|
|
|
}
|
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
uint32_t Sapphire::StatusEffect::StatusEffect::getTickRate() const
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_tickRate;
|
2017-08-08 13:53:47 +02:00
|
|
|
}
|
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
uint64_t Sapphire::StatusEffect::StatusEffect::getLastTickMs() const
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_lastTick;
|
2017-08-08 13:53:47 +02:00
|
|
|
}
|
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
uint64_t Sapphire::StatusEffect::StatusEffect::getStartTimeMs() const
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_startTime;
|
2017-08-08 13:53:47 +02:00
|
|
|
}
|
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
void Sapphire::StatusEffect::StatusEffect::setLastTick( uint64_t lastTick )
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
m_lastTick = lastTick;
|
2017-08-08 13:53:47 +02:00
|
|
|
}
|
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
void Sapphire::StatusEffect::StatusEffect::setParam( uint16_t param )
|
2017-08-12 22:11:56 -03:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
m_param = param;
|
2017-08-12 22:11:56 -03:00
|
|
|
}
|
2017-08-10 16:12:54 +02:00
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
const std::string& Sapphire::StatusEffect::StatusEffect::getName() const
|
2017-08-08 13:53:47 +02:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
return m_name;
|
2017-08-08 13:53:47 +02:00
|
|
|
}
|