Skip to content

Commit e65cdac

Browse files
committed
feat(gameevents): OnClientProcessUsercmds
1 parent bed6540 commit e65cdac

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

.vscode/c_cpp_properties.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"name": "Win32",
55
"includePath": [
66
"${workspaceFolder}/build/swiftly/windows-x86_64/**",
7+
"${workspaceFolder}/build/swiftly/linux-x86_64/**",
78
"${workspaceFolder}/alliedmodders/hl2sdk-cs2/**",
89
"${workspaceFolder}/alliedmodders/metamod/**",
910
"${workspaceFolder}/alliedmodders/metamod/core/**",

plugin_files/gamedata/cs2/core/signatures.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@
119119
"windows": "48 8B 3D ? ? ? ? 48 85 FF 0F 84 ? ? ? ? BE",
120120
"linux": "4C 8B 35 ? ? ? ? 4D 85 F6 75 ? E9"
121121
},
122-
"CCSPlayer_MovementServices_ProcessUserCmd": {
122+
"CCSPlayerController_ProcessUsercmds": {
123123
"lib": "server",
124124
"windows": "48 8B C4 44 88 48 20 44 89 40 18 48 89 50 10 53",
125125
"linux": "55 48 89 E5 41 57 41 56 41 89 D6 41 55 41 54 49 89 FC 53 48 83 EC 38"

src/scripting/engine/gameevents.cpp

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
#include <plugins/manager.h>
44
#include <sdk/schema.h>
55
#include <sdk/components/CTakeDamageInfo.h>
6+
#include <network/usermessages/usermessage.h>
7+
#include <embedder/src/Embedder.h>
68

79
#include "ehandle.h"
10+
#include "cs_usercmd.pb.h"
811

912
dyno::ReturnAction CCSPlayerPawnBase_PostThinkPre(dyno::CallbackType type, dyno::IHook& hook)
1013
{
@@ -143,4 +146,44 @@ dyno::ReturnAction Hook_CBaseEntity_TakeDamage(dyno::CallbackType type, dyno::IH
143146
return dyno::ReturnAction::Ignored;
144147
}
145148

146-
FunctionHook CBaseEntity_TakeDamage("CBaseEntity_TakeDamage", dyno::CallbackType::Pre, Hook_CBaseEntity_TakeDamage, "pp", 'v');
149+
FunctionHook CBaseEntity_TakeDamage("CBaseEntity_TakeDamage", dyno::CallbackType::Pre, Hook_CBaseEntity_TakeDamage, "pp", 'v');
150+
151+
class CUserCmd
152+
{
153+
public:
154+
[[maybe_unused]] char pad0[0x10];
155+
CSGOUserCmdPB cmd;
156+
[[maybe_unused]] char pad1[0x38];
157+
#ifdef _WIN32
158+
[[maybe_unused]] char pad2[0x8];
159+
#endif
160+
};
161+
162+
dyno::ReturnAction Hook_CCSPlayerController_ProcessUsercmds(dyno::CallbackType type, dyno::IHook& hook)
163+
{
164+
CEntityInstance* controller = (CEntityInstance*)(hook.getArgument<void*>(0));
165+
CUserCmd* cmdList = hook.getArgument<CUserCmd*>(1);
166+
int numcmds = hook.getArgument<int>(2);
167+
bool paused = hook.getArgument<bool>(3);
168+
float margin = hook.getArgument<float>(4);
169+
170+
std::vector<UserMessage*> ums;
171+
std::vector<std::any> userMessages;
172+
173+
for (int i = 0; i < numcmds; i++) {
174+
auto um = new UserMessage((google::protobuf::Message*)(&cmdList[i].cmd));
175+
ums.push_back(um);
176+
userMessages.push_back(new ClassData({ { "um_ptr", um } }, "UserMessage", nullptr));
177+
}
178+
179+
g_pluginManager.ExecuteEvent("core", "OnClientProcessUsercmds", { controller->m_pEntity->m_EHandle.GetEntryIndex() - 1, userMessages, numcmds, paused, margin }, {});
180+
181+
for (int i = 0; i < numcmds; i++) {
182+
delete ums[i];
183+
delete std::any_cast<ClassData*>(userMessages[i]);
184+
}
185+
186+
return dyno::ReturnAction::Ignored;
187+
}
188+
189+
FunctionHook CCSPlayerController_ProcessUsercmds("CCSPlayerController_ProcessUsercmds", dyno::CallbackType::Pre, Hook_CCSPlayerController_ProcessUsercmds, "ppibf", 'p');

0 commit comments

Comments
 (0)