F4MP/codigos originales/tiltedcode/Code/server/Services/MagicService.cpp

86 lines
3.5 KiB
C++
Raw Normal View History

#include <Services/MagicService.h>
#include <GameServer.h>
#include <World.h>
#include <Messages/SpellCastRequest.h>
#include <Messages/InterruptCastRequest.h>
#include <Messages/AddTargetRequest.h>
#include <Messages/NotifySpellCast.h>
#include <Messages/NotifyInterruptCast.h>
#include <Messages/NotifyAddTarget.h>
#include <Messages/NotifyRemoveSpell.h>
MagicService::MagicService(World& aWorld, entt::dispatcher& aDispatcher) noexcept
: m_world(aWorld)
{
m_spellCastConnection = aDispatcher.sink<PacketEvent<SpellCastRequest>>().connect<&MagicService::OnSpellCastRequest>(this);
m_interruptCastConnection = aDispatcher.sink<PacketEvent<InterruptCastRequest>>().connect<&MagicService::OnInterruptCastRequest>(this);
m_addTargetConnection = aDispatcher.sink<PacketEvent<AddTargetRequest>>().connect<&MagicService::OnAddTargetRequest>(this);
m_removeSpellConnection = aDispatcher.sink<PacketEvent<RemoveSpellRequest>>().connect<&MagicService::OnRemoveSpellRequest>(this);
}
void MagicService::OnSpellCastRequest(const PacketEvent<SpellCastRequest>& acMessage) const noexcept
{
auto& message = acMessage.Packet;
NotifySpellCast notify;
notify.CasterId = message.CasterId;
notify.SpellFormId = message.SpellFormId;
notify.CastingSource = message.CastingSource;
notify.IsDualCasting = message.IsDualCasting;
notify.DesiredTarget = message.DesiredTarget;
const auto entity = static_cast<entt::entity>(message.CasterId);
if (!GameServer::Get()->SendToPlayersInRange(notify, entity, acMessage.GetSender()))
spdlog::error("{}: SendToPlayersInRange failed", __FUNCTION__);
}
void MagicService::OnInterruptCastRequest(const PacketEvent<InterruptCastRequest>& acMessage) const noexcept
{
auto& message = acMessage.Packet;
NotifyInterruptCast notify;
notify.CasterId = message.CasterId;
notify.CastingSource = message.CastingSource;
const auto entity = static_cast<entt::entity>(message.CasterId);
if (!GameServer::Get()->SendToPlayersInRange(notify, entity, acMessage.GetSender()))
spdlog::error("{}: SendToPlayersInRange failed", __FUNCTION__);
}
void MagicService::OnAddTargetRequest(const PacketEvent<AddTargetRequest>& acMessage) const noexcept
{
auto& message = acMessage.Packet;
NotifyAddTarget notify;
notify.TargetId = message.TargetId;
notify.CasterId = message.CasterId;
notify.SpellId = message.SpellId;
notify.EffectId = message.EffectId;
notify.Magnitude = message.Magnitude;
notify.IsDualCasting = message.IsDualCasting;
notify.ApplyHealPerkBonus = message.ApplyHealPerkBonus;
notify.ApplyStaminaPerkBonus = message.ApplyStaminaPerkBonus;
const auto entity = static_cast<entt::entity>(message.TargetId);
if (!GameServer::Get()->SendToPlayersInRange(notify, entity, acMessage.GetSender()))
spdlog::error("{}: SendToPlayersInRange failed", __FUNCTION__);
}
void MagicService::OnRemoveSpellRequest(const PacketEvent<RemoveSpellRequest>& acMessage) const noexcept
{
const auto& message = acMessage.Packet;
NotifyRemoveSpell notify;
notify.TargetId = message.TargetId;
notify.SpellId = message.SpellId;
//spdlog::info(__FUNCTION__ ": TargetId: {}, Spell baseId: {}", notify.TargetId, notify.SpellId.BaseId);
const auto entity = static_cast<entt::entity>(message.TargetId);
if (!GameServer::Get()->SendToPlayersInRange(notify, entity, acMessage.GetSender()))
spdlog::error("{}: SendToPlayersInRange failed", __FUNCTION__);
}