#include #include #include #include #include #include #include #include #include OverlayClient::OverlayClient(TransportService& aTransport, TiltedPhoques::OverlayRenderHandler* apHandler) : TiltedPhoques::OverlayClient(apHandler) , m_transport(aTransport) { } OverlayClient::~OverlayClient() noexcept { } bool OverlayClient::OnProcessMessageReceived(CefRefPtr browser, CefRefPtr frame, CefProcessId source_process, CefRefPtr 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 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 aEventArgs) { std::string contents = aEventArgs->GetString(1).ToString(); if (!contents.empty()) { SendChatMessageRequest messageRequest; messageRequest.MessageType = static_cast(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 aEventArgs) { const uint8_t hours = static_cast(aEventArgs->GetInt(0)); const uint8_t minutes = static_cast(aEventArgs->GetInt(1)); const uint32_t senderId = m_transport.GetLocalPlayerId(); World::Get().GetDispatcher().trigger(SetTimeCommandEvent(hours, minutes, senderId)); } void OverlayClient::ProcessTeleportMessage(CefRefPtr 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); }