diff --git a/SceneManager/Utils/MousePositionInWorld.cs b/SceneManager/Utils/MousePositionInWorld.cs new file mode 100644 index 0000000..4f17043 --- /dev/null +++ b/SceneManager/Utils/MousePositionInWorld.cs @@ -0,0 +1,42 @@ +using Rage; + +namespace SceneManager.Utils +{ + internal static class MousePositionInWorld + { + internal static Vector3 GetPosition { get { return GetMousePositionInWorld(); } } + + internal static Vector3 GetPositionForBarrier { get { return GetMousePositionInWorld(Settings.BarrierPlacementDistance); } } + + private static Vector3 GetMousePositionInWorld(float maxDistance = 100f) + { + HitResult TracePlayerView(float maxTraceDistance = 100f, TraceFlags flags = TraceFlags.IntersectWorld) => TracePlayerView2(out Vector3 v1, out Vector3 v2, maxTraceDistance, flags); + + HitResult TracePlayerView2(out Vector3 start, out Vector3 end, float maxTraceDistance, TraceFlags flags) + { + Vector3 direction = GetPlayerLookingDirection(out start); + end = start + (maxTraceDistance * direction); + return World.TraceLine(start, end, flags); + } + + Vector3 GetPlayerLookingDirection(out Vector3 camPosition) + { + if (Camera.RenderingCamera) + { + camPosition = Camera.RenderingCamera.Position; + return Camera.RenderingCamera.Direction; + } + else + { + float pitch = Rage.Native.NativeFunction.Natives.GET_GAMEPLAY_CAM_RELATIVE_PITCH(); + float heading = Rage.Native.NativeFunction.Natives.GET_GAMEPLAY_CAM_RELATIVE_HEADING(); + + camPosition = Rage.Native.NativeFunction.Natives.GET_GAMEPLAY_CAM_COORD(); + return (Game.LocalPlayer.Character.Rotation + new Rotator(pitch, 0, heading)).ToVector().ToNormalized(); + } + } + + return TracePlayerView(maxDistance, TraceFlags.IntersectWorld).HitPosition; + } + } +}