1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-06-07 16:47:44 +00:00

Merge pull request #959 from arieshi255/actions-fixup

[3.x] WIP: Cleanup of initial action implementation
This commit is contained in:
Mordred 2024-06-21 22:09:35 +02:00 committed by GitHub
commit 52dfd3a2f6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 46 additions and 33 deletions

View file

@ -430,7 +430,7 @@ namespace Excel
uint8_t HideCastBar : 1; uint8_t HideCastBar : 1;
uint8_t IsTargetLine : 1; uint8_t IsTargetLine : 1;
int8_t unknown : 8; int8_t unknown;
}; };
/* 75653 */ /* 75653 */

View file

@ -15,12 +15,7 @@ public:
void onExpire( Entity::Chara& actor ) override void onExpire( Entity::Chara& actor ) override
{ {
actor.removeSingleStatusEffectById( Unchained ); actor.removeStatusEffectById( { Unchained, Wrath, WrathII, WrathIII, WrathIV, Infuriated } );
actor.removeSingleStatusEffectById( Wrath );
actor.removeSingleStatusEffectById( WrathII );
actor.removeSingleStatusEffectById( WrathIII );
actor.removeSingleStatusEffectById( WrathIV );
actor.removeSingleStatusEffectById( Infuriated );
} }
}; };

View file

@ -40,7 +40,7 @@ struct StatusModifier
struct StatusEntry struct StatusEntry
{ {
uint16_t id; uint16_t id;
int32_t duration; uint32_t duration;
uint32_t flag; uint32_t flag;
std::vector< StatusModifier > modifiers; std::vector< StatusModifier > modifiers;
}; };

View file

@ -592,15 +592,13 @@ void Action::Action::buildActionResults()
} }
// If we hit an enemy // If we hit an enemy
if( m_hitActors.size() > 0 && getHitChara()->getObjKind() != m_pSource->getObjKind() ) if( !m_hitActors.empty() && getHitChara()->getObjKind() != m_pSource->getObjKind() )
{ {
m_pSource->removeStatusEffectByFlag( Common::StatusEffectFlag::RemoveOnSuccessfulHit ); m_pSource->removeStatusEffectByFlag( Common::StatusEffectFlag::RemoveOnSuccessfulHit );
} }
handleJobAction(); handleJobAction();
handleStatusEffects();
if( m_lutEntry.statuses.caster.size() > 0 || m_lutEntry.statuses.target.size() > 0 )
handleStatusEffects();
m_actionResultBuilder->sendActionResults( m_hitActors ); m_actionResultBuilder->sendActionResults( m_hitActors );
@ -620,25 +618,25 @@ void Action::Action::handleStatusEffects()
return; return;
// handle caster statuses // handle caster statuses
if( m_lutEntry.statuses.caster.size() > 0 ) if( !m_lutEntry.statuses.caster.empty() )
{ {
for( auto& status : m_lutEntry.statuses.caster ) for( auto& status : m_lutEntry.statuses.caster )
{ {
pActionBuilder->applyStatusEffectSelf( status.id, status.duration, 0, status.modifiers, status.flag, true ); pActionBuilder->applyStatusEffectSelf( status.id, status.duration, 0, std::move( status.modifiers ), status.flag, true );
} }
} }
// handle hit actor statuses // handle hit actor statuses
if( m_lutEntry.statuses.target.size() > 0 && m_hitActors.size() > 0 ) if( !m_lutEntry.statuses.target.empty() && !m_hitActors.empty() )
{ {
for( auto& actor : m_hitActors ) for( auto& actor : m_hitActors )
{ {
for( auto& status : m_lutEntry.statuses.target ) for( auto& status : m_lutEntry.statuses.target )
{ {
pActionBuilder->applyStatusEffect( actor, status.id, status.duration, 0, status.modifiers, status.flag, true ); pActionBuilder->applyStatusEffect( actor, status.id, status.duration, 0, std::move( status.modifiers ), status.flag, true );
} }
if( actor->getStatusEffectMap().size() > 0 ) if( !actor->getStatusEffectMap().empty() )
actor->onActionHostile( m_pSource ); actor->onActionHostile( m_pSource );
} }
} }

