diff --git a/src/world/Action/Action.cpp b/src/world/Action/Action.cpp index 99aa456a..74918d30 100644 --- a/src/world/Action/Action.cpp +++ b/src/world/Action/Action.cpp @@ -439,7 +439,7 @@ void Action::Action::buildEffects() if( m_disableGenericHandler || !hasValidLutEntry() ) { // send any effect packet added by script or an empty one just to play animation for other players - m_effectBuilder->buildAndSendPackets(); + m_effectBuilder->buildAndSendPackets( getAnimationLock() ); return; } @@ -543,7 +543,7 @@ void Action::Action::buildEffects() m_effectBuilder->applyStatusEffect( m_pSource, m_pSource, m_lutEntry.selfStatus, m_lutEntry.selfStatusDuration, m_lutEntry.selfStatusParam ); } - m_effectBuilder->buildAndSendPackets(); + m_effectBuilder->buildAndSendPackets( getAnimationLock() ); // at this point we're done with it and no longer need it m_effectBuilder.reset(); @@ -815,6 +815,22 @@ bool Action::Action::hasValidLutEntry() const m_lutEntry.targetStatus != 0 || m_lutEntry.gainMPPercentage != 0; } +float Action::Action::getAnimationLock() +{ + switch( static_cast< Common::ActionCategory >( m_actionData->actionCategory ) ) + { + case Common::ActionCategory::Item: + { + return 1.1f; + } + case Common::ActionCategory::Mount: + { + return 0.1f; + } + } + return 0.6f; +} + Action::EffectBuilderPtr Action::Action::getEffectbuilder() { return m_effectBuilder; diff --git a/src/world/Action/Action.h b/src/world/Action/Action.h index 037ac94d..fa20f06f 100644 --- a/src/world/Action/Action.h +++ b/src/world/Action/Action.h @@ -129,6 +129,8 @@ namespace Sapphire::World::Action ActionEntry getActionEntry() const; + float getAnimationLock(); + bool isPhysical() const; bool isMagical() const; diff --git a/src/world/Action/EffectBuilder.cpp b/src/world/Action/EffectBuilder.cpp index 54f0c4d1..81dc218b 100644 --- a/src/world/Action/EffectBuilder.cpp +++ b/src/world/Action/EffectBuilder.cpp @@ -105,7 +105,7 @@ void EffectBuilder::statusNoEffect( Entity::CharaPtr& target, uint16_t statusId moveToResultList( target, nextResult ); } -void EffectBuilder::buildAndSendPackets() +void EffectBuilder::buildAndSendPackets( float animationLock ) { auto targetCount = m_resolvedEffects.size(); //Logger::debug( "EffectBuilder result: " ); @@ -115,13 +115,13 @@ void EffectBuilder::buildAndSendPackets() do // we want to send at least one packet even nothing is hit so other players can see { - auto packet = buildNextEffectPacket( globalSequence ); + auto packet = buildNextEffectPacket( globalSequence, animationLock ); m_sourceChara->sendToInRangeSet( packet, true ); } while( !m_resolvedEffects.empty() ); } -std::shared_ptr< FFXIVPacketBase > EffectBuilder::buildNextEffectPacket( uint32_t globalSequence ) +std::shared_ptr< FFXIVPacketBase > EffectBuilder::buildNextEffectPacket( uint32_t globalSequence, float animationLock ) { auto remainingTargetCount = m_resolvedEffects.size(); @@ -190,7 +190,7 @@ std::shared_ptr< FFXIVPacketBase > EffectBuilder::buildNextEffectPacket( uint32_ pHeader->effectCount = static_cast< uint8_t >( remainingTargetCount > packetSize ? packetSize : remainingTargetCount ); pHeader->sourceSequence = m_sequence; pHeader->globalSequence = globalSequence; - pHeader->animationLockTime = 0.6f; + pHeader->animationLockTime = animationLock; uint8_t targetIndex = 0; for( auto it = m_resolvedEffects.begin(); it != m_resolvedEffects.end(); ) @@ -235,7 +235,7 @@ std::shared_ptr< FFXIVPacketBase > EffectBuilder::buildNextEffectPacket( uint32_ auto effectPacket = std::make_shared< Server::EffectPacket >( m_sourceChara->getId(), firstResult->getTarget()->getId(), m_actionId ); effectPacket->setRotation( Common::Util::floatToUInt16Rot( m_sourceChara->getRot() ) ); effectPacket->setSequence( seq, m_sequence ); - effectPacket->data().animationLockTime = 0.6f; + effectPacket->data().animationLockTime = animationLock; for( int i = 0; i < resultList->size(); i++ ) { @@ -263,7 +263,7 @@ std::shared_ptr< FFXIVPacketBase > EffectBuilder::buildNextEffectPacket( uint32_ effectPacket->data().effectCount = 0; effectPacket->data().sourceSequence = m_sequence; effectPacket->data().globalSequence = globalSequence; - effectPacket->data().animationLockTime = 0.6f; + effectPacket->data().animationLockTime = animationLock; return effectPacket; } diff --git a/src/world/Action/EffectBuilder.h b/src/world/Action/EffectBuilder.h index 5ceb9504..7d268f83 100644 --- a/src/world/Action/EffectBuilder.h +++ b/src/world/Action/EffectBuilder.h @@ -31,14 +31,14 @@ namespace Sapphire::World::Action void statusNoEffect( Entity::CharaPtr& target, uint16_t statusId ); - void buildAndSendPackets(); + void buildAndSendPackets( float animationLock ); private: void moveToResultList( Entity::CharaPtr& chara, EffectResultPtr result ); uint64_t getResultDelayMs(); - std::shared_ptr< Sapphire::Network::Packets::FFXIVPacketBase > buildNextEffectPacket( uint32_t globalSequence ); + std::shared_ptr< Sapphire::Network::Packets::FFXIVPacketBase > buildNextEffectPacket( uint32_t globalSequence, float animationLock ); private: uint32_t m_actionId;