From 5b059004555dc31c504cb4e9d348efd11c413ca3 Mon Sep 17 00:00:00 2001 From: collett Date: Tue, 14 Jan 2020 17:38:09 +0900 Subject: [PATCH] refreshed status keeps its old last tick time --- src/world/Action/EffectResult.cpp | 8 +++++++- src/world/Actor/Chara.cpp | 6 ++++-- src/world/Actor/Chara.h | 4 ++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/world/Action/EffectResult.cpp b/src/world/Action/EffectResult.cpp index 1b5c5587..27b44a5f 100644 --- a/src/world/Action/EffectResult.cpp +++ b/src/world/Action/EffectResult.cpp @@ -148,12 +148,14 @@ void EffectResult::execute() case Common::ActionEffectType::ApplyStatusEffect: { + uint64_t lastTickOverride = 0; //remove same effect from the same source (refreshing old buff) for( auto const& entry : m_target->getStatusEffectMap() ) { auto statusEffect = entry.second; if( statusEffect->getId() == m_value && statusEffect->getSrcActorId() == m_source->getId() ) { + lastTickOverride = statusEffect->getLastTickMs(); // refreshing does not show "-status" flying text, and we don't send status list now because we are adding a new one m_target->removeStatusEffect( entry.first, false, false ); break; @@ -161,9 +163,13 @@ void EffectResult::execute() } if( m_pPreBuiltStatusEffect ) + { + m_pPreBuiltStatusEffect->setLastTick( lastTickOverride ); m_target->addStatusEffect( m_pPreBuiltStatusEffect ); + } else - m_target->addStatusEffectById( m_value, m_value2, *m_source, m_param2 ); + m_target->addStatusEffectById( m_value, m_value2, *m_source, m_param2, lastTickOverride ); + break; } diff --git a/src/world/Actor/Chara.cpp b/src/world/Actor/Chara.cpp index 7b977408..d4db062c 100644 --- a/src/world/Actor/Chara.cpp +++ b/src/world/Actor/Chara.cpp @@ -536,20 +536,22 @@ void Sapphire::Entity::Chara::addStatusEffect( StatusEffect::StatusEffectPtr pEf sendStatusEffectUpdate(); // although client buff displays correctly without this but retail sends it so we do it as well } -void Sapphire::Entity::Chara::addStatusEffectById( uint32_t id, int32_t duration, Entity::Chara& source, uint16_t param ) +void Sapphire::Entity::Chara::addStatusEffectById( uint32_t id, int32_t duration, Entity::Chara& source, uint16_t param, uint64_t lastTickOverride ) { auto effect = StatusEffect::make_StatusEffect( id, source.getAsChara(), getAsChara(), duration, 3000, m_pFw ); effect->setParam( param ); + effect->setLastTick( lastTickOverride ); addStatusEffect( effect ); } -void Sapphire::Entity::Chara::addStatusEffectByIdIfNotExist( uint32_t id, int32_t duration, Entity::Chara& source, uint16_t param ) +void Sapphire::Entity::Chara::addStatusEffectByIdIfNotExist( uint32_t id, int32_t duration, Entity::Chara& source, uint16_t param, uint64_t lastTickOverride ) { if( getStatusEffectById( id ).second ) return; auto effect = StatusEffect::make_StatusEffect( id, source.getAsChara(), getAsChara(), duration, 3000, m_pFw ); effect->setParam( param ); + effect->setLastTick( lastTickOverride ); addStatusEffect( effect ); } diff --git a/src/world/Actor/Chara.h b/src/world/Actor/Chara.h index 62476df7..62388701 100644 --- a/src/world/Actor/Chara.h +++ b/src/world/Actor/Chara.h @@ -174,10 +174,10 @@ namespace Sapphire::Entity const uint32_t* getModelArray() const; // add a status effect by id - void addStatusEffectById( uint32_t id, int32_t duration, Entity::Chara& source, uint16_t param = 0 ); + void addStatusEffectById( uint32_t id, int32_t duration, Entity::Chara& source, uint16_t param = 0, uint64_t lastTickOverride = 0 ); // add a status effect by id if it doesn't exist - void addStatusEffectByIdIfNotExist( uint32_t id, int32_t duration, Entity::Chara& source, uint16_t param = 0 ); + void addStatusEffectByIdIfNotExist( uint32_t id, int32_t duration, Entity::Chara& source, uint16_t param = 0, uint64_t lastTickOverride = 0 ); /// End Status Effect Functions