1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-23 18:17:46 +00:00
sapphire/src/world/Action/ActionResult.cpp

181 lines
5.1 KiB
C++
Raw Normal View History

#include "ActionResult.h"
2019-07-25 22:46:10 +10:00
#include <Util/Util.h>
#include <Service.h>
#include <Manager/PlayerMgr.h>
#include "Actor/Chara.h"
2020-01-23 22:36:01 +09:00
#include "Actor/Player.h"
#include "StatusEffect/StatusEffect.h"
2019-07-25 22:46:10 +10:00
using namespace Sapphire;
2023-03-16 21:56:57 +01:00
using namespace Sapphire::Common;
2019-07-25 22:46:10 +10:00
using namespace Sapphire::World::Action;
ActionResult::ActionResult( Entity::CharaPtr target ) :
m_target( std::move( target ) )
2019-07-25 22:46:10 +10:00
{
m_result.Arg0 = 0;
m_result.Arg1 = 0;
m_result.Arg2 = 0;
m_result.Value = 0;
2023-03-16 21:56:57 +01:00
m_result.Flag = static_cast< uint8_t >( ActionResultFlag::None );
m_result.Type = CalcResultType::TypeNone;
2019-07-25 22:46:10 +10:00
}
Entity::CharaPtr ActionResult::getTarget() const
2019-07-25 22:46:10 +10:00
{
return m_target;
}
2023-03-16 21:56:57 +01:00
void ActionResult::damage( uint32_t amount, CalcResultType hitType, uint8_t hitEffect, ActionResultFlag flag )
{
m_result.Arg0 = hitEffect;
m_result.Value = static_cast< int16_t >( amount );
m_result.Flag = static_cast< uint8_t >( flag );
m_result.Type = hitType;
2019-07-25 22:46:10 +10:00
}
2023-03-16 21:56:57 +01:00
void ActionResult::heal( uint32_t amount, CalcResultType hitType, uint8_t hitEffect, ActionResultFlag flag )
2019-07-25 22:46:10 +10:00
{
m_result.Arg0 = hitEffect;
m_result.Value = static_cast< int16_t >( amount );
m_result.Flag = static_cast< uint8_t >( flag );
m_result.Type = hitType;
2019-07-25 22:46:10 +10:00
}
2023-03-16 21:56:57 +01:00
void ActionResult::restoreMP( uint32_t amount, ActionResultFlag flag )
2020-01-05 17:09:27 +09:00
{
m_result.Value = static_cast< int16_t >( amount );
m_result.Flag = static_cast< uint8_t >( flag );
2023-03-16 21:56:57 +01:00
m_result.Type = CalcResultType::TypeRecoverMp;
2020-01-05 17:09:27 +09:00
}
void ActionResult::startCombo( uint16_t actionId )
2020-01-05 17:09:27 +09:00
{
m_result.Value = static_cast< int16_t >( actionId );
2023-03-16 21:56:57 +01:00
m_result.Flag = static_cast< uint8_t >( ActionResultFlag::EffectOnSource );
m_result.Type = CalcResultType::TypeCombo;
2020-01-05 17:09:27 +09:00
}
void ActionResult::comboSucceed()
2020-01-05 17:09:27 +09:00
{
2020-01-05 20:49:50 +09:00
// no EffectOnSource flag on this
2023-03-16 21:56:57 +01:00
m_result.Type = CalcResultType::TypeComboHit;
2020-01-05 17:09:27 +09:00
}
void ActionResult::applyStatusEffect( uint32_t id, int32_t duration, Entity::Chara& source, uint8_t param, bool shouldOverride )
2020-01-06 19:25:01 +09:00
{
m_result.Value = static_cast< int16_t >( id );
m_result.Arg2 = param;
2023-03-16 21:56:57 +01:00
m_result.Type = CalcResultType::TypeSetStatus;
m_bOverrideStatus = shouldOverride;
[3.x] WIP: Initial Action and StatusEffect implementation (#958) * Check statuses to determine valid lut entry * Add duration field to statuses * Rename buildEffects to make more sense * Add basic generic handler for applying statuseffects * Add more modifiers * Add basic modifier impl for Chara * Apply/remove modifiers for statuseffects * Add some example statuses to lut * Fix windows build error * Don't clear tick effect * Add status entry for Maim * Apply status effects properly for self when having a target * Fix hasStatusEffect to prevent duplicates * Basic dot/hot ticks implemented * Update HP on tick effects * Apply effect to correct target * Add method to simplify applying statuses to self * Add job actions for warrior * Add some actions and statuses for war * Add even more modifiers * Add statuseffect cost type * Add option to not send statusremove order * Change delModifier assert to return early instead * Add option for scripts to enable the generic/lut handler * Add enums for common action values * fix indentation * Fix modifier name for Defiance * Remove status tick logging * Move modifiers to statuseffect * Add ParryPercent modifier * Remove wrath when Defiance ends * Apply modifiers in applyStatus * Remove unused method * Persistence for cross-class skills * Add flags to StatusEffects * Some exd struct fixes * Some aoe work * Add flags to lut * Add missing changeclass * Add SET_STATUS_ME to ActionIntegrity * Improve offensive action check * Add flag to overloaded applyStatusEffectSelf * indentation fix * Some calculation work * Null-check ActionResultBuilder --------- Co-authored-by: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Co-authored-by: Mordred <30826167+SapphireMordred@users.noreply.github.com>
2024-06-21 04:27:01 +02:00
m_pStatus = Sapphire::StatusEffect::make_StatusEffect( id, source.getAsChara(), m_target, duration, 3000 );
m_pStatus->setParam( param );
}
void ActionResult::applyStatusEffect( uint32_t id, int32_t duration, Entity::Chara& source, uint8_t param,
std::vector< StatusModifier > modifiers, uint32_t flag, bool shouldOverride )
{
m_result.Value = static_cast< int16_t >( id );
m_result.Arg2 = param;
m_result.Type = CalcResultType::TypeSetStatus;
m_bOverrideStatus = shouldOverride;
m_pStatus = Sapphire::StatusEffect::make_StatusEffect( id, source.getAsChara(), m_target, duration, modifiers, flag, 3000 );
m_pStatus->setParam( param );
2020-01-06 19:25:01 +09:00
}
void ActionResult::applyStatusEffectSelf( uint32_t id, int32_t duration, uint8_t param, bool shouldOverride )
{
m_result.Value = static_cast< int16_t >( id );
m_result.Arg2 = param;
2023-03-16 21:56:57 +01:00
m_result.Type = CalcResultType::TypeSetStatusMe;
m_result.Flag = static_cast< uint8_t >( ActionResultFlag::EffectOnSource );
m_bOverrideStatus = shouldOverride;
2024-01-16 08:41:55 +01:00
m_pStatus = Sapphire::StatusEffect::make_StatusEffect( id, m_target, m_target, duration, 3000 );
m_pStatus->setParam( param );
}
[3.x] WIP: Initial Action and StatusEffect implementation (#958) * Check statuses to determine valid lut entry * Add duration field to statuses * Rename buildEffects to make more sense * Add basic generic handler for applying statuseffects * Add more modifiers * Add basic modifier impl for Chara * Apply/remove modifiers for statuseffects * Add some example statuses to lut * Fix windows build error * Don't clear tick effect * Add status entry for Maim * Apply status effects properly for self when having a target * Fix hasStatusEffect to prevent duplicates * Basic dot/hot ticks implemented * Update HP on tick effects * Apply effect to correct target * Add method to simplify applying statuses to self * Add job actions for warrior * Add some actions and statuses for war * Add even more modifiers * Add statuseffect cost type * Add option to not send statusremove order * Change delModifier assert to return early instead * Add option for scripts to enable the generic/lut handler * Add enums for common action values * fix indentation * Fix modifier name for Defiance * Remove status tick logging * Move modifiers to statuseffect * Add ParryPercent modifier * Remove wrath when Defiance ends * Apply modifiers in applyStatus * Remove unused method * Persistence for cross-class skills * Add flags to StatusEffects * Some exd struct fixes * Some aoe work * Add flags to lut * Add missing changeclass * Add SET_STATUS_ME to ActionIntegrity * Improve offensive action check * Add flag to overloaded applyStatusEffectSelf * indentation fix * Some calculation work * Null-check ActionResultBuilder --------- Co-authored-by: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Co-authored-by: Mordred <30826167+SapphireMordred@users.noreply.github.com>
2024-06-21 04:27:01 +02:00
void ActionResult::applyStatusEffectSelf( uint32_t id, int32_t duration, uint8_t param, std::vector< World::Action::StatusModifier > modifiers,
uint32_t flag, bool shouldOverride )
{
m_result.Value = static_cast< int16_t >( id );
m_result.Arg2 = param;
m_result.Type = CalcResultType::TypeSetStatusMe;
m_result.Flag = static_cast< uint8_t >( Common::ActionResultFlag::EffectOnSource );
m_bOverrideStatus = shouldOverride;
m_pStatus = Sapphire::StatusEffect::make_StatusEffect( id, m_target, m_target, duration, modifiers, flag, 3000 );
m_pStatus->setParam( param );
}
void ActionResult::mount( uint16_t mountId )
2020-01-23 22:36:01 +09:00
{
m_result.Value = static_cast< int16_t >( mountId );
m_result.Arg0 = 1;
2023-03-16 21:56:57 +01:00
m_result.Type = CalcResultType::TypeMount;
2020-01-23 22:36:01 +09:00
}
const Common::CalcResultParam& ActionResult::getCalcResultParam() const
2019-07-25 22:46:10 +10:00
{
return m_result;
}
[3.x] WIP: Initial Action and StatusEffect implementation (#958) * Check statuses to determine valid lut entry * Add duration field to statuses * Rename buildEffects to make more sense * Add basic generic handler for applying statuseffects * Add more modifiers * Add basic modifier impl for Chara * Apply/remove modifiers for statuseffects * Add some example statuses to lut * Fix windows build error * Don't clear tick effect * Add status entry for Maim * Apply status effects properly for self when having a target * Fix hasStatusEffect to prevent duplicates * Basic dot/hot ticks implemented * Update HP on tick effects * Apply effect to correct target * Add method to simplify applying statuses to self * Add job actions for warrior * Add some actions and statuses for war * Add even more modifiers * Add statuseffect cost type * Add option to not send statusremove order * Change delModifier assert to return early instead * Add option for scripts to enable the generic/lut handler * Add enums for common action values * fix indentation * Fix modifier name for Defiance * Remove status tick logging * Move modifiers to statuseffect * Add ParryPercent modifier * Remove wrath when Defiance ends * Apply modifiers in applyStatus * Remove unused method * Persistence for cross-class skills * Add flags to StatusEffects * Some exd struct fixes * Some aoe work * Add flags to lut * Add missing changeclass * Add SET_STATUS_ME to ActionIntegrity * Improve offensive action check * Add flag to overloaded applyStatusEffectSelf * indentation fix * Some calculation work * Null-check ActionResultBuilder --------- Co-authored-by: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Co-authored-by: Mordred <30826167+SapphireMordred@users.noreply.github.com>
2024-06-21 04:27:01 +02:00
const Sapphire::StatusEffect::StatusEffectPtr ActionResult::getStatusEffect() const
{
return m_pStatus;
}
void ActionResult::execute()
{
if( !m_target )
return;
switch( m_result.Type )
{
2023-03-16 21:56:57 +01:00
case CalcResultType::TypeDamageHp:
case CalcResultType::TypeCriticalDamageHp:
{
m_target->takeDamage( m_result.Value );
break;
}
2023-03-16 21:56:57 +01:00
case CalcResultType::TypeRecoverHp:
case CalcResultType::TypeCriticalRecoverHp:
{
m_target->heal( m_result.Value );
break;
}
2023-03-16 21:56:57 +01:00
case CalcResultType::TypeRecoverMp:
2020-01-05 17:09:27 +09:00
{
m_target->restoreMP( m_result.Value );
2020-01-05 17:09:27 +09:00
break;
}
2023-03-16 21:56:57 +01:00
case CalcResultType::TypeSetStatus:
case CalcResultType::TypeSetStatusMe:
{
if( !m_bOverrideStatus )
2023-03-12 21:06:37 +01:00
m_target->addStatusEffectByIdIfNotExist( m_pStatus );
else
2023-03-12 21:06:37 +01:00
m_target->addStatusEffectById( m_pStatus );
break;
}
2023-03-16 21:56:57 +01:00
case CalcResultType::TypeMount:
2020-01-23 22:36:01 +09:00
{
auto pPlayer = m_target->getAsPlayer();
2023-03-06 10:12:29 +01:00
pPlayer->setMount( m_result.Value );
2020-01-23 22:36:01 +09:00
break;
}
default:
break;
}
2019-07-25 22:46:10 +10:00
}