diff --git a/src/world/StatusEffect/StatusEffect.cpp b/src/world/StatusEffect/StatusEffect.cpp index 1b371938..064c2119 100644 --- a/src/world/StatusEffect/StatusEffect.cpp +++ b/src/world/StatusEffect/StatusEffect.cpp @@ -17,12 +17,20 @@ using namespace Sapphire::Common; using namespace Sapphire::Network::Packets; //using namespace Sapphire::Network::Packets::WorldPackets::Server; +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, 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 ), m_lastTick( 0 ) @@ -87,6 +95,15 @@ void Sapphire::StatusEffect::StatusEffect::applyStatus() m_startTime = Util::getTimeMs(); auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); + 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(); + // this is only right when an action is being used by the player // else you probably need to use an actorcontrol @@ -111,6 +128,15 @@ void Sapphire::StatusEffect::StatusEffect::applyStatus() void Sapphire::StatusEffect::StatusEffect::removeStatus() { 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(); + scriptMgr.onStatusTimeOut( m_targetActor, m_id ); } diff --git a/src/world/StatusEffect/StatusEffect.h b/src/world/StatusEffect/StatusEffect.h index e6bb1c8e..bc8e4f47 100644 --- a/src/world/StatusEffect/StatusEffect.h +++ b/src/world/StatusEffect/StatusEffect.h @@ -2,6 +2,7 @@ #define _STATUSEFFECT_H_ #include "Forwards.h" +#include "Action/ActionLut.h" namespace Sapphire { namespace StatusEffect { @@ -10,6 +11,9 @@ namespace StatusEffect { class StatusEffect { public: + StatusEffect( uint32_t id, Entity::CharaPtr sourceActor, Entity::CharaPtr targetActor, + uint32_t duration, std::vector< World::Action::StatusModifier >& modifiers, uint32_t tickRate ); + StatusEffect( uint32_t id, Entity::CharaPtr sourceActor, Entity::CharaPtr targetActor, uint32_t duration, uint32_t tickRate ); @@ -58,7 +62,7 @@ private: uint16_t m_param; std::string m_name; std::pair< uint8_t, uint32_t > m_currTickEffect; - + std::vector< World::Action::StatusModifier > m_modifiers; }; }