diff --git a/src/world/Actor/Chara.cpp b/src/world/Actor/Chara.cpp index a135f1e9..0cb1804f 100644 --- a/src/world/Actor/Chara.cpp +++ b/src/world/Actor/Chara.cpp @@ -562,7 +562,7 @@ void Sapphire::Entity::Chara::addStatusEffectByIdIfNotExist( uint32_t id, int32_ } void Sapphire::Entity::Chara::addStatusEffectByIdIfNotExist( uint32_t id, int32_t duration, Entity::Chara& source, - std::vector< World::Action::StatusModifier >& modifiers, uint16_t param ) + std::vector< World::Action::StatusModifier > modifiers, uint16_t param ) { if( hasStatusEffect( id ) ) return; @@ -590,6 +590,18 @@ void Sapphire::Entity::Chara::statusEffectFreeSlot( uint8_t slotId ) m_statusEffectFreeSlotQueue.push( slotId ); } +void Sapphire::Entity::Chara::replaceSingleStatusEffectById( uint32_t id ) +{ + for( const auto& effectIt : m_statusEffectMap ) + { + if( effectIt.second->getId() == id ) + { + removeStatusEffect( effectIt.first, false ); + break; + } + } +} + void Sapphire::Entity::Chara::removeSingleStatusEffectById( uint32_t id ) { for( const auto& effectIt : m_statusEffectMap ) @@ -602,7 +614,7 @@ void Sapphire::Entity::Chara::removeSingleStatusEffectById( uint32_t id ) } } -std::map< uint8_t, Sapphire::StatusEffect::StatusEffectPtr >::iterator Sapphire::Entity::Chara::removeStatusEffect( uint8_t effectSlotId ) +std::map< uint8_t, Sapphire::StatusEffect::StatusEffectPtr >::iterator Sapphire::Entity::Chara::removeStatusEffect( uint8_t effectSlotId, bool sendOrder ) { auto pEffectIt = m_statusEffectMap.find( effectSlotId ); if( pEffectIt == m_statusEffectMap.end() ) @@ -613,7 +625,8 @@ std::map< uint8_t, Sapphire::StatusEffect::StatusEffectPtr >::iterator Sapphire: auto pEffect = pEffectIt->second; pEffect->removeStatus(); - server().queueForPlayers( getInRangePlayerIds( isPlayer() ), makeActorControl( getId(), StatusEffectLose, pEffect->getId() ) ); + if( sendOrder ) + server().queueForPlayers( getInRangePlayerIds( isPlayer() ), makeActorControl( getId(), StatusEffectLose, pEffect->getId() ) ); auto it = m_statusEffectMap.erase( pEffectIt ); diff --git a/src/world/Actor/Chara.h b/src/world/Actor/Chara.h index a5c4de9c..089313ae 100644 --- a/src/world/Actor/Chara.h +++ b/src/world/Actor/Chara.h @@ -111,7 +111,9 @@ namespace Sapphire::Entity /// Status effect functions void addStatusEffect( StatusEffect::StatusEffectPtr pEffect ); - std::map< uint8_t, StatusEffect::StatusEffectPtr >::iterator removeStatusEffect( uint8_t effectSlotId ); + std::map< uint8_t, StatusEffect::StatusEffectPtr >::iterator removeStatusEffect( uint8_t effectSlotId, bool sendOrder = true ); + + void replaceSingleStatusEffectById( uint32_t id ); void removeSingleStatusEffectById( uint32_t id ); @@ -140,7 +142,8 @@ namespace Sapphire::Entity void addStatusEffectById( uint32_t id, int32_t duration, Entity::Chara& source, uint16_t param = 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, std::vector< World::Action::StatusModifier >& modifiers, uint16_t param = 0 ); + void addStatusEffectByIdIfNotExist( uint32_t id, int32_t duration, Entity::Chara& source, std::vector< World::Action::StatusModifier > modifiers, + uint16_t param = 0 ); // remove a status effect by id void removeSingleStatusEffectFromId( uint32_t id );