C#:
using Oxide.Core;
using Oxide.Core.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using UnityEngine;
using Oxide.Game.Rust.Cui;
using Oxide.Core.Plugins;
using System;
namespace Oxide.Plugins {
[Info("PlayersClasses", "ServerRust", "0.2.0")]
class PlayersClasses : RustPlugin {
#region Data
static PlayersClasses instance;
public Dictionary<ulong, PlayersData> Players = new Dictionary<ulong, PlayersData>();
public List<ulong> Attacker = new List<ulong>();
public List<ulong> Raider = new List<ulong>();
public List<ulong> Building = new List<ulong>();
bool init = false;
public class PlayersData {
public string Name;
public int Killed;
public int Death;
public int Building;
public int KilledStructure;
public string GetClasses;
public bool Chose;
}
void LoadData() {
try {
Players = players_File.ReadObject<Dictionary<ulong, PlayersData>>();
}
catch {
Players = new Dictionary<ulong, PlayersData>();
}
}
DynamicConfigFile players_File = Interface.Oxide.DataFileSystem.GetFile("PlayersClasses/Players");
void SaveData() {
players_File.WriteObject(Players);
}
#endregion
#region Configuration
private List<string> defaultPrefabs2 = new List<string>();
private List<string> defaultPrefabs1 = new List<string>();
private List<string> Weapons1 = new List<string>();
private List<string> Weapons2 = new List<string>();
private List<string> BlacklistWeapons = new List<string>();
private List<string> PrivilageAttacker = new List<string>() {
"o.grant user {user} privilage",
}
;
private List<string> PrivilageBuilding = new List<string>() {
"o.grant user {user} privilage",
}
;
private List<string> PrivilageRaider = new List<string>() {
"o.grant user {user} privilage",
}
;
private void LoadDefaultConfig() {
var _defaultPrefabs2 = new List<object>() {
"cupboard.tool.deployed", "furnace", "barricade.stone", "barricade.concrete", "floor.grill", "wall.external.high.wood", "furnace.large", "reactivetarget_deployed", "barricade.woodwire", "landmine", "ceilinglight.deployed", "sleepingbag", "spikes.floor", "water_catcher_large", "gates.external.high.wood", "wall.frame.garagedoor", "shutter.metal.embrasure.a", "shutter.metal.embrasure.b", "door.hinged.metal", "door.double.hinged.metal", "wall.frame.cell.gate", "wall.frame.cell", "door.closer", "workbench2.deployed", "dropbox", "jackolantern.angry", "sleepingbag_leather_deployed", "barricade.wood", "lantern.deployed", "beartrap", "barricade.sandbags", "woodbox_deployed", "door.double.hinged.wood", "door.hinged.wood", "wall.frame.shopfront", "wall.window.bars.wood", "lock.key", "door.closer", "workbench1.deployed", "wall.window.bars.metal", "wall.frame.netting", "wall.frame.fence.gate", "wall.frame.fence", "sign.large.wood"
}
;
GetConfig("Постройка", "Разрешенные предметы для первого уровня Строителя (Запрещенное для нулевого)", ref _defaultPrefabs2);
defaultPrefabs2 = _defaultPrefabs2.Select(p => p.ToString()).ToList();
var _defaultPrefabs1 = new List<object>() {
"jackolantern.angry", "sleepingbag_leather_deployed", "barricade.wood", "lantern.deployed", "beartrap", "barricade.sandbags", "woodbox_deployed", "door.double.hinged.wood", "door.hinged.wood", "wall.frame.shopfront", "wall.window.bars.wood", "lock.key", "door.closer", "workbench1.deployed", "wall.frame.fence.gate", "wall.frame.fence", "sign.large.wood"
}
;
GetConfig("Постройка", "Разрешенные предметы для нулевого уровня Строителя", ref _defaultPrefabs1);
defaultPrefabs1 = _defaultPrefabs1.Select(p => p.ToString()).ToList();
var _defaultWeapons1 = new List<object>() {
"shotgun.double", "grenade.f1", "shotgun.pump", "pistol.revolver", "grenade.beancan", "pistol.semiauto", "pistol.python", "rifle.semiauto", "smg.thompson", "smg.mp5", "smg.2"
}
;
GetConfig("Оружие", "Разрешенное оружие для первого уровня стрелка (Запрещенное для нулевого)", ref _defaultWeapons1);
Weapons1 = _defaultWeapons1.Select(p => p.ToString()).ToList();
var _defaultWeapons2 = new List<object>() {
"pistol.m92", "rifle.lr300", "rifle.ak", "rifle.bolt", "explosive.timed", "rocket.launcher", "lmg.m249", "shotgun.spas12"
}
;
GetConfig("Оружие", "Запрещенное оружие для первого и нулевого уровня стрелка", ref _defaultWeapons2);
Weapons2 = _defaultWeapons2.Select(p => p.ToString()).ToList();
var _WriteListExp = new List<object>() {
"explosive.timed", "rocket.launcher", "flamethrower", "grenade.beancan", "grenade.f1", "explosive.satchel"
}
;
GetConfig("Оружие", "Список запрещенных взрывных веществ для Стрелков и Строителей", ref _WriteListExp);
BlacklistWeapons = _WriteListExp.Select(p => p.ToString()).ToList();
var _PrivilageAttacker = new List<object>() {
"ratescontroller.x3", "default"
}
;
GetConfig("Привилегии", "Список дополнительных привилегий/групп для Стрелка (Используйте привилегию либо название группы без доп.слов)", ref _PrivilageAttacker);
PrivilageAttacker = _PrivilageAttacker.Select(p => p.ToString()).ToList();
var _PrivilageBuilding = new List<object>() {
"ratescontroller.x3", "default"
}
;
GetConfig("Привилегии", "Список дополнительных привилегий/групп для Строителя (Используйте привилегию либо название группы без доп.слов)", ref _PrivilageBuilding);
PrivilageBuilding = _PrivilageBuilding.Select(p => p.ToString()).ToList();
var _PrivilageRaider = new List<object>() {
"ratescontroller.x3", "default"
}
;
GetConfig("Привилегии", "Список дополнительных привилегий/групп для Рейдера (Используйте привилегию либо название группы без доп.слов)", ref _PrivilageRaider);
PrivilageRaider = _PrivilageRaider.Select(p => p.ToString()).ToList();
GetConfig("Основное", "Частота обновлений боковой панели GUI", ref UpdateTime);
GetConfig("Основное", "Включить автоматический вайп классов при вайпе карты", ref AutoWipe);
SaveConfig();
}
private bool GetConfig<T>(string MainMenu, string Key, ref T var) {
if (Config[MainMenu, Key] != null) {
var = (T)Convert.ChangeType(Config[MainMenu, Key], typeof(T));
return false;
}
Config[MainMenu, Key] = var;
return true;
}
private float UpdateTime = 5.0f;
private bool AutoWipe = true;
#endregion
#region Oxide
private void OnWeaponFired(BaseProjectile projectile, BasePlayer player, ItemModProjectile mod) {
if (player == null) return;
if (IsNPC(player)) return;
var item = player.GetActiveItem();
var targetLocation = player.transform.position + (player.eyes.HeadForward());
if (GetPlayersClasses(player.userID) == "Building") {
if (UnityEngine.Random.Range(0f, 100f) < 60) {
if (Weapons1.Contains(item.info.shortname)) {
SendReply(player, Messages["DropWeapon"]);
item.Drop(player.transform.position + new Vector3(0, 1.5f, 0), player.eyes.HeadForward());
}
if (Weapons2.Contains(item.info.shortname)) {
SendReply(player, Messages["DropWeapon"]);
item.Drop(player.transform.position + new Vector3(0, 1.5f, 0), player.eyes.HeadForward());
}
}
}
if (GetPlayersClasses(player.userID) == "Raider") {
if (UnityEngine.Random.Range(0f, 100f) < 30) {
if (Weapons2.Contains(item.info.shortname)) {
SendReply(player, Messages["DropWeapon"]);
item.Drop(player.transform.position + new Vector3(0, 1.5f, 0), player.eyes.HeadForward());
}
}
}
}
object CanEquipItem(PlayerInventory inventory, Item item) {
var player = inventory.GetComponent<BasePlayer>();
if (IsNPC(player)) return null;
if (!Players.ContainsKey(player.userID)) return null;
if (GetPlayersClasses(player.userID) == "Building") {
foreach (var weap in BlacklistWeapons) {
if (weap == item.info.shortname) {
SendReply(player, Messages["CanEquipItem"]);
return false;
}
}
}
if (GetPlayersClasses(player.userID) == "Attacker") {
foreach (var weap in BlacklistWeapons) {
if (weap == item.info.shortname) {
SendReply(player, Messages["CanEquipItem"]);
return false;
}
}
if (item.info.shortname == "lock.code") {
SendReply(player, Messages["NoLockCode"]);
return false;
}
}
return null;
}
void OnNewSave() {
LoadData();
WipeData();
}
void OnEntityDeath(BaseCombatEntity victim, HitInfo info) {
if (victim == null) return;
if (info == null) return;
if (IsNPC(victim.ToPlayer()) || IsNPC(info.InitiatorPlayer)) return;
var block = victim as BuildingBlock;
if (info.Initiator == null) return;
if (block && block.grade <= 0) return;
if (!info.Initiator.ToPlayer()) return;
BasePlayer v = victim.ToPlayer();
BasePlayer k = info.InitiatorPlayer;
if (InEvent(v) || InDuel(v)) return;
BaseEntity e = victim.GetEntity();
if (e == null) return;
if (victim is BuildingBlock || victim is BaseEntity && !(victim is BasePlayer) && k is BasePlayer) {
if (!Players.ContainsKey(k.userID)) {
OnPlayerConnected(k);
}
Players[k.userID].KilledStructure++;
}
if (v == null) return;
if (k != null && k != v) {
if (InEvent(k) || InDuel(k)) return;
if (!Players.ContainsKey(k.userID)) {
OnPlayerConnected(k);
}
Players[k.userID].Killed++;
}
if (!Players.ContainsKey(v.userID)) {
OnPlayerConnected(v);
}
if (!InDuel(v) || !IsNPC(v)) Players[v.userID].Death += 1;
}
object OnEntityTakeDamage(BaseCombatEntity entity, HitInfo hitInfo) {
BasePlayer attacker = hitInfo?.Initiator as BasePlayer;
if (hitInfo == null || attacker == null || entity == null) return null;
if (IsNPC(attacker)) return null;
if (InDuel(attacker)) return null;
PlayersData PlayersData;
if (!Players.TryGetValue(attacker.userID, out PlayersData)) return null;
if (entity is BuildingBlock && entity is BaseEntity) {
if (entity == null) return null;
var ClassAttacker = Players[attacker.userID].GetClasses;
if (ClassAttacker == "Attacker") {
var dmgType = hitInfo.damageTypes.GetMajorityDamageType();
hitInfo.damageTypes.ScaleAll(0.5f);
}
if (ClassAttacker == "Building") {
var dmgType = hitInfo.damageTypes.GetMajorityDamageType();
hitInfo.damageTypes.ScaleAll(0.25f);
}
if (ClassAttacker == "Raider") {
var dmgType = hitInfo.damageTypes.GetMajorityDamageType();
hitInfo.damageTypes.ScaleAll(1.5f);
}
}
BasePlayer victimPlayer = (entity as BasePlayer);
if (victimPlayer == null) return null;
if (InDuel(victimPlayer)) return null;
if (entity is BasePlayer && hitInfo.Initiator is BasePlayer) {
if (entity == null) return null;
if (Players[attacker.userID].GetClasses == "Attacker") {
var dmgType = hitInfo.damageTypes.GetMajorityDamageType();
var attackerinfo = hitInfo.HitEntity.ToPlayer();
hitInfo.damageTypes.ScaleAll(1.5f);
}
if (Players[attacker.userID].GetClasses == "Building") {
var dmgType = hitInfo.damageTypes.GetMajorityDamageType();
hitInfo.damageTypes.ScaleAll(0.5f);
}
if (Players[attacker.userID].GetClasses == "Raider") {
var dmgType = hitInfo.damageTypes.GetMajorityDamageType();
hitInfo.damageTypes.ScaleAll(0.75f);
}
if (IsNPC(victimPlayer)) return null;
if (Players[victimPlayer.userID].GetClasses == "Attacker") {
var dmgType = hitInfo.damageTypes.GetMajorityDamageType();
hitInfo.damageTypes.ScaleAll(0.75f);
}
if (Players[victimPlayer.userID].GetClasses == "Building") {
var dmgType = hitInfo.damageTypes.GetMajorityDamageType();
hitInfo.damageTypes.ScaleAll(0.4f);
}
if (Players[victimPlayer.userID].GetClasses == "Raider") {
var dmgType = hitInfo.damageTypes.GetMajorityDamageType();
hitInfo.damageTypes.ScaleAll(0.6f);
}
}
return null;
}
void OnDispenserBonus(ResourceDispenser disp, BasePlayer player, Item item) {
double mod = 1f;
if (GetPlayersClasses(player.userID) == "Attacker") {
var rates = 0.50;
var newAmount = (int)(item.amount * rates * mod);
item.amount = newAmount > 1 ? newAmount : 1;
}
if (GetPlayersClasses(player.userID) == "Raider") {
var rates = 0.75;
var newAmount = (int)(item.amount * rates * mod);
item.amount = newAmount > 1 ? newAmount : 1;
}
if (GetPlayersClasses(player.userID) == "Building") {
var rates = 1.5f;
var newAmount = (int)(item.amount * rates * mod);
item.amount = newAmount > 1 ? newAmount : 1;
}
}
void OnDispenserGather(ResourceDispenser dispenser, BaseEntity entity, Item item) {
if (!entity.ToPlayer()) return;
double mod = 1f;
if (Players[entity.ToPlayer().userID].GetClasses == "Attacker") {
var rates = 0.50;
var newAmount = (int)(item.amount * rates * mod);
item.amount = newAmount > 1 ? newAmount : 1;
}
if (Players[entity.ToPlayer().userID].GetClasses == "Raider") {
var rates = 0.75;
var newAmount = (int)(item.amount * rates * mod);
item.amount = newAmount > 1 ? newAmount : 1;
}
if (Players[entity.ToPlayer().userID].GetClasses == "Building") {
var rates = 1.5f;
var newAmount = (int)(item.amount * rates * mod);
item.amount = newAmount > 1 ? newAmount : 1;
}
}
private Timer mytimer;
Dictionary<string, string> Images = new Dictionary<string, string>() {
{
"Attacker", "http://i.imgur.com/co1TmwL.png"
}
, {
"Building", "http://i.imgur.com/qmbEgcx.png"
}
, {
"Raider", "http://i.imgur.com/aUNQmNN.png"
}
,
}
;
void OnServerInitialized() {
instance = this;
lang.RegisterMessages(Messages, this, "en");
Messages = lang.GetMessages("en", this);
LoadData();
LoadDefaultConfig();
InitFileManager();
CommunityEntity.ServerInstance.StartCoroutine(LoadImages());
timer.Once(1f, () => instance.init = true);
foreach (var player in BasePlayer.activePlayerList) mytimer = timer.Every(UpdateTime, () => CheckOnline(player));
foreach (var player in BasePlayer.activePlayerList) OnPlayerConnected(player);
}
void OnPlayerConnected(BasePlayer player) {
PlayersData PlayersData;
if (!Players.TryGetValue(player.userID, out PlayersData)) {
PlayersData = new PlayersData();
Players.Add(player.userID, new PlayersData() {
Chose = false, GetClasses = "null", KilledStructure = 0, Killed = 0, Death = 0, Building = 0, Name = player.displayName
}
);
}
if (GetPlayersClasses(player.userID) == "null") {
UIDraw(player);
}
if (Players.ContainsKey(player.userID)) {
CheckOnline(player);
}
}
void CheckOnline(BasePlayer player) {
if (!Players.ContainsKey(player.userID)) {
OnPlayerConnected(player);
return;
}
Attacker.Clear();
Building.Clear();
Raider.Clear();
if (GetPlayersClasses(player.userID) == "Attacker") {
if (!Attacker.Contains(player.userID)) {
Attacker.Add(player.userID);
}
DrawUI(player, Attacker.Count());
}
if (GetPlayersClasses(player.userID) == "Raider") {
if (!Raider.Contains(player.userID)) {
Raider.Add(player.userID);
}
DrawUI(player, Raider.Count());
}
if (GetPlayersClasses(player.userID) == "Building") {
if (!Building.Contains(player.userID)) {
Building.Add(player.userID);
}
DrawUI(player, Building.Count());
}
}
void OnHammerHit(BasePlayer player, HitInfo info) {
var buildingBlock = info.HitEntity as BuildingBlock;
if (buildingBlock == null || player == null) return;
if (GetPlayersClasses(player.userID) == "Attacker") {
var grades = buildingBlock.grade.ToString();
var buildingGrade = (int)buildingBlock.grade;
if (buildingGrade > 1) {
return;
}
}
if (GetPlayersClasses(player.userID) == "Raider") {
var buildingGrade = (int)buildingBlock.grade;
if (buildingGrade > 2) {
return;
}
}
}
void OnEntityBuilt(Planner plan, GameObject go) {
if (plan == null || go == null) return;
var player = plan.GetOwnerPlayer();
if (!Players.ContainsKey(player.userID)) {
OnPlayerConnected(player);
return;
}
BaseEntity entity = go.ToBaseEntity();
var buildingBlock = entity as BuildingBlock;
Players[player.userID].Building++;
if (entity as BuildingBlock) {
if (GetPlayersClasses(player.userID) == "Attacker") {
var buildingGrade = (int)buildingBlock.grade;
if (buildingGrade > 1) {
SendReply(player, Messages["NoUpgrade"]);
buildingBlock.SetGrade(BuildingGrade.Enum.Twigs);
}
return;
}
if (GetPlayersClasses(player.userID) == "Raider") {
var buildingGrade = (int)buildingBlock.grade;
if (buildingGrade > 2) {
SendReply(player, Messages["NoUpgrade"]);
buildingBlock.SetGrade(BuildingGrade.Enum.Twigs);
}
return;
}
}
if (GetPlayersClasses(player.userID) == "Attacker") {
if (!defaultPrefabs1.Contains(entity.ShortPrefabName)) {
entity.Kill();
ReplaceItem(player, entity.ShortPrefabName);
SendReply(player, Messages["NoBuildEntity"]);
return;
}
}
if (GetPlayersClasses(player.userID) == "Raider") {
if (!defaultPrefabs2.Contains(entity.ShortPrefabName)) {
entity.Kill();
ReplaceItem(player, entity.ShortPrefabName);
SendReply(player, Messages["NoBuildEntity"]);
return;
}
}
}
object OnStructureUpgrade(BaseCombatEntity entity, BasePlayer player, BuildingGrade.Enum grade) {
if (GetPlayersClasses(player.userID) == "Attacker") {
if (grade == BuildingGrade.Enum.Twigs || grade == BuildingGrade.Enum.Wood) {
return null;
}
else {
SendReply(player, Messages["NoUpgrade"]);
return false;
}
}
if (GetPlayersClasses(player.userID) == "Raider") {
if (grade == BuildingGrade.Enum.Twigs || grade == BuildingGrade.Enum.Wood || grade == BuildingGrade.Enum.Stone) {
return null;
}
else {
SendReply(player, Messages["NoUpgrade"]);
return false;
}
}
return null;
}
void OnPlayerDisconnected(BasePlayer player, string reason) {
if (!Players.ContainsKey(player.userID)) return;
if (GetPlayersClasses(player.userID) == "Attacker") {
Attacker.Remove(player.userID);
}
if (GetPlayersClasses(player.userID) == "Raider") {
Raider.Remove(player.userID);
}
if (GetPlayersClasses(player.userID) == "Building") {
Building.Remove(player.userID);
}
DestroyUI(player);
}
void OnServerSave() {
SaveData();
}
void Unload() {
SaveData();
foreach (var player in BasePlayer.activePlayerList) {
DestroyUI(player);
}
}
#endregion
#region Core
[PluginReference]
Plugin EventManager;
bool InEvent(BasePlayer player) {
try {
bool result = (bool)EventManager?.Call("isPlaying", new object[] {
player
}
);
return result;
}
catch {
return false;
}
}
[PluginReference]
Plugin Duel;
bool InDuel(BasePlayer player) => Duel?.Call<bool>("IsPlayerOnActiveDuel", player) ?? false;
private bool IsNPC(BasePlayer player) {
if (player == null) return false;
if (player is NPCPlayer) return true;
if (!(player.userID >= 76560000000000000L || player.userID <= 0L)) return true;
return false;
}
public string GetPlayersClasses(ulong uid) {
return Players[uid].GetClasses;
}
private string GetPlayerClasses(BasePlayer player, bool stat, bool rank = false, bool after = false, string Classes = "") {
var classes1 = GetPlayersClasses(player.userID);
if (stat) {
if (classes1 == "Attacker") return "Стрелок";
if (classes1 == "Building") return "Строитель";
if (classes1 == "Raider") return "Рейдер";
}
if (rank) {
IOrderedEnumerable<KeyValuePair<ulong, PlayersData>> Top = from pair in Players where pair.Value.GetClasses == classes1 orderby (pair.Value.Killed + pair.Value.KilledStructure + pair.Value.Building - pair.Value.Death) descending select pair;
int i = 1;
foreach (KeyValuePair<ulong, PlayersData> pair in Top) {
if (pair.Key == player.userID) {
return i.ToString();
}
i++;
}
}
if (after) {
IOrderedEnumerable<KeyValuePair<ulong, PlayersData>> Top = from pair in Players where pair.Value.GetClasses == Classes orderby (pair.Value.Killed + pair.Value.KilledStructure + pair.Value.Building - pair.Value.Death) descending select pair;
int i = 1;
foreach (KeyValuePair<ulong, PlayersData> pair in Top) {
i++;
}
return i.ToString();
}
return null;
}
void WipeData() {
foreach (var player in Players) {
WipedPlayerClasses(player.Key);
}
Players = new Dictionary<ulong, PlayersData>();
PrintWarning("Прошел вайп, очистили data/PlayersClasses/Players а так же удалили все привилегии у игроков (Какие были выданы плагином)");
Interface.Oxide.ReloadPlugin("PlayersClasses");
}
void WipedPlayerClasses(ulong userId) {
var player = BasePlayer.FindByID(userId);
if (player == null) return;
if (!Players.ContainsKey(player.userID)) return;
if (Players[player.userID].GetClasses == "Attacker") {
foreach (var priv in PrivilageAttacker) {
if (priv.ToLower().Contains(".")) {
rust.RunServerCommand($"o.revoke user {player.userID} {priv}");
}
else {
rust.RunServerCommand($"o.usergroup remove {player.userID} {priv}");
}
}
}
if (Players[player.userID].GetClasses == "Building") {
foreach (var priv in PrivilageBuilding) {
if (priv.ToLower().Contains(".")) {
rust.RunServerCommand($"o.revoke user {player.userID} {priv}");
}
else {
rust.RunServerCommand($"o.usergroup remove {player.userID} {priv}");
}
}
}
if (Players[player.userID].GetClasses == "Raider") {
foreach (var priv in PrivilageRaider) {
if (priv.ToLower().Contains(".")) {
rust.RunServerCommand($"o.revoke user {player.userID} {priv}");
}
else {
rust.RunServerCommand($"o.usergroup remove {player.userID} {priv}");
}
}
}
}
string GetPrivilage(BasePlayer player) {
string chose = "";
if (GetPlayersClasses(player.userID) == "Attacker") {
chose = chose + "\t\tНаносимый урон по игрокам: +50%\n\t\tНаносимый урон по постройкам: -50%\n\t\tУровень строителя: 0\n\t\tЗащита: +25%\n\t\tУровень стрельбы: 2\n\t\tСбор ресурсов: -50%";
}
if (GetPlayersClasses(player.userID) == "Building") {
chose = chose + "\t\tНаносимый урон по игрокам: -75%\n\t\tНаносимый урон по постройкам: -75%\n\t\tУровень строителя: 2\n\t\tЗащита: +75%\n\t\tУровень стрельбы: 0\n\t\tСбор ресурсов: +50%";
}
if (GetPlayersClasses(player.userID) == "Raider") {
chose = chose + "\t\tНаносимый урон по игрокам: -50%\n\t\tНаносимый урон по постройкам: +50%\n\t\tУровень строителя: 1\n\t\tЗащита: +50%\n\t\tУровень стрельбы: 1\n\t\tСбор ресурсов: -25%";
}
return chose;
}
void ReplaceItem(BasePlayer player, string shortname) {
if (player == null) return;
if (shortname.Contains(".deployed")) shortname = shortname.Replace(".deployed", "");
player.inventory.GiveItem(ItemManager.CreateByName(shortname, 1, 0));
}
public BasePlayer FindBasePlayer(string nameOrUserId) {
nameOrUserId = nameOrUserId.ToLower();
foreach (var player in BasePlayer.activePlayerList) {
if (player.displayName.ToLower().Contains(nameOrUserId) || player.UserIDString == nameOrUserId) return player;
}
foreach (var player in BasePlayer.sleepingPlayerList) {
if (player.displayName.ToLower().Contains(nameOrUserId) || player.UserIDString == nameOrUserId) return player;
}
return default(BasePlayer);
}
#endregion
#region Commands
[ConsoleCommand("classes_chose")]
void CmdChoseClass(ConsoleSystem.Arg args) {
var player = args.Connection.player as BasePlayer;
if (player == null) return;
if (args.Args == null) return;
var chose = args.Args[0];
Players[player.userID].Chose = true;
Players[player.userID].GetClasses = chose;
SendReply(player, Messages["Chose"], GetPlayerClasses(player, true), GetPrivilage(player));
if (GetPlayersClasses(player.userID) == "Attacker") {
foreach (var priv in PrivilageAttacker) {
if (priv.ToLower().Contains(".")) {
rust.RunServerCommand($"o.grant user {player.userID} {priv}");
}
else {
rust.RunServerCommand($"o.usergroup add {player.userID} {priv}");
}
}
}
if (GetPlayersClasses(player.userID) == "Building") {
foreach (var priv in PrivilageBuilding) {
if (priv.ToLower().Contains(".")) {
rust.RunServerCommand($"o.grant user {player.userID} {priv}");
}
else {
rust.RunServerCommand($"o.usergroup add {player.userID} {priv}");
}
}
}
if (GetPlayersClasses(player.userID) == "Raider") {
foreach (var priv in PrivilageRaider) {
if (priv.ToLower().Contains(".")) {
rust.RunServerCommand($"o.grant user {player.userID} {priv}");
}
else {
rust.RunServerCommand($"o.usergroup add {player} {priv}");
}
}
}
DestroyUI(player);
}
[ConsoleCommand("classes")]
void CmdChoseClasses(ConsoleSystem.Arg args) {
var player = args.Connection.player as BasePlayer;
if (player == null) return;
var clases = GetPlayerClasses(player, true);
if (player.IsAdmin || !Players[player.userID].Chose) {
UIDraw(player);
}
else {
SendReply(player, Messages["NoChose"], clases);
}
}
[ConsoleCommand("classeswipe")]
void CmdWipedClasses(ConsoleSystem.Arg args) {
var player = args.Player();
if (player != null) return;
PrintWarning("Запущен ручной вайп данных PlayersClasses");
WipeData();
}
[ConsoleCommand("classes_nochose")]
void CmdNoChoseClass(ConsoleSystem.Arg args) {
var player = args.Connection.player as BasePlayer;
if (player == null) return;
player.Kick("Вы отказались от выбора");
}
[ChatCommand("mystats")]
void ChatChatStats(BasePlayer player) {
if (player == null) return;
DrawStats(player);
}
[ChatCommand("getclasses")]
void ChatGetClasses(BasePlayer player, string cmd, string[] args) {
if (player == null) return;
if (!player.IsAdmin) return;
if (args == null || args.Length <= 0) {
SendReply(player, Messages["cmdHelp"]);
return;
}
switch (args[0].ToLower()) {
case "replace" : if (args.Length <= 2) {
SendReply(player, Messages["cmdHelp"]);
return;
}
var targetAdd = (BasePlayer.Find(args[1]) ?? BasePlayer.FindSleeping(args[1]));
if (targetAdd == null) {
SendReply(player, Messages["playerNotFound"], args[1]);
return;
}
if (!Players.ContainsKey(targetAdd.userID)) {
SendReply(player, Messages["playerNotFound"], targetAdd.displayName);
return;
}
if (args[2] != "Attacker" && args[2] != "Building" && args[2] != "Raider") {
SendReply(player, Messages["ClassNotFound"], args[2], "Attacker, Building, Raider");
return;
}
WipedPlayerClasses(targetAdd.userID);
if (targetAdd.IsConnected) {
player.Command($"classes_chose {args[2]}");
}
else {
Players[targetAdd.userID].GetClasses = args[2];
if (GetPlayersClasses(targetAdd.userID) == "Attacker") {
foreach (var priv in PrivilageAttacker) {
if (priv.ToLower().Contains(".")) {
rust.RunServerCommand($"o.grant user {targetAdd.userID} {priv}");
}
else {
rust.RunServerCommand($"o.usergroup add {targetAdd.userID} {priv}");
}
}
}
if (GetPlayersClasses(targetAdd.userID) == "Building") {
foreach (var priv in PrivilageBuilding) {
if (priv.ToLower().Contains(".")) {
rust.RunServerCommand($"o.grant user {targetAdd.userID} {priv}");
}
else {
rust.RunServerCommand($"o.usergroup add {targetAdd.userID} {priv}");
}
}
}
if (GetPlayersClasses(targetAdd.userID) == "Raider") {
foreach (var priv in PrivilageRaider) {
if (priv.ToLower().Contains(".")) {
rust.RunServerCommand($"o.grant user {targetAdd.userID} {priv}");
}
else {
rust.RunServerCommand($"o.usergroup add {targetAdd.userID} {priv}");
}
}
}
}
return;
case "remove" : if (args.Length <= 1) {
SendReply(player, Messages["cmdHelp"]);
return;
}
var targetRemove = (BasePlayer.Find(args[1]) ?? BasePlayer.FindSleeping(args[1]));
if (targetRemove == null) {
SendReply(player, Messages["playerNotFound"], args[1]);
return;
}
if (!Players.ContainsKey(targetRemove.userID)) {
SendReply(player, Messages["playerNotFound"], targetRemove.displayName);
return;
}
WipedPlayerClasses(targetRemove.userID);
Players.Remove(targetRemove.userID);
if (targetRemove.IsConnected) {
OnPlayerConnected(targetRemove);
}
return;
default : var target = BasePlayer.Find(args[0]);
if (target == null) {
SendReply(player, Messages["playerNotFound"], args[0]);
return;
}
if (!Players.ContainsKey(target.userID)) {
SendReply(player, Messages["playerNotFound"], target.displayName);
return;
}
string info = $"\nКласс игрока: {GetPlayerClasses(target, true)}\nИгрок на: {GetPlayerClasses(player, false, true)} месте в своем классе\nСтатистика:\n\tУбийств: {Players[target.userID].Killed}\n\tСмертей: {Players[target.userID].Death}\n\tУничтоженых строений: {Players[target.userID].KilledStructure}\n\tПостроеных строений: {Players[target.userID].Building}";
SendReply(player, Messages["PlayerInfo"], target.displayName, info);
return;
}
}
[ChatCommand("globaltop")]
void ChatChatTop(BasePlayer player) {
if (player == null) return;
DrawTOP(player);
}
[ConsoleCommand("drawstats")]
private void DrawTop(ConsoleSystem.Arg arg) {
var player = arg.Player();
if (player == null) return;
DrawStats(player);
}
[ConsoleCommand("drawtopclasses")]
private void DrawStats(ConsoleSystem.Arg arg) {
var player = arg.Player();
if (player == null) return;
DrawTOP(player);
}
#endregion
#region UI
string UI = "[{\"name\":\"PlayersClasses_2\",\"parent\":\"Overlay\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"0 0 0 0.788231\"},{\"type\":\"NeedsCursor\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"PlayersClasses_3\",\"parent\":\"PlayersClasses_2\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"0.1294118 0.1294118 0.1529412 0.4431373\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0.8320313\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"PlayersClasses_4\",\"parent\":\"PlayersClasses_3\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{welcome}\",\"fontSize\":18,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"PlayersClasses_5\",\"parent\":\"PlayersClasses_2\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"1 1 1 0\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0.26\",\"anchormax\":\"1 0.7500001\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"PlayersClasses_6\",\"parent\":\"PlayersClasses_5\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"0.427451 0.1843137 0.1254902 0.4474251\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.09516837 0\",\"anchormax\":\"0.3016105 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"button\",\"parent\":\"PlayersClasses_6\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"classes_chose Attacker\",\"color\":\"0.427451 0.1843137 0.1254902 1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.01 0.01\",\"anchormax\":\"0.99 0.1\",\"offsetmin\":\"0.05 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"button2\",\"parent\":\"button\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Выбрать\",\"fontSize\":18,\"align\":\"MiddleCenter\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 0.3037587\",\"distance\":\"1 -1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0.05 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"text\",\"parent\":\"PlayersClasses_6\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"СТРЕЛОК\",\"fontSize\":20,\"align\":\"MiddleCenter\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 0.5247875\",\"distance\":\"1 -1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0.9202804\",\"anchormax\":\"1 0.9946854\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"images\",\"parent\":\"PlayersClasses_6\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"png\":\"{Attacker}\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.15 0.4021048\",\"anchormax\":\"0.85 0.9123087\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"textinfo\",\"parent\":\"PlayersClasses_6\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Наносимый урон по игрокам: +50%\nНаносимый урон по постройкам: -50%\nУровень строителя: 0\nЗащита: +25%\nУровень стрельбы: 2\nСбор ресурсов: -50%\",\"align\":\"MiddleCenter\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 0.3921701\",\"distance\":\"1 -1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.01063825 0.1124575\",\"anchormax\":\"0.9858159 0.3967899\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"PlayersClasses_7\",\"parent\":\"PlayersClasses_5\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"0.3882353 0.3803922 0.2901961 0.4363736\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.3967789 0\",\"anchormax\":\"0.6032211 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"text\",\"parent\":\"PlayersClasses_7\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"СТРОИТЕЛЬ\",\"fontSize\":20,\"align\":\"MiddleCenter\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 0.5247875\",\"distance\":\"1 -1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0.9202804\",\"anchormax\":\"1 0.9946854\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"textinfo\",\"parent\":\"PlayersClasses_7\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Наносимый урон по игрокам: -75%\nНаносимый урон по постройкам: -75%\nУровень строителя: 2\nЗащита: +75%\nУровень стрельбы: 0\nСбор ресурсов: +50%\",\"align\":\"MiddleCenter\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 0.3921701\",\"distance\":\"1 -1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.01063825 0.1124575\",\"anchormax\":\"0.9858159 0.3967899\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"images\",\"parent\":\"PlayersClasses_7\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"png\":\"{Building}\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.15 0.4021048\",\"anchormax\":\"0.85 0.9123087\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"button\",\"parent\":\"PlayersClasses_7\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"classes_chose Building\",\"color\":\"0.3882353 0.3803922 0.2901961 1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.01 0.01\",\"anchormax\":\"0.99 0.1\",\"offsetmin\":\"0.05 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"button3\",\"parent\":\"button\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Выбрать\",\"fontSize\":18,\"align\":\"MiddleCenter\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 0.3037587\",\"distance\":\"1 -1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0.05 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"PlayersClasses_8\",\"parent\":\"PlayersClasses_5\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"0.1294118 0.1333333 0.1529412 0.4470588\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.6983895 0\",\"anchormax\":\"0.9048316 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"button\",\"parent\":\"PlayersClasses_8\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"classes_chose Raider\",\"color\":\"0.1333333 0.1372549 0.1529412 1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.01 0.01\",\"anchormax\":\"0.99 0.1\",\"offsetmin\":\"0.05 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"button1\",\"parent\":\"button\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Выбрать\",\"fontSize\":18,\"align\":\"MiddleCenter\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 0.3037587\",\"distance\":\"1 -1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0.05 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"text\",\"parent\":\"PlayersClasses_8\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"РЕЙДЕР\",\"fontSize\":20,\"align\":\"MiddleCenter\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 0.5247875\",\"distance\":\"1 -1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0.9202804\",\"anchormax\":\"1 0.9946854\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"images\",\"parent\":\"PlayersClasses_8\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"png\":\"{Raider}\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.15 0.4021048\",\"anchormax\":\"0.85 0.9123087\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"textinfo\",\"parent\":\"PlayersClasses_8\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Наносимый урон по игрокам: -50%\nНаносимый урон по постройкам: +50%\nУровень строителя: 1\nЗащита: +50%\nУровень стрельбы: 1\nСбор ресурсов: -25%\",\"align\":\"MiddleCenter\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 0.3921701\",\"distance\":\"1 -1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.01063825 0.1124575\",\"anchormax\":\"0.9858159 0.3967899\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"button_Exit\",\"parent\":\"PlayersClasses_2\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"classes_nochose\",\"color\":\"0.2705882 0 0 0.7857328\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.39 0.1523438\",\"anchormax\":\"0.61 0.2122396\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"text\",\"parent\":\"button_Exit\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Отказаться и выйти\",\"fontSize\":18,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]}]";
string Online = "
// ... [Code preview truncated due to length. Full source in attached file] ...