diff --git a/managed/RayTrace/RayTraceApi/RayTraceApi.cs b/managed/RayTrace/RayTraceApi/RayTraceApi.cs index cc41a6f..425725c 100644 --- a/managed/RayTrace/RayTraceApi/RayTraceApi.cs +++ b/managed/RayTrace/RayTraceApi/RayTraceApi.cs @@ -170,7 +170,15 @@ namespace RayTraceAPI } [StructLayout(LayoutKind.Sequential)] - public struct QAngle + public struct VectorNative + { + public float X; + public float Y; + public float Z; + } + + [StructLayout(LayoutKind.Sequential)] + public struct QAngleNative { public float X; public float Y; @@ -180,30 +188,9 @@ namespace RayTraceAPI public interface CRayTraceInterface { - TraceResult TraceShape( - in Vector3 start, - in QAngle angles, - CEntityInstance ignoreEntity, - in TraceOptions options); - - TraceResult TraceEndShape( - in Vector3 start, - in Vector3 end, - CEntityInstance ignoreEntity, - in TraceOptions options); - - TraceResult TraceHullShape( - in Vector3 start, - in Vector3 end, - in Vector3 mins, - in Vector3 maxs, - CEntityInstance ignoreEntity, - in TraceOptions options); - - TraceResult TraceShapeEx( - in Vector3 start, - in Vector3 end, - nint traceFilter, - nint ray); + public TraceResult TraceShape(Vector start, QAngle angles, CEntityInstance ignore, TraceOptions options); + public TraceResult TraceEndShape(Vector start, Vector end, CEntityInstance ignore, TraceOptions options); + public TraceResult TraceHullShape(Vector start, Vector end, Vector mins, Vector maxs, CEntityInstance ignore, TraceOptions options); + public TraceResult TraceShapeEx(Vector start, Vector end, nint filter, nint ray); } } \ No newline at end of file diff --git a/managed/RayTrace/RayTraceImpl/RayTraceImpl.cs b/managed/RayTrace/RayTraceImpl/RayTraceImpl.cs index 2e10bfa..e6613d7 100644 --- a/managed/RayTrace/RayTraceImpl/RayTraceImpl.cs +++ b/managed/RayTrace/RayTraceImpl/RayTraceImpl.cs @@ -2,6 +2,7 @@ // Created by Michal Přikryl on 10.10.2025. // Copyright (c) 2025 slynxcz. All rights reserved. // + using System.Buffers; using System.Numerics; using System.Reflection; @@ -19,7 +20,6 @@ using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Utils; using RayTraceAPI; -using QAngle = RayTraceAPI.QAngle; using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; namespace RayTraceImpl; @@ -32,7 +32,8 @@ public class RayTraceImpl : BasePlugin public override string ModuleVersion => "v1.0.0"; public override string ModuleAuthor => "Slynx"; - internal static PluginCapability RayTraceInterface { get; } = new("raytrace:craytraceinterface"); + internal static PluginCapability RayTraceInterface { get; } = + new("raytrace:craytraceinterface"); public override void Load(bool hotReload) { @@ -52,76 +53,94 @@ public class RayTraceImpl : BasePlugin Prints.ServerLog("[RayTraceImpl] Native bridge initialization failed.", ConsoleColor.Red); return; } + Prints.ServerLog("[RayTraceImpl] Managed side initialized.", ConsoleColor.Green); } } public class CRayTrace : CRayTraceInterface { - public TraceResult TraceShape(in Vector3 start, in QAngle angles, CEntityInstance ignore, in TraceOptions options) + public TraceResult TraceShape(Vector start, QAngle angles, CEntityInstance ignore, TraceOptions options) { unsafe { if (!NativeBridge.Loaded) return default; + VectorNative startNative = new() { X = start.X, Y = start.Y, Z = start.Z }; + QAngleNative angNative = new() { X = angles.X, Y = angles.Y, Z = angles.Z }; + TraceOptions optCopy = options; + return NativeBridge.TraceShape!( NativeBridge.Handle, - start, - angles, + (nint)(&startNative), + (nint)(&angNative), ignore.Handle, - (nint)Unsafe.AsPointer(ref Unsafe.AsRef(in options)) + (nint)(&optCopy) ); } } - public TraceResult TraceEndShape(in Vector3 start, in Vector3 end, CEntityInstance ignore, in TraceOptions options) + public TraceResult TraceEndShape(Vector start, Vector end, CEntityInstance ignore, TraceOptions options) { unsafe { if (!NativeBridge.Loaded) return default; + VectorNative s = new() { X = start.X, Y = start.Y, Z = start.Z }; + VectorNative e = new() { X = end.X, Y = end.Y, Z = end.Z }; + TraceOptions opt = options; + return NativeBridge.TraceEndShape!( NativeBridge.Handle, - start, - end, + (nint)(&s), + (nint)(&e), ignore.Handle, - (nint)Unsafe.AsPointer(ref Unsafe.AsRef(in options)) + (nint)(&opt) ); } } - public TraceResult TraceHullShape(in Vector3 start, in Vector3 end, in Vector3 mins, in Vector3 maxs, CEntityInstance ignore, in TraceOptions options) + public TraceResult TraceHullShape(Vector start, Vector end, Vector mins, Vector maxs, CEntityInstance ignore, TraceOptions options) { unsafe { if (!NativeBridge.Loaded) return default; + VectorNative s = new() { X = start.X, Y = start.Y, Z = start.Z }; + VectorNative e = new() { X = end.X, Y = end.Y, Z = end.Z }; + VectorNative mi = new() { X = mins.X, Y = mins.Y, Z = mins.Z }; + VectorNative ma = new() { X = maxs.X, Y = maxs.Y, Z = maxs.Z }; + TraceOptions opt = options; + return NativeBridge.TraceHullShape!( NativeBridge.Handle, - start, - end, - mins, - maxs, + (nint)(&s), + (nint)(&e), + (nint)(&mi), + (nint)(&ma), ignore.Handle, - (nint)Unsafe.AsPointer(ref Unsafe.AsRef(in options)) + (nint)(&opt) ); } } - public TraceResult TraceShapeEx(in Vector3 start, in Vector3 end, nint filter, nint ray) + public TraceResult TraceShapeEx(Vector start, Vector end, nint filter, nint ray) { unsafe { if (!NativeBridge.Loaded) return default; + VectorNative s = new() { X = start.X, Y = start.Y, Z = start.Z }; + VectorNative e = new() { X = end.X, Y = end.Y, Z = end.Z }; + return NativeBridge.TraceShapeEx!( NativeBridge.Handle, - start, - end, + (nint)(&s), + (nint)(&e), filter, ray ); @@ -134,10 +153,10 @@ public static class NativeBridge public static nint Handle; public static bool Loaded; - public static Func? TraceShape; - public static Func? TraceEndShape; - public static Func? TraceHullShape; - public static Func? TraceShapeEx; + public static unsafe Func? TraceShape; + public static unsafe Func? TraceEndShape; + public static unsafe Func? TraceHullShape; + public static unsafe Func? TraceShapeEx; public static bool Initialize() { @@ -170,10 +189,10 @@ public static class NativeBridge ex = 5; } - TraceShape = VirtualFunction.Create(Handle, shape); - TraceEndShape = VirtualFunction.Create(Handle, end); - TraceHullShape = VirtualFunction.Create(Handle, hull); - TraceShapeEx = VirtualFunction.Create(Handle, ex); + TraceShape = VirtualFunction.Create(Handle, shape); + TraceEndShape = VirtualFunction.Create(Handle, end); + TraceHullShape = VirtualFunction.Create(Handle, hull); + TraceShapeEx = VirtualFunction.Create(Handle, ex); } }