1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-29 15:47:46 +00:00
sapphire/src/world/StatusEffect/StatusEffect.cpp

184 lines
5.4 KiB
C++
Raw Normal View History

#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
#include "Actor/Chara.h"
#include "Actor/GameObject.h"
2017-08-08 13:53:47 +02:00
#include "Script/ScriptMgr.h"
2017-08-08 13:53:47 +02:00
#include "StatusEffect.h"
using namespace Sapphire::Common;
using namespace Sapphire::Network::Packets;
//using namespace Sapphire::Network::Packets::WorldPackets::Server;
2017-08-08 13:53:47 +02: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 );
}
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 ) :
m_id( id ),
m_sourceActor( sourceActor ),
m_targetActor( targetActor ),
m_duration( duration ),
m_modifiers( 0 ),
m_startTime( 0 ),
m_tickRate( tickRate ),
2020-03-01 01:00:57 +11:00
m_lastTick( 0 )
{
auto& exdData = Common::Service< Data::ExdData >::ref();
2022-01-27 21:24:54 +01:00
auto entry = exdData.getRow< Excel::Status >( id );
m_name = entry->getString( entry->data().Text.Name );
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
}
Sapphire::StatusEffect::StatusEffect::~StatusEffect()
2017-08-08 13:53:47 +02:00
{
}
2023-03-07 20:00:32 +01:00
void Sapphire::StatusEffect::StatusEffect::registerTickEffect( ParamModifier type, uint32_t param )
{
m_currTickEffect = std::make_pair( type, param );
}
2023-03-07 20:00:32 +01:00
std::pair< ParamModifier, uint32_t > Sapphire::StatusEffect::StatusEffect::getTickEffect()
{
2023-02-21 20:11:17 +01:00
return m_currTickEffect;
}
2017-08-08 13:53:47 +02:00
void Sapphire::StatusEffect::StatusEffect::onTick()
2017-08-08 13:53:47 +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
}
uint32_t Sapphire::StatusEffect::StatusEffect::getSrcActorId() const
2017-08-08 13:53:47 +02:00
{
return m_sourceActor->getId();
2017-08-08 13:53:47 +02:00
}
uint32_t Sapphire::StatusEffect::StatusEffect::getTargetActorId() const
2017-08-08 13:53:47 +02:00
{
return m_targetActor->getId();
2017-08-08 13:53:47 +02:00
}
uint16_t Sapphire::StatusEffect::StatusEffect::getParam() const
{
return m_param;
}
void Sapphire::StatusEffect::StatusEffect::applyStatus()
2017-08-08 13:53:47 +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
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 );
2023-03-07 20:00:32 +01:00
else if( mod.modifier == Common::ParamModifier::TickDamage )
registerTickEffect( mod.modifier, mod.value );
else if( mod.modifier == Common::ParamModifier::TickHeal )
registerTickEffect( mod.modifier, mod.value );
}
m_targetActor->calculateStats();
// 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
//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
}
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();
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
}
uint32_t Sapphire::StatusEffect::StatusEffect::getId() const
2017-08-08 13:53:47 +02:00
{
return m_id;
2017-08-08 13:53:47 +02:00
}
uint32_t Sapphire::StatusEffect::StatusEffect::getDuration() const
2017-08-08 13:53:47 +02:00
{
return m_duration;
2017-08-08 13:53:47 +02:00
}
uint32_t Sapphire::StatusEffect::StatusEffect::getTickRate() const
2017-08-08 13:53:47 +02:00
{
return m_tickRate;
2017-08-08 13:53:47 +02:00
}
uint64_t Sapphire::StatusEffect::StatusEffect::getLastTickMs() const
2017-08-08 13:53:47 +02:00
{
return m_lastTick;
2017-08-08 13:53:47 +02:00
}
uint64_t Sapphire::StatusEffect::StatusEffect::getStartTimeMs() const
2017-08-08 13:53:47 +02:00
{
return m_startTime;
2017-08-08 13:53:47 +02:00
}
void Sapphire::StatusEffect::StatusEffect::setLastTick( uint64_t lastTick )
2017-08-08 13:53:47 +02:00
{
m_lastTick = lastTick;
2017-08-08 13:53:47 +02:00
}
void Sapphire::StatusEffect::StatusEffect::setParam( uint16_t param )
{
m_param = param;
}
const std::string& Sapphire::StatusEffect::StatusEffect::getName() const
2017-08-08 13:53:47 +02:00
{
return m_name;
2017-08-08 13:53:47 +02:00
}