mirror of
https://github.com/Jous99/F4MP.git
synced 2026-01-13 00:20:54 +01:00
85 lines
3.5 KiB
C++
85 lines
3.5 KiB
C++
#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__);
|
|
}
|