Иконка ресурса

FREE AutoGrades : 0.0.7 0.0.7

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
/*
	Created By AlexALX (c) 2015-2016
	Special thanks to: recon, freaky
	for keep plugin work with latest rust updates
*/
using System;
using System.Collections.Generic;
using Oxide.Core;
using Oxide.Game.Rust.Libraries;

namespace Oxide.Plugins
{                 
    [Info("Automatic Build Grades", "AlexALX", "0.0.7", ResourceId = 921)]
    public class AutoGrades : RustPlugin
    {
	
		private Dictionary<string,int> playerGrades;
		private bool LoadDefault = false;
		private bool block = true;
		private string cmdname = "bgrade";

        void Loaded() {
            playerGrades = new Dictionary<string, int>();
			
			// DO NOT EDIT THIS LINES! PLEASE USE oxide/lang/AutoGrades.en.json or own language name!
			lang.RegisterMessages(new Dictionary<string,string>{
				["BGRADE_NOPERM"] = "<color='#DD0000'>You have no access to this command.</color>",
				["BGRADE_NORES"] = "<color='#DD0000'>Not enough resources for construct and upgrade.</color>",
				["BGRADE_NORES2"] = "<color='#DD0000'>Not enough resources for upgrade.</color>",
				["BGRADE_HELP"] = "Automatic Build Grade command usage:",
				["BGRADE_1"] = "<color='#00DD00'>/{0} 1</color> - auto update to wood",
				["BGRADE_2"] = "<color='#00DD00'>/{0} 2</color> - auto update to stone",
				["BGRADE_3"] = "<color='#00DD00'>/{0} 3</color> - auto update to metal",
				["BGRADE_4"] = "<color='#00DD00'>/{0} 4</color> - auto update to armored",
				["BGRADE_0"] = "<color='#00DD00'>/{0} 0</color> - disable auto update",
				["BGRADE_CUR"] = "Current mode: <color='#DD0000'>{0}</color>",
				["BGRADE_SET"] = "<color='#00DD00'>You successfully set auto update to <color='#DD0000'>{0}</color>.</color>",
				["BGRADE_DIS"] = "<color='#00DD00'>You successfully <color='#DD0000'>disabled</color> auto update.</color>",
				["BGRADE_INV"] = "<color='#DD0000'>Invalid building grade.</color>",
				["Disabled"] = "Disabled",
				["Wood"] = "Wood",
				["Stone"] = "Stone",
				["Metal"] = "Metal",
				["TopTier"] = "TopTier",
			}, this);

			lang.RegisterMessages(new Dictionary<string,string>{
				["BGRADE_NOPERM"] = "<color='#DD0000'>ÐедоÑÑаÑоÑно пÑав Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ командÑ.</color>",
				["BGRADE_NORES"] = "<color='#DD0000'>ÐедоÑÑаÑоÑно ÑеÑÑÑÑов Ð´Ð»Ñ Ð¿Ð¾ÑÑÑойки и обновлениÑ.</color>",
				["BGRADE_NORES2"] = "<color='#DD0000'>ÐедоÑÑаÑоÑно ÑеÑÑÑÑов Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ.</color>",
				["BGRADE_HELP"] = "ÐвÑомаÑиÑеÑкое обновление конÑÑÑÑкÑии, иÑполÑзование:",
				["BGRADE_1"] = "<color='#00DD00'>/{0} 1</color> - авÑо обновление до деÑева",
				["BGRADE_2"] = "<color='#00DD00'>/{0} 2</color> - авÑо обновление до камнÑ",
				["BGRADE_3"] = "<color='#00DD00'>/{0} 3</color> - авÑо обновление до меÑала",
				["BGRADE_4"] = "<color='#00DD00'>/{0} 4</color> - авÑо обновление до бÑониÑованого",
				["BGRADE_0"] = "<color='#00DD00'>/{0} 0</color> - оÑклÑÑиÑÑ Ð°Ð²Ñо обновление",
				["BGRADE_CUR"] = "ТекÑÑий Ñежим: <color='#DD0000'>{0}</color>",
				["BGRADE_SET"] = "<color='#00DD00'>ÐÑ ÑÑпеÑно ÑÑÑановили авÑо обновление до: <color='#DD0000'>{0}</color>.</color>",
				["BGRADE_DIS"] = "<color='#00DD00'>ÐÑ ÑÑпеÑно <color='#DD0000'>вÑклÑÑили</color> авÑо обновление.</color>",
				["BGRADE_INV"] = "<color='#DD0000'>ÐевеÑнÑй клаÑÑ Ð¿Ð¾ÑÑÑойки.</color>",
				["Disabled"] = "ÐÑклÑÑено",
				["Wood"] = "ÐеÑево",
				["Stone"] = "ÐаменÑ",
				["Metal"] = "ÐеÑал",
				["TopTier"] = "ÐÑониÑованÑй",
			}, this, "ru");
				
        }
		/* Not sure if this needed, maybe someone reconnect or so...[HookMethod("OnPlayerDisconnected")]
        void OnPlayerDisconnected(BasePlayer player)
        {
			var steamId = player.userID.ToString();
            if (playerGrades.ContainsKey(steamId)) {
				playerGrades.Remove(steamId);
			}
        }*/
		
		void LoadDefaultConfig() {
			LoadDefault = true;
		}
		
		void OnServerInitialized() {
			permission.RegisterPermission("autogrades.all", this);
			permission.RegisterPermission("autogrades.1", this);
			permission.RegisterPermission("autogrades.2", this);
			permission.RegisterPermission("autogrades.3", this);
			permission.RegisterPermission("autogrades.4", this);
			permission.RegisterPermission("autogrades.nores", this);
			
			// config update from 0.0.3
			var gperm = false;
			if (!LoadDefault && (Config["Language"]!=null || Config["Messages"]!=null)) {
				Config.Remove("Language");
				Config["OldMessages"] = Config["Messages"]; // i don't want remove someone translation/customization without any warnings!
				Config.Remove("Messages");
				// not sure if this is correct way of show warning, but it works.Interface.Oxide.LogInfo("[{0}] {1}", Title, "Config successfully updated!");
				Interface.Oxide.LogWarning("[{0}] {1}", Title, "Please re-assign player rights! Old rights will not work!");
				gperm = true;
			}
			
			if (Config["OldMessages"]!=null) {
				Interface.Oxide.LogWarning("[{0}] {1}", Title, "Outdated messages detected!");
				Interface.Oxide.LogWarning("[{0}] {1}", Title, "Please remove them from config after merge to oxide/lang file.");
			}
			// end of config update
			
			if (LoadDefault || Config["Block Construct and Refund"]==null || gperm) {
				permission.GrantGroupPermission("admin","autogrades.all",this);
				permission.GrantGroupPermission("admin","autogrades.nores",this);
			}
			ReadFromConfig<bool>("Block Construct and Refund", ref block);
			ReadFromConfig<string>("Command", ref cmdname);
			SaveConfig();
			
			var command = Interface.Oxide.GetLibrary<Command>();
			command.AddChatCommand(cmdname, this, "ChatBuildGrade");	
		}
		
        private void ReadFromConfig<T>(string Key, ref T var)
        {
            if (Config[Key] != null) {
				var = (T)Convert.ChangeType(Config[Key], typeof(T));
			}
			Config[Key] = var;
        }
		
		private string GetMessage(string name, string sid = null) {
			return lang.GetMessage(name, this, sid);
		}
		
		private bool HasPerm(BasePlayer ply, string perm) {
			return permission.UserHasPermission(ply.userID.ToString(), "autogrades."+perm);
		}
	
		private int PlayerGrade(string steamId, bool cache = true) {
            if (playerGrades.ContainsKey(steamId)) return playerGrades[steamId];
			if (!cache) return 0;
            playerGrades[steamId] = 0;
            return playerGrades[steamId];
		}
		
		private bool HasAnyPerm(BasePlayer player) {
			return (HasPerm(player,"all") || HasPerm(player,"1") || HasPerm(player,"2") || HasPerm(player,"3") || HasPerm(player,"4"));
		}
		
		private bool CanAffordUpgrade(int grade, BuildingBlock buildingBlock, BasePlayer player)
		{
			bool flag = true;
			List<ItemAmount>.Enumerator enumerator = buildingBlock.blockDefinition.grades[(int)buildingBlock.grade].costToBuild.GetEnumerator(); //this[iGrade].costToBuild.GetEnumerator();
			/*try
			{*/
			// Add cost of build grade 0
			Dictionary<int,float> costs = new Dictionary<int,float>();
			while (enumerator.MoveNext())
			{
				ItemAmount current = enumerator.Current;
				costs[current.itemid] = current.amount;
			}
			
			enumerator = buildingBlock.blockDefinition.grades[grade].costToBuild.GetEnumerator();
			
			// Calc needed costs for upgrade
			while (enumerator.MoveNext())
			{
				ItemAmount current = enumerator.Current;
				var cost = 0f;
				if (costs.ContainsKey(current.itemid)) {
					cost = costs[current.itemid];
					costs.Remove(current.itemid);
				}
				if (player.inventory.GetAmount(current.itemid) >= current.amount+cost)
				{
					continue;
				}
				flag = false;
				return flag;
			}
			
			// check for build grade 0 and needed cost (additional resources)
			if (costs.Count>0) {
				foreach(KeyValuePair<int,float> kvp in costs) {
					if (player.inventory.GetAmount(kvp.Key) >= kvp.Value) {
						continue;
					}
					flag = false;
					return flag;
				}
			}
			//return true;
			/*}
			finally
			{
				((IDisposable)(object)enumerator).Dispose();
			}*/
			return flag;
		}
		
		/* Example of hook usage
		int CanAutoGrade(BasePlayer player, int grade, BuildingBlock buildingBlock, Planner planner) {
			//return -1; // Block upgrade, but create twig part
			//return 0; // Obey plugin settings (block on construct if enabled or not)
			//return 1; // Block upgrade and block build
			return; // allow upgrade
		}*/
		
        void OnEntityBuilt(Planner planner, UnityEngine.GameObject gameObject) {	
			var player = planner.GetOwnerPlayer();
            if (!HasAnyPerm(player)) return;
			BuildingBlock buildingBlock = gameObject.GetComponent<BuildingBlock>();
			if (buildingBlock==null) return;
			var steamId = player.userID.ToString();
			var pgrade = PlayerGrade(steamId,false);
			if (pgrade>0) {
				if (!HasPerm(player,"all") && !HasPerm(player,pgrade.ToString())) return;
				var result = Interface.CallHook("CanAutoGrade", new object[] { player, pgrade, buildingBlock, planner });
				if (result is int) {
					if ((int)result==0 && !block || (int)result<0) return;
					var items = buildingBlock.blockDefinition.grades[(int)buildingBlock.grade].costToBuild;
					foreach (ItemAmount itemAmount in items)
					{
						player.Command(string.Concat(new object[] { "note.inv ", itemAmount.itemid, " ", (int)itemAmount.amount }), new object[0]);
						player.inventory.GiveItem(ItemManager.CreateByItemID(itemAmount.itemid, (int)itemAmount.amount),player.inventory.containerMain);
					}
					gameObject.GetComponent<BaseEntity>().KillMessage();
					return;
				}
				if (!HasPerm(player,"nores")) {
					int amount = 0;
					if (pgrade>(int)buildingBlock.grade&&buildingBlock.blockDefinition.grades[pgrade]) {
						var items = buildingBlock.blockDefinition.grades[(int)buildingBlock.grade].costToBuild;
						if (!CanAffordUpgrade(pgrade,buildingBlock,player)) {
							if (!block) { player.ChatMessage(GetMessage("BGRADE_NORES2",steamId)); return; }
							foreach (ItemAmount itemAmount in items)
							{
								player.Command(string.Concat(new object[] { "note.inv ", itemAmount.itemid, " ", (int)itemAmount.amount }), new object[0]);
								player.inventory.GiveItem(ItemManager.CreateByItemID(itemAmount.itemid, (int)itemAmount.amount),player.inventory.containerMain);
							}
							gameObject.GetComponent<BaseEntity>().KillMessage();
							player.ChatMessage(GetMessage("BGRADE_NORES",steamId)); 
							return;
						} else {
							var grd = (BuildingGrade.Enum) pgrade;
							buildingBlock.SetGrade(grd);
							buildingBlock.UpdateSkin();
							buildingBlock.SetHealthToMax();
							buildingBlock.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
							var items2 = buildingBlock.blockDefinition.grades[pgrade].costToBuild;
							List<Item> items3 = new List<Item>();
							foreach (ItemAmount itemAmount in items2)
							{
								amount = (int)Math.Ceiling(itemAmount.amount);
								player.inventory.Take(items3, itemAmount.itemid, amount);
								player.Command(string.Concat(new object[] { "note.inv ", itemAmount.itemid, " ", amount * -1f }), new object[0]);
							}
						}
					}
				} else {
					var grd = (BuildingGrade.Enum) pgrade;
					buildingBlock.SetGrade(grd);
					buildingBlock.UpdateSkin();
					buildingBlock.SetHealthToMax();
					buildingBlock.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
				}
			}
		}
		