View file

@ -17,7 +17,7 @@ namespace Sapphire::World::Action
struct StatusEntry struct StatusEntry
{ {
uint16_t id; uint16_t id;
int32_t duration; uint32_t duration;
uint32_t flag; uint32_t flag;
std::vector< StatusModifier > modifiers; std::vector< StatusModifier > modifiers;
}; };

View file

@ -78,7 +78,7 @@ void ActionResult::applyStatusEffect( uint32_t id, int32_t duration, Entity::Cha
} }
void ActionResult::applyStatusEffect( uint32_t id, int32_t duration, Entity::Chara& source, uint8_t 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 ) const std::vector< StatusModifier >& modifiers, uint32_t flag, bool shouldOverride )
{ {
m_result.Value = static_cast< int16_t >( id ); m_result.Value = static_cast< int16_t >( id );
m_result.Arg2 = param; m_result.Arg2 = param;
@ -101,7 +101,7 @@ void ActionResult::applyStatusEffectSelf( uint32_t id, int32_t duration, uint8_t
m_pStatus->setParam( param ); m_pStatus->setParam( param );
} }
void ActionResult::applyStatusEffectSelf( uint32_t id, int32_t duration, uint8_t param, std::vector< World::Action::StatusModifier > modifiers, void ActionResult::applyStatusEffectSelf( uint32_t id, int32_t duration, uint8_t param, const std::vector< World::Action::StatusModifier >& modifiers,
uint32_t flag, bool shouldOverride ) uint32_t flag, bool shouldOverride )
{ {
m_result.Value = static_cast< int16_t >( id ); m_result.Value = static_cast< int16_t >( id );

View file

@ -22,9 +22,9 @@ namespace Sapphire::World::Action
void comboSucceed(); void comboSucceed();
void applyStatusEffect( uint32_t id, int32_t duration, Entity::Chara& source, uint8_t param, bool shouldOverride ); void applyStatusEffect( uint32_t id, int32_t duration, Entity::Chara& source, uint8_t param, bool shouldOverride );
void applyStatusEffect( uint32_t id, int32_t duration, Entity::Chara& source, uint8_t param, void applyStatusEffect( uint32_t id, int32_t duration, Entity::Chara& source, uint8_t param,
std::vector< World::Action::StatusModifier > modifiers, uint32_t flag, bool shouldOverride ); const std::vector< World::Action::StatusModifier >& modifiers, uint32_t flag, bool shouldOverride );
void applyStatusEffectSelf( uint32_t id, int32_t duration, uint8_t param, bool shouldOverride ); void applyStatusEffectSelf( uint32_t id, int32_t duration, uint8_t param, bool shouldOverride );
void applyStatusEffectSelf( uint32_t id, int32_t duration, uint8_t param, std::vector< World::Action::StatusModifier > modifiers, void applyStatusEffectSelf( uint32_t id, int32_t duration, uint8_t param, const std::vector< World::Action::StatusModifier >& modifiers,
uint32_t flag, bool shouldOverride ); uint32_t flag, bool shouldOverride );
void mount( uint16_t mountId ); void mount( uint16_t mountId );

View file

@ -94,7 +94,7 @@ void ActionResultBuilder::applyStatusEffect( Entity::CharaPtr& target, uint16_t
} }
void ActionResultBuilder::applyStatusEffect( Entity::CharaPtr& target, uint16_t statusId, uint32_t duration, uint8_t param, void ActionResultBuilder::applyStatusEffect( Entity::CharaPtr& target, uint16_t statusId, uint32_t duration, uint8_t param,
std::vector< World::Action::StatusModifier > modifiers, uint32_t flag, bool shouldOverride ) const std::vector< World::Action::StatusModifier >& modifiers, uint32_t flag, bool shouldOverride )
{ {
ActionResultPtr nextResult = make_ActionResult( target ); ActionResultPtr nextResult = make_ActionResult( target );
nextResult->applyStatusEffect( statusId, duration, *m_sourceChara, param, modifiers, flag, shouldOverride ); nextResult->applyStatusEffect( statusId, duration, *m_sourceChara, param, modifiers, flag, shouldOverride );
@ -108,7 +108,7 @@ void ActionResultBuilder::applyStatusEffectSelf( uint16_t statusId, uint32_t dur
addResultToActor( m_sourceChara, nextResult ); addResultToActor( m_sourceChara, nextResult );
} }
void ActionResultBuilder::applyStatusEffectSelf( uint16_t statusId, uint32_t duration, uint8_t param, std::vector< World::Action::StatusModifier > modifiers, void ActionResultBuilder::applyStatusEffectSelf( uint16_t statusId, uint32_t duration, uint8_t param, const std::vector< World::Action::StatusModifier >& modifiers,
uint32_t flag, bool shouldOverride ) uint32_t flag, bool shouldOverride )
{ {
ActionResultPtr nextResult = make_ActionResult( m_sourceChara ); ActionResultPtr nextResult = make_ActionResult( m_sourceChara );

View file

@ -28,9 +28,9 @@ namespace Sapphire::World::Action
void applyStatusEffect( Entity::CharaPtr& target, uint16_t statusId, uint32_t duration, uint8_t param, bool shouldOverride = false ); void applyStatusEffect( Entity::CharaPtr& target, uint16_t statusId, uint32_t duration, uint8_t param, bool shouldOverride = false );
void applyStatusEffect( Entity::CharaPtr& target, uint16_t statusId, uint32_t duration, uint8_t param, void applyStatusEffect( Entity::CharaPtr& target, uint16_t statusId, uint32_t duration, uint8_t param,
std::vector< World::Action::StatusModifier > modifiers, uint32_t flag = 0, bool shouldOverride = false ); const std::vector< World::Action::StatusModifier >& modifiers, uint32_t flag = 0, bool shouldOverride = false );
void applyStatusEffectSelf( uint16_t statusId, uint32_t duration, uint8_t param, bool shouldOverride = false ); void applyStatusEffectSelf( uint16_t statusId, uint32_t duration, uint8_t param, bool shouldOverride = false );
void applyStatusEffectSelf( uint16_t statusId, uint32_t duration, uint8_t param, std::vector< World::Action::StatusModifier > modifiers, void applyStatusEffectSelf( uint16_t statusId, uint32_t duration, uint8_t param, const std::vector< World::Action::StatusModifier >& modifiers,
uint32_t flag = 0, bool shouldOverride = false ); uint32_t flag = 0, bool shouldOverride = false );
void mount( Entity::CharaPtr& target, uint16_t mountId ); void mount( Entity::CharaPtr& target, uint16_t mountId );

View file

@ -559,6 +559,24 @@ void Chara::removeSingleStatusEffectById( uint32_t id )
} }
} }
void Chara::removeStatusEffectById( std::vector< uint32_t > ids )
{
for( auto effectIt = m_statusEffectMap.begin(); effectIt != m_statusEffectMap.end(); )
{
auto foundStatus = std::find( ids.begin(), ids.end(), effectIt->second->getId() );
if( foundStatus != ids.end() )
{
effectIt = removeStatusEffect( effectIt->first );
ids.erase( foundStatus );
}
else
{
++effectIt;
}
}
}
void Chara::removeStatusEffectByFlag( Common::StatusEffectFlag flag ) void Chara::removeStatusEffectByFlag( Common::StatusEffectFlag flag )
{ {
for( auto effectIt = m_statusEffectMap.begin(); effectIt != m_statusEffectMap.end(); ) for( auto effectIt = m_statusEffectMap.begin(); effectIt != m_statusEffectMap.end(); )

View file

@ -114,6 +114,8 @@ namespace Sapphire::Entity
void removeSingleStatusEffectById( uint32_t id ); void removeSingleStatusEffectById( uint32_t id );
void removeStatusEffectById( std::vector< uint32_t > ids );
void removeStatusEffectByFlag( Common::StatusEffectFlag flag ); void removeStatusEffectByFlag( Common::StatusEffectFlag flag );
void updateStatusEffects(); void updateStatusEffects();

View file

@ -22,11 +22,11 @@ using namespace Sapphire::Network::Packets;
//using namespace Sapphire::Network::Packets::WorldPackets::Server; //using namespace Sapphire::Network::Packets::WorldPackets::Server;
Sapphire::StatusEffect::StatusEffect::StatusEffect( uint32_t id, Entity::CharaPtr sourceActor, Entity::CharaPtr targetActor, Sapphire::StatusEffect::StatusEffect::StatusEffect( uint32_t id, Entity::CharaPtr sourceActor, Entity::CharaPtr targetActor,
uint32_t duration,std::vector< World::Action::StatusModifier >& modifiers, uint32_t duration, const std::vector< World::Action::StatusModifier >& modifiers,
uint32_t flag, uint32_t tickRate ) : uint32_t flag, uint32_t tickRate ) :
StatusEffect( id, sourceActor, targetActor, duration, tickRate ) StatusEffect( id, sourceActor, targetActor, duration, tickRate )
{ {
m_statusModifiers = std::move( modifiers ); m_statusModifiers = modifiers;
m_flag = flag; m_flag = flag;
} }
@ -109,7 +109,7 @@ uint16_t Sapphire::StatusEffect::StatusEffect::getParam() const
return m_param; return m_param;
} }
std::unordered_map< Common::ParamModifier, int32_t >& Sapphire::StatusEffect::StatusEffect::getModifiers() const std::unordered_map< Common::ParamModifier, int32_t >& Sapphire::StatusEffect::StatusEffect::getModifiers() const
{ {
return m_modifiers; return m_modifiers;
} }
@ -196,7 +196,7 @@ uint32_t Sapphire::StatusEffect::StatusEffect::getFlag() const
return m_flag; return m_flag;
} }
std::vector< World::Action::StatusModifier > Sapphire::StatusEffect::StatusEffect::getStatusModifiers() const const std::vector< World::Action::StatusModifier >& Sapphire::StatusEffect::StatusEffect::getStatusModifiers() const
{ {
return m_statusModifiers; return m_statusModifiers;
} }

View file

@ -12,7 +12,7 @@ class StatusEffect
{ {
public: public:
StatusEffect( uint32_t id, Entity::CharaPtr sourceActor, Entity::CharaPtr targetActor, StatusEffect( uint32_t id, Entity::CharaPtr sourceActor, Entity::CharaPtr targetActor,
uint32_t duration, std::vector< World::Action::StatusModifier >& modifiers, uint32_t flag, uint32_t tickRate ); uint32_t duration, const std::vector< World::Action::StatusModifier >& modifiers, uint32_t flag, uint32_t tickRate );
StatusEffect( uint32_t id, Entity::CharaPtr sourceActor, Entity::CharaPtr targetActor, StatusEffect( uint32_t id, Entity::CharaPtr sourceActor, Entity::CharaPtr targetActor,
uint32_t duration, uint32_t tickRate ); uint32_t duration, uint32_t tickRate );
@ -21,7 +21,7 @@ public:
void onTick(); void onTick();
std::unordered_map< Common::ParamModifier, int32_t >& getModifiers(); const std::unordered_map< Common::ParamModifier, int32_t >& getModifiers() const;
void setModifier( Common::ParamModifier paramModifier, int32_t value ); void setModifier( Common::ParamModifier paramModifier, int32_t value );
@ -50,7 +50,7 @@ public:
uint32_t getFlag() const; uint32_t getFlag() const;
std::vector< World::Action::StatusModifier > getStatusModifiers() const; const std::vector< World::Action::StatusModifier >& getStatusModifiers() const;
void setLastTick( uint64_t lastTick ); void setLastTick( uint64_t lastTick );