C#:
// EasyRadar by Vegas Rust
using System;
using UnityEngine;
namespace Oxide.Plugins
{
[Info("EasyRadar", "Vegas Rust", "1.0.0")]
[Description("EasyRadar by Vegas Rust — simple admin player radar.")]
public class EasyRadar : RustPlugin
{
private const string ChatPrefix = "<size=12><color=#44CC66>EasyRadar</color> » ";
private PluginConfig config;
private class PluginConfig
{
public float MaxDistance = 100f;
}
protected override void LoadDefaultConfig()
{
config = new PluginConfig();
SaveConfig();
}
protected override void LoadConfig()
{
base.LoadConfig();
config = Config.ReadObject<PluginConfig>() ?? new PluginConfig();
if (config.MaxDistance < 1f)
config.MaxDistance = 100f;
}
protected override void SaveConfig() => Config.WriteObject(config, true);
private void Init() => LoadConfig();
private void Unload()
{
foreach (var player in BasePlayer.activePlayerList)
{
if (player == null) continue;
var component = player.GetComponent<RadarBehaviour>();
if (component != null)
UnityEngine.Object.Destroy(component);
}
}
[ChatCommand("radar")]
private void RadarCommand(BasePlayer player, string command, string[] args)
{
if (player == null || !player.IsConnected) return;
if (player.net.connection.authLevel == 0) return;
if (args.Length > 0) return;
var component = player.GetComponent<RadarBehaviour>();
if (component != null)
{
UnityEngine.Object.Destroy(component);
player.ChatMessage($"{ChatPrefix}Disabled.");
return;
}
StartRadar(player);
}
private void StartRadar(BasePlayer player)
{
var existing = player.GetComponent<RadarBehaviour>();
if (existing != null)
UnityEngine.Object.Destroy(existing);
var behaviour = player.gameObject.AddComponent<RadarBehaviour>();
behaviour.rate = 1f;
behaviour.dist = config.MaxDistance;
behaviour.player = player;
behaviour.Init();
player.ChatMessage($"{ChatPrefix}Enabled.");
}
public class RadarBehaviour : FacepunchBehaviour
{
public float rate;
public float dist;
public BasePlayer player;
public void Init()
{
InvokeRepeating(nameof(UpdateRadar), rate, rate);
}
private void UpdateRadar()
{
if (player == null || !player.IsConnected)
{
Destroy(this);
return;
}
foreach (var connection in player.net.group.subscribers)
{
if (!connection.active) continue;
var user = connection.player as BasePlayer;
if (user == null || user.userID == player.userID) continue;
if (connection.authLevel == 2 && player.Connection.authLevel == 1) continue;
var distance = Math.Round((user.transform.position - player.transform.position).magnitude);
if (distance > dist) continue;
player.SendConsoleCommand(
"ddraw.text",
rate,
Color.white,
user.transform.position + new Vector3(0, 1.9f, 0),
$"{user.displayName} | {distance}m");
}
}
private void OnDestroy()
{
CancelInvoke(nameof(UpdateRadar));
}
}
}
}