mirror of
https://github.com/Jous99/F4MP.git
synced 2026-01-13 00:00:54 +01:00
63 lines
2.3 KiB
C++
63 lines
2.3 KiB
C++
|
|
#include <Services/CommandService.h>
|
|
#include <Services/TransportService.h>
|
|
|
|
#include <Systems/ModSystem.h>
|
|
#include <World.h>
|
|
|
|
#include <Forms/TESObjectCELL.h>
|
|
#include <Forms/TESWorldSpace.h>
|
|
#include <PlayerCharacter.h>
|
|
|
|
#include <Events/SetTimeCommandEvent.h>
|
|
|
|
#include <Messages/TeleportCommandRequest.h>
|
|
#include <Messages/TeleportCommandResponse.h>
|
|
#include "Messages/SetTimeCommandRequest.h"
|
|
|
|
#include <Structs/GridCellCoords.h>
|
|
|
|
CommandService::CommandService(World& aWorld, TransportService& aTransport, entt::dispatcher& aDispatcher)
|
|
: m_world(aWorld)
|
|
, m_transport(aTransport)
|
|
{
|
|
m_setTimeConnection = aDispatcher.sink<SetTimeCommandEvent>().connect<&CommandService::OnSetTimeCommand>(this);
|
|
m_teleportConnection = aDispatcher.sink<TeleportCommandResponse>().connect<&CommandService::OnTeleportCommandResponse>(this);
|
|
}
|
|
|
|
void CommandService::OnSetTimeCommand(const SetTimeCommandEvent& acEvent) const noexcept
|
|
{
|
|
SetTimeCommandRequest request{};
|
|
request.Hours = acEvent.Hours;
|
|
request.Minutes = acEvent.Minutes;
|
|
request.PlayerId = acEvent.PlayerId;
|
|
m_transport.Send(request);
|
|
}
|
|
|
|
void CommandService::OnTeleportCommandResponse(const TeleportCommandResponse& acMessage) noexcept
|
|
{
|
|
spdlog::info("TeleportCommandResponse: {:X}:{:X} at position {}, {}, {}", acMessage.CellId.ModId, acMessage.CellId.BaseId, acMessage.Position.x, acMessage.Position.y, acMessage.Position.z);
|
|
auto& modSystem = m_world.GetModSystem();
|
|
|
|
const uint32_t cellId = modSystem.GetGameId(acMessage.CellId);
|
|
TESObjectCELL* pCell = Cast<TESObjectCELL>(TESForm::GetById(cellId));
|
|
if (!pCell)
|
|
{
|
|
const uint32_t worldSpaceId = modSystem.GetGameId(acMessage.WorldSpaceId);
|
|
TESWorldSpace* pWorldSpace = Cast<TESWorldSpace>(TESForm::GetById(worldSpaceId));
|
|
if (pWorldSpace)
|
|
{
|
|
GridCellCoords coordinates = GridCellCoords::CalculateGridCellCoords(acMessage.Position);
|
|
pCell = pWorldSpace->LoadCell(coordinates.X, coordinates.Y);
|
|
}
|
|
|
|
if (!pCell)
|
|
{
|
|
spdlog::error("Failed to fetch cell to teleport to.");
|
|
m_world.GetOverlayService().SendSystemMessage("Teleporting to player failed.");
|
|
return;
|
|
}
|
|
}
|
|
|
|
PlayerCharacter::Get()->MoveTo(pCell, acMessage.Position);
|
|
}
|