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:
parent
4e4ecba9d5
commit
b4a9f29d96
3 changed files with 34 additions and 20 deletions
|
@ -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() )
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue