VoltMod
C++23 framework for CS2 server plugins
Loading...
Searching...
No Matches
Bindings.cpp
Go to the documentation of this file.
3#include <format>
4#include <string>
5#include <string_view>
6#include <utility>
7#include <vector>
8
9namespace VoltMod
10{
11
12/** Binds one member from a gamedata lookup and keeps what did not bind. */
14{
15public:
16 explicit MemberBinder(const GameDataLookup& lookup) : _lookup(lookup) {}
17
18 template <class Sig>
19 void operator()(Fn<Sig>& member, std::string_view key)
20 {
22 }
23
28
29 template <class Sig>
30 void operator()(VirtualFn<Sig>& member, std::string_view key)
31 {
33 member = VirtualFn<Sig>(entry.Value, entry.Address);
34 }
35
36 template <class T>
37 void operator()(Offset<T>& member, std::string_view key)
38 {
40 }
41
42 /** What did not bind, as `key: reason`, in the order the members were bound. */
43 std::vector<std::string> TakeFailures() { return std::move(_failures); }
44
45private:
46 GameDataLocation Look(GameDataSection sections, std::string_view key)
47 {
48 const GameDataLocation entry = _lookup(sections, key);
49 if (!entry.Found)
50 {
51 _failures.push_back(std::format("{}: {}", key, entry.Reason));
52 }
53 return entry;
54 }
55
56 const GameDataLookup& _lookup;
57 std::vector<std::string> _failures;
58};
59
61{
62 *this = Bindings{};
63
65
66 bind(CreateEntityByName, "CreateEntityByName");
67 bind(DispatchSpawn, "DispatchSpawn");
68 bind(AcceptInput, "CEntityInstance::AcceptInput");
69 bind(AddEntityIOEvent, "CEntitySystem::AddEntityIOEvent");
70 bind(SetModel, "CBaseModelEntity::SetModel");
71 bind(EmitSoundParams, "CBaseEntity::EmitSoundParams");
72 bind(StopSound, "CBaseEntity::StopSound");
73 bind(EmitSoundFilter, "CBaseEntity::EmitSoundFilter");
74 bind(LegacyGameEventListener, "GetLegacyGameEventListener");
75 bind(TakeDamage, "CBaseEntity::TakeDamageOld");
76 bind(BuildDamageInfo, "CTakeDamageInfo::CTakeDamageInfo");
77 bind(TerminateRound, "CCSGameRules::TerminateRound");
78 bind(DropWeapon, "CCSPlayer_WeaponServices::DropWeapon");
79
80 bind(CustomHudSetHasClass, "CCSCustomHudLayout::SetHasClass");
81 bind(CustomHudSetHasClassForPlayer, "CCSCustomHudLayout::SetHasClassForPlayer");
82 bind(CustomHudSetDialogVariable, "CCSCustomHudLayout::SetDialogVariableString");
83 bind(CustomHudSetDialogVariableForPlayer, "CCSCustomHudLayout::SetDialogVariableStringForPlayer");
84 bind(CustomHudSetInputCapture, "CCSCustomHudLayout::SetInputCaptureEnabled");
85 bind(FilterMessage, "INetworkMessageProcessingPreFilter::FilterMessage");
86 bind(ReplyConnection, "CNetworkGameServer::ReplyConnection");
87
88 bind(GameEventManager, "CSource2Server::g_GameEventManager");
89
90 bind(CommitSuicide, "CBasePlayerPawn::CommitSuicide");
91 bind(ChangeTeam, "CCSPlayerController::ChangeTeam");
92 bind(Respawn, "CCSPlayerController::Respawn");
93 bind(Teleport, "CBaseEntity::Teleport");
94 bind(NavTraceLine, "CNavPhysicsInterface::Nav_TraceLine");
95 bind(NavTraceShape, "CNavPhysicsInterface::Nav_TraceShape");
96 bind(GiveNamedItem, "CCSPlayer_ItemServices::GiveNamedItem");
97 bind(RemoveAllItems, "CCSPlayer_ItemServices::RemoveAllItems");
98 bind(SelectItem, "CCSPlayer_WeaponServices::SelectItem");
99 bind(RunCommand, "CPlayer_MovementServices::RunCommand");
100 bind(ProcessRespondCvarValue, "CServerSideClient::ProcessRespondCvarValue");
101 bind(SendNetMessage, "CServerSideClient::SendNetMessage");
102
103 bind(GameEntitySystem, "GameEntitySystem");
104 bind(VisibilityRecipientSlot, "CheckTransmitPlayerSlot");
105 bind(ClientSlot, "CServerSideClientBase::m_nClientSlot");
106 bind(ClientMessageFilter, "CServerSideClient::INetworkMessageProcessingPreFilter");
107 bind(ClientSteamId, "CServerSideClientBase::m_SteamID");
108 bind(ServerAddons, "CNetworkGameServer::m_szAddons");
109 bind(UserCmdProto, "CUserCmd::CSGOUserCmdPB");
110 // Movement can use the protobuf counter instead.
111 bind(UserCmdNumber, "CUserCmdBase::cmdNum");
112
113 Failures = bind.TakeFailures();
114 if (!Failures.empty())
115 {
116 return std::unexpected(
117 Error::Engine(std::format("{} did not bind: {}", Failures.size(), Strings::Join(Failures, "; "))));
118 }
119
120 return {};
121}
122
123} // namespace VoltMod
void operator()(Offset< T > &member, std::string_view key)
Definition Bindings.cpp:37
void operator()(Fn< Sig > &member, std::string_view key)
Definition Bindings.cpp:19
std::vector< std::string > TakeFailures()
Definition Bindings.cpp:43
MemberBinder(const GameDataLookup &lookup)
Definition Bindings.cpp:16
void operator()(Address &member, std::string_view key)
Definition Bindings.cpp:24
void operator()(VirtualFn< Sig > &member, std::string_view key)
Definition Bindings.cpp:30
static std::string Join(const std::vector< std::string > &parts, std::string_view delimiter)
Definition Strings.cpp:114
Report player pawn moves through CBaseEntity::Teleport.
Definition Teleport.hpp:29
static std::string ReadFile(const std::filesystem::path &path)
Definition Loader.cpp:56
std::function< GameDataLocation(GameDataSection sections, std::string_view name)> GameDataLookup
std::expected< void, Error > Status
Definition Result.hpp:67
VirtualFn< bool(EngineClient *, const CNetMessage *)> ProcessRespondCvarValue
Definition Bindings.hpp:90
Fn< void(CEntityInstance *, const char *)> StopSound
Definition Bindings.hpp:39
Fn< void(CEntityInstance *, const char *, CEntityInstance *, CEntityInstance *, void *)> AcceptInput
Definition Bindings.hpp:29
Fn< void(CEntityInstance *, CEntityKeyValues *)> DispatchSpawn
Definition Bindings.hpp:27
Fn< void(void *, int32_t, bool)> CustomHudSetInputCapture
Definition Bindings.hpp:61
Offset< int32_t > UserCmdNumber
Definition Bindings.hpp:107
VirtualFn< void(void *, bool)> RemoveAllItems
Definition Bindings.hpp:87
Address GameEventManager
Definition Bindings.hpp:70
Offset< void > UserCmdProto
Definition Bindings.hpp:105
Address EmitSoundFilter
Definition Bindings.hpp:41
Fn< void(void *, int32_t, const CUtlString *, const CUtlString *, int32_t)> CustomHudSetHasClassForPlayer
Definition Bindings.hpp:57
VirtualFn< bool(EngineClient *, const CNetMessage *, NetChannelBufType_t)> SendNetMessage
Definition Bindings.hpp:91
Offset< int64_t > ClientSteamId
Definition Bindings.hpp:99
VirtualFn< void(EngineNavPhysics *, const Ray_t *, const Vector *, const Vector *, CTraceFilter *, CGameTrace *)> NavTraceShape
Definition Bindings.hpp:82
VirtualFn< void(CEntityInstance *, int)> ChangeTeam
Definition Bindings.hpp:74
VirtualFn< bool(INetworkMessageProcessingPreFilter *, const CNetMessage *, INetChannel *)> FilterMessage
Definition Bindings.hpp:65
Fn< void(void *, float, uint32_t, void *)> TerminateRound
Definition Bindings.hpp:51
Status Bind(const GameDataLookup &lookup)
Definition Bindings.cpp:60
std::vector< std::string > Failures
Definition Bindings.hpp:22
Fn< void(void *, CEntityInstance *, const char *, CEntityInstance *, CEntityInstance *, const void *, float, const void *, const void *)> AddEntityIOEvent
Definition Bindings.hpp:34
Offset< uint8_t > VisibilityRecipientSlot
Definition Bindings.hpp:96
VirtualFn< void(CEntityInstance *)> Respawn
Definition Bindings.hpp:75
Fn< void(void *, CEntityInstance *, CEntityInstance *, CEntityInstance *, const Vector *, const Vector *, float, int, int, void *)> BuildDamageInfo
Definition Bindings.hpp:49
Fn< void(void *, const CUtlString *, const CUtlString *, int32_t)> CustomHudSetHasClass
Definition Bindings.hpp:56
VirtualFn< void *(EngineMovementServices *, void *)> RunCommand
Definition Bindings.hpp:84
Fn< CEntityInstance *(const char *, int)> CreateEntityByName
Definition Bindings.hpp:25
Offset< int > ClientSlot
Definition Bindings.hpp:97
Offset< void > ClientMessageFilter
Definition Bindings.hpp:101
Offset< void > ServerAddons
Definition Bindings.hpp:103
VirtualFn< bool(EngineWeaponServices *, CEntityInstance *, int)> SelectItem
Definition Bindings.hpp:89
Fn< int64_t(CEntityInstance *, void *, void *)> TakeDamage
Definition Bindings.hpp:45
Fn< void(CEntityInstance *, const char *)> SetModel
Definition Bindings.hpp:35
Offset< CGameEntitySystem * > GameEntitySystem
Definition Bindings.hpp:94
Fn< void(CNetworkGameServerBase *, EngineClient *)> ReplyConnection
Definition Bindings.hpp:67
Address LegacyGameEventListener
Definition Bindings.hpp:43
VirtualFn< void(CEntityInstance *, bool, bool)> CommitSuicide
Definition Bindings.hpp:73
Fn< bool(EngineWeaponServices *, CEntityInstance *, bool)> DropWeapon
Definition Bindings.hpp:53
Fn< void(void *, const CUtlString *, const CUtlString *, const CUtlString *)> CustomHudSetDialogVariable
Definition Bindings.hpp:58
VirtualFn< bool(EngineNavPhysics *, const Vector *, const Vector *, CTraceFilter *, CGameTrace *)> NavTraceLine
Definition Bindings.hpp:80
VirtualFn< void *(void *, const char *)> GiveNamedItem
Definition Bindings.hpp:85
Fn< void(void *, int32_t, const CUtlString *, const CUtlString *, const CUtlString *)> CustomHudSetDialogVariableForPlayer
Definition Bindings.hpp:60
static Error Engine(std::string detail)
Definition Result.hpp:58