2019-07-25 22:46:10 +10:00
|
|
|
#include "EffectBuilder.h"
|
|
|
|
#include "EffectResult.h"
|
|
|
|
|
2019-07-26 20:28:01 +10:00
|
|
|
#include <Actor/Player.h>
|
2019-07-25 22:46:10 +10:00
|
|
|
|
|
|
|
#include <Network/PacketWrappers/EffectPacket.h>
|
|
|
|
|
|
|
|
#include <Territory/Territory.h>
|
|
|
|
|
|
|
|
#include <Util/Util.h>
|
|
|
|
#include <Util/UtilMath.h>
|
|
|
|
|
|
|
|
#include <Logging/Logger.h>
|
|
|
|
|
|
|
|
using namespace Sapphire;
|
|
|
|
using namespace Sapphire::World::Action;
|
|
|
|
using namespace Sapphire::Network::Packets;
|
|
|
|
|
2019-07-26 20:28:01 +10:00
|
|
|
EffectBuilder::EffectBuilder( Entity::CharaPtr source, uint32_t actionId, uint16_t sequence ) :
|
2019-07-25 22:46:10 +10:00
|
|
|
m_sourceChara( std::move( source ) ),
|
2019-07-26 20:28:01 +10:00
|
|
|
m_actionId( actionId ),
|
|
|
|
m_sequence( sequence )
|
2019-07-25 22:46:10 +10:00
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t EffectBuilder::getResultDelayMs()
|
|
|
|
{
|
|
|
|
// todo: actually figure this retarded shit out
|
|
|
|
|
|
|
|
return Common::Util::getTimeMs() + 1000;
|
|
|
|
}
|
|
|
|
|
|
|
|
EffectResultPtr EffectBuilder::getResult( Entity::CharaPtr& chara )
|
|
|
|
{
|
|
|
|
auto it = m_resolvedEffects.find( chara->getId() );
|
|
|
|
if( it == m_resolvedEffects.end() )
|
|
|
|
{
|
|
|
|
// create a new one and return it
|
|
|
|
// todo: this feels kinda dirty but makes for easy work
|
|
|
|
auto result = make_EffectResult( chara, getResultDelayMs() );
|
|
|
|
|
|
|
|
m_resolvedEffects[ chara->getId() ] = result;
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
return it->second;
|
|
|
|
}
|
|
|
|
|
|
|
|
void EffectBuilder::healTarget( Entity::CharaPtr& target, uint32_t amount, Common::ActionHitSeverityType severity )
|
|
|
|
{
|
|
|
|
auto result = getResult( target );
|
|
|
|
assert( result );
|
|
|
|
|
|
|
|
result->heal( amount, severity );
|
|
|
|
}
|
|
|
|
|
|
|
|
void EffectBuilder::damageTarget( Entity::CharaPtr& target, uint32_t amount, Common::ActionHitSeverityType severity )
|
|
|
|
{
|
|
|
|
auto result = getResult( target );
|
|
|
|
assert( result );
|
|
|
|
|
|
|
|
result->damage( amount, severity );
|
|
|
|
}
|
|
|
|
|
|
|
|
void EffectBuilder::buildAndSendPackets()
|
|
|
|
{
|
2019-07-25 23:21:42 +10:00
|
|
|
Logger::debug( "EffectBuilder result: " );
|
|
|
|
Logger::debug( "Targets afflicted: {}", m_resolvedEffects.size() );
|
2019-07-25 22:46:10 +10:00
|
|
|
|
|
|
|
// test shit
|
|
|
|
for( auto& effect : m_resolvedEffects )
|
|
|
|
{
|
|
|
|
auto& result = effect.second;
|
|
|
|
|
2019-07-25 23:21:42 +10:00
|
|
|
Logger::debug( " - id: {}", result->getTarget()->getId() );
|
|
|
|
|
2019-07-25 22:46:10 +10:00
|
|
|
auto effectPacket = std::make_shared< Server::EffectPacket >( m_sourceChara->getId(), result->getTarget()->getId(), m_actionId );
|
|
|
|
effectPacket->setRotation( Common::Util::floatToUInt16Rot( m_sourceChara->getRot() ) );
|
2019-07-26 20:28:01 +10:00
|
|
|
effectPacket->setSequence( m_sequence );
|
2019-07-25 22:46:10 +10:00
|
|
|
|
|
|
|
effectPacket->addEffect( result->buildEffectEntry() );
|
|
|
|
|
2019-07-26 20:28:01 +10:00
|
|
|
m_sourceChara->sendToInRangeSet( effectPacket, false );
|
2019-07-25 22:46:10 +10:00
|
|
|
|
2019-07-26 20:28:01 +10:00
|
|
|
// send a dupe packet to the caster with hiddenAnimation field set
|
|
|
|
if( auto player = m_sourceChara->getAsPlayer() )
|
|
|
|
{
|
|
|
|
auto effectPacket2 = std::make_shared< Server::EffectPacket >( m_sourceChara->getId(), result->getTarget()->getId(), m_actionId );
|
|
|
|
effectPacket2->setRotation( Common::Util::floatToUInt16Rot( m_sourceChara->getRot() ) );
|
|
|
|
effectPacket2->setSequence( m_sequence );
|
|
|
|
|
|
|
|
effectPacket2->data().hiddenAnimation = m_sequence;
|
|
|
|
|
|
|
|
effectPacket2->addEffect( result->buildEffectEntry() );
|
|
|
|
|
|
|
|
player->queuePacket( effectPacket2 );
|
|
|
|
}
|
2019-07-25 22:46:10 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|