Skip to content

Instantly share code, notes, and snippets.

@aurorapar
Created September 30, 2025 12:26
Show Gist options
  • Save aurorapar/20d2db0ce2ecc8f1942294a22966a583 to your computer and use it in GitHub Desktop.
Save aurorapar/20d2db0ce2ecc8f1942294a22966a583 to your computer and use it in GitHub Desktop.
public static Vector3 GetViewLocation(CCSPlayerController player, int distance = 8192, int cutShortDistance = 0)
{
var eyePosition = player.PlayerPawn.Value.AbsOrigin;
Vector startOrigin = new Vector(eyePosition.X, eyePosition.Y, eyePosition.Z + player.PlayerPawn.Value.ViewOffset.Z);
QAngle eyeAngles = player.PlayerPawn.Value.EyeAngles;
Vector forward = new();
NativeAPI.AngleVectors(eyeAngles.Handle, forward.Handle, 0, 0);
Vector endOrigin = new(startOrigin.X + forward.X * distance, startOrigin.Y + forward.Y * distance, startOrigin.Z + forward.Z * distance);
unsafe
{
CGameTrace* trace = stackalloc CGameTrace[1];
var gameTraceManager = NativeAPI.FindSignature(Addresses.ServerPath, GameData.GetSignature("GameTraceManager"));
int code = *(int*)(gameTraceManager + 3);
IntPtr gameTraceManagerAddress = gameTraceManager + code + 7;;
IntPtr traceFunc = NativeAPI.FindSignature(Addresses.ServerPath, GameData.GetSignature("TraceFunc"));
var traceShape = Marshal.GetDelegateForFunctionPointer<TraceShapeDelegate>(traceFunc);
ulong mask = (ulong) (RaytraceMasks.Solid | RaytraceMasks.Window | RaytraceMasks.Debris | RaytraceMasks.Hitbox);
ulong targetMask = (ulong) RaytraceMasks.Sky;
var buyzoneHandles = Utilities.FindAllEntitiesByDesignerName<CBuyZone>("func_buyzone")
.Select(e => (IntPtr) e.Handle).ToList();
var bombsiteHandles = Utilities.FindAllEntitiesByDesignerName<CBombTarget>("func_bomb_target")
.Select(e => (IntPtr) e.Handle).ToList();
var filters = new List<IntPtr>()
{
player.PlayerPawn.Value.Handle
};
filters.AddRange(buyzoneHandles);
filters.AddRange(bombsiteHandles);
traceShape(*(IntPtr*)gameTraceManagerAddress, startOrigin.Handle, endOrigin.Handle, player.PlayerPawn.Value.Handle, ~0ul,
targetMask, trace);
CGameTrace? possibleTraceResult = *trace;
if (!possibleTraceResult.HasValue)
return (Vector3) startOrigin;
var traceResult = (CGameTrace)possibleTraceResult;
CCSPlayerController? target = null;
if ((CBaseEntity?)Activator.CreateInstance(typeof(CBaseEntity), traceResult.HitEntity) is
{ } entityInstance)
{
if (entityInstance == null)
return (Vector3) startOrigin;
return new Vector3(
traceResult.EndPos.X + forward.X * -cutShortDistance,
traceResult.EndPos.Y + forward.Y * -cutShortDistance,
traceResult.EndPos.Z + forward.Z * -cutShortDistance
);
}
}
return (Vector3) startOrigin;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment