mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-06-07 08:37:45 +00:00
Merge pull request #959 from arieshi255/actions-fixup
[3.x] WIP: Cleanup of initial action implementation
This commit is contained in:
commit
52dfd3a2f6
13 changed files with 46 additions and 33 deletions
2
deps/datReader/Exd/Structs.h
vendored
2
deps/datReader/Exd/Structs.h
vendored
|
@ -430,7 +430,7 @@ namespace Excel
|
|||
uint8_t HideCastBar : 1;
|
||||
uint8_t IsTargetLine : 1;
|
||||
|
||||
int8_t unknown : 8;
|
||||
int8_t unknown;
|
||||
};
|
||||
|
||||
/* 75653 */
|
||||
|
|
|
@ -15,12 +15,7 @@ public:
|
|||
|
||||
void onExpire( Entity::Chara& actor ) override
|
||||
{
|
||||
actor.removeSingleStatusEffectById( Unchained );
|
||||
actor.removeSingleStatusEffectById( Wrath );
|
||||
actor.removeSingleStatusEffectById( WrathII );
|
||||
actor.removeSingleStatusEffectById( WrathIII );
|
||||
actor.removeSingleStatusEffectById( WrathIV );
|
||||
actor.removeSingleStatusEffectById( Infuriated );
|
||||
actor.removeStatusEffectById( { Unchained, Wrath, WrathII, WrathIII, WrathIV, Infuriated } );
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ struct StatusModifier
|
|||
struct StatusEntry
|
||||
{
|
||||
uint16_t id;
|
||||
int32_t duration;
|
||||
uint32_t duration;
|
||||
uint32_t flag;
|
||||
std::vector< StatusModifier > modifiers;
|
||||
};
|
||||
|
|
|
@ -592,15 +592,13 @@ void Action::Action::buildActionResults()
|
|||
}
|
||||
|
||||
// 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 );
|
||||
}
|
||||
|
||||
handleJobAction();
|
||||
|
||||
if( m_lutEntry.statuses.caster.size() > 0 || m_lutEntry.statuses.target.size() > 0 )
|
||||
handleStatusEffects();
|
||||
handleStatusEffects();
|
||||
|
||||
m_actionResultBuilder->sendActionResults( m_hitActors );
|
||||
|
||||
|
@ -620,25 +618,25 @@ void Action::Action::handleStatusEffects()
|
|||
return;
|
||||
|
||||
// handle caster statuses
|
||||
if( m_lutEntry.statuses.caster.size() > 0 )
|
||||
if( !m_lutEntry.statuses.caster.empty() )
|
||||
{
|
||||
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
|
||||
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& 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 );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@ namespace Sapphire::World::Action
|
|||
struct StatusEntry
|
||||
{
|
||||
uint16_t id;
|
||||
int32_t duration;
|
||||
uint32_t duration;
|
||||
uint32_t flag;
|
||||
std::vector< StatusModifier > modifiers;
|
||||
};
|
||||
|
|
|
@ -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,
|
||||
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.Arg2 = param;
|
||||
|
@ -101,7 +101,7 @@ void ActionResult::applyStatusEffectSelf( uint32_t id, int32_t duration, uint8_t
|
|||
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 )
|
||||
{
|
||||
m_result.Value = static_cast< int16_t >( id );
|
||||
|
|
|
@ -22,9 +22,9 @@ namespace Sapphire::World::Action
|
|||
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,
|
||||
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, 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 );
|
||||
void mount( uint16_t mountId );
|
||||
|
||||
|
|
|
@ -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,
|
||||
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 );
|
||||
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 );
|
||||
}
|
||||
|
||||
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 )
|
||||
{
|
||||
ActionResultPtr nextResult = make_ActionResult( m_sourceChara );
|
||||
|
|
|
@ -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,
|
||||
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, 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 );
|
||||
|
||||
void mount( Entity::CharaPtr& target, uint16_t mountId );
|
||||
|
|
|
@ -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 )
|
||||
{
|
||||
for( auto effectIt = m_statusEffectMap.begin(); effectIt != m_statusEffectMap.end(); )
|
||||
|
|
|
@ -114,6 +114,8 @@ namespace Sapphire::Entity
|
|||
|
||||
void removeSingleStatusEffectById( uint32_t id );
|
||||
|
||||
void removeStatusEffectById( std::vector< uint32_t > ids );
|
||||
|
||||
void removeStatusEffectByFlag( Common::StatusEffectFlag flag );
|
||||
|
||||
void updateStatusEffects();
|
||||
|
|
|
@ -22,11 +22,11 @@ using namespace Sapphire::Network::Packets;
|
|||
//using namespace Sapphire::Network::Packets::WorldPackets::Server;
|
||||
|
||||
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 ) :
|
||||
StatusEffect( id, sourceActor, targetActor, duration, tickRate )
|
||||
{
|
||||
m_statusModifiers = std::move( modifiers );
|
||||
m_statusModifiers = modifiers;
|
||||
m_flag = flag;
|
||||
}
|
||||
|
||||
|
@ -109,7 +109,7 @@ uint16_t Sapphire::StatusEffect::StatusEffect::getParam() const
|
|||
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;
|
||||
}
|
||||
|
@ -196,7 +196,7 @@ uint32_t Sapphire::StatusEffect::StatusEffect::getFlag() const
|
|||
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;
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ class StatusEffect
|
|||
{
|
||||
public:
|
||||
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,
|
||||
uint32_t duration, uint32_t tickRate );
|
||||
|
@ -21,7 +21,7 @@ public:
|
|||
|
||||
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 );
|
||||
|
||||
|
@ -50,7 +50,7 @@ public:
|
|||
|
||||
uint32_t getFlag() const;
|
||||
|
||||
std::vector< World::Action::StatusModifier > getStatusModifiers() const;
|
||||
const std::vector< World::Action::StatusModifier >& getStatusModifiers() const;
|
||||
|
||||
void setLastTick( uint64_t lastTick );
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue