Skip to content

Commit 4991651

Browse files
committed
feat: access client-side ray tracer
1 parent c0883c6 commit 4991651

File tree

4 files changed

+57
-47
lines changed

4 files changed

+57
-47
lines changed

src/Features/EntityList.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ CON_COMMAND(sar_ent_info, "sar_ent_info [selector] - show info about the entity
255255
} else {
256256
CGameTrace tr;
257257

258-
if (engine->TraceFromCamera(8192, MASK_ALL, tr)) {
258+
if (engine->TraceFromCamera<true>(8192, MASK_ALL, tr)) {
259259
void *entity = tr.m_pEnt;
260260
if (entity) {
261261
dumpEntInfo(entity);

src/Features/Speedrun/CategoryCreator.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ CON_COMMAND(sar_speedrun_cc_place, "sar_speedrun_cc_place - place a trigger-ey r
173173
}
174174
case 1: {
175175
CGameTrace tr;
176-
engine->TraceFromCamera(MAX_TRACE, MASK_SHOT_PORTAL, tr);
176+
engine->TraceFromCamera<true>(MAX_TRACE, MASK_SHOT_PORTAL, tr);
177177

178178
g_placementStart = tr.endpos;
179179

@@ -183,7 +183,7 @@ CON_COMMAND(sar_speedrun_cc_place, "sar_speedrun_cc_place - place a trigger-ey r
183183
}
184184
case 2: {
185185
CGameTrace tr;
186-
engine->TraceFromCamera(MAX_TRACE, MASK_SHOT_PORTAL, tr);
186+
engine->TraceFromCamera<true>(MAX_TRACE, MASK_SHOT_PORTAL, tr);
187187

188188
Vector start = g_placementStart;
189189
Vector end = tr.endpos;
@@ -265,7 +265,7 @@ ON_EVENT(RENDER) {
265265

266266
if (g_placementStage == 2) {
267267
CGameTrace tr;
268-
engine->TraceFromCamera(MAX_TRACE, MASK_SHOT_PORTAL, tr);
268+
engine->TraceFromCamera<true>(MAX_TRACE, MASK_SHOT_PORTAL, tr);
269269

270270
OverlayRender::addBoxMesh(
271271
{0, 0, 0},

src/Modules/Engine.cpp

Lines changed: 5 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -262,46 +262,6 @@ bool Engine::IsSplitscreen() {
262262
return false;
263263
}
264264

265-
bool Engine::Trace(Vector &pos, QAngle &angle, float distMax, int mask, CTraceFilterSimple &filter, CGameTrace &tr) {
266-
float X = DEG2RAD(angle.x), Y = DEG2RAD(angle.y);
267-
auto cosX = std::cos(X), cosY = std::cos(Y);
268-
auto sinX = std::sin(X), sinY = std::sin(Y);
269-
270-
Vector dir(cosY * cosX, sinY * cosX, -sinX);
271-
272-
Vector finalDir = Vector(dir.x, dir.y, dir.z).Normalize() * distMax;
273-
274-
Ray_t ray;
275-
ray.m_IsRay = true;
276-
ray.m_IsSwept = true;
277-
ray.m_Start = VectorAligned(pos.x, pos.y, pos.z);
278-
ray.m_Delta = VectorAligned(finalDir.x, finalDir.y, finalDir.z);
279-
ray.m_StartOffset = VectorAligned();
280-
ray.m_Extents = VectorAligned();
281-
282-
engine->TraceRay(this->engineTrace->ThisPtr(), ray, mask, &filter, &tr);
283-
284-
if (tr.fraction >= 1) {
285-
return false;
286-
}
287-
return true;
288-
}
289-
290-
bool Engine::TraceFromCamera(float distMax, int mask, CGameTrace &tr) {
291-
void *player = server->GetPlayer(GET_SLOT() + 1);
292-
293-
if (player == nullptr || (int)player == -1)
294-
return false;
295-
296-
Vector camPos = server->GetAbsOrigin(player) + server->GetViewOffset(player);
297-
QAngle angle = engine->GetAngles(GET_SLOT());
298-
299-
CTraceFilterSimple filter;
300-
filter.SetPassEntity(server->GetPlayer(GET_SLOT() + 1));
301-
302-
return this->Trace(camPos, angle, distMax, mask, filter, tr);
303-
}
304-
305265
ON_EVENT(PRE_TICK) {
306266
if (!engine->demoplayer->IsPlaying()) {
307267
if (sar_pause_at.GetInt() == -1 || (!sv_cheats.GetBool() && sar_pause_at.GetInt() > 0)) {
@@ -1056,6 +1016,10 @@ bool Engine::Init() {
10561016
this->TraceRay = this->engineTrace->Original<_TraceRay>(Offsets::TraceRay);
10571017
this->PointOutsideWorld = this->engineTrace->Original<_PointOutsideWorld>(Offsets::TraceRay + 14);
10581018
}
1019+
1020+
if (this->engineTraceClient = Interface::Create(this->Name(), "EngineTraceClient004")) {
1021+
this->TraceRayClient = this->engineTraceClient->Original<_TraceRay>(Offsets::TraceRay);
1022+
}
10591023
}
10601024

10611025
if (this->engineTool = Interface::Create(this->Name(), "VENGINETOOL003", false)) {
@@ -1214,7 +1178,7 @@ bool Engine::Init() {
12141178
Memory::CloseModuleHandle(bink_mod);
12151179
}
12161180

1217-
return this->hasLoaded = this->engineClient && this->s_ServerPlugin && this->demoplayer && this->demorecorder && this->engineTrace;
1181+
return this->hasLoaded = this->engineClient && this->s_ServerPlugin && this->demoplayer && this->demorecorder && this->engineTrace && this->engineTraceClient;
12181182
}
12191183
void Engine::Shutdown() {
12201184
if (this->engineClient) {

src/Modules/Engine.hpp

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#include "EngineDemoRecorder.hpp"
55
#include "Interface.hpp"
66
#include "Module.hpp"
7+
#include "Modules/Client.hpp"
8+
#include "Modules/Server.hpp"
79
#include "Utils.hpp"
810
#include "Variable.hpp"
911

@@ -17,6 +19,7 @@ class Engine : public Module {
1719
Interface *s_ServerPlugin = nullptr;
1820
Interface *engineTool = nullptr;
1921
Interface *engineTrace = nullptr;
22+
Interface *engineTraceClient = nullptr;
2023
Interface *g_VEngineServer = nullptr;
2124

2225
Interface *g_physCollision = nullptr; // This is actually on the vphysics module but I don't care
@@ -88,6 +91,7 @@ class Engine : public Module {
8891
_DebugDrawPhysCollide DebugDrawPhysCollide = nullptr;
8992
_IsPaused IsPaused = nullptr;
9093
_TraceRay TraceRay = nullptr;
94+
_TraceRay TraceRayClient = nullptr;
9195
_PointOutsideWorld PointOutsideWorld = nullptr;
9296
_GetCount GetCount = nullptr;
9397
_Con_IsVisible Con_IsVisible = nullptr;
@@ -148,8 +152,8 @@ class Engine : public Module {
148152
bool IsOrange();
149153
bool IsSplitscreen();
150154
void RecordDemoData(void *data, size_t len);
151-
bool Trace(Vector &pos, QAngle &angle, float distMax, int mask, CTraceFilterSimple &filter, CGameTrace &tr);
152-
bool TraceFromCamera(float distMax, int mask, CGameTrace &tr);
155+
template <bool serverside> bool Trace(Vector &pos, QAngle &angle, float distMax, int mask, CTraceFilterSimple &filter, CGameTrace &tr);
156+
template <bool serverside> bool TraceFromCamera(float distMax, int mask, CGameTrace &tr);
153157
bool ConsoleVisible();
154158
void GetTicks(int &host, int &server, int &client);
155159
void SetAdvancing(bool advancing);
@@ -262,3 +266,45 @@ extern int g_coop_pausable;
262266
#define NOW_STEADY() std::chrono::steady_clock::now()
263267

264268
#define GET_ACTIVE_SPLITSCREEN_SLOT() engine->GetActiveSplitScreenPlayerSlot(nullptr)
269+
270+
template <bool serverside>
271+
bool Engine::Trace(Vector &pos, QAngle &angle, float distMax, int mask, CTraceFilterSimple &filter, CGameTrace &tr) {
272+
float X = DEG2RAD(angle.x), Y = DEG2RAD(angle.y);
273+
auto cosX = std::cos(X), cosY = std::cos(Y);
274+
auto sinX = std::sin(X), sinY = std::sin(Y);
275+
276+
Vector dir(cosY * cosX, sinY * cosX, -sinX);
277+
278+
Vector finalDir = Vector(dir.x, dir.y, dir.z).Normalize() * distMax;
279+
280+
Ray_t ray;
281+
ray.m_IsRay = true;
282+
ray.m_IsSwept = true;
283+
ray.m_Start = VectorAligned(pos.x, pos.y, pos.z);
284+
ray.m_Delta = VectorAligned(finalDir.x, finalDir.y, finalDir.z);
285+
ray.m_StartOffset = VectorAligned();
286+
ray.m_Extents = VectorAligned();
287+
288+
if (serverside) engine->TraceRay(this->engineTrace->ThisPtr(), ray, mask, &filter, &tr);
289+
else engine->TraceRayClient(this->engineTraceClient->ThisPtr(), ray, mask, &filter, &tr);
290+
291+
if (tr.fraction >= 1) {
292+
return false;
293+
}
294+
return true;
295+
}
296+
297+
template <bool serverside>
298+
bool Engine::TraceFromCamera(float distMax, int mask, CGameTrace &tr) {
299+
void *player = serverside ? (void *)server->GetPlayer(GET_SLOT() + 1) : (void *)client->GetPlayer(GET_SLOT() + 1);
300+
if (player == nullptr || (int)player == -1)
301+
return false;
302+
303+
Vector camPos = serverside ? server->GetAbsOrigin(player) + server->GetViewOffset(player) : client->GetAbsOrigin(player) + client->GetViewOffset(player);
304+
QAngle angle = engine->GetAngles(GET_SLOT());
305+
306+
CTraceFilterSimple filter;
307+
filter.SetPassEntity(player);
308+
309+
return this->Trace<serverside>(camPos, angle, distMax, mask, filter, tr);
310+
}

0 commit comments

Comments
 (0)