Skip to content

Commit 07e6928

Browse files
committed
Fix patterns, implement scripted stuff
Autojump, ducktap and append are only implemented in this commit.
1 parent 46798c2 commit 07e6928

8 files changed

Lines changed: 144 additions & 18 deletions

File tree

src/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ set(CLIENT_FILES
3636
cl_dll/hud_timer.h
3737
cl_dll/hud_viewangles.cpp
3838
cl_dll/hud_viewangles.h
39+
cl_dll/input.cpp
40+
cl_dll/input.h
3941
cl_dll/opengl_utils.cpp
4042
cl_dll/opengl_utils.hpp
4143
cl_dll/parsemsg.cpp
@@ -54,6 +56,7 @@ set(ENGINE_FILES
5456
engine/gl_screen.h)
5557

5658
set(MAIN_FILES
59+
engine_patterns.hpp
5760
SvenBXT.cpp
5861
SvenBXT.h
5962
Utils.cpp

src/SvenBXT.cpp

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,9 @@ void SvenBXT_FindEngineStuff()
9797
switch (pattern - patterns::engine::ClientDLL_Init.cbegin())
9898
{
9999
default:
100-
case 0: // Sven-5.25
101-
Sys_Printf("Searching cl_enginefuncs in Sven-5.25 pattern...\n");
102-
g_lpEngfuncs = *reinterpret_cast<cl_enginefunc_t**>(reinterpret_cast<uintptr_t>(ClientDLL_Init) + 332);
100+
case 0: // Sven-5.23
101+
Sys_Printf("Searching cl_enginefuncs in Sven-5.23 pattern...\n");
102+
g_lpEngfuncs = *reinterpret_cast<cl_enginefunc_t**>(reinterpret_cast<uintptr_t>(ClientDLL_Init) + 1);
103103

104104
if (g_lpEngfuncs)
105105
{
@@ -108,18 +108,18 @@ void SvenBXT_FindEngineStuff()
108108
}
109109
else
110110
Sys_Printf("[Engine] Failed to find cl_enginefuncs. Can't hook client.\n");
111+
111112
break;
112-
case 1: // Sven-5.23
113-
Sys_Printf("Searching cl_enginefuncs in Sven-5.23 pattern...\n");
114-
g_lpEngfuncs = *reinterpret_cast<cl_enginefunc_t**>(reinterpret_cast<uintptr_t>(ClientDLL_Init) + 1);
113+
114+
case 1: // Sven-5.25
115+
Sys_Printf("Searching cl_enginefuncs in Sven-5.25 pattern...\n");
116+
g_lpEngfuncs = *reinterpret_cast<cl_enginefunc_t**>(reinterpret_cast<uintptr_t>(ClientDLL_Init) + 332);
115117

116118
if (g_lpEngfuncs)
117119
{
118120
Sys_Printf("[Engine] Found cl_enginefuncs at 0x%p.\n", g_lpEngfuncs);
119121
SvenBXT_HookClient();
120122
}
121-
else
122-
Sys_Printf("[Engine] Failed to find cl_enginefuncs. Can't hook client.\n");
123123
break;
124124
case 2: // Sven-5.26-rc1
125125
Sys_Printf("Searching cl_enginefuncs in Sven-5.26-rc1 pattern...\n");
@@ -130,9 +130,6 @@ void SvenBXT_FindEngineStuff()
130130
Sys_Printf("[Engine] Found cl_enginefuncs at 0x%p.\n", g_lpEngfuncs);
131131
SvenBXT_HookClient();
132132
}
133-
else
134-
Sys_Printf("[Engine] Failed to find cl_enginefuncs. Can't hook client.\n");
135-
136133
break;
137134
}
138135
});
@@ -190,13 +187,12 @@ void SvenBXT_FindEngineStuff()
190187
}
191188
});
192189

193-
SPTEngineFind(GL_Begin2D);
194-
SPTEngineFind(GL_Finish2D);
195-
196190
SPTEngineFind(LoadThisDll);
197191
SPTEngineFind(SCR_BeginLoadingPlaque);
198192
SPTEngineFind(SCR_EndLoadingPlaque);
199193
SPTEngineFind(GL_EndRendering);
194+
SPTEngineFind(GL_Finish2D);
195+
SPTEngineFind(GL_Begin2D);
200196
#endif
201197

202198
CreateHook(Engine, LoadThisDll);

src/SvenBXT.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ extern server_t* sv;
7373
#include "cl_dll/parsemsg.h"
7474
#include "cl_dll/view.h"
7575
#include "cl_dll/tri.h"
76+
#include "cl_dll/input.h"
7677
#include "cl_dll/opengl_utils.hpp"
7778

7879
#include "engine/gl_screen.h"

src/cl_dll/cdll_int.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,24 @@ int HOOKED_HUD_Redraw(float time, int intermission)
7878
return ORIG_HUD_Redraw(time, intermission);
7979
}
8080

81+
void __CmdFunc_Append()
82+
{
83+
if (g_lpEngfuncs->Cmd_Argc() != 2)
84+
{
85+
if (!g_lpEngfuncs->pDemoAPI->IsPlayingback())
86+
g_lpEngfuncs->Con_Printf("sbxt_append <command> - put the command into the end of the command buffer.\n");
87+
88+
return;
89+
}
90+
91+
EngineClientCmd(g_lpEngfuncs->Cmd_Argv(1));
92+
}
93+
94+
void CL_CmdInitialize()
95+
{
96+
HOOK_COMMAND("sbxt_append", Append);
97+
}
98+
8199
void CL_Initialize()
82100
{
83101
int status;
@@ -88,11 +106,21 @@ void CL_Initialize()
88106
Find(Client, HUD_VidInit);
89107
Find(Client, HUD_Redraw);
90108
Find(Client, HUD_DrawTransparentTriangles);
109+
Find(Client, HUD_PlayerMove);
110+
Find(Client, CL_CreateMove);
91111
CreateHook(Client, V_CalcRefdef);
92112
CreateHook(Client, HUD_VidInit);
93113
CreateHook(Client, HUD_Redraw);
94114
CreateHook(Client, HUD_DrawTransparentTriangles);
115+
CreateHook(Client, HUD_PlayerMove);
116+
CreateHook(Client, CL_CreateMove);
95117

96118
TRACE("Initializing HUD...\n");
97119
gBXTHud.Init();
120+
121+
TRACE("Initializing client commands...\n");
122+
CL_CmdInitialize();
123+
124+
TRACE("Initializing input...\n");
125+
IN_Init();
98126
}

src/cl_dll/input.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#include "SvenBXT.h"
2+
3+
cvar_t* sbxt_autojump;
4+
5+
playermove_t* g_ppmove;
6+
7+
bool bDucktapDown = false;
8+
9+
void IN_BXT_TAS_Ducktap_Down()
10+
{
11+
bDucktapDown = true;
12+
}
13+
14+
void IN_BXT_TAS_Ducktap_Up()
15+
{
16+
bDucktapDown = false;
17+
}
18+
19+
void HOOKED_HUD_PlayerMove(struct playermove_s* ppmove, qboolean server)
20+
{
21+
ORIG_HUD_PlayerMove(ppmove, server);
22+
g_ppmove = ppmove;
23+
}
24+
25+
void HOOKED_CL_CreateMove(float frametime, usercmd_s* cmd, int active)
26+
{
27+
ORIG_CL_CreateMove(frametime, cmd, active);
28+
29+
if (!g_ppmove)
30+
return;
31+
32+
if (bDucktapDown)
33+
{
34+
cmd->buttons |= IN_DUCK;
35+
36+
static bool s_duck_was_down_last_frame = false;
37+
static bool should_release_duck;
38+
39+
should_release_duck = (!(g_ppmove->flags & FL_ONGROUND) && g_ppmove->waterlevel < 1);
40+
41+
if (s_duck_was_down_last_frame && (g_ppmove->flags & FL_ONGROUND) && g_ppmove->waterlevel < 1)
42+
should_release_duck = true;
43+
44+
if (should_release_duck)
45+
{
46+
cmd->buttons &= ~IN_DUCK;
47+
}
48+
49+
s_duck_was_down_last_frame = ((cmd->buttons & IN_DUCK) != 0);
50+
}
51+
else
52+
{
53+
if (sbxt_autojump->value && (cmd->buttons & IN_JUMP) && !(g_ppmove->flags & FL_ONGROUND))
54+
{
55+
cmd->buttons &= ~IN_JUMP;
56+
}
57+
}
58+
}
59+
60+
void IN_Init()
61+
{
62+
g_lpEngfuncs->AddCommand("+sbxt_ducktap", IN_BXT_TAS_Ducktap_Down);
63+
g_lpEngfuncs->AddCommand("-sbxt_ducktap", IN_BXT_TAS_Ducktap_Up);
64+
sbxt_autojump = CVAR_CREATE("sbxt_autojump", "0", 0);
65+
}

