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