1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-28 20:27:46 +00:00

more animation lock stuff

This commit is contained in:
collett 2020-01-13 17:58:07 +09:00
parent 0620aaa932
commit fc66254da3
4 changed files with 28 additions and 10 deletions

View file

@ -471,7 +471,7 @@ void Action::Action::buildEffects()
if( !hasLutEntry || m_hitActors.empty() ) if( !hasLutEntry || m_hitActors.empty() )
{ {
// send any effect packet added by script or an empty one just to play animation for other players // 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; 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 // at this point we're done with it and no longer need it
m_effectBuilder.reset(); m_effectBuilder.reset();
@ -813,6 +813,22 @@ bool Action::Action::hasValidLutEntry() const
m_lutEntry.rearPotency != 0 || m_lutEntry.curePotency != 0 || m_lutEntry.restoreMPPercentage != 0; 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() Action::EffectBuilderPtr Action::Action::getEffectbuilder()
{ {
return m_effectBuilder; return m_effectBuilder;

View file

@ -118,6 +118,8 @@ namespace Sapphire::World::Action
*/ */
Entity::CharaPtr getHitChara(); Entity::CharaPtr getHitChara();
float getAnimationLock();
/*! /*!
* @brief Starts the cast. Finishes it immediately if there is no cast time (weaponskills). * @brief Starts the cast. Finishes it immediately if there is no cast time (weaponskills).
*/ */

View file

@ -91,7 +91,7 @@ void EffectBuilder::applyStatusEffect( Entity::CharaPtr& target, uint16_t status
moveToResultList( target, nextResult ); moveToResultList( target, nextResult );
} }
void EffectBuilder::buildAndSendPackets() void EffectBuilder::buildAndSendPackets( float animationLock )
{ {
auto targetCount = m_resolvedEffects.size(); auto targetCount = m_resolvedEffects.size();
Logger::debug( "EffectBuilder result: " ); 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 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 ); m_sourceChara->sendToInRangeSet( packet, true );
} }
while( !m_resolvedEffects.empty() ); 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(); 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->effectCount = static_cast< uint8_t >( remainingTargetCount > packetSize ? packetSize : remainingTargetCount );
pHeader->sourceSequence = m_sequence; pHeader->sourceSequence = m_sequence;
pHeader->globalSequence = globalSequence; pHeader->globalSequence = globalSequence;
pHeader->animationLockTime = 0.6f; pHeader->animationLockTime = animationLock;
uint8_t targetIndex = 0; uint8_t targetIndex = 0;
for( auto it = m_resolvedEffects.begin(); it != m_resolvedEffects.end(); ) 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 ); auto effectPacket = std::make_shared< Server::EffectPacket >( m_sourceChara->getId(), firstResult->getTarget()->getId(), m_actionId );
effectPacket->setRotation( Common::Util::floatToUInt16Rot( m_sourceChara->getRot() ) ); effectPacket->setRotation( Common::Util::floatToUInt16Rot( m_sourceChara->getRot() ) );
effectPacket->setSequence( seq, m_sequence ); effectPacket->setSequence( seq, m_sequence );
effectPacket->data().animationLockTime = 0.6f; effectPacket->data().animationLockTime = animationLock;
for( int i = 0; i < resultList->size(); i++ ) 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().effectCount = 0;
effectPacket->data().sourceSequence = m_sequence; effectPacket->data().sourceSequence = m_sequence;
effectPacket->data().globalSequence = globalSequence; effectPacket->data().globalSequence = globalSequence;
effectPacket->data().animationLockTime = 0.6f; effectPacket->data().animationLockTime = animationLock;
return effectPacket; return effectPacket;
} }

View file

@ -28,7 +28,7 @@ namespace Sapphire::World::Action
void applyStatusEffect( Entity::CharaPtr& target, uint16_t statusId, uint8_t param ); void applyStatusEffect( Entity::CharaPtr& target, uint16_t statusId, uint8_t param );
void buildAndSendPackets(); void buildAndSendPackets( float animationLock );
private: private:
@ -36,7 +36,7 @@ namespace Sapphire::World::Action
uint64_t getResultDelayMs(); 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: private:
uint32_t m_actionId; uint32_t m_actionId;