1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-26 22:37:45 +00:00
sapphire/src/world/Action/EffectBuilder.cpp

92 lines
2.5 KiB
C++
Raw Normal View History

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
{
}
uint64_t EffectBuilder::getResultDelayMs()
2019-07-25 22:46:10 +10:00
{
// todo: actually figure this retarded shit out
return Common::Util::getTimeMs() + 850;
2019-07-25 22:46:10 +10:00
}
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
for( auto it = m_resolvedEffects.begin(); it != m_resolvedEffects.end(); )
2019-07-25 22:46:10 +10:00
{
auto result = it->second;
2019-07-25 23:21:42 +10:00
Logger::debug( " - id: {}", result->getTarget()->getId() );
2019-07-26 21:58:13 +10:00
auto seq = m_sourceChara->getCurrentTerritory()->getNextEffectSequence();
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 21:58:13 +10:00
effectPacket->setSequence( seq, m_sequence );
2019-07-25 22:46:10 +10:00
effectPacket->addEffect( result->buildEffectEntry() );
2019-07-26 21:58:13 +10:00
m_sourceChara->sendToInRangeSet( effectPacket, true );
2019-07-25 22:46:10 +10:00
// add effect to territory
m_sourceChara->getCurrentTerritory()->addEffectResult( std::move( result ) );
it = m_resolvedEffects.erase( it );
}
2019-07-25 22:46:10 +10:00
}