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