VoltMod
C++23 framework for CS2 server plugins
Loading...
Searching...
No Matches
PluginRegistry.cpp
Go to the documentation of this file.
2
4
5#include <algorithm>
6#include <string>
7
8namespace VoltMod
9{
10
18
22
24
26{
27 _state.SchemaLayoutStamp = stamp;
28 _state.SchemaVerified = verified;
29}
30
31PluginContext* PluginRegistry::AddPlugin(std::string_view name, std::string_view logTag, std::string_view version)
32{
33 if (name.empty() || FindPlugin(name) != nullptr)
34 {
35 return nullptr;
36 }
37
38 _plugins.push_back(std::make_unique<PluginContext>(_state, std::string(name),
39 std::string(logTag.empty() ? name : logTag),
40 std::string(version), _state.NextOrder++));
41 return _plugins.back().get();
42}
43
45{
46 const auto found = std::ranges::find_if(_plugins, [name](const auto& plugin) { return plugin->Name() == name; });
47 return found != _plugins.end() ? found->get() : nullptr;
48}
49
51{
52 const auto found = std::ranges::find_if(_plugins, [name](const auto& plugin) { return plugin->Name() == name; });
53 if (found == _plugins.end())
54 {
55 return {};
56 }
57
58 LeakReport leaks = (*found)->RemoveAll();
59 _plugins.erase(found);
60 return leaks;
61}
62
64{
67 return false;
68 });
69}
70
72{
73 _state.CurrentMap = mapName;
76 return false;
77 });
78}
79
80std::string PluginRegistry::RaiseClientConnecting(int slot, int64_t steamId, std::string_view name)
81{
82 char reason[256] = {};
83 const bool refused =
85 return callback(context, slot, steamId, name, reason, sizeof reason);
86 });
87 if (!refused)
88 {
89 return {};
90 }
91 reason[sizeof reason - 1] = '\0';
92 return reason[0] != '\0' ? std::string(reason) : std::string("Refused by the server.");
93}
94
95void PluginRegistry::RaiseClientConnected(int slot, int64_t steamId, std::string_view name, std::string_view address)
96{
97 // First, so a language a plugin restores on connect survives.
98 _state.Languages.Reset(slot);
99 if (IsValidSlot(slot))
100 {
101 _state.Clients[slot] =
102 ConnectedClient{.SteamId = steamId, .Name = std::string(name), .Address = std::string(address)};
103 }
106 return false;
107 });
108}
109
111{
114 return false;
115 });
116 _state.Languages.Reset(slot);
117 _state.Clients.Reset(slot);
118}
119
121{
122 if (IsValidSlot(slot) && _state.Clients[slot])
123 {
124 _state.Clients[slot]->FullyConnected = true;
125 }
128 return false;
129 });
130}
131
139
140bool PluginRegistry::RaiseConsoleCommand(std::string_view name, std::string_view arguments, int slot)
141{
143 return callback(context, name, arguments, slot);
144 });
145}
146
154
162
164{
165 return !_state.PlayerCommand.Empty() || !_state.PlayerCommandDone.Empty();
166}
167
172
177
179{
182 return false;
183 });
184}
185
186void PluginRegistry::RegisterHostCommand(std::string_view name)
187{
188 _state.Commands.Reserve(name);
189}
190
191} // namespace VoltMod
bool Dispatch(Visit &&visit)
void Reserve(std::string_view name)
std::string RaiseClientConnecting(int slot, int64_t steamId, std::string_view name)
void RaiseButtonPress(int slot, std::string_view buttonId)
void RaiseClientSettingsChanged(int slot)
void RegisterHostCommand(std::string_view name)
void RaiseCheckTransmit(CCheckTransmitInfo **infoList, int infoCount)
void SetSchemaLayout(uint64_t stamp, bool verified)
PluginContext * FindPlugin(std::string_view name)
void RaiseClientConnected(int slot, int64_t steamId, std::string_view name, std::string_view address)
void RaiseServerStartup(std::string_view mapName)
PluginRegistry(LoaderHandoff start={}, IPluginGameData *gameData=nullptr, IPluginAddons *addons=nullptr)
void RaiseBuildGameSessionManifest(IEntityResourceManifest *manifest)
bool RaiseConsoleCommand(std::string_view name, std::string_view arguments, int slot)
LeakReport RemovePlugin(std::string_view name)
void RaiseClientFullyConnected(int slot)
PluginContext * AddPlugin(std::string_view name, std::string_view logTag={}, std::string_view version={})
void RaiseClientDisconnected(int slot)
void RaisePlayerCommand(int slot, const PlayerInput &input)
void RaisePlayerCommandDone(int slot, const PlayerInput &input)
static std::string ReadFile(const std::filesystem::path &path)
Definition Loader.cpp:56
constexpr bool IsValidSlot(int slot)
Definition Slot.hpp:13
static void RaiseCommand(CallbackList< IPluginEvents::PlayerCommandFn > &listeners, int slot, const PlayerInput &input)
void(*)(void *context, int slot) ClientFullyConnectedFn
void(*)(void *context, int slot) ClientSettingsChangedFn
void(*)(void *context, int slot, std::string_view buttonId) ButtonPressFn
void(*)(void *context, std::string_view mapName) ServerStartupFn
void(*)(void *context, int slot, int64_t steamId, std::string_view name, std::string_view address) ClientConnectedFn
bool(*)(void *context, std::string_view name, std::string_view arguments, int slot) ConsoleCommandFn
void(*)(void *context, CCheckTransmitInfo **infoList, int infoCount) CheckTransmitFn
void(*)(void *context, IEntityResourceManifest *manifest) BuildGameSessionManifestFn
void(*)(void *context) FrameFn
void(*)(void *context, int slot, const PlayerInput &input) PlayerCommandFn
bool(*)(void *context, int slot, int64_t steamId, std::string_view name, char *reason, size_t reasonSize) ClientConnectingFn
void(*)(void *context, int slot) ClientDisconnectedFn
Protobuf-free snapshot of the CUserCmd handed to CPlayer_MovementServices::RunCommand,...
CallbackList< IPluginEvents::BuildGameSessionManifestFn > BuildGameSessionManifest
CallbackList< IPluginEvents::PlayerCommandFn > PlayerCommand
CallbackList< IPluginEvents::ClientFullyConnectedFn > ClientFullyConnected
CallbackList< IPluginEvents::ClientSettingsChangedFn > ClientSettingsChanged
CallbackList< IPluginEvents::FrameFn > Frame
PerSlot< std::optional< ConnectedClient > > Clients
CallbackList< IPluginEvents::ClientConnectingFn > ClientConnecting
LanguageTable Languages
CallbackList< IPluginEvents::CheckTransmitFn > CheckTransmit
uint64_t NextOrder
load positions keep rising, so a reloaded plugin dispatches last
CallbackList< IPluginEvents::ButtonPressFn > ButtonPress
CallbackList< IPluginEvents::ConsoleCommandFn > ConsoleCommand
CallbackList< IPluginEvents::PlayerCommandFn > PlayerCommandDone
CallbackList< IPluginEvents::ClientDisconnectedFn > ClientDisconnected
CallbackList< IPluginEvents::ClientConnectedFn > ClientConnected
uint64_t SchemaLayoutStamp
zero until the host has checked its own layout
CallbackList< IPluginEvents::ServerStartupFn > ServerStartup