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

So you can hit more than 32 targets with aoe.

This commit is contained in:
collett 2020-01-05 08:39:54 +09:00
parent 4e4ecba9d5
commit b4a9f29d96
3 changed files with 34 additions and 20 deletions

View file

@ -688,9 +688,6 @@ bool Action::Action::snapshotAffectedActors( std::vector< Entity::CharaPtr >& ac
break; break;
} }
} }
if ( actors.size() == 32 )
break; // cannot add more than 32 targets
} }
if( auto player = m_pSource->getAsPlayer() ) if( auto player = m_pSource->getAsPlayer() )

View file

@ -110,19 +110,31 @@ void EffectBuilder::comboVisualEffect( Entity::CharaPtr& target )
void EffectBuilder::buildAndSendPackets() void EffectBuilder::buildAndSendPackets()
{ {
auto targetCount = m_resolvedEffects.size(); auto targetCount = m_resolvedEffects.size();
assert( targetCount <= 32 );
Logger::debug( "EffectBuilder result: " ); Logger::debug( "EffectBuilder result: " );
Logger::debug( "Targets afflicted: {}", targetCount ); Logger::debug( "Targets afflicted: {}", targetCount );
if( targetCount > 1 ) // use AoeEffect packets auto globalSequence = m_sourceChara->getCurrentTerritory()->getNextEffectSequence();
while( m_resolvedEffects.size() > 0 )
{ {
int packetSize = targetCount <= 8 ? 8 : auto packet = buildNextEffectPacket( globalSequence );
( targetCount <= 16 ? 16 : m_sourceChara->sendToInRangeSet( packet, true );
( targetCount <= 24 ? 24 : 32 ) ); }
}
std::shared_ptr< FFXIVPacketBase > EffectBuilder::buildNextEffectPacket( uint32_t globalSequence )
{
auto remainingTargetCount = m_resolvedEffects.size();
if( remainingTargetCount > 1 ) // use AoeEffect packets
{
int packetSize = remainingTargetCount <= 8 ? 8 :
( remainingTargetCount <= 16 ? 16 :
( remainingTargetCount <= 24 ? 24 : 32 ) );
using EffectHeader = Server::FFXIVIpcAoeEffect< 8 >; // dummy type to access header part of the packet using EffectHeader = Server::FFXIVIpcAoeEffect< 8 >; // dummy type to access header part of the packet
FFXIVPacketBasePtr pPacket = nullptr; FFXIVPacketBasePtr effectPacket = nullptr;
EffectHeader* pHeader; EffectHeader* pHeader;
Common::EffectEntry* pEntry; Common::EffectEntry* pEntry;
uint64_t* pEffectTargetId; uint64_t* pEffectTargetId;
@ -136,7 +148,7 @@ void EffectBuilder::buildAndSendPackets()
pEntry = ( Common::EffectEntry* )( &( p->data().effects ) ); pEntry = ( Common::EffectEntry* )( &( p->data().effects ) );
pEffectTargetId = ( uint64_t* )( &( p->data().effectTargetId ) ); pEffectTargetId = ( uint64_t* )( &( p->data().effectTargetId ) );
pFlag = ( uint16_t* )( &( p->data().unkFlag ) ); pFlag = ( uint16_t* )( &( p->data().unkFlag ) );
pPacket = std::move( p ); effectPacket = std::move( p );
break; break;
} }
case 16: case 16:
@ -146,7 +158,7 @@ void EffectBuilder::buildAndSendPackets()
pEntry = ( Common::EffectEntry* )( &( p->data().effects ) ); pEntry = ( Common::EffectEntry* )( &( p->data().effects ) );
pEffectTargetId = ( uint64_t* )( &( p->data().effectTargetId ) ); pEffectTargetId = ( uint64_t* )( &( p->data().effectTargetId ) );
pFlag = ( uint16_t* )( &( p->data().unkFlag ) ); pFlag = ( uint16_t* )( &( p->data().unkFlag ) );
pPacket = std::move( p ); effectPacket = std::move( p );
break; break;
} }
case 24: case 24:
@ -156,7 +168,7 @@ void EffectBuilder::buildAndSendPackets()
pEntry = ( Common::EffectEntry* )( &( p->data().effects ) ); pEntry = ( Common::EffectEntry* )( &( p->data().effects ) );
pEffectTargetId = ( uint64_t* )( &( p->data().effectTargetId ) ); pEffectTargetId = ( uint64_t* )( &( p->data().effectTargetId ) );
pFlag = ( uint16_t* )( &( p->data().unkFlag ) ); pFlag = ( uint16_t* )( &( p->data().unkFlag ) );
pPacket = std::move( p ); effectPacket = std::move( p );
break; break;
} }
case 32: case 32:
@ -166,11 +178,11 @@ void EffectBuilder::buildAndSendPackets()
pEntry = ( Common::EffectEntry* )( &( p->data().effects ) ); pEntry = ( Common::EffectEntry* )( &( p->data().effects ) );
pEffectTargetId = ( uint64_t* )( &( p->data().effectTargetId ) ); pEffectTargetId = ( uint64_t* )( &( p->data().effectTargetId ) );
pFlag = ( uint16_t* )( &( p->data().unkFlag ) ); pFlag = ( uint16_t* )( &( p->data().unkFlag ) );
pPacket = std::move( p ); effectPacket = std::move( p );
break; break;
} }
} }
assert( pPacket != nullptr ); assert( effectPacket != nullptr );
pHeader->actionAnimationId = m_sourceChara->getId(); pHeader->actionAnimationId = m_sourceChara->getId();
pHeader->actionId = m_actionId; pHeader->actionId = m_actionId;
@ -179,9 +191,9 @@ void EffectBuilder::buildAndSendPackets()
pHeader->someTargetId = 0xE0000000; pHeader->someTargetId = 0xE0000000;
pHeader->rotation = Common::Util::floatToUInt16Rot( m_sourceChara->getRot() ); pHeader->rotation = Common::Util::floatToUInt16Rot( m_sourceChara->getRot() );
pHeader->effectDisplayType = Common::ActionEffectDisplayType::ShowActionName; pHeader->effectDisplayType = Common::ActionEffectDisplayType::ShowActionName;
pHeader->effectCount = static_cast< uint8_t >( targetCount ); pHeader->effectCount = static_cast< uint8_t >( remainingTargetCount > packetSize ? packetSize : remainingTargetCount );
pHeader->sourceSequence = m_sequence; pHeader->sourceSequence = m_sequence;
pHeader->globalEffectCounter = m_sourceChara->getCurrentTerritory()->getNextEffectSequence(); pHeader->globalEffectCounter = globalSequence;
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(); )
@ -203,13 +215,16 @@ void EffectBuilder::buildAndSendPackets()
it = m_resolvedEffects.erase( it ); it = m_resolvedEffects.erase( it );
targetIndex++; targetIndex++;
if( targetIndex == packetSize )
break;
} }
pFlag[0] = 0x7FFF; pFlag[0] = 0x7FFF;
pFlag[1] = 0x7FFF; pFlag[1] = 0x7FFF;
pFlag[2] = 0x7FFF; pFlag[2] = 0x7FFF;
m_sourceChara->sendToInRangeSet( pPacket, true ); return effectPacket;
} }
else else
{ {
@ -233,8 +248,8 @@ void EffectBuilder::buildAndSendPackets()
resultList->clear(); resultList->clear();
m_sourceChara->sendToInRangeSet( effectPacket, true );
m_resolvedEffects.clear(); m_resolvedEffects.clear();
return effectPacket;
} }
} }

View file

@ -35,6 +35,8 @@ namespace Sapphire::World::Action
uint64_t getResultDelayMs(); uint64_t getResultDelayMs();
std::shared_ptr< Sapphire::Network::Packets::FFXIVPacketBase > buildNextEffectPacket( uint32_t globalSequence );
private: private:
uint32_t m_actionId; uint32_t m_actionId;
uint16_t m_sequence; uint16_t m_sequence;