C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Oxide.Plugins
{
[Info("Admin Panel", "austinv900", "1.2.9")]
[Description("GUI admin panel with command buttons")]
public class AdminPanel : RustPlugin
{
[PluginReference]
private Plugin AdminRadar, EnhancedBanSystem, Godmode, NTeleportation, Vanish;
private const string permAdminPanel = "adminpanel.allowed";
private const string permAdminRadar = "adminradar.allowed";
private const string permGodmode = "godmode.toggle";
private const string permVanish = "vanish.use";
#region Integrations
#region Godmode
private bool IsGod(string UserID)
{
return Godmode != null && Godmode.Call<bool>("IsGod", UserID);
}
private void ToggleGodmode(BasePlayer player)
{
if (Godmode == null) return;
if (IsGod(player.UserIDString))
Godmode.Call("DisableGodmode", player.IPlayer);
else
Godmode.Call("EnableGodmode", player.IPlayer);
AdminGui(player);
}
#endregion Godmode
#region Vanish
private bool IsInvisible(BasePlayer player)
{
return Vanish != null && Vanish.Call<bool>("IsInvisible", player);
}
private void ToggleVanish(BasePlayer player)
{
if (Vanish == null) return;
if (!IsInvisible(player))
Vanish.Call("Disappear", player);
else
Vanish.Call("Reappear", player);
AdminGui(player);
}
#endregion Vanish
#region Admin Radar
private bool IsRadar(string id)
{
return AdminRadar != null && AdminRadar.Call<bool>("IsRadar", id);
}
private void ToggleRadar(BasePlayer player)
{
if (AdminRadar == null) return;
AdminRadar.Call("cmdESP", player, "radar", new string[0]);
AdminGui(player);
}
#endregion Admin Radar
#endregion Integrations
private void Init()
{
LoadDefaultConfig();
permission.RegisterPermission(permAdminPanel, this);
}
#region Configuration
private bool ToggleMode;
private string PanelPosMax;
private string PanelPosMin;
private string adminZoneCords;
private string btnActColor;
private string btnInactColor;
protected override void LoadDefaultConfig()
{
Config["AdminPanelToggleMode"] = ToggleMode = GetConfig("AdminPanelToggleMode", false);
Config["AdminPanelPosMax"] = PanelPosMax = GetConfig("AdminPanelPosMax", "0.991 0.67");
Config["AdminPanelPosMin"] = PanelPosMin = GetConfig("AdminPanelPosMin", "0.9 0.5");
Config["AdminZoneCoordinates"] = adminZoneCords = GetConfig("AdminZoneCoordinates", "0;0;0;");
Config["PanelButtonActiveColor"] = btnActColor = GetConfig("PanelButtonActiveColor", "0 2.55 0 0.3");
Config["PanelButtonInactiveColor"] = btnInactColor = GetConfig("PanelButtonInactiveColor", "2.55 0 0 0.3");
SaveConfig();
}
#endregion Configuration
#region Localization
private new void LoadDefaultMessages()
{
// English
lang.RegisterMessages(new Dictionary<string, string>
{
["AdminTP"] = "AdminTP",
["Godmode"] = "God",
["Radar"] = "Radar",
["Vanish"] = "Vanish"
}, this);
// Spanish
lang.RegisterMessages(new Dictionary<string, string>
{
["AdminTP"] = "AdminTP",
["Godmode"] = "Dios",
["Radar"] = "Radar",
["Vanish"] = "Desaparecer"
}, this, "es");
}
#endregion Localization
#region Hooks
private void OnPlayerSleepEnded(BasePlayer player)
{
if (!ToggleMode)
{
if (IsAllowed(player.UserIDString, permAdminPanel)) AdminGui(player);
}
}
private void OnPlayerDie(BasePlayer player)
{
CuiHelper.DestroyUi(player, Name);
}
private void OnPluginLoaded(Plugin plugin)
{
if (plugin.Name == "AdminRadar" || plugin.Name == "Godmode" || plugin.Name == "Vanish")
{
OnServerInitialized();
}
}
private void OnPluginUnloaded(Plugin plugin)
{
if (plugin.Name == "AdminRadar" || plugin.Name == "Godmode" || plugin.Name == "Vanish")
{
OnServerInitialized();
}
}
private void OnServerInitialized()
{
if (!ToggleMode)
{
foreach (var player in BasePlayer.activePlayerList)
{
if (IsAllowed(player.UserIDString, permAdminPanel)) AdminGui(player);
}
}
}
#endregion Hooks
#region Command Structure
[ConsoleCommand("adminpanel")]
private void ccmdAdminPanel(ConsoleSystem.Arg arg) // TODO: Make universal command
{
var player = arg.Player();
if (player == null) return;
var args = arg.Args;
if (IsAllowed(player.UserIDString, permAdminPanel))
{
switch (args[0].ToLower()) // TODO: Fix possible NRE
{
case "action":
if (args[1] == "vanish") // TODO: ToLower() args[1] here and below, use switch?
{
if (Vanish) ToggleVanish(player);
}
else if (args[1] == "admintp")
{
var pos = adminZoneCords.Split(';');
var loc = new Vector3(float.Parse(pos[0]), float.Parse(pos[1]), float.Parse(pos[2]));
covalence.Players.FindPlayer(player.UserIDString).Teleport(loc.x, loc.y, loc.z);
}
else if (args[1] == "radar")
{
if (AdminRadar) ToggleRadar(player);
}
else if (args[1] == "god")
{
if (Godmode) ToggleGodmode(player);
}
break;
case "toggle":
if (IsAllowed(player.UserIDString, permAdminPanel))
{
if (args[1] == "True" && ToggleMode) // TODO: Convert to bool to check
{
AdminGui(player);
}
else if (args[1] == "False" && ToggleMode) // TODO: Convert to bool to check
{
CuiHelper.DestroyUi(player, Name);
}
// TODO: Show reply
}
break;
default:
SendReply(player, "Invalid syntax"); // TODO: Localization
return;
}
}
//Reply(player, null); // TODO: Show actual reply or not at all
}
[ChatCommand("adminpanel")]
private void ccmdAdminPanel(BasePlayer player, string command, string[] args) // TODO: Make universal command
{
if (!IsAllowed(player.UserIDString, permAdminPanel))
{
SendReply(player, $"Unknown command: {command}"); // TODO: Localization
return;
}
if (args.Length == 0)
{
SendReply(player, $"Usage: /{command} show/hide/settp"); // TODO: Localization
return;
}
switch (args[0].ToLower())
{
case "hide":
CuiHelper.DestroyUi(player, Name);
SendReply(player, "Admin panel hidden"); // TODO: Localization
break;
case "show":
AdminGui(player);
SendReply(player, "Admin panel refreshed/shown"); // TODO: Localization
break;
case "settp":
Vector3 coord = player.transform.position + new Vector3(0, 1, 0);
Config["AdminZoneCoordinates"] = adminZoneCords = $"{coord.x};{coord.y};{coord.z}";
Config.Save();
SendReply(player, $"Admin zone coordinates set to current position {player.transform.position + new Vector3(0, 1, 0)}"); // TODO: Localization
break;
default:
SendReply(player, $"Invalid syntax: /{command} {args[0]}"); // TODO: Localization
break;
}
}
#endregion Command Structure
#region GUI Panel
private void AdminGui(BasePlayer player)
{
NextTick(() =>
{
// Destroy existing UI
CuiHelper.DestroyUi(player, Name);
var BTNColorVanish = btnInactColor;
var BTNColorGod = btnInactColor;
var BTNColorRadar = btnInactColor;
if (AdminRadar) { if (IsRadar(player.UserIDString)) { BTNColorRadar = btnActColor; } }
if (Godmode) { if (IsGod(player.UserIDString)) { BTNColorGod = btnActColor; } }
if (Vanish) { if (IsInvisible(player)) { BTNColorVanish = btnActColor; } }
var GUIElement = new CuiElementContainer();
var GUIPanel = GUIElement.Add(new CuiPanel
{
Image =
{
Color = "1 1 1 0"
},
RectTransform =
{
AnchorMin = PanelPosMin,
AnchorMax = PanelPosMax
},
CursorEnabled = ToggleMode
}, "Hud", Name);
if (AdminRadar && permission.UserHasPermission(player.UserIDString, permAdminRadar))
{
GUIElement.Add(new CuiButton
{
Button =
{
Command = "adminpanel action radar",
Color = BTNColorRadar
},
Text =
{
Text = Lang("Radar", player.UserIDString),
FontSize = 8,
Align = TextAnchor.MiddleCenter,
Color = "1 1 1 1"
},
RectTransform =
{
AnchorMin = "0.062 0.21",
AnchorMax = "0.51 0.37"
}
}, GUIPanel);
}
GUIElement.Add(new CuiButton
{
Button =
{
Command = "adminpanel action admintp",
Color = "1.28 0 1.28 0.3"
},
Text =
{
Text = Lang("AdminTP", player.UserIDString),
FontSize = 8,
Align = TextAnchor.MiddleCenter,
Color = "1 1 1 1"
},
RectTransform =
{
AnchorMin = "0.52 0.21",
AnchorMax = "0.95 0.37"
}
}, GUIPanel);
if (Godmode && permission.UserHasPermission(player.UserIDString, permGodmode))
{
GUIElement.Add(new CuiButton
{
Button =
{
Command = "adminpanel action god",
Color = BTNColorGod
},
Text =
{
Text = Lang("Godmode", player.UserIDString),
FontSize = 8,
Align = TextAnchor.MiddleCenter,
Color = "1 1 1 1"
},
RectTransform =
{
AnchorMin = "0.52 0.02",
AnchorMax = "0.95 0.196"
}
}, GUIPanel);
}
if (Vanish && permission.UserHasPermission(player.UserIDString, permVanish))
{
GUIElement.Add(new CuiButton
{
Button =
{
Command = "adminpanel action vanish",
Color = BTNColorVanish
},
Text =
{
Text = Lang("Vanish", player.UserIDString),
FontSize = 8,
Align = TextAnchor.MiddleCenter,
Color = "1 1 1 1"
},
RectTransform =
{
AnchorMin = "0.062 0.02",
AnchorMax = "0.51 0.196"
}
}, GUIPanel);
}
CuiHelper.AddUi(player, GUIElement);
});
}
private void Unload()
{
foreach (var player in BasePlayer.activePlayerList)
{
CuiHelper.DestroyUi(player, Name);
}
}
#endregion GUI Panel
#region Helpers
private T GetConfig<T>(string name, T defaultValue)
{
if (Config[name] == null) return defaultValue;
return (T)Convert.ChangeType(Config[name], typeof(T));
}
private bool IsAdmin(string id) => permission.UserHasGroup(id, "admin");
private bool IsAllowed(string id, string perm) => permission.UserHasPermission(id, perm) || IsAdmin(id);
private string Lang(string key, string id = null, params object[] args) => string.Format(lang.GetMessage(key, this, id), args);
#endregion Helpers
}
}