From 3b3398e3e085e0cd294526877aa41535e03d11ad Mon Sep 17 00:00:00 2001 From: collett Date: Sun, 19 Jan 2020 20:53:56 +0900 Subject: [PATCH] fix code following some commented things from old pr that are obvious better --- src/world/Action/Action.cpp | 14 +++++++++----- src/world/Action/EffectBuilder.cpp | 30 ++++++++++++++++++------------ src/world/Action/EffectBuilder.h | 7 +++++-- src/world/Action/EffectResult.cpp | 5 +++++ src/world/Action/EffectResult.h | 1 + src/world/Actor/Chara.cpp | 6 +++--- 6 files changed, 41 insertions(+), 22 deletions(-) diff --git a/src/world/Action/Action.cpp b/src/world/Action/Action.cpp index 739520bb..53529af1 100644 --- a/src/world/Action/Action.cpp +++ b/src/world/Action/Action.cpp @@ -146,6 +146,8 @@ bool Action::Action::init() addDefaultActorFilters(); + m_effectBuilder->setAnimationLock( getAnimationLock() ); + return true; } @@ -295,11 +297,13 @@ void Action::Action::start() } } - // todo: m_recastTimeMs needs to be adjusted for player sks/sps - auto actionStartPkt = makeActorControlSelf( m_pSource->getId(), ActorControlType::ActionStart, 1, getId(), - m_recastTimeMs / 10 ); if( player ) + { + // todo: m_recastTimeMs needs to be adjusted for player sks/sps + auto actionStartPkt = makeActorControlSelf( m_pSource->getId(), ActorControlType::ActionStart, 1, getId(), + m_recastTimeMs / 10 ); player->queuePacket( actionStartPkt ); + } auto pScriptMgr = m_pFw->get< Scripting::ScriptMgr >(); @@ -447,7 +451,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( getAnimationLock() ); + m_effectBuilder->buildAndSendPackets(); return; } @@ -551,7 +555,7 @@ void Action::Action::buildEffects() m_effectBuilder->applyStatusEffect( m_pSource, m_pSource, m_lutEntry.selfStatus, m_lutEntry.selfStatusDuration, m_lutEntry.selfStatusParam ); } - m_effectBuilder->buildAndSendPackets( getAnimationLock() ); + m_effectBuilder->buildAndSendPackets(); // at this point we're done with it and no longer need it m_effectBuilder.reset(); diff --git a/src/world/Action/EffectBuilder.cpp b/src/world/Action/EffectBuilder.cpp index 057a1540..b28b872a 100644 --- a/src/world/Action/EffectBuilder.cpp +++ b/src/world/Action/EffectBuilder.cpp @@ -19,6 +19,7 @@ using namespace Sapphire::Network::Packets; EffectBuilder::EffectBuilder( Entity::CharaPtr source, uint32_t actionId, uint16_t sequence ) : m_sourceChara( std::move( source ) ), m_actionId( actionId ), + m_animationLock( 0.6f ), m_sequence( sequence ) { @@ -44,35 +45,35 @@ void EffectBuilder::moveToResultList( Entity::CharaPtr& chara, EffectResultPtr r void EffectBuilder::heal( Entity::CharaPtr& effectTarget, Entity::CharaPtr& healingTarget, uint32_t amount, Common::ActionHitSeverityType severity, Common::ActionEffectResultFlag flag, uint64_t resultDelayMs ) { - EffectResultPtr nextResult = make_EffectResult( healingTarget, nullptr, Common::Util::getTimeMs() + resultDelayMs ); + EffectResultPtr nextResult = make_EffectResult( healingTarget, Common::Util::getTimeMs() + resultDelayMs ); nextResult->heal( amount, severity, flag ); moveToResultList( effectTarget, nextResult ); } void EffectBuilder::restoreMP( Entity::CharaPtr& target, Entity::CharaPtr& restoringTarget, uint32_t amount, Common::ActionEffectResultFlag flag, uint64_t resultDelayMs ) { - EffectResultPtr nextResult = make_EffectResult( restoringTarget, nullptr, Common::Util::getTimeMs() + resultDelayMs ); + EffectResultPtr nextResult = make_EffectResult( restoringTarget, Common::Util::getTimeMs() + resultDelayMs ); nextResult->restoreMP( amount, flag ); moveToResultList( target, nextResult ); } void EffectBuilder::damage( Entity::CharaPtr& effectTarget, Entity::CharaPtr& damagingTarget, uint32_t amount, Common::ActionHitSeverityType severity, Common::ActionEffectResultFlag flag, uint64_t resultDelayMs ) { - EffectResultPtr nextResult = make_EffectResult( damagingTarget, nullptr, Common::Util::getTimeMs() + resultDelayMs ); + EffectResultPtr nextResult = make_EffectResult( damagingTarget, Common::Util::getTimeMs() + resultDelayMs ); nextResult->damage( amount, severity, flag ); moveToResultList( effectTarget, nextResult ); } void EffectBuilder::startCombo( Entity::CharaPtr& target, uint16_t actionId ) { - EffectResultPtr nextResult = make_EffectResult( target, nullptr, 0 ); + EffectResultPtr nextResult = make_EffectResult( target, 0 ); nextResult->startCombo( actionId ); moveToResultList( target, nextResult ); } void EffectBuilder::comboSucceed( Entity::CharaPtr& target ) { - EffectResultPtr nextResult = make_EffectResult( target, nullptr, 0 ); + EffectResultPtr nextResult = make_EffectResult( target, 0 ); nextResult->comboSucceed(); moveToResultList( target, nextResult ); } @@ -93,12 +94,17 @@ void EffectBuilder::applyStatusEffect( Entity::CharaPtr& target, Entity::CharaPt void EffectBuilder::statusNoEffect( Entity::CharaPtr& target, uint16_t statusId ) { - EffectResultPtr nextResult = make_EffectResult( target, nullptr, 0 ); + EffectResultPtr nextResult = make_EffectResult( target, 0 ); nextResult->statusNoEffect( statusId ); moveToResultList( target, nextResult ); } -void EffectBuilder::buildAndSendPackets( float animationLock ) +void EffectBuilder::setAnimationLock( float animationLock ) +{ + m_animationLock = animationLock; +} + +void EffectBuilder::buildAndSendPackets() { auto targetCount = m_resolvedEffects.size(); //Logger::debug( "EffectBuilder result: " ); @@ -108,13 +114,13 @@ void EffectBuilder::buildAndSendPackets( float animationLock ) do // we want to send at least one packet even nothing is hit so other players can see { - auto packet = buildNextEffectPacket( globalSequence, animationLock ); + auto packet = buildNextEffectPacket( globalSequence ); m_sourceChara->sendToInRangeSet( packet, true ); } while( !m_resolvedEffects.empty() ); } -std::shared_ptr< FFXIVPacketBase > EffectBuilder::buildNextEffectPacket( uint32_t globalSequence, float animationLock ) +std::shared_ptr< FFXIVPacketBase > EffectBuilder::buildNextEffectPacket( uint32_t globalSequence ) { auto remainingTargetCount = m_resolvedEffects.size(); @@ -183,7 +189,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 = animationLock; + pHeader->animationLockTime = m_animationLock; uint8_t targetIndex = 0; for( auto it = m_resolvedEffects.begin(); it != m_resolvedEffects.end(); ) @@ -228,7 +234,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 = animationLock; + effectPacket->data().animationLockTime = m_animationLock; for( int i = 0; i < resultList->size(); i++ ) { @@ -256,7 +262,7 @@ std::shared_ptr< FFXIVPacketBase > EffectBuilder::buildNextEffectPacket( uint32_ effectPacket->data().effectCount = 0; effectPacket->data().sourceSequence = m_sequence; effectPacket->data().globalSequence = globalSequence; - effectPacket->data().animationLockTime = animationLock; + effectPacket->data().animationLockTime = m_animationLock; return effectPacket; } diff --git a/src/world/Action/EffectBuilder.h b/src/world/Action/EffectBuilder.h index 07e771da..226b6289 100644 --- a/src/world/Action/EffectBuilder.h +++ b/src/world/Action/EffectBuilder.h @@ -11,6 +11,8 @@ namespace Sapphire::World::Action public: EffectBuilder( Entity::CharaPtr source, uint32_t actionId, uint16_t sequence ); + void setAnimationLock( float animationLock ); + void heal( Entity::CharaPtr& effectTarget, Entity::CharaPtr& healingTarget, uint32_t amount, Common::ActionHitSeverityType severity = Common::ActionHitSeverityType::NormalHeal, Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None, uint64_t resultDelayMs = 600 ); @@ -31,15 +33,16 @@ namespace Sapphire::World::Action void statusNoEffect( Entity::CharaPtr& target, uint16_t statusId ); - void buildAndSendPackets( float animationLock ); + void buildAndSendPackets(); private: void moveToResultList( Entity::CharaPtr& chara, EffectResultPtr result ); - std::shared_ptr< Sapphire::Network::Packets::FFXIVPacketBase > buildNextEffectPacket( uint32_t globalSequence, float animationLock ); + std::shared_ptr< Sapphire::Network::Packets::FFXIVPacketBase > buildNextEffectPacket( uint32_t globalSequence ); private: uint32_t m_actionId; + float m_animationLock; uint16_t m_sequence; Entity::CharaPtr m_sourceChara; diff --git a/src/world/Action/EffectResult.cpp b/src/world/Action/EffectResult.cpp index a4c52cef..b0b7a155 100644 --- a/src/world/Action/EffectResult.cpp +++ b/src/world/Action/EffectResult.cpp @@ -24,6 +24,11 @@ EffectResult::EffectResult( Entity::CharaPtr target, Entity::CharaPtr source, ui } +EffectResult::EffectResult( Entity::CharaPtr target, uint64_t delayMs ) : + EffectResult::EffectResult( std::move( target ), nullptr, delayMs ) +{ +} + Entity::CharaPtr EffectResult::getSource() const { return m_source; diff --git a/src/world/Action/EffectResult.h b/src/world/Action/EffectResult.h index 7b65c754..689fbca8 100644 --- a/src/world/Action/EffectResult.h +++ b/src/world/Action/EffectResult.h @@ -16,6 +16,7 @@ namespace Sapphire::World::Action { public: explicit EffectResult( Entity::CharaPtr target, Entity::CharaPtr source, uint64_t delayMs ); + explicit EffectResult( Entity::CharaPtr target, uint64_t delayMs ); void damage( uint32_t amount, Common::ActionHitSeverityType severity, Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None ); void heal( uint32_t amount, Common::ActionHitSeverityType severity, Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None ); diff --git a/src/world/Actor/Chara.cpp b/src/world/Actor/Chara.cpp index c9e95dbb..95b28484 100644 --- a/src/world/Actor/Chara.cpp +++ b/src/world/Actor/Chara.cpp @@ -531,7 +531,7 @@ void Sapphire::Entity::Chara::addStatusEffect( StatusEffect::StatusEffectPtr pEf { totalShieldValue /= getMaxHp(); totalShieldValue *= 100; - statusEffectAdd->data().shieldPercentage = totalShieldValue >= 255 ? 255 : static_cast< uint8_t >( totalShieldValue ); + statusEffectAdd->data().shieldPercentage = static_cast< uint8_t >( std::min( 255.0f, totalShieldValue ) ); } sendToInRangeSet( statusEffectAdd, true ); @@ -664,7 +664,7 @@ void Sapphire::Entity::Chara::sendStatusEffectUpdate() { totalShieldValue /= getMaxHp(); totalShieldValue *= 100; - statusEffectList->data().shieldPercentage = totalShieldValue >= 255 ? 255 : static_cast< uint8_t >( totalShieldValue ); + statusEffectList->data().shieldPercentage = static_cast< uint8_t >( std::min( 255.0f, totalShieldValue ) ); } sendToInRangeSet( statusEffectList, true ); @@ -696,7 +696,7 @@ void Sapphire::Entity::Chara::sendEffectResultToUpdateShieldValue() { totalShieldValue /= getMaxHp(); totalShieldValue *= 100; - pPacket->data().shieldPercentage = totalShieldValue >= 255 ? 255 : static_cast< uint8_t >( totalShieldValue ); + pPacket->data().shieldPercentage = static_cast< uint8_t >( std::min( 255.0f, totalShieldValue ) ); } sendToInRangeSet( pPacket, true );