        //[ChatCommand("bgrade")]
        void ChatBuildGrade(BasePlayer player, string command, string[] args) {
			var steamId = player.userID.ToString();
            if (!HasAnyPerm(player)) { 
				SendReply(player, GetMessage("BGRADE_NOPERM",steamId)); return; 
			}
			var chatmsg = new List<string>();
            if (args.Length>0) {
				switch (args[0])
				{
					case "1":
					case "2":
					case "3":
					case "4":
						if (!HasPerm(player,"all") && !HasPerm(player,args[0])) { 
							SendReply(player, GetMessage("BGRADE_NOPERM",steamId)); return; 
						}
						var pgrade = PlayerGrade(steamId);
						playerGrades[steamId] = Convert.ToInt32(args[0]);
						chatmsg.Add(string.Format(GetMessage("BGRADE_SET",steamId),GetMessage(((BuildingGrade.Enum) playerGrades[steamId]).ToString(),steamId)));
					break;
					case "0":
						playerGrades.Remove(steamId);
						chatmsg.Add(GetMessage("BGRADE_DIS",steamId));
					break;
					default:
						chatmsg.Add(GetMessage("BGRADE_INV",steamId));
					break;
				}
			} else {
				var pgrade = PlayerGrade(steamId,false);
				chatmsg.Add(GetMessage("BGRADE_HELP",steamId)+"\n");
				var all = HasPerm(player,"all");
				if (all || HasPerm(player,"1")) chatmsg.Add(string.Format(GetMessage("BGRADE_1",steamId),cmdname));
				if (all || HasPerm(player,"2")) chatmsg.Add(string.Format(GetMessage("BGRADE_2",steamId),cmdname));
				if (all || HasPerm(player,"3")) chatmsg.Add(string.Format(GetMessage("BGRADE_3",steamId),cmdname));
				if (all || HasPerm(player,"4")) chatmsg.Add(string.Format(GetMessage("BGRADE_4",steamId),cmdname));
				chatmsg.Add(string.Format(GetMessage("BGRADE_0",steamId),cmdname));
				var curtxt = ((BuildingGrade.Enum) pgrade).ToString();
				if (pgrade==0) curtxt = "Disabled";
				chatmsg.Add("\n"+string.Format(GetMessage("BGRADE_CUR",steamId), GetMessage(curtxt,steamId)));
			}
			player.ChatMessage(string.Join("\n", chatmsg.ToArray()));
        }
	
	}
	
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху