From 9e02f69be5b8f6c81642ed16e9ffd4f93c00a638 Mon Sep 17 00:00:00 2001 From: Roman Nikonov Date: Sun, 16 Feb 2025 22:37:06 +0100 Subject: [PATCH 1/3] feat(skymp5-server): add onlinePlayersInfo property --- .../OnlinePlayersInfoBinding.cpp | 41 +++++++++++++++++++ .../OnlinePlayersInfoBinding.h | 10 +++++ .../PropertyBindingFactory.cpp | 2 + .../cpp/server_guest_lib/ServerState.h | 2 +- 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 skymp5-server/cpp/addon/property_bindings/OnlinePlayersInfoBinding.cpp create mode 100644 skymp5-server/cpp/addon/property_bindings/OnlinePlayersInfoBinding.h diff --git a/skymp5-server/cpp/addon/property_bindings/OnlinePlayersInfoBinding.cpp b/skymp5-server/cpp/addon/property_bindings/OnlinePlayersInfoBinding.cpp new file mode 100644 index 0000000000..f93ced0ced --- /dev/null +++ b/skymp5-server/cpp/addon/property_bindings/OnlinePlayersInfoBinding.cpp @@ -0,0 +1,41 @@ +#include "OnlinePlayersInfoBinding.h" + +#include "Config.h" +#include + +namespace { +struct PlayerInfo { + uint32_t actorId; // may be zero if not assigned to any actor + std::string guid; // may be an empty string if + uint32_t userId; +}; +} + +Napi::Value OnlinePlayersInfoBinding::Get(Napi::Env env, ScampServer& scampServer, + uint32_t) +{ + auto& partOne = scampServer.GetPartOne(); + // const auto& serverState = partOne->serverState; + + thread_local std::vector g_onlineActors(kMaxPlayers); + size_t numOnlineActors = 0; + + auto maxConnectedId = partOne->serverState.maxConnectedId; + for (size_t i = 0; i <= maxConnectedId; ++i) { + if (auto actor = partOne->serverState.ActorByUser(i)) { + g_onlineActors[numOnlineActors] = {actor->GetFormId(), partOne->serverState.UserGuid(i), i}; + ++numOnlineActors; + } + } + + auto arr = Napi::Array::New(env, numOnlineActors); + for (size_t k = 0; k < numOnlineActors; ++k) { + const auto& info = g_onlineActors[k]; + auto obj = Napi::Object::New(env); + obj.Set("actorId", info.actorId); + obj.Set("guid", info.guid); // hide inside another 'networking' obj? + obj.Set("userId", info.userId); + arr.Set(k, obj); + } + return arr; +} diff --git a/skymp5-server/cpp/addon/property_bindings/OnlinePlayersInfoBinding.h b/skymp5-server/cpp/addon/property_bindings/OnlinePlayersInfoBinding.h new file mode 100644 index 0000000000..4503bbb6e8 --- /dev/null +++ b/skymp5-server/cpp/addon/property_bindings/OnlinePlayersInfoBinding.h @@ -0,0 +1,10 @@ +#pragma once +#include "PropertyBinding.h" + +class OnlinePlayersInfoBinding : public PropertyBinding +{ +public: + std::string GetPropertyName() const override { return "onlinePlayersInfo"; } + Napi::Value Get(Napi::Env env, ScampServer& scampServer, + uint32_t formId) override; +}; diff --git a/skymp5-server/cpp/addon/property_bindings/PropertyBindingFactory.cpp b/skymp5-server/cpp/addon/property_bindings/PropertyBindingFactory.cpp index 740e5b0820..dcb2eac66d 100644 --- a/skymp5-server/cpp/addon/property_bindings/PropertyBindingFactory.cpp +++ b/skymp5-server/cpp/addon/property_bindings/PropertyBindingFactory.cpp @@ -16,6 +16,7 @@ #include "LocationalDataBinding.h" #include "NeighborsBinding.h" #include "OnlinePlayersBinding.h" +#include "OnlinePlayersInfoBinding.h" #include "PercentagesBinding.h" #include "PosBinding.h" #include "ProfileIdBinding.h" @@ -42,6 +43,7 @@ PropertyBindingFactory::CreateStandardPropertyBindings() result["locationalData"] = std::make_shared(); result["neighbors"] = std::make_shared(); result["onlinePlayers"] = std::make_shared(); + result["onlinePlayersInfo"] = std::make_shared(); result["percentages"] = std::make_shared(); result["pos"] = std::make_shared(); result["profileId"] = std::make_shared(); diff --git a/skymp5-server/cpp/server_guest_lib/ServerState.h b/skymp5-server/cpp/server_guest_lib/ServerState.h index 55175092e8..ab17113e1e 100644 --- a/skymp5-server/cpp/server_guest_lib/ServerState.h +++ b/skymp5-server/cpp/server_guest_lib/ServerState.h @@ -41,7 +41,7 @@ struct DeferredMessage struct UserInfo { - bool isDisconnecting = false; + // bool isDisconnecting = false; bool isPacketHistoryRecording = false; PacketHistory packetHistory; From 0c8a1077750c3339be4648ce7abeb003110d66a1 Mon Sep 17 00:00:00 2001 From: Roman Nikonov Date: Mon, 17 Feb 2025 10:21:28 +0100 Subject: [PATCH 2/3] upd --- .../cpp/addon/property_bindings/OnlinePlayersInfoBinding.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/skymp5-server/cpp/addon/property_bindings/OnlinePlayersInfoBinding.cpp b/skymp5-server/cpp/addon/property_bindings/OnlinePlayersInfoBinding.cpp index f93ced0ced..7a28b3c442 100644 --- a/skymp5-server/cpp/addon/property_bindings/OnlinePlayersInfoBinding.cpp +++ b/skymp5-server/cpp/addon/property_bindings/OnlinePlayersInfoBinding.cpp @@ -7,7 +7,7 @@ namespace { struct PlayerInfo { uint32_t actorId; // may be zero if not assigned to any actor std::string guid; // may be an empty string if - uint32_t userId; + Networking::UserId userId; }; } @@ -23,7 +23,7 @@ Napi::Value OnlinePlayersInfoBinding::Get(Napi::Env env, ScampServer& scampServe auto maxConnectedId = partOne->serverState.maxConnectedId; for (size_t i = 0; i <= maxConnectedId; ++i) { if (auto actor = partOne->serverState.ActorByUser(i)) { - g_onlineActors[numOnlineActors] = {actor->GetFormId(), partOne->serverState.UserGuid(i), i}; + g_onlineActors[numOnlineActors] = {actor->GetFormId(), partOne->serverState.UserGuid(i), static_cast(i)}; ++numOnlineActors; } } From 1b56790f6741edc4cddea9aaff61f5dde4e3e1fd Mon Sep 17 00:00:00 2001 From: Roman Nikonov Date: Mon, 17 Feb 2025 10:23:51 +0100 Subject: [PATCH 3/3] fmt --- .../property_bindings/OnlinePlayersInfoBinding.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/skymp5-server/cpp/addon/property_bindings/OnlinePlayersInfoBinding.cpp b/skymp5-server/cpp/addon/property_bindings/OnlinePlayersInfoBinding.cpp index 7a28b3c442..a193d60966 100644 --- a/skymp5-server/cpp/addon/property_bindings/OnlinePlayersInfoBinding.cpp +++ b/skymp5-server/cpp/addon/property_bindings/OnlinePlayersInfoBinding.cpp @@ -4,15 +4,16 @@ #include namespace { -struct PlayerInfo { +struct PlayerInfo +{ uint32_t actorId; // may be zero if not assigned to any actor std::string guid; // may be an empty string if Networking::UserId userId; }; } -Napi::Value OnlinePlayersInfoBinding::Get(Napi::Env env, ScampServer& scampServer, - uint32_t) +Napi::Value OnlinePlayersInfoBinding::Get(Napi::Env env, + ScampServer& scampServer, uint32_t) { auto& partOne = scampServer.GetPartOne(); // const auto& serverState = partOne->serverState; @@ -23,7 +24,11 @@ Napi::Value OnlinePlayersInfoBinding::Get(Napi::Env env, ScampServer& scampServe auto maxConnectedId = partOne->serverState.maxConnectedId; for (size_t i = 0; i <= maxConnectedId; ++i) { if (auto actor = partOne->serverState.ActorByUser(i)) { - g_onlineActors[numOnlineActors] = {actor->GetFormId(), partOne->serverState.UserGuid(i), static_cast(i)}; + g_onlineActors[numOnlineActors] = { + actor->GetFormId(), + partOne->serverState.UserGuid(i), + static_cast(i), + }; ++numOnlineActors; } }