Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 77 additions & 32 deletions src/Cheats/TracersHandler.cs
Original file line number Diff line number Diff line change
@@ -1,62 +1,107 @@
using UnityEngine;

namespace MalumMenu;

public static class TracersHandler
{
public static void drawPlayerTracer(PlayerPhysics playerPhysics){
try{

Color color = Color.clear; // All tracers are invisible by default
/// <summary>
/// Draws a tracer from the local player to another player.
/// </summary>
/// <param name="playerPhysics">The <c>PlayerPhysics</c> of the target player.</param>
public static void DrawPlayerTracer(PlayerPhysics playerPhysics)
{
try
{
var color = Color.clear; // All tracers are invisible by default

if (!playerPhysics.myPlayer.Data.IsDead){
if (CheatToggles.tracersCrew && !playerPhysics.myPlayer.Data.Role.IsImpostor){
if (CheatToggles.colorBasedTracers){
color = playerPhysics.myPlayer.Data.Color; // Color-Based Tracer
}else{
color = playerPhysics.myPlayer.Data.Role.TeamColor; // Team-Based Tracer
if (!playerPhysics.myPlayer.Data.IsDead)
{
if (CheatToggles.tracersCrew && !playerPhysics.myPlayer.Data.Role.IsImpostor ||
CheatToggles.tracersImps && playerPhysics.myPlayer.Data.Role.IsImpostor)
{
if (CheatToggles.distanceBasedTracers)
{
color = GetDistanceBasedColor(playerPhysics.myPlayer.transform.position);
}
}else if (CheatToggles.tracersImps && playerPhysics.myPlayer.Data.Role.IsImpostor){
if (CheatToggles.colorBasedTracers){
else if (CheatToggles.colorBasedTracers)
{
color = playerPhysics.myPlayer.Data.Color; // Color-Based Tracer
}else{
}
else
{
color = playerPhysics.myPlayer.Data.Role.TeamColor; // Team-Based Tracer
}
}
}else{
if (CheatToggles.tracersGhosts){
if (CheatToggles.colorBasedTracers){
}
else
{
if (CheatToggles.tracersGhosts)
{
if (CheatToggles.distanceBasedTracers)
{
color = GetDistanceBasedColor(playerPhysics.myPlayer.transform.position);
}
else if (CheatToggles.colorBasedTracers)
{
color = playerPhysics.myPlayer.Data.Color; // Color-Based Tracer
}else{
}
else
{
color = Palette.White; // Ghost Tracer (White)
}
}
}

// Draw tracer between the player and LocalPlayer using the right color
Utils.drawTracer(playerPhysics.myPlayer.gameObject, PlayerControl.LocalPlayer.gameObject, color);

}catch{}
}

public static void drawBodyTracer(DeadBody deadBody){
Color color = Color.clear; // All tracers are invisible by default

if (CheatToggles.tracersBodies){
if (CheatToggles.colorBasedTracers){

// Fetch the dead body's PlayerInfo
NetworkedPlayerInfo playerById = GameData.Instance.GetPlayerById(deadBody.ParentId);

color = playerById.Color; // Color-Based Tracer

}else{
/// <summary>
/// Draws a tracer from the local player to a dead body. Only draws tracers for unreported dead bodies.
/// </summary>
/// <param name="deadBody">The <c>DeadBody</c> to draw a tracer to.</param>
public static void DrawBodyTracer(DeadBody deadBody)
{
var color = Color.clear; // All tracers are invisible by default

if (CheatToggles.tracersBodies)
{
if (CheatToggles.distanceBasedTracers)
{
color = GetDistanceBasedColor(deadBody.transform.position);
}
else if (CheatToggles.colorBasedTracers)
{
color = GameData.Instance.GetPlayerById(deadBody.ParentId).Color; // Color-Based Tracer
}
else
{
color = Color.yellow; // Dead Body Tracer (Yellow)

}
}

// Draw tracer between the dead body and LocalPlayer using the right color
Utils.drawTracer(deadBody.gameObject, PlayerControl.LocalPlayer.gameObject, color);
}
}

/// <summary>
/// Gets a color based on the distance between the local player and a target position.
/// Closer distances are red, medium distances are yellow, and farther distances are green.
/// </summary>
/// <param name="targetPosition">The position to calculate the distance from.</param>
/// <returns>A Color that represents the distance (red for close, yellow for medium, green for far).</returns>
private static Color GetDistanceBasedColor(Vector3 targetPosition)
{
const float maxDistance = 20f; // Green at 20+ units
const float minDistance = 2f; // Red at 2 units or fewer

var distance = Vector3.Distance(targetPosition, PlayerControl.LocalPlayer.transform.position);
var normalized = Mathf.InverseLerp(minDistance, maxDistance, distance);

// Interpolate: Red (close) -> Yellow (medium) -> Green (far)
return normalized < 0.5f
? Color.Lerp(Color.red, Color.yellow, normalized * 2f)
: Color.Lerp(Color.yellow, Color.green, (normalized - 0.5f) * 2f);
}
}
11 changes: 3 additions & 8 deletions src/Patches/PlayerPhysicsPatches.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ public static class PlayerPhysics_LateUpdate
{
public static void Postfix(PlayerPhysics __instance)
{

MalumESP.PlayerNametags(__instance);
MalumESP.seeGhostsCheat(__instance);

Expand All @@ -33,18 +32,15 @@ public static void Postfix(PlayerPhysics __instance)
MalumPPMCheats.changeRolePPM();
MalumPPMCheats.forceRolePPM();

TracersHandler.drawPlayerTracer(__instance);
TracersHandler.DrawPlayerTracer(__instance);

GameObject[] bodyObjects = GameObject.FindGameObjectsWithTag("DeadBody");
foreach(GameObject bodyObject in bodyObjects) // Finds and loops through all dead bodies
{
DeadBody deadBody = bodyObject.GetComponent<DeadBody>();

if (deadBody){
if (!deadBody.Reported){ // Only draw tracers for unreported dead bodies
TracersHandler.drawBodyTracer(deadBody);
}
}
if (!deadBody || deadBody.Reported) continue; // Only draw tracers for unreported dead bodies
TracersHandler.DrawBodyTracer(deadBody);
}

try
Expand All @@ -60,7 +56,6 @@ public static void Postfix(PlayerPhysics __instance)
PlayerControl.LocalPlayer.MyPhysics.GhostSpeed = Mathf.Abs(PlayerControl.LocalPlayer.MyPhysics.GhostSpeed);
}
}catch (NullReferenceException) {}

}
}

Expand Down
3 changes: 2 additions & 1 deletion src/UI/MenuUI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ private void Start()
new ToggleInfo(" Impostors", () => CheatToggles.tracersImps, x => CheatToggles.tracersImps = x),
new ToggleInfo(" Ghosts", () => CheatToggles.tracersGhosts, x => CheatToggles.tracersGhosts = x),
new ToggleInfo(" Dead Bodies", () => CheatToggles.tracersBodies, x => CheatToggles.tracersBodies = x),
new ToggleInfo(" Color-based", () => CheatToggles.colorBasedTracers, x => CheatToggles.colorBasedTracers = x)
new ToggleInfo(" Color-based", () => CheatToggles.colorBasedTracers, x => CheatToggles.colorBasedTracers = x),
new ToggleInfo(" Distance-based", () => CheatToggles.distanceBasedTracers, x => CheatToggles.distanceBasedTracers = x)
]),

new SubmenuInfo("Minimap", false, [
Expand Down
Loading