From d640506962b4c26c877f4220083309e0ad1b7ed4 Mon Sep 17 00:00:00 2001 From: collett Date: Wed, 8 Mar 2023 02:47:31 +0900 Subject: [PATCH 1/3] minor fixes --- src/world/Action/Action.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/world/Action/Action.cpp b/src/world/Action/Action.cpp index 4ea6a2d1..24e05e5f 100644 --- a/src/world/Action/Action.cpp +++ b/src/world/Action/Action.cpp @@ -576,9 +576,7 @@ void Action::Action::buildEffects() else m_effectBuilder->damage( actor, actor, dmg.first, dmg.second, dmg.first == 0 ? Common::ActionEffectResultFlag::Absorbed : Common::ActionEffectResultFlag::None, getExecutionDelay() + victimCounter * 100 ); - auto reflectDmg = Math::CalcStats::calcDamageReflect( m_pSource, actor, dmg.first, - attackType == Common::AttackType::Physical ? Common::ActionTypeFilter::Physical : - ( attackType == Common::AttackType::Magical ? Common::ActionTypeFilter::Magical : Common::ActionTypeFilter::Unknown ) ); + auto reflectDmg = Math::CalcStats::calcDamageReflect( m_pSource, actor, dmg.first, getActionTypeFilterFromAttackType( attackType ) ); if( reflectDmg.first > 0 ) { m_effectBuilder->damage( actor, m_pSource, reflectDmg.first, reflectDmg.second, Common::ActionEffectResultFlag::Reflected, getExecutionDelay() + victimCounter * 100 ); @@ -624,7 +622,7 @@ void Action::Action::buildEffects() } } - if( validVictimCounter == 0 ) + if( validVictimCounter == 0 ) // effects only apply once if aoe, on first valid target (can be single target action as well) { if( isCorrectCombo() ) m_effectBuilder->comboSucceed( actor ); @@ -718,7 +716,7 @@ void Action::Action::buildEffects() if( m_lutEntry.selfStatus != 0 ) { if( !isComboAction() || isCorrectCombo() ) - m_effectBuilder->applyStatusEffect( m_pSource, m_pSource, m_lutEntry.selfStatus, m_lutEntry.selfStatusDuration, m_lutEntry.selfStatusParam ); + m_effectBuilder->applyStatusEffect( m_pSource, m_pSource, m_lutEntry.selfStatus, m_lutEntry.selfStatusDuration, m_lutEntry.selfStatusParam, getExecutionDelay() ); } scriptMgr.onBeforeBuildEffect( *this, victimCounter, validVictimCounter ); From 125c07173b031bad242ea3e91c8ebaff3c6b1a13 Mon Sep 17 00:00:00 2001 From: collett Date: Wed, 8 Mar 2023 04:10:12 +0900 Subject: [PATCH 2/3] fix ActionEffectType which is wrong since 5.2 and use proper effect packet for self buffs --- src/common/Common.h | 16 ++++++++-------- src/world/Action/Action.cpp | 9 ++++++++- src/world/Action/EffectBuilder.cpp | 8 ++++---- src/world/Action/EffectBuilder.h | 4 ++-- src/world/Action/EffectResult.cpp | 19 +++++++++++-------- src/world/Action/EffectResult.h | 4 ++-- 6 files changed, 35 insertions(+), 25 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index a53c18d7..1a154d36 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -692,11 +692,11 @@ namespace Sapphire::Common MpLoss = 10, MpGain = 11, TpLoss = 12, - TpGain = 13, - GpGain = 14, - ApplyStatusEffectTarget = 15, - ApplyStatusEffectSource = 16, // effect entry on target but buff applies to source, like storm's eye - StatusNoEffect = 20, // shifted one up from 5.18 + //TpGain = 13, // everything below shifted one up since 5.2 + GpGain = 13, + ApplyStatusEffectTarget = 14, + ApplyStatusEffectSource = 15, // effect entry on target but buff applies to source, like storm's eye + StatusNoEffect = 20, /*! * @brief Tells the client that it should show combo indicators on actions. * @@ -704,10 +704,10 @@ namespace Sapphire::Common * @param value The actionid that starts/continues the combo. eg, 3617 will start a spinning slash and/or syphon strike combo */ Provoke = 24, - StartActionCombo = 27, // shifted one up from 5.18 - ComboSucceed = 28, // shifted one up from 5.18, on retail this is not seen anymore, still working though. + StartActionCombo = 27, + ComboSucceed = 28, // two more values inserted between this and Mount since 5.2 Knockback = 33, - Mount = 40, // shifted one down from 5.18 + Mount = 40, VFX = 59, // links to VFX sheet }; diff --git a/src/world/Action/Action.cpp b/src/world/Action/Action.cpp index 24e05e5f..a2e99b73 100644 --- a/src/world/Action/Action.cpp +++ b/src/world/Action/Action.cpp @@ -504,6 +504,7 @@ void Action::Action::buildEffects() } uint8_t victimCounter = 0, validVictimCounter = 0; + Entity::CharaPtr firstValidVictim = nullptr; for( auto& actor : m_hitActors ) { @@ -696,6 +697,7 @@ void Action::Action::buildEffects() } } validVictimCounter++; + firstValidVictim = actor; } } @@ -716,7 +718,12 @@ void Action::Action::buildEffects() if( m_lutEntry.selfStatus != 0 ) { if( !isComboAction() || isCorrectCombo() ) - m_effectBuilder->applyStatusEffect( m_pSource, m_pSource, m_lutEntry.selfStatus, m_lutEntry.selfStatusDuration, m_lutEntry.selfStatusParam, getExecutionDelay() ); + { + if( firstValidVictim ) + m_effectBuilder->applyStatusEffect( firstValidVictim, m_pSource, m_lutEntry.selfStatus, m_lutEntry.selfStatusDuration, m_lutEntry.selfStatusParam, getExecutionDelay(), true ); + else + m_effectBuilder->applyStatusEffect( m_pSource, m_pSource, m_lutEntry.selfStatus, m_lutEntry.selfStatusDuration, m_lutEntry.selfStatusParam, getExecutionDelay() ); + } } scriptMgr.onBeforeBuildEffect( *this, victimCounter, validVictimCounter ); diff --git a/src/world/Action/EffectBuilder.cpp b/src/world/Action/EffectBuilder.cpp index c3c14ced..b570fbcb 100644 --- a/src/world/Action/EffectBuilder.cpp +++ b/src/world/Action/EffectBuilder.cpp @@ -99,17 +99,17 @@ void EffectBuilder::comboSucceed( Entity::CharaPtr& target ) moveToResultList( target, nextResult ); } -void EffectBuilder::applyStatusEffect( Entity::CharaPtr& target, Entity::CharaPtr& source, uint16_t statusId, uint32_t duration, uint16_t param, uint64_t resultDelayMs ) +void EffectBuilder::applyStatusEffect( Entity::CharaPtr& target, Entity::CharaPtr& source, uint16_t statusId, uint32_t duration, uint16_t param, uint64_t resultDelayMs, bool statusToSource ) { EffectResultPtr nextResult = make_EffectResult( target, source, Common::Util::getTimeMs() + resultDelayMs ); - nextResult->applyStatusEffect( statusId, duration, param ); + nextResult->applyStatusEffect( statusId, duration, param, statusToSource ); moveToResultList( target, nextResult ); } -void EffectBuilder::applyStatusEffect( Entity::CharaPtr& target, Entity::CharaPtr& source, StatusEffect::StatusEffectPtr pStatusEffect, uint64_t resultDelayMs ) +void EffectBuilder::applyStatusEffect( Entity::CharaPtr& target, Entity::CharaPtr& source, StatusEffect::StatusEffectPtr pStatusEffect, uint64_t resultDelayMs, bool statusToSource ) { EffectResultPtr nextResult = make_EffectResult( target, source, Common::Util::getTimeMs() + resultDelayMs ); - nextResult->applyStatusEffect( pStatusEffect ); + nextResult->applyStatusEffect( pStatusEffect, statusToSource ); moveToResultList( target, nextResult ); } diff --git a/src/world/Action/EffectBuilder.h b/src/world/Action/EffectBuilder.h index 232c98d4..78f020a2 100644 --- a/src/world/Action/EffectBuilder.h +++ b/src/world/Action/EffectBuilder.h @@ -36,8 +36,8 @@ namespace Sapphire::World::Action void comboSucceed( Entity::CharaPtr& target ); - void applyStatusEffect( Entity::CharaPtr& target, Entity::CharaPtr& source, uint16_t statusId, uint32_t duration, uint16_t param, uint64_t resultDelayMs = 500 ); - void applyStatusEffect( Entity::CharaPtr& target, Entity::CharaPtr& source, StatusEffect::StatusEffectPtr pStatusEffect, uint64_t resultDelayMs = 500 ); + void applyStatusEffect( Entity::CharaPtr& target, Entity::CharaPtr& source, uint16_t statusId, uint32_t duration, uint16_t param, uint64_t resultDelayMs = 500, bool statusToSource = false ); + void applyStatusEffect( Entity::CharaPtr& target, Entity::CharaPtr& source, StatusEffect::StatusEffectPtr pStatusEffect, uint64_t resultDelayMs = 500, bool statusToSource = false ); void statusNoEffect( Entity::CharaPtr& target, uint16_t statusId ); diff --git a/src/world/Action/EffectResult.cpp b/src/world/Action/EffectResult.cpp index dd025daf..c9a3cb3b 100644 --- a/src/world/Action/EffectResult.cpp +++ b/src/world/Action/EffectResult.cpp @@ -115,22 +115,24 @@ void EffectResult::comboSucceed() m_type = Common::ActionEffectType::ComboSucceed; } -void EffectResult::applyStatusEffect( uint16_t statusId, uint32_t duration, uint16_t param ) +void EffectResult::applyStatusEffect( uint16_t statusId, uint32_t duration, uint16_t param, bool statusToSource ) { m_value = statusId; m_statusDuration = duration; m_param2 = param; + m_flag = statusToSource ? Common::ActionEffectResultFlag::EffectOnSource : Common::ActionEffectResultFlag::None; - m_type = Common::ActionEffectType::ApplyStatusEffectTarget; + m_type = statusToSource ? Common::ActionEffectType::ApplyStatusEffectSource : Common::ActionEffectType::ApplyStatusEffectTarget; } -void EffectResult::applyStatusEffect( StatusEffect::StatusEffectPtr pStatusEffect ) +void EffectResult::applyStatusEffect( StatusEffect::StatusEffectPtr pStatusEffect, bool statusToSource ) { m_value = pStatusEffect->getId(); m_param2 = pStatusEffect->getParam(); m_pPreBuiltStatusEffect = std::move( pStatusEffect ); + m_flag = statusToSource ? Common::ActionEffectResultFlag::EffectOnSource : Common::ActionEffectResultFlag::None; - m_type = Common::ActionEffectType::ApplyStatusEffectTarget; + m_type = statusToSource ? Common::ActionEffectType::ApplyStatusEffectSource : Common::ActionEffectType::ApplyStatusEffectTarget; } void EffectResult::statusNoEffect( uint16_t statusId ) @@ -202,8 +204,9 @@ void EffectResult::execute() case Common::ActionEffectType::ApplyStatusEffectTarget: case Common::ActionEffectType::ApplyStatusEffectSource: { + auto applyTarget = m_type == Common::ActionEffectType::ApplyStatusEffectTarget ? m_target : m_source; //refreshing old buff - for( auto const& entry : m_target->getStatusEffectMap() ) + for( auto const& entry : applyTarget->getStatusEffectMap() ) { auto statusEffect = entry.second; if( statusEffect->getId() == m_value && statusEffect->getSrcActorId() == m_source->getId() ) @@ -216,17 +219,17 @@ void EffectResult::execute() { statusEffect->refresh(); } - m_target->sendStatusEffectUpdate(); + applyTarget->sendStatusEffectUpdate(); return; } } if( m_pPreBuiltStatusEffect ) { - m_target->addStatusEffect( m_pPreBuiltStatusEffect ); + applyTarget->addStatusEffect( m_pPreBuiltStatusEffect ); } else - m_target->addStatusEffectById( m_value, m_statusDuration, *m_source, m_param2 ); + applyTarget->addStatusEffectById( m_value, m_statusDuration, *m_source, m_param2 ); break; } diff --git a/src/world/Action/EffectResult.h b/src/world/Action/EffectResult.h index f2d04e2d..52ac289d 100644 --- a/src/world/Action/EffectResult.h +++ b/src/world/Action/EffectResult.h @@ -26,8 +26,8 @@ namespace Sapphire::World::Action void restoreMP( uint32_t amount, Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None ); void startCombo( uint16_t actionId ); void comboSucceed(); - void applyStatusEffect( uint16_t statusId, uint32_t duration, uint16_t param ); - void applyStatusEffect( StatusEffect::StatusEffectPtr pStatusEffect ); + void applyStatusEffect( uint16_t statusId, uint32_t duration, uint16_t param, bool statusToSource = false ); + void applyStatusEffect( StatusEffect::StatusEffectPtr pStatusEffect, bool statusToSource = false ); void statusNoEffect( uint16_t statusId ); void mount( uint16_t mountId ); void provoke(); From 0cf8009c3a2e5f578d23b06049926e337d8fae5f Mon Sep 17 00:00:00 2001 From: collett Date: Wed, 8 Mar 2023 04:12:52 +0900 Subject: [PATCH 3/3] first is not last --- src/world/Action/Action.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/world/Action/Action.cpp b/src/world/Action/Action.cpp index a2e99b73..8dfc6a43 100644 --- a/src/world/Action/Action.cpp +++ b/src/world/Action/Action.cpp @@ -696,8 +696,9 @@ void Action::Action::buildEffects() } } } + if( validVictimCounter == 0 ) + firstValidVictim = actor; validVictimCounter++; - firstValidVictim = actor; } }