This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

88 lines
2.6 KiB
C++

/*
*
* For source engine tracing
*
*/
#include "../../../framework/trace.hpp"
#include "../../../framework/entitys.hpp"
#include "../hacks/ifaces.hpp"
#include "../util/classes.hpp"
#include "../util/mathlib.hpp"
namespace modules::source::trace {
// We do this similer to the ssdk
class TraceFilter : public ITraceFilter {
public:
TraceFilter(
IClientEntity* _ignore_target = iface::entity_list->GetClientEntity(
iface::engine->GetLocalPlayer()))
: ignore_target(_ignore_target) {}
TraceType_t GetTraceType() const { return TRACE_EVERYTHING; }
virtual bool ShouldHitEntity(IHandleEntity* handle, int mask) {
IClientEntity* entity = reinterpret_cast<IClientEntity*>(handle);
if (!entity || entity == ignore_target) return false;
#if defined(NEKO_TF2)
// Ignore invisible entities that we don't wanna hit
switch (entity->GetClientClass()->id) {
case 64: // CFuncRespawnRoomVisualizer
case 230: // CTFMedigunShield
case 55: // CFuncAreaPortalWindow
return false;
}
#endif
return true;
}
private:
IClientEntity* ignore_target;
};
// Trace line, returns end of trace
trace_t Terrain(const Vector& src, const Vector& dest) {
Ray_t ray;
ray.Init(src, dest);
TraceFilter filter(nullptr); // TODO, replace with a proper terrain filter
trace_t trace_result;
iface::trace->TraceRay(ray, 0x46004003, &filter, &trace_result);
return trace_result;
}
// Trace a line, returns entity hit or end of trace
trace_t Shot(const Vector& src, const Vector& dest, IClientEntity* ignore) {
Ray_t ray;
ray.Init(src, dest);
TraceFilter filter(ignore);
trace_t trace_result;
iface::trace->TraceRay(ray, 0x46004003, &filter, &trace_result);
return trace_result;
}
void Init() {
// Trace line to get entity
::trace::Terrain = [](const CatVector& src,
const CatVector& dest) -> CatVector {
trace_t trace_result = Terrain(ToVector(src), ToVector(dest));
return ToCatVector(trace_result.endpos);
};
// Trace a line, returns the end vector and entity if hit
::trace::Shot = [](const CatVector& src, const CatVector& dest,
CatEntity* ignore) -> std::pair<CatEntity*, CatVector> {
trace_t trace_result = Shot(ToVector(src), ToVector(dest),
reinterpret_cast<IClientEntity*>(ignore));
return {reinterpret_cast<CatEntity*>(trace_result.m_pEnt),
ToCatVector(trace_result.endpos)};
};
}
} // namespace modules::source::trace