Skip to content

Commit cecc2f4

Browse files
Merge pull request #2 from Jacobwasbeast/dev-server-essentials
Dev server essentials
2 parents 5040784 + 84fcd5e commit cecc2f4

File tree

140 files changed

+7329
-410
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

140 files changed

+7329
-410
lines changed

.aider.chat.history.md

Lines changed: 0 additions & 39 deletions
This file was deleted.

.aider.input.history

Lines changed: 0 additions & 9 deletions
This file was deleted.

.aider.tags.cache.v4/cache.db

-32 KB
Binary file not shown.

.aider.tags.cache.v4/cache.db-shm

-32 KB
Binary file not shown.

.aider.tags.cache.v4/cache.db-wal

Whitespace-only changes.

Code/client/Services/Debug/Views/PartyView.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ void DebugService::DrawPartyView()
4141
auto playerEntry = players.find(playerId);
4242
if (playerEntry != players.end())
4343
{
44-
auto playerName = playerEntry.value();
44+
auto playerName = playerEntry.value().Name;
4545
if (playerId == partyService.GetLeaderPlayerId())
4646
{
4747
playerName += " (Leader)";
@@ -52,7 +52,7 @@ void DebugService::DrawPartyView()
5252
if (ImGui::Button("Teleport"))
5353
{
5454
TeleportCommandRequest request{};
55-
request.TargetPlayer = playerEntry.value();
55+
request.TargetPlayer = playerEntry.value().Name;
5656

5757
m_transport.Send(request);
5858
}
@@ -91,7 +91,7 @@ void DebugService::DrawPartyView()
9191
continue;
9292

9393
playerCount++;
94-
ImGui::BulletText(player.second.c_str());
94+
ImGui::BulletText(player.second.Name.c_str());
9595
ImGui::SameLine(100);
9696
if (ImGui::Button("Invite"))
9797
{
@@ -116,7 +116,7 @@ void DebugService::DrawPartyView()
116116
if (std::find(std::begin(members), std::end(members), player.first) != std::end(members))
117117
continue;
118118

119-
ImGui::Text(player.second.c_str());
119+
ImGui::Text(player.second.Name.c_str());
120120
ImGui::SameLine(100);
121121
if (ImGui::Button("Accept"))
122122
{

Code/client/Services/Generic/InventoryService.cpp

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,22 @@ void InventoryService::OnEquipmentChangeEvent(const EquipmentChangeEvent& acEven
140140

141141
void InventoryService::OnNotifyInventoryChanges(const NotifyInventoryChanges& acMessage) noexcept
142142
{
143+
TESObjectREFR* pObject = Utils::GetByServerId<TESObjectREFR>(acMessage.ServerId);
144+
if (!pObject)
145+
{
146+
spdlog::error("{}: could not find server id {:X} for inventory change", __FUNCTION__, acMessage.ServerId);
147+
return;
148+
}
149+
150+
Actor* pActor = Cast<Actor>(pObject);
151+
152+
if (acMessage.Silent)
153+
{
154+
ScopedInventoryOverride _;
155+
pObject->AddOrRemoveItem(acMessage.Item);
156+
return;
157+
}
158+
143159
std::optional<uint32_t> dropInstanceId{};
144160
if (acMessage.HasDropInstanceId)
145161
dropInstanceId = acMessage.DropInstanceId;
@@ -161,8 +177,6 @@ void InventoryService::OnNotifyInventoryChanges(const NotifyInventoryChanges& ac
161177
pDropRotation = &dropRotation;
162178
}
163179

164-
Actor* pActor = Utils::GetByServerId<Actor>(acMessage.ServerId);
165-
166180
if (acMessage.Drop)
167181
{
168182
if (!pActor)
@@ -221,14 +235,10 @@ void InventoryService::OnNotifyInventoryChanges(const NotifyInventoryChanges& ac
221235
}
222236
}
223237

224-
TESObjectREFR* pObject = Utils::GetByServerId<TESObjectREFR>(acMessage.ServerId);
225-
if (!pObject)
226-
return;
227-
228238
ScopedInventoryOverride _;
229239

230-
if (auto* pActorObject = Cast<Actor>(pObject))
231-
pActorObject->DropOrPickUpObject(acMessage.Item, pDropLocation, pDropRotation);
240+
if (pActor)
241+
pActor->DropOrPickUpObject(acMessage.Item, pDropLocation, pDropRotation);
232242
else
233243
pObject->AddOrRemoveItem(acMessage.Item);
234244
}

Code/client/Services/Generic/MagicService.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,7 @@ void MagicService::OnNotifyPartyMemberDowned(const NotifyPartyMemberDowned& acMe
745745
std::string playerName;
746746
const auto& players = m_world.GetPartyService().GetPlayers();
747747
if (auto it = players.find(acMessage.PlayerId); it != players.end())
748-
playerName = it->second.c_str();
748+
playerName = it->second.Name.c_str();
749749
else
750750
playerName = "Player " + std::to_string(acMessage.PlayerId);
751751

Code/client/Services/Generic/OverlayClient.cpp

Lines changed: 113 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,14 @@
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+
151255
void OverlayClient::ProcessToggleDebugUI()
152256
{
153257
World::Get().GetDebugService().m_showDebugStuff = !World::Get().GetDebugService().m_showDebugStuff;

0 commit comments

Comments
 (0)