diff --git a/src/world/Action/Action.cpp b/src/world/Action/Action.cpp index 1f3de39a..e93088f8 100644 --- a/src/world/Action/Action.cpp +++ b/src/world/Action/Action.cpp @@ -471,7 +471,7 @@ void Action::Action::buildEffects() if( !hasLutEntry || m_hitActors.empty() ) { // 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; } @@ -541,7 +541,7 @@ void Action::Action::buildEffects() } } - m_effectBuilder->buildAndSendPackets(); + m_effectBuilder->buildAndSendPackets( getAnimationLock() ); // at this point we're done with it and no longer need it m_effectBuilder.reset(); @@ -813,6 +813,22 @@ bool Action::Action::hasValidLutEntry() const m_lutEntry.rearPotency != 0 || m_lutEntry.curePotency != 0 || m_lutEntry.restoreMPPercentage != 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 355514b5..25115601 100644 --- a/src/world/Action/Action.h +++ b/src/world/Action/Action.h @@ -118,6 +118,8 @@ namespace Sapphire::World::Action */ Entity::CharaPtr getHitChara(); + float getAnimationLock(); + /*! * @brief Starts the cast. Finishes it immediately if there is no cast time (weaponskills). */ diff --git a/src/world/Action/EffectBuilder.cpp b/src/world/Action/EffectBuilder.cpp index 83803896..c4815cdb 100644 --- a/src/world/Action/EffectBuilder.cpp +++ b/src/world/Action/EffectBuilder.cpp @@ -91,7 +91,7 @@ void EffectBuilder::applyStatusEffect( Entity::CharaPtr& target, uint16_t status moveToResultList( target, nextResult ); } -void EffectBuilder::buildAndSendPackets() +void EffectBuilder::buildAndSendPackets( float animationLock ) { auto targetCount = m_resolvedEffects.size(); Logger::debug( "EffectBuilder result: " ); @@ -101,13 +101,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(); @@ -176,7 +176,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(); ) @@ -221,7 +221,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++ ) { @@ -249,7 +249,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 6a4aa240..0ff0251b 100644 --- a/src/world/Action/EffectBuilder.h +++ b/src/world/Action/EffectBuilder.h @@ -28,7 +28,7 @@ namespace Sapphire::World::Action void applyStatusEffect( Entity::CharaPtr& target, uint16_t statusId, uint8_t param ); - void buildAndSendPackets(); + void buildAndSendPackets( float animationLock ); private: @@ -36,7 +36,7 @@ namespace Sapphire::World::Action 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;