C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Oxide.Core.Libraries;
using Oxide.Core.Plugins;
using UnityEngine.Assertions.Must;
using System.Linq;
using Oxide.Core;
using Oxide.Game.Rust.Cui;
using System.Globalization;
using System.Text.RegularExpressions;
using UnityEngine;
using System.Net;
namespace Oxide.Plugins {
[Info("AAASystem", "PRESSF", "4.0.6")]
public class AAASystem : RustPlugin {
#region Configuration
private static ConfigData _config;
public class ConfigData {
public PermissionsConfig Права {
get;
set;
}
= new PermissionsConfig();
public TogglesConfig Функции {
get;
set;
}
= new TogglesConfig();
public OtherConfig Другое {
get;
set;
}
= new OtherConfig();
public IntegrationsConfig Интеграции {
get;
set;
}
= new IntegrationsConfig();
public MenuConfig Меню {
get;
set;
}
= new MenuConfig();
}
public class PermissionsConfig {
[JsonProperty("Пермишен на использование GodMode")]
public string GodMode {
get;
set;
}
= "aaasystem.godmode.use";
[JsonProperty("Пермишен на использование NoClip")]
public string NoClip {
get;
set;
}
= "aaasystem.noclip.use";
[JsonProperty("Пермишен на использование Админ Телепорта (/astp и /back)")]
public string AdminTP {
get;
set;
}
= "aaasystem.teleport.use";
[JsonProperty("Пермишен на Админ Телепорт в дом (можно будет тепнуться к игроку если рядом шкаф)")]
public string AdminTPrest {
get;
set;
}
= "aaasystem.teleportrest.use";
[JsonProperty("Админы с игнорированием (765000000000000, 76500000000000001)")]
public List<ulong> listignorplayers {
get;
set;
}
= new List<ulong> {
}
;
[JsonProperty("Адреса с которых можно подключатся к RCON (192.0.0.01, 192.0.0.02)")]
public List<string> listignorips {
get;
set;
}
= new List<string> {
}
;
}
public class TogglesConfig {
[JsonProperty("Блокировать подключение к RCON + оповещене?")]
public bool isBlockRCON {
get;
set;
}
= true;
[JsonProperty("Рестарт через 30 секунд после входа в RCON?")]
public bool isChangeRCON {
get;
set;
}
= true;
[JsonProperty("Включить сообщения в чат?")]
public bool isSendMessage {
get;
set;
}
= true;
[JsonProperty("Сообщение в чат при абузе")]
public string Msg {
get;
set;
}
= "<color=red>оффни админку</color>";
[JsonProperty("Сообщение в чат со списанием при подозрительной активности")]
public string Msgminus {
get;
set;
}
= "<color=red>прекрати | списали у тебя с доната 1 рубль, чтоб не втыкал</color>";
[JsonProperty("Режим блокировки (true - блокировать весь урон) (false - блокировать только урон по игрокам)")]
public bool isBlockAllDamage {
get;
set;
}
= true;
[JsonProperty("Блокировать урон?")]
public bool isBlockDamage {
get;
set;
}
= true;
[JsonProperty("Блокировать авторизации?")]
public bool isBlockAuth {
get;
set;
}
= true;
[JsonProperty("Блокировать билдинг?")]
public bool isBlockBuild {
get;
set;
}
= true;
[JsonProperty("Блокировать лутание?")]
public bool isBlockLoot {
get;
set;
}
= true;
[JsonProperty("Блокировать двери и ввод паролей?")]
public bool isBlockDoor {
get;
set;
}
= true;
[JsonProperty("Блокировать NoClip при входе в bulding block?")]
public bool isBlockEnter {
get;
set;
}
= true;
[JsonProperty("Блокировать консольные команды? (пример: изменение ConVars, выдачу через inventory.give)")]
public bool isBlockConvars {
get;
set;
}
= true;
[JsonProperty("Проверять AdminESP - 0 , AdminRadar - 1 , AdminESP и AdminRadar - 2")]
public int isRadarESP {
get;
set;
}
= 1;
}
public class OtherConfig {
[JsonProperty("Команды для блока")]
public List<string> blockcommandlist {
get;
set;
}
= new List<string> {
}
;
[JsonProperty("Ссылка на вебхук для анти абуза")]
public string Webhook {
get;
set;
}
= "";
[JsonProperty("Ссылка на вебхук для подозрительной активности")]
public string SusWebhook {
get;
set;
}
= "";
[JsonProperty("Ссылка на вебхук для оповещения о попытке входа в RCON")]
public string WebhookRCON {
get;
set;
}
= "";
[JsonProperty("Ссылка на вебхук для логирования /astp и /back")]
public string WebhookTP {
get;
set;
}
= "";
[JsonProperty("Сколько секунд после выключения функций считать подозрительной активностью")]
public float secondsa {
get;
set;
}
= 15f;
}
public class IntegrationsConfig {
[JsonProperty("(IQReportSystem) Включить интеграцию? Снятие админ прав за неактив")]
public bool isIQRS {
get;
set;
}
= false;
[JsonProperty("(IQReportSystem) При компиляции отправлять в дискорд статистику?")]
public bool isIQRSstats {
get;
set;
}
= false;
[JsonProperty("(IQReportSystem) Сколько часов модератор должен быть неактивен для снятия?")]
public float IQRSdays {
get;
set;
}
= 128;
[JsonProperty("(IQReportSystem) Ссылка на вебхук?")]
public string WebhookIQRS {
get;
set;
}
= "";
[JsonProperty("(IQReportSystem) Команда для снятия? (%steamid% заменяеться на стим айди админа)")]
public string IQRScommands {
get;
set;
}
= "staff remove %steamid% moderator";
[JsonProperty("(gamestores) Включить штраф?")]
public bool isShtraf {
get;
set;
}
= true;
[JsonProperty("(gamestores) На сколько рублей штрафовать?")]
public float shtrafcount {
get;
set;
}
= 1;
[JsonProperty("(gamestores) shop.id")]
public string shopid {
get;
set;
}
= "40000";
[JsonProperty("(gamestores) secret.key")]
public string secretkey {
get;
set;
}
= "33d4";
}
public class MenuConfig {
[JsonProperty("(MENU) Ссылка на фон с текстом")]
public string MenuB {
get;
set;
}
= "https://cdn.discordapp.com/attachments/1156620187223728168/1184986190705864704/image.png";
[JsonProperty("(MENU) ссылка на картинку 'YES'")]
public string MenuY {
get;
set;
}
= "https://cdn.discordapp.com/attachments/1156620187223728168/1184990271289708615/image.png";
[JsonProperty("(MENU) ссылка на картинку 'NO'")]
public string MenuN {
get;
set;
}
= "https://cdn.discordapp.com/attachments/1156620187223728168/1184990242583875704/image.png";
[JsonProperty("(MENU) AnchorMax для фона с текстом")]
public string MenuBAMax {
get;
set;
}
= "1 1";
[JsonProperty("(MENU) AnchorMin для фона с текстом")]
public string MenuBAMin {
get;
set;
}
= "1 1";
[JsonProperty("(MENU) OffsetMax для фона с текстом")]
public string MenuBOMax {
get;
set;
}
= "-10 -10";
[JsonProperty("(MENU) OffsetMin для фона с текстом")]
public string MenuBOMin {
get;
set;
}
= "-350 -200";
[JsonProperty("(MENU) OffsetMax для статуса функции (1)")]
public string MenuYNOMax1 {
get;
set;
}
= "95 125";
[JsonProperty("(MENU) OffsetMin для статуса функции (1)")]
public string MenuYNOMin1 {
get;
set;
}
= "55 105";
[JsonProperty("(MENU) OffsetMax для статуса функции (2)")]
public string MenuYNOMax2 {
get;
set;
}
= "95 102.5";
[JsonProperty("(MENU) OffsetMin для статуса функции (2)")]
public string MenuYNOMin2 {
get;
set;
}
= "55 82.5";
[JsonProperty("(MENU) OffsetMax для статуса функции (3)")]
public string MenuYNOMax3 {
get;
set;
}
= "95 80";
[JsonProperty("(MENU) OffsetMin для статуса функции (3)")]
public string MenuYNOMin3 {
get;
set;
}
= "55 60";
[JsonProperty("(MENU) OffsetMax для статуса функции (4)")]
public string MenuYNOMax4 {
get;
set;
}
= "95 57.5";
[JsonProperty("(MENU) OffsetMin для статуса функции (4)")]
public string MenuYNOMin4 {
get;
set;
}
= "55 37.5";
}
protected override void LoadConfig() {
base.LoadConfig();
try {
_config = Config.ReadObject<ConfigData>();
if (_config == null) LoadDefaultConfig();
}
catch {
Puts("ОШИБКА КОНФИГУРАЦИИ, ЗАГРУЗКА КОНФИГУРАЦИИ ПО УМОЛЧАНИЮ");
LoadDefaultConfig();
}
NextTick(SaveConfig);
}
protected override void LoadDefaultConfig() => _config = new ConfigData();
protected override void SaveConfig() => Config.WriteObject(_config, true);
#endregion
object OnRconConnection(IPAddress ip) {
if (!_config.Функции.isBlockRCON) return null;
string serverIp = ConVar.Server.ip;
if (ip == IPAddress.Parse(serverIp)) return null;
Interface.Oxide.LogWarning("!!!!!НЕИЗВЕСТНЫЙ ПОДКЛЮЧАЕТСЯ К RCON!!!!!");
Interface.Oxide.LogWarning("!!!!НЕИЗВЕСТНЫЙ ПОДКЛЮЧАЕТСЯ К RCON!!!!");
Interface.Oxide.LogWarning("!!!НЕИЗВЕСТНЫЙ ПОДКЛЮЧАЕТСЯ К RCON!!!");
Interface.Oxide.LogWarning("!!НЕИЗВЕСТНЫЙ ПОДКЛЮЧАЕТСЯ К RCON!!");
Interface.Oxide.LogWarning("!НЕИЗВЕСТНЫЙ ПОДКЛЮЧАЕТСЯ К RCON!");
Puts($"{ip} и айпи сервера {serverIp}");
if (_config.Функции.isChangeRCON) rust.RunServerCommand("restart 30");
RequestDCVZLOM(jsonrconhack.Replace("[ip]", ip.ToString()).Replace("[stop]", _config.Функции.isChangeRCON ? "Сервер отправлен на рестарт!" : "Плагин ничего не предпринял!"));
return true;
}
#region IQRS
void OnStartedChecked(BasePlayer Target, BasePlayer Moderator, Boolean IsConsole = false) {
if (!_config.Интеграции.isIQRS) return;
if (IsConsole == false) {
var data = Interface.Oxide.DataFileSystem.GetFile("AAAS_lastchecks");
var playerData = new Dictionary<string, object> {
["lastcheck"]
= DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss"),
}
;
data["admins", Moderator.userID.ToString()] = playerData;
data.Save();
}
}
object OnServerCommand(ConsoleSystem.Arg arg) {
if (_config.Функции.isBlockConvars) {
string command = arg.cmd.FullName.ToLower();
if (!command.Contains("AntiHack")) {
ulong commandHash;
if (ulong.TryParse(command, out commandHash) && _config.Другое.blockcommandlist.Contains(commandHash.ToString())) {
Debug.LogError("Команда запрещена и не будет выполнена, динаху");
return true;
}
}
}
return null;
}
#endregion
#region Menu
private string _ASlayer1 = "ASMenu";
private string _ASlayer2 = "ASStat";
void CloseMenuOETD(BasePlayer attaker) {
CuiHelper.DestroyUi(attaker, _ASlayer1);
//
}
void CloseMenu(BasePlayer player) {
CuiHelper.DestroyUi(player, _ASlayer1);
}
void OpenAAASMenu(BasePlayer attaker, bool isvanish, bool isadminesp, bool isfly, bool isGodMode, bool isNoClip, bool isRadar) {
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiPanel {
CursorEnabled = false, Image = {
Color = "0 0 0 0"
}
, RectTransform = {
AnchorMin = _config.Меню.MenuBAMin, AnchorMax = _config.Меню.MenuBAMax, OffsetMin = _config.Меню.MenuBOMin, OffsetMax = _config.Меню.MenuBOMax
}
}
, "Overlay", _ASlayer1);
container.Add(new CuiElement {
Parent = _ASlayer1, Components = {
new CuiRawImageComponent {
Png = (string) ImageLibrary.Call("GetImage", "menubt")
}
}
}
);
container.Add(new CuiElement {
Parent = _ASlayer1, Name = "YesorNo1", Components = {
new CuiRawImageComponent {
Png = (string) ImageLibrary.Call("GetImage", isfly || isNoClip ? "yes" : "no")
}
, new CuiRectTransformComponent {
AnchorMin = "0.1 0.1", AnchorMax = "0.1 0.1", OffsetMin = _config.Меню.MenuYNOMin1, OffsetMax = _config.Меню.MenuYNOMax1
}
}
}
);
container.Add(new CuiElement {
Parent = _ASlayer1, Name = "YesorNo2", Components = {
new CuiRawImageComponent {
Png = (string) ImageLibrary.Call("GetImage", isGodMode ? "yes" : "no")
}
, new CuiRectTransformComponent {
AnchorMin = "0.1 0.1", AnchorMax = "0.1 0.1", OffsetMin = _config.Меню.MenuYNOMin2, OffsetMax = _config.Меню.MenuYNOMax2
}
}
}
);
container.Add(new CuiElement {
Parent = _ASlayer1, Name = "YesorNo3", Components = {
new CuiRawImageComponent {
Png = (string) ImageLibrary.Call("GetImage", isadminesp || isRadar ? "yes" : "no")
}
, new CuiRectTransformComponent {
AnchorMin = "0.1 0.1", AnchorMax = "0.1 0.1", OffsetMin = _config.Меню.MenuYNOMin3, OffsetMax = _config.Меню.MenuYNOMax3
}
}
}
);
container.Add(new CuiElement {
Parent = _ASlayer1, Name = "YesorNo4", Components = {
new CuiRawImageComponent {
Png = (string) ImageLibrary.Call("GetImage", isvanish ? "yes" : "no")
}
, new CuiRectTransformComponent {
AnchorMin = "0.1 0.1", AnchorMax = "0.1 0.1", OffsetMin = _config.Меню.MenuYNOMin4, OffsetMax = _config.Меню.MenuYNOMax4
}
}
}
);
CuiHelper.AddUi(attaker, container);
}
#endregion
Dictionary<ulong, bool> playerRadars = new Dictionary<ulong, bool>();
private void OnRadarActivated(BasePlayer player, string playerName, string playerId, Vector3 lastPosition) {
ulong playerSteamID;
if (ulong.TryParse(playerId, out playerSteamID)) {
if (!playerRadars.ContainsKey(playerSteamID)) {
playerRadars.Add(playerSteamID, true);
}
playerRadars[playerSteamID] = true;
player.ChatMessage($"Радар: <color=green>включен</color>");
if (_config.Права.listignorplayers.Contains(player.userID)) return;
if (RecentFunctions.ContainsKey(player.userID)) {
if (RecentFunctions[player.userID] == "AdminESP") {
RequestDS(jsonsusrepeek.Replace("[player]", player.displayName + " | " + player.userID).Replace("[plugin]", "AdminESP"), true);
RecentFunctions.Remove(player.userID);
return;
}
else {
RecentFunctions.Add(player.userID, "AdminESP");
}
}
else {
RecentFunctions.Add(player.userID, "AdminESP");
}
}
}
private void OnRadarDeactivated(BasePlayer player, string playerName, string playerId, Vector3 lastPosition) {
ulong playerSteamID;
if (ulong.TryParse(playerId, out playerSteamID)) {
if (!playerRadars.ContainsKey(playerSteamID)) {
playerRadars.Add(playerSteamID, false);
}
playerRadars[playerSteamID] = false;
player.ChatMessage($"Радар: <color=red>выключен</color>");
if (_config.Права.listignorplayers.Contains(player.userID)) return;
if (RecentFunctions.ContainsKey(player.userID)) {
if (RecentFunctions[player.userID] == "AdminESP") {
RequestDS(jsonsusrepeek.Replace("[player]", player.displayName + " | " + player.userID).Replace("[plugin]", "AdminESP"), true);
RecentFunctions.Remove(player.userID);
return;
}
else {
RecentFunctions.Add(player.userID, "AdminESP");
}
}
else {
RecentFunctions.Add(player.userID, "AdminESP");
}
timer.Once(_config.Другое.secondsa, () => {
RecentFunctions.Remove(player.userID);
}
);
}
}
Dictionary<ulong, bool> playerNoClipes = new Dictionary<ulong, bool>();
Timer checktimer;
[ChatCommand("noclip")]
private void NoCLipCommand(BasePlayer player, string command, string[] args) {
if (!permission.UserHasPermission(player.UserIDString, _config.Права.NoClip)) {
player.ChatMessage("У вас нет прав для использования этой команды.");
return;
}
ulong playerSteamID = player.userID;
if (!playerNoClipes.ContainsKey(playerSteamID)) {
playerNoClipes.Add(playerSteamID, false);
}
playerNoClipes[playerSteamID] = !playerNoClipes[playerSteamID];
string NoClipStatus = playerNoClipes[playerSteamID] ? "<color=green>включен</color>" : "<color=red>выключен</color>";
player.ChatMessage($"Режим летчика: {NoClipStatus}");
if (playerNoClipes[playerSteamID]) {
player.SetPlayerFlag(BasePlayer.PlayerFlags.IsDeveloper, true);
timer.Once(0.5f, () => {
player.SendConsoleCommand("noclip");
}
);
string Grid = GetGridString(player.transform.position);
if (_config.Функции.isBlockEnter) {
checktimer = timer.Every(0.2f, () => {
if (!player.CanBuild()) {
player.SendConsoleCommand("noclip");
timer.Once(0.5f, () => {
player.SetPlayerFlag(BasePlayer.PlayerFlags.IsDeveloper, false);
}
);
playerNoClipes[playerSteamID] = !playerNoClipes[playerSteamID];
player.ChatMessage("<color=red>Администратор! нельзя в чужие дома залетать! оповестили твое руководство</color>");
RequestDS(jsonsusnoclip.Replace("[player]", player.displayName + " | " + player.userID).Replace("[plugin]", "NoClip").Replace("[grid]", "на координате " + Grid), true);
if (checktimer != null && checktimer.Destroyed == false) {
checktimer.Destroy();
}
}
}
);
}
}
else {
player.SendConsoleCommand("noclip");
if (checktimer != null && checktimer.Destroyed == false) {
checktimer.Destroy();
}
timer.Once(0.5f, () => {
player.SetPlayerFlag(BasePlayer.PlayerFlags.IsDeveloper, false);
}
);
}
if (_config.Права.listignorplayers.Contains(player.userID)) return;
if (RecentFunctions.ContainsKey(player.userID)) {
if (RecentFunctions[player.userID] == "NoClip") {
RequestDS(jsonsusrepeek.Replace("[player]", player.displayName + " | " + player.userID).Replace("[plugin]", "NoClip"), true);
RecentFunctions.Remove(player.userID);
return;
}
else {
RecentFunctions.Add(player.userID, "NoClip");
}
}
else {
RecentFunctions.Add(player.userID, "NoClip");
}
timer.Once(_config.Другое.secondsa, () => {
RecentFunctions.Remove(player.userID);
}
);
}
private Dictionary<ulong, Vector3> playerPosDB = new Dictionary<ulong, Vector3>();
[ChatCommand("back")]
private void AdminBackTPCommand(BasePlayer player, string command, string[] args) {
if (!permission.UserHasPermission(player.UserIDString, _config.Права.AdminTP)) {
player.ChatMessage("У вас нет прав для использования этой команды.");
return;
}
ulong playerId = player.userID;
if (playerPosDB.ContainsKey(playerId)) {
Vector3 targetPosition = playerPosDB[playerId];
player.Teleport(targetPosition);
player.ChatMessage("</color=green>Телепорт на обратную точку.</color>");
string Grid = GetGridString(targetPosition);
RequestLog(jsonteleportlog.Replace("[player]", player.displayName+" | "+ player.userID).Replace("[command]", "/back").Replace("[grid]", "на координате " + Grid));
playerPosDB.Remove(playerId);
}
else {
player.ChatMessage("</color=red>Точка обратного телепорта не найдена.</color>");
}
}
[ChatCommand("astp")]
private void AdminTPCommand(BasePlayer player, string command, string[] args) {
if (!permission.UserHasPermission(player.UserIDString, _config.Права.AdminTP)) {
player.ChatMessage("У вас нет прав для использования этой команды.");
return;
}
ulong playerId = player.userID;
if (args.Length < 1) {
player.ChatMessage("Используйте: /astp \"НикНейм\"");
return;
}
string displayName = args[0];
BasePlayer targetPlayer = FindPlayerByDisplayNameT(displayName);
if (targetPlayer == null) {
player.ChatMessage("Игрок не найден.");
return;
}
if (!permission.UserHasPermission(player.UserIDString, _config.Права.AdminTPrest)) {
string nearbyObjects = GetNearbyObjects(targetPlayer.transform.position, 10f);
if (HasForbiddenObjects(nearbyObjects) || !targetPlayer.CanBuild()) {
Vector3 alternativePoint = FindAlternativeTeleportPoint(targetPlayer.transform.position, 25f);
if (alternativePoint != Vector3.zero) {
player.ChatMessage($"<color=red>Игрок находится в зоне чужого шкафа.</color> \nТелепорт в альтернативное место в радиусе 25м \n<color=yellow>Для телепорта назад используйте</color> /back");
playerPosDB[playerId] = player.transform.position;
player.Teleport(alternativePoint);
string Grid = GetGridString(alternativePoint);
RequestLog(jsonteleportlog.Replace("[player]", player.displayName+" | "+ player.userID).Replace("[command]", "/astp").Replace("[grid]", "на координате " + Grid));
}
else {
player.ChatMessage("<color=red>Не удалось найти альтернативное место для телепорта.</color> Попробуйте позже.");
}
return;
}
else {
player.ChatMessage($"<color=green>Телепорт к</color> \"{targetPlayer.displayName}\" \n<color=yellow>Для телепорта назад используйте</color> /back");
playerPosDB[playerId] = player.transform.position;
player.Teleport(targetPlayer.transform.position);
string Grid = GetGridString(targetPlayer.transform.position);
RequestLog(jsonteleportlog.Replace("[player]", player.displayName+" | "+ player.userID).Replace("[command]", "/astp").Replace("[grid]", "на координате " + Grid));
}
}
else {
player.ChatMessage($"<color=green>Телепорт к</color> \"{targetPlayer.displayName}\" \n<color=yellow>Для телепорта назад используйте</color> /back");
playerPosDB[playerId] = player.transform.position;
player.Teleport(targetPlayer.transform.position);
string Grid = GetGridString(targetPlayer.transform.position);
RequestLog(jsonteleportlog.Replace("[player]", player.displayName+" | "+ player.userID).Replace("[command]", "/astp").Replace("[grid]", "на координате " + Grid));
}
Vector3 FindAlternativeTeleportPoint(Vector3 startPosition, float searchRadius) {
int maxAttempts = 10;
for (int i = 0; i < maxAttempts; i++) {
Vector3 randomOffset = UnityEngine.Random.onUnitSphere * UnityEngine.Random.Range(1f, searchRadius);
Vector3 alternativePoint = startPosition + randomOffset;
string nearbyObjects = GetNearbyObjects(alternativePoint, 10f);
if (!HasForbiddenObjects(nearbyObjects)) {
return alternativePoint;
}
}
return Vector3.zero;
}
}
private BasePlayer FindPlayerByDisplayNameT(string displayName) {
BasePlayer targetPlayer = null;
foreach (BasePlayer player in BasePlayer.activePlayerList) {
if (player.displayName.ToLower().Contains(displayName.ToLower())) {
targetPlayer = player;
break;
}
}
return targetPlayer;
}
Dictionary<ulong, bool> playerGodModes = new Dictionary<ulong, bool>();
[ChatCommand("god")]
private void GodModeCommand(BasePlayer player, string command, string[] args) {
if (!permission.UserHasPermission(player.UserIDString, _config.Права.GodMode)) {
player.ChatMessage("У вас нет прав для использования этой команды.");
return;
}
ulong playerSteamID = player.userID;
if (!playerGodModes.ContainsKey(playerSteamID)) {
playerGodModes.Add(playerSteamID, false);
}
playerGodModes[playerSteamID] = !playerGodModes[playerSteamID];
string godModeStatus = playerGodModes[playerSteamID] ? "<color=green>включен</color>" : "<color=red>выключен</color>";
player.ChatMessage($"Режим бога: {godModeStatus}");
if (_config.Права.listignorplayers.Contains(player.userID)) return;
if (!playerGodModes[playerSteamID]) {
if (_config.Права.listignorplayers.Contains(player.userID)) return;
if (RecentFunctions.ContainsKey(player.userID)) {
if (RecentFunctions[player.userID] == "GodMode") {
RequestDS(jsonsusrepeek.Replace("[player]", player.displayName + " | " + player.userID).Replace("[plugin]", "GodMode"), true);
RecentFunctions.Remove(player.userID);
return;
}
else {
RecentFunctions.Add(player.userID, "GodMode");
}
}
else {
RecentFunctions.Add(player.userID, "GodMode");
}
timer.Once(_config.Другое.secondsa, () => {
RecentFunctions.Remove(player.userID);
}
);
}
}
[PluginReference]
private Plugin AdminRadar, Vanish, AdminESP, ImageLibrary, IQReportSystem;
//Dictionary<string, int> cdDict = new Dictionary<string, int>();
float resetInterval = 8f;
string sN = ConVar.Server.hostname;
void Unload() {
if (this.Title == "AAASystem") {
foreach (BasePlayer player in BasePlayer.activePlayerList) {
CloseMenu(player);
}
}
}
private void OnServerInitialized() {
foreach (BasePlayer player in BasePlayer.activePlayerList) {
CloseMenu(player);
}
//Puts("!!!В ЭТОМ ПЛАГИНЕ УСТАНОВЛЕННА СИСТЕМА ЗАЩИТЫ ОТ СЛИВА ИЗ ПОЛЬЗОВАТЕЛЬСКОГО СОГЛАШЕНИЯ!!!");
//timer.Repeat(resetInterval, 0, () => ResetCD());
permission.RegisterPermission(_config.Права.GodMode, this);
permission.RegisterPermission(_config.Права.NoClip, this);
permission.RegisterPermission(_config.Права.AdminTP, this);
permission.RegisterPermission(_config.Права.AdminTPrest, this);
//permission.RegisterPermission(_config.Права.AdminTP, this);
permission.RegisterPermission("aaasystem.can.seemenu", this);
ImageLibrary.Call("AddImage", _config.Меню.MenuB, "menubt");
ImageLibrary.Call("AddImage", _config.Меню.MenuY, "yes");
ImageLibrary.Call("AddImage", _config.Меню.MenuN, "no");
var data = Interface.Oxide.DataFileSystem.GetFile("AAAS_lastchecks");
var playerData = data["admins"] as Dictionary<string, object>;
if (playerData != null && _config.Интеграции.isIQRS) {
foreach (var entry in playerData) {
string playerId = entry.Key;
var playerInfo = entry.Value as Dictionary<string, object>;
if (playerInfo != null) {
string dateString = playerInfo["lastcheck"].ToString();
DateTime lastCheck;
if (DateTime.TryParseExact(dateString, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out lastCheck)) {
DateTime currentTime = DateTime.Now;
TimeSpan timeDifference = currentTime - lastCheck;
double hours = timeDifference.TotalHours;
if (hours >= _config.Интеграции.IQRSdays) {
string formattedCommand = _config.Интеграции.IQRScommands.Replace("%steamid%", playerInfo["admins"].ToString());
rust.RunServerCommand(formattedCommand);
RequestDCINT(jsoniqreportsnt.Replace("[player]", playerInfo["admins"].ToString()));
}
else if (hours >= 12) {
if (_config.Интеграции.isIQRSstats) {
RequestDCINT(jsoniqreport.Replace("[player]", playerInfo["admins"].ToString()).Replace("[day]", hours.ToString()));
}
}
}
}
}
}
}
/*void ResetCD()
{
foreach (var attakerID in cdDict.Keys.ToList())
{
cdDict[attakerID] = 0;
}
}*/
void OnLootEntity(BasePlayer player, BaseEntity entity) {
if (_config.Функции.isBlockLoot) {
if (_config.Права.listignorplayers.Contains(player.userID)) return;
bool isvanish = Vanish.Call<bool>("IsInvisible", player);
bool isadminesp = false;
bool isRadar = false;
if (_config.Функции.isRadarESP == 0) {
isadminesp = AdminESP.Call<bool>("IsUsingEsp", player);
}
else if (_config.Функции.isRadarESP == 1) {
if (playerRadars.ContainsKey(player.userID)) {
isRadar = playerRadars[player.userID];
}
}
else if (_config.Функции.isRadarESP == 2) {
isadminesp = AdminESP.Call<bool>("IsUsingEsp", player);
if (playerRadars.ContainsKey(player.userID)) {
isRadar = playerRadars[player.userID];
}
}
bool isfly = player.IsFlying;
bool isGodMode = false;
bool isNoClip = false;
if (playerNoClipes.ContainsKey(player.userID)) {
isNoClip = playerNoClipes[player.userID];
}
if (playerGodModes.ContainsKey(player.userID)) {
isGodMode = playerGodModes[player.userID];
}
string Grid = GetGridString(player.transform.position);
if (isvanish || isfly || isGodMode || isadminesp || isRadar || isNoClip) {
timer.Once(0.01f, () => {
player.EndLooting();
}
);
string nearbyObjects = GetNearbyObjects(player.transform.position, 10f);
string forbiddenObjectsResult = HasForbiddenObjects(nearbyObjects) && !player.CanBuild() ? "Рядом чужой шкаф." : "Рядом нет чужих шкафов.";
player.ChatMessage("<color=red>Администратор! функции выключи! оповестили твое руководство</color>");
RequestDS(jsonsuslootplayer.Replace("[player]", player.displayName+" | "+ player.userID).Replace("[plugins]", (isvanish? "Vanish " : "" ) + (isGodMode? "GodMode " : "" ) + (isadminesp || isRadar? "AdminESP " : "") + (isfly || isNoClip? "NoClip" : "") ).Replace("[buildblock]", forbiddenObjectsResult + " на координате " + Grid), true);
}
if (RecentFunctions.ContainsKey(player.userID)) {
if (RecentFunctions[player.userID] == "Vanish") {
RequestDS(jsonsuslootafter.Replace("[player]", player.displayName + " | " + player.userID).Replace("[plugin]", "Vanish").Replace("[grid]", "на координате " + Grid), true);
}
if (RecentFunctions[player.userID] == "NoClip") {
RequestDS(jsonsuslootafter.Replace("[player]", player.displayName + " | " + player.userID).Replace("[plugin]", "NoClip").Replace("[grid]", "на координате " + Grid), true);
}
timer.Once(0.01f, () => {
player.EndLooting();
}
);
}
}
}
object OnCupboardAuthorize(BuildingPrivlidge privilege, BasePlayer player, int players) {
if (_config.Функции.isBlockAuth) {
if (_config.Права.listignorplayers.Contains(player.userID)) return null;
bool isvanish = Vanish.Call<bool>("IsInvisible", player);
if (!player.CanBuild()) {
if (isvanish) {
/*timer.Once(0.01f, () =>
{
privilege.authorizedPlayers.RemoveAt(players);
});*/
string Grid = GetGridString(player.transform.position);
RequestDS(jsonsusauthplayer.Replace("[player]", player.displayName+" | "+ player.userID).Replace("[grid]", "на координате " + Grid).Replace("[entity]", "Шкаф"), true);
player.ChatMessage("<color=red>Администратор! функции выключи! оповестили твое руководство</color>");
return true;
}
}
}
return null;
}
object OnTurretAuthorize(AutoTurret turret, BasePlayer player, int players) {
if (_config.Функции.isBlockAuth) {
if (_config.Права.listignorplayers.Contains(player.userID)) return null;
bool isvanish = Vanish.Call<bool>("IsInvisible", player);
if (isvanish) {
/*timer.Once(0.01f, () =>
{
turret.authorizedPlayers.RemoveAt(players);
});*/
string Grid = GetGridString(player.transform.position);
RequestDS(jsonsusauthplayer.Replace("[player]", player.displayName+" | "+ player.userID).Replace("[grid]", "на координате " + Grid).Replace("[entity]", "Турель"), true);
player.ChatMessage("<color=red>Администратор! функции выключи! оповестили твое руководство</color>");
return true;
}
}
return null;
}
object OnConstructionPlace(BaseEntity entity, Construction component, Construction.Target constructionTarget, BasePlayer player) {
if (_config.Функции.isBlockBuild) {
if (_config.Права.listignorplayers.Contains(player.userID)) return null;
bool isvanish = Vanish.Call<bool>("IsInvisible", player);
if (isvanish) {
string Grid = GetGridString(player.transform.position);
RequestDS(jsonsusbuildplayer.Replace("[player]", player.displayName+" | "+ player.userID).Replace("[grid]", "на координате " + Grid).Replace("[method]", "строить " + entity), true);
player.ChatMessage("<color=red>Администратор! функции выключи! оповестили твое руководство</color>");
return true;
}
}
return null;
}
object OnStructureUpgrade(BaseCombatEntity entity, BasePlayer player, BuildingGrade.Enum grade) {
if (_config.Функции.isBlockBuild) {
if (_config.Права.listignorplayers.Contains(player.userID)) return null;
bool isvanish = Vanish.Call<bool>("IsInvisible", player);
if (isvanish) {
string Grid = GetGridString(player.transform.position);
RequestDS(jsonsusbuildplayer.Replace("[player]", player.displayName+" | "+ player.userID).Replace("[grid]", "на координате " + Grid).Replace("[method]", "улучшать " + entity), true);
player.ChatMessage("<color=red>Администратор! функции выключи! оповестили твое руководство</color>");
return true;
}
}
return null;
}
object OnStructureDemolish(BaseCombatEntity entity, BasePlayer player, bool immediate) {
if (_config.Функции.isBlockBuild) {
if (_config.Права.listignorplayers.Contains(player.userID)) return null;
bool isvanish = Vanish.Call<bool>("IsInvisible", player);
if (isvanish) {
string Grid = GetGridString(player.transform.position);
RequestDS(jsonsusbuildplayer.Replace("[player]", player.displayName+" | "+ player.userID).Replace("[grid]", "на координате " + Grid).Replace("[method]", "удалять " + entity), true);
player.ChatMessage("<color=red>Администратор! функции выключи! оповестили твое руководство</color>");
return true;
}
}
return null;
}
object OnStructureRepair(BaseCombatEntity entity, BasePlayer player) {
if (_config.Функции.isBlockBuild) {
if (_config.Права.listignorplayers.Contains(player.userID)) return null;
bool isvanish = Vanish.Call<bool>("IsInvisible", player);
if (isvanish) {
string Grid = GetGridString(player.transform.position);
RequestDS(jsonsusbuildplayer.Replace("[player]", player.displayName+" | "+ player.userID).Replace("[grid]", "на координате " + Grid).Replace("[method]", "чинить " + entity), true);
player.ChatMessage("<color=red>Администратор! функции выключи! оповестили твое руководство</color>");
return true;
}
}
return null;
}
string GetNearbyObjects(Vector3 position, float radius) {
Collider[] colliders = Physics.OverlapSphere(position, radius);
Dictionary<string, int> objectCounts = new Dictionary<string, int>();
foreach (Collider collider in colliders) {
string objectName = collider.gameObject.name;
if (objectCounts.ContainsKey(objectName)) {
objectCounts[objectName]++;
}
else {
objectCounts[objectName] = 1;
}
}
string nearbyObjects = "";
foreach (KeyValuePair<string, int> entry in objectCounts) {
nearbyObjects += entry.Key;
if (entry.Value > 1) {
nearbyObjects += $" ({entry.Value} шт.)";
}
nearbyObjects += ", ";
}
if (nearbyObjects.Length > 0) {
nearbyObjects = nearbyObjects.TrimEnd(',', ' ');
}
return nearbyObjects;
}
bool HasForbiddenObjects(string nearbyObjects) {
string[] forbiddenObjects = new string[] {
"prevent_building", "assets/bundled/prefabs/ui/lootpanels/lootpanel.toolcupboard.prefab"
}
;
foreach (string forbiddenObject in forbiddenObjects) {
if (nearbyObjects.Contains(forbiddenObject)) {
return true;
}
}
return false;
}
private string GetGridString(Vector3 position) {
Vector2 adjPosition = new Vector2((World.Size / 2) + position.x, (World.Size / 2) - position.z);
return $"{NumberToString((int)(adjPosition.x / 150))}{(int)(adjPosition.y / 150)}";
}
private string NumberToString(int number) {
bool a = number > 26;
Char c = (Char)(65 + (a ? number - 26 : number));
return a ? "A" + c : c.ToString();
}
object OnItemPickup(Item item, BasePlayer player) {
if (_config.Права.listignorplayers.Contains(player.userID)) return null;
bool isvanish = Vanish.Call<bool>("IsInvisible", player);
bool isadminesp = false;
bool isRadar = false;
if (_config.Функции.isRadarESP == 0) {
isadminesp = AdminESP.Call<bool>("IsUsingEsp", player);
}
else if (_config.Функции.isRadarESP == 1) {
if (playerRadars.ContainsKey(player.userID)) {
isRadar = playerRadars[player.userID];
}
}
else if (_config.Функции.isRadarESP == 2) {
isadminesp = AdminESP.Call<bool>("IsUsingEsp", player);
if (playerRadars.ContainsKey(player.userID)) {
isRadar = playerRadars[player.userID];
}
}
bool isf
// ... [Code preview truncated due to length. Full source in attached file] ...