F4MP/codigos originales/tiltedcode/Code/client/Services/Generic/OverlayClient.cpp
2026-01-06 18:53:59 +01:00

162 lines
5.3 KiB
C++

#include <TiltedOnlinePCH.h>
#include <OverlayRenderHandler.hpp>
#include <DInputHook.hpp>
#include <Services/OverlayClient.h>
#include <Services/TransportService.h>
#include <Messages/SendChatMessageRequest.h>
#include <Messages/TeleportRequest.h>
#include <Events/SetTimeCommandEvent.h>
#include <World.h>
OverlayClient::OverlayClient(TransportService& aTransport, TiltedPhoques::OverlayRenderHandler* apHandler)
: TiltedPhoques::OverlayClient(apHandler)
, m_transport(aTransport)
{
}
OverlayClient::~OverlayClient() noexcept
{
}
bool OverlayClient::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefProcessId source_process, CefRefPtr<CefProcessMessage> message)
{
if (message->GetName() == "ui-event")
{
auto pArguments = message->GetArgumentList();
auto eventName = pArguments->GetString(0).ToString();
auto eventArgs = pArguments->GetList(1);
spdlog::info(eventName);
spdlog::info(eventArgs->GetString(0).ToString());
spdlog::info(std::to_string(eventArgs->GetInt(1)));
spdlog::info(eventArgs->GetString(2).ToString());
#ifndef PUBLIC_BUILD
LOG(INFO) << "event=ui_event name=" << eventName;
#endif
if (eventName == "connect")
ProcessConnectMessage(eventArgs);
else if (eventName == "disconnect")
ProcessDisconnectMessage();
else if (eventName == "revealPlayers")
ProcessRevealPlayersMessage();
else if (eventName == "sendMessage")
ProcessChatMessage(eventArgs);
else if (eventName == "setTime")
ProcessSetTimeCommand(eventArgs);
else if (eventName == "launchParty")
World::Get().GetPartyService().CreateParty();
else if (eventName == "leaveParty")
World::Get().GetPartyService().LeaveParty();
else if (eventName == "createPartyInvite")
{
uint32_t aPlayerId = eventArgs->GetInt(0);
World::Get().GetPartyService().CreateInvite(aPlayerId);
}
else if (eventName == "acceptPartyInvite")
{
uint32_t aInviterId = eventArgs->GetInt(0);
// push to main thread because the party service has to check validity of invite thread safely
World::Get().GetRunner().Queue([aInviterId]() { World::Get().GetPartyService().AcceptInvite(aInviterId); });
}
else if (eventName == "kickPartyMember")
{
uint32_t aPlayerId = eventArgs->GetInt(0);
World::Get().GetPartyService().KickPartyMember(aPlayerId);
}
else if (eventName == "changePartyLeader")
{
uint32_t aPlayerId = eventArgs->GetInt(0);
World::Get().GetPartyService().ChangePartyLeader(aPlayerId);
}
else if (eventName == "teleportToPlayer")
ProcessTeleportMessage(eventArgs);
else if (eventName == "toggleDebugUI")
ProcessToggleDebugUI();
return true;
}
return false;
}
void OverlayClient::ProcessConnectMessage(CefRefPtr<CefListValue> aEventArgs)
{
std::string baseIp = aEventArgs->GetString(0);
if (baseIp == "localhost")
{
baseIp = "127.0.0.1";
}
uint16_t port = aEventArgs->GetInt(1) ? aEventArgs->GetInt(1) : 10578;
World::Get().GetTransport().SetServerPassword(aEventArgs->GetString(2));
std::string endpoint = baseIp + ":" + std::to_string(port);
World::Get().GetRunner().Queue([endpoint] { World::Get().GetTransport().Connect(endpoint); });
}
void OverlayClient::ProcessDisconnectMessage()
{
World::Get().GetRunner().Queue([]() { World::Get().GetTransport().Close(); });
}
void OverlayClient::ProcessRevealPlayersMessage()
{
SetUIVisible(false);
World::Get().GetMagicService().StartRevealingOtherPlayers();
}
void OverlayClient::ProcessChatMessage(CefRefPtr<CefListValue> aEventArgs)
{
std::string contents = aEventArgs->GetString(1).ToString();
if (!contents.empty())
{
SendChatMessageRequest messageRequest;
messageRequest.MessageType = static_cast<ChatMessageType>(aEventArgs->GetInt(0));
messageRequest.ChatMessage = contents;
spdlog::info(L"Send chat message of type {}: '{}' ", messageRequest.MessageType, aEventArgs->GetString(1).ToWString());
m_transport.Send(messageRequest);
}
}
void OverlayClient::ProcessSetTimeCommand(CefRefPtr<CefListValue> aEventArgs)
{
const uint8_t hours = static_cast<uint8_t>(aEventArgs->GetInt(0));
const uint8_t minutes = static_cast<uint8_t>(aEventArgs->GetInt(1));
const uint32_t senderId = m_transport.GetLocalPlayerId();
World::Get().GetDispatcher().trigger(SetTimeCommandEvent(hours, minutes, senderId));
}
void OverlayClient::ProcessTeleportMessage(CefRefPtr<CefListValue> aEventArgs)
{
TeleportRequest request{};
request.PlayerId = aEventArgs->GetInt(0);
m_transport.Send(request);
}
void OverlayClient::ProcessToggleDebugUI()
{
World::Get().GetDebugService().m_showDebugStuff = !World::Get().GetDebugService().m_showDebugStuff;
}
void OverlayClient::SetUIVisible(bool aVisible) noexcept
{
auto pRenderer = GetOverlayRenderHandler();
if (!pRenderer)
return;
TiltedPhoques::DInputHook::Get().SetEnabled(aVisible);
World::Get().GetOverlayService().SetActive(aVisible);
pRenderer->SetCursorVisible(aVisible);
}