src/cl_dll/input.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#ifdef INPUT_H_RECURSE_GUARD
2+
#error Recursive header files inclusion detected in input.h
3+
#else //INPUT_H_RECURSE_GUARD
4+
5+
#define INPUT_H_RECURSE_GUARD
6+
7+
#ifndef INPUT_H_GUARD
8+
#define INPUT_H_GUARD
9+
#pragma once
10+
11+
#ifdef __cplusplus
12+
13+
void HOOKED_HUD_PlayerMove(struct playermove_s* ppmove, qboolean server);
14+
void HOOKED_CL_CreateMove(float frametime, usercmd_s* cmd, int active);
15+
void IN_Init();
16+
17+
#else //!__cplusplus
18+
#error C++ compiler required to compile input.h
19+
#endif //__cplusplus
20+
21+
#endif //INPUT_H_GUARD
22+
23+
#undef INPUT_H_RECURSE_GUARD
24+
#endif //INPUT_H_RECURSE_GUARD

src/engine_patterns.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,17 @@ namespace patterns
3232
// ScreenShake
3333
// ScreenFade
3434
PATTERNS(ClientDLL_Init,
35-
"Sven-5.26-rc1",
36-
"81 EC 04 02 00 00 A1 ?? ?? ?? ?? 33 C4 89 84 24 ?? ?? ?? ?? 68 00 02 00 00 8D 44 24 ?? 6A 00 50 E8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 8D 44 24 ?? 68 FF 01 00 00 50 E8 ?? ?? ?? ?? 83 C4 18 83 3D ?? ?? ?? ?? 00 0F 84 ?? ?? ?? ?? E8 ?? ?? ?? ?? E8 ?? ?? ?? ?? A1 ?? ?? ?? ?? 85 C0 74 ?? FF D0 FF 35 ?? ?? ?? ??",
3735
"Sven-5.23",
3836
"68 ?? ?? ?? ?? FF 15 ?? ?? ?? ?? A1 ?? ?? ?? ?? 83 C4 1C 85 C0 74 0A 68 ?? ?? ?? ?? FF D0 83 C4 04 E8 ?? ?? ?? ?? 68 ?? ?? ?? ?? E8 ?? ?? ?? ?? 83 C4 04 A3 ?? ?? ?? ?? 85 C0 74 3A",
3937
"Sven-5.25",
40-
"81 EC 04 02 00 00 A1 ?? ?? ?? ?? 33 C4 89 84 24 ?? ?? ?? ?? 68 ?? ?? ?? ?? 8D 44 24 ?? 68 00 02 00 00 50 E8 ?? ?? ?? ?? 83 C4 0C 83 3D ?? ?? ?? ?? 00 0F 84 ?? ?? ?? ?? E8 ?? ?? ?? ?? E8 ?? ?? ?? ?? A1 ?? ?? ?? ?? 85 C0 74 ?? FF D0 FF 35 ?? ?? ?? ?? E8 ?? ?? ?? ?? 68 B0 00 00 00 6A 00 68 ?? ?? ?? ??"
38+
"81 EC 04 02 00 00 A1 ?? ?? ?? ?? 33 C4 89 84 24 ?? ?? ?? ?? 68 ?? ?? ?? ?? 8D 44 24 ?? 68 00 02 00 00",
39+
"Sven-5.26-rc1",
40+
"81 EC 04 02 00 00 A1 ?? ?? ?? ?? 33 C4 89 84 24 ?? ?? ?? ?? 68 00 02 00 00 8D 44 24 ?? 6A 00 50 E8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 8D 44 24 ?? 68 FF 01 00 00"
4141
);
4242

4343
PATTERNS(GL_Begin2D, // a.k.a GLBeginHud
4444
"Sven-5.25",
45-
"56 FF 35 ?? ?? ?? ?? FF 35 ?? ?? ?? ?? FF 35 ?? ?? ?? ??");
45+
"56 FF 35 ?? ?? ?? ?? FF 35 ?? ?? ?? ?? FF 35 ?? ?? ?? ?? FF 35 ?? ?? ?? ?? FF 15 ?? ?? ?? ?? 68 01 17 00 00 FF 15 ?? ?? ?? ?? FF 15 ?? ?? ?? ?? 8B 35 ?? ?? ?? ?? FF D6 DD 05 ?? ?? ?? ?? 83 EC 30");
4646

4747
PATTERNS(GL_Finish2D,
4848
"Sven-5.25",

src/hlsdk_mini.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2566,6 +2566,15 @@ typedef struct event_api_s
25662566
void (*EV_KillEvents)(int entnum, const char* eventname);
25672567
} event_api_t;
25682568

2569+
typedef struct demo_api_s
2570+
{
2571+
int (*IsRecording)(void);
2572+
int (*IsPlayingback)(void);
2573+
int (*IsTimeDemo)(void);
2574+
void (*WriteBuffer)(int size, unsigned char* buffer);
2575+
} demo_api_t;
2576+
2577+
25692578
typedef enum
25702579
{
25712580
TRI_FRONT = 0,

0 commit comments

Comments
 (0)