C#:
using System;
using System.Collections.Generic;
using UnityEngine;
using Oxide.Core;
using Oxide.Core.Plugins;
namespace Oxide.Plugins
{
[Info("WallHack Admin", "VanDaMus", "1.0.0")]
[Description("Показывает всех игроков через стены: боксы, линии и имена (steamcommunity.com/id/alexandr689/)")]
public class WallHackAdmin : RustPlugin
{
#region Поля
private const string PermUse = "wallhackadmin.use";
private Dictionary<ulong, Timer> playerTimers = new Dictionary<ulong, Timer>();
#endregion
#region Инициализация
private void Init()
{
permission.RegisterPermission(PermUse, this);
}
private void OnServerInitialized()
{
foreach (var ply in BasePlayer.activePlayerList)
{
if (ply == null) continue;
if (IsPlayerAdmin(ply) && !permission.UserHasPermission(ply.UserIDString, PermUse))
{
permission.GrantUserPermission(ply.UserIDString, PermUse, this);
Puts($"Выдано право {PermUse} игроку {ply.displayName} (ownerid)");
}
}
}
private void Unload()
{
foreach (var t in playerTimers.Values)
t?.Destroy();
playerTimers.Clear();
}
#endregion
#region Команды
[ChatCommand("whon")]
private void CmdWhOn(BasePlayer player, string command, string[] args)
{
if (!IsPlayerAdmin(player))
{
SendReply(player, "У вас нет доступа к этой команде.");
return;
}
if (playerTimers.ContainsKey(player.userID))
{
SendReply(player, "WH уже включен для вас.");
return;
}
playerTimers[player.userID] = timer.Every(0.1f, () => DrawESP(player));
SendReply(player, "WallHack <color=#00ff00>ВКЛЮЧЕН</color>.");
}
[ChatCommand("whoff")]
private void CmdWhOff(BasePlayer player, string command, string[] args)
{
if (!IsPlayerAdmin(player))
{
SendReply(player, "У вас нет доступа к этой команде.");
return;
}
if (playerTimers.TryGetValue(player.userID, out var t))
{
t.Destroy();
playerTimers.Remove(player.userID);
SendReply(player, "WallHack <color=#ff0000>ВЫКЛЮЧЕН</color>.");
}
else
{
SendReply(player, "WH уже выключен.");
}
}
[ChatCommand("wh")]
private void CmdWh(BasePlayer player, string command, string[] args)
{
if (!IsPlayerAdmin(player))
{
SendReply(player, "У вас нет доступа к этой команде.");
return;
}
if (playerTimers.ContainsKey(player.userID))
{
CmdWhOff(player, "whoff", null);
}
else
{
CmdWhOn(player, "whon", null);
}
}
#endregion
#region Отрисовка
private void DrawESP(BasePlayer viewer)
{
if (viewer == null || !viewer.IsConnected)
{
StopESP(viewer);
return;
}
foreach (var target in BasePlayer.activePlayerList)
{
if (target == null || target == viewer || !target.IsConnected) continue;
if (target.IsSleeping() || target.IsDead()) continue;
var pos = target.transform.position;
var headPos = pos + new Vector3(0, 1.8f, 0);
var feetPos = pos + new Vector3(0, 0.05f, 0);
Color boxColor = Color.red;
if (viewer.currentTeam != 0 && target.currentTeam != 0 && viewer.currentTeam == target.currentTeam)
{
boxColor = Color.green;
}
else if (target.IsBuildingAuthed())
{
boxColor = Color.yellow;
}
DrawLine(viewer, feetPos + new Vector3(-0.4f, 0, -0.4f), feetPos + new Vector3(0.4f, 0, -0.4f), boxColor);
DrawLine(viewer, feetPos + new Vector3(0.4f, 0, -0.4f), feetPos + new Vector3(0.4f, 0, 0.4f), boxColor);
DrawLine(viewer, feetPos + new Vector3(0.4f, 0, 0.4f), feetPos + new Vector3(-0.4f, 0, 0.4f), boxColor);
DrawLine(viewer, feetPos + new Vector3(-0.4f, 0, 0.4f), feetPos + new Vector3(-0.4f, 0, -0.4f), boxColor);
var topPos = pos + new Vector3(0, 1.9f, 0);
DrawLine(viewer, topPos + new Vector3(-0.4f, 0, -0.4f), topPos + new Vector3(0.4f, 0, -0.4f), boxColor);
DrawLine(viewer, topPos + new Vector3(0.4f, 0, -0.4f), topPos + new Vector3(0.4f, 0, 0.4f), boxColor);
DrawLine(viewer, topPos + new Vector3(0.4f, 0, 0.4f), topPos + new Vector3(-0.4f, 0, 0.4f), boxColor);
DrawLine(viewer, topPos + new Vector3(-0.4f, 0, 0.4f), topPos + new Vector3(-0.4f, 0, -0.4f), boxColor);
DrawLine(viewer, feetPos + new Vector3(-0.4f, 0, -0.4f), topPos + new Vector3(-0.4f, 0, -0.4f), boxColor);
DrawLine(viewer, feetPos + new Vector3(0.4f, 0, -0.4f), topPos + new Vector3(0.4f, 0, -0.4f), boxColor);
DrawLine(viewer, feetPos + new Vector3(0.4f, 0, 0.4f), topPos + new Vector3(0.4f, 0, 0.4f), boxColor);
DrawLine(viewer, feetPos + new Vector3(-0.4f, 0, 0.4f), topPos + new Vector3(-0.4f, 0, 0.4f), boxColor);
DrawText(viewer, headPos + new Vector3(0, 0.4f, 0), target.displayName, Color.white, 18);
var distance = Vector3.Distance(viewer.transform.position, pos);
DrawText(viewer, headPos + new Vector3(0, -0.4f, 0), $"{distance:F0}m", Color.white, 14);
DrawLine(viewer, viewer.transform.position + new Vector3(0, 1.6f, 0), headPos, new Color(boxColor.r, boxColor.g, boxColor.b, 0.5f));
}
}
private void DrawLine(BasePlayer player, Vector3 start, Vector3 end, Color color)
{
if (player == null || !player.IsConnected) return;
player.SendConsoleCommand("ddraw.line", 0.15f, color, start, end);
}
private void DrawText(BasePlayer player, Vector3 position, string text, Color color, int size)
{
if (player == null || !player.IsConnected) return;
player.SendConsoleCommand("ddraw.text", 0.15f, color, position, $"<size={size}>{text}</size>");
}
#endregion
#region Вспомогательные методы
private void StopESP(BasePlayer player)
{
if (player != null && playerTimers.TryGetValue(player.userID, out var t))
{
t.Destroy();
playerTimers.Remove(player.userID);
}
}
private void OnPlayerDisconnected(BasePlayer player, string reason)
{
StopESP(player);
}
private bool IsPlayerAdmin(BasePlayer player)
{
if (player == null) return false;
return player.IsAdmin || player.net?.connection?.authLevel > 0;
}
#endregion
}
}