66#include < Services/OverlayClient.h>
77#include < Services/TransportService.h>
88#include < Services/PlayerService.h>
9+ #include < Services/TradeService.h>
10+
11+ #include < Structs/Inventory.h>
912
1013#include < Messages/SendChatMessageRequest.h>
1114#include < Messages/TeleportRequest.h>
15+ #include < Messages/TeleportResponse.h>
16+ #include < Messages/PlayerProfileImageUpdateRequest.h>
1217
1318#include < Events/SetTimeCommandEvent.h>
1419
@@ -33,10 +38,7 @@ bool OverlayClient::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefR
3338 auto eventName = pArguments->GetString (0 ).ToString ();
3439 auto eventArgs = pArguments->GetList (1 );
3540
36- spdlog::info (eventName);
37- spdlog::info (eventArgs->GetString (0 ).ToString ());
38- spdlog::info (std::to_string (eventArgs->GetInt (1 )));
39- spdlog::info (eventArgs->GetString (2 ).ToString ());
41+ spdlog::info (" ui-event '{}' ({} args)" , eventName, eventArgs->GetSize ());
4042
4143#ifndef PUBLIC_BUILD
4244 LOG (INFO) << " event=ui_event name=" << eventName;
@@ -77,12 +79,75 @@ bool OverlayClient::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefR
7779 uint32_t aPlayerId = eventArgs->GetInt (0 );
7880 World::Get ().GetPartyService ().ChangePartyLeader (aPlayerId);
7981 }
80- else if (eventName == " teleportToPlayer" )
81- ProcessTeleportMessage (eventArgs);
82+ else if (eventName == " setProfilePicture" )
83+ ProcessSetProfilePicture (eventArgs);
84+ else if (eventName == " teleportToPlayer" || eventName == " requestTeleport" )
85+ ProcessTeleportRequestMessage (eventArgs);
86+ else if (eventName == " respondTeleportRequest" )
87+ ProcessTeleportResponseMessage (eventArgs);
8288 else if (eventName == " toggleDebugUI" )
8389 ProcessToggleDebugUI ();
8490 else if (eventName == " respawnButtonClicked" )
8591 World::Get ().GetRunner ().Queue ([]() { World::Get ().ctx ().at <PlayerService>().RequestManualRespawn (); });
92+ else if (eventName == " sendTradeInvite" )
93+ {
94+ uint32_t aPlayerId = eventArgs->GetInt (0 );
95+ World::Get ().GetTradeService ().SendInvite (aPlayerId);
96+ }
97+ else if (eventName == " respondTradeInvite" )
98+ {
99+ uint32_t inviterId = eventArgs->GetInt (0 );
100+ bool accept = eventArgs->GetBool (1 );
101+ World::Get ().GetTradeService ().RespondToInvite (inviterId, accept);
102+ }
103+ else if (eventName == " cancelTrade" )
104+ {
105+ World::Get ().GetTradeService ().CancelTrade ();
106+ }
107+ else if (eventName == " setTradeReady" )
108+ {
109+ bool ready = eventArgs->GetBool (0 );
110+ World::Get ().GetTradeService ().SetReady (ready);
111+ }
112+ else if (eventName == " updateTradeOffer" )
113+ {
114+ TiltedPhoques::Vector<TradeService::OfferSelection> selections;
115+ auto pList = eventArgs->GetList (0 );
116+ if (pList)
117+ {
118+ const auto cCount = pList->GetSize ();
119+ selections.reserve (cCount);
120+ for (size_t i = 0 ; i < cCount; ++i)
121+ {
122+ TradeService::OfferSelection selection{};
123+
124+ if (pList->GetType (static_cast <int >(i)) == VTYPE_DICTIONARY)
125+ {
126+ auto pEntry = pList->GetDictionary (static_cast <int >(i));
127+ if (!pEntry)
128+ continue ;
129+
130+ selection.Index = static_cast <uint32_t >(pEntry->GetInt (" index" ));
131+ selection.Count = pEntry->GetInt (" count" );
132+ }
133+ else
134+ {
135+ auto pEntry = pList->GetList (static_cast <int >(i));
136+ if (!pEntry || pEntry->GetSize () < 2 )
137+ continue ;
138+
139+ selection.Index = static_cast <uint32_t >(pEntry->GetInt (0 ));
140+ selection.Count = pEntry->GetInt (1 );
141+ }
142+
143+ if (selection.Count <= 0 )
144+ continue ;
145+
146+ selections.push_back (selection);
147+ }
148+ }
149+ World::Get ().GetTradeService ().UpdateOffer (selections);
150+ }
86151
87152 return true ;
88153 }
@@ -98,8 +163,20 @@ void OverlayClient::ProcessConnectMessage(CefRefPtr<CefListValue> aEventArgs)
98163 baseIp = " 127.0.0.1" ;
99164 }
100165
101- uint16_t port = aEventArgs->GetInt (1 ) ? aEventArgs->GetInt (1 ) : 10578 ;
102- World::Get ().GetTransport ().SetServerPassword (aEventArgs->GetString (2 ));
166+ const uint16_t port = aEventArgs->GetInt (1 ) ? static_cast <uint16_t >(aEventArgs->GetInt (1 )) : 10578 ;
167+ std::string username;
168+ std::string password;
169+
170+ if (aEventArgs->GetSize () >= 3 )
171+ username = aEventArgs->GetString (2 );
172+ if (aEventArgs->GetSize () >= 4 )
173+ password = aEventArgs->GetString (3 );
174+
175+ if (aEventArgs->GetSize () >= 5 )
176+ World::Get ().GetTransport ().SetServerPassword (aEventArgs->GetString (4 ));
177+ else
178+ World::Get ().GetTransport ().SetServerPassword (" " );
179+ World::Get ().GetTransport ().SetLoginCredentials (username, password);
103180
104181 std::string endpoint = baseIp + " :" + std::to_string (port);
105182
@@ -140,14 +217,41 @@ void OverlayClient::ProcessSetTimeCommand(CefRefPtr<CefListValue> aEventArgs)
140217 World::Get ().GetDispatcher ().trigger (SetTimeCommandEvent (hours, minutes, senderId));
141218}
142219
143- void OverlayClient::ProcessTeleportMessage (CefRefPtr<CefListValue> aEventArgs)
220+ void OverlayClient::ProcessTeleportRequestMessage (CefRefPtr<CefListValue> aEventArgs)
144221{
145222 TeleportRequest request{};
146223 request.PlayerId = aEventArgs->GetInt (0 );
147224
148225 m_transport.Send (request);
149226}
150227
228+ void OverlayClient::ProcessTeleportResponseMessage (CefRefPtr<CefListValue> aEventArgs)
229+ {
230+ TeleportResponse response{};
231+ response.RequesterId = static_cast <uint16_t >(aEventArgs->GetInt (0 ));
232+ response.Accepted = aEventArgs->GetBool (1 );
233+
234+ m_transport.Send (response);
235+ }
236+
237+ void OverlayClient::ProcessSetProfilePicture (CefRefPtr<CefListValue> aEventArgs)
238+ {
239+ std::string payload;
240+ if (aEventArgs->GetSize () > 0 )
241+ payload = aEventArgs->GetString (0 ).ToString ();
242+
243+ constexpr size_t cMaxAvatarBytes = 256u * 1024u ;
244+ if (payload.size () > cMaxAvatarBytes)
245+ {
246+ spdlog::warn (" [OverlayClient] Ignoring avatar upload larger than {} bytes" , cMaxAvatarBytes);
247+ return ;
248+ }
249+
250+ PlayerProfileImageUpdateRequest request{};
251+ request.ImageData = payload;
252+ m_transport.Send (request);
253+ }
254+
151255void OverlayClient::ProcessToggleDebugUI ()
152256{
153257 World::Get ().GetDebugService ().m_showDebugStuff = !World::Get ().GetDebugService ().m_showDebugStuff ;
0 commit comments