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

FREE DamageControl : 2.4.9 2.4.9

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Collections.Generic;
using System.Linq;
using Oxide.Core;
using Oxide.Core.Libraries.Covalence;
using Oxide.Game.Rust.Cui;
using System.Reflection;
using Oxide.Core.Plugins;
using Oxide.Core.CSharp;
using UnityEngine.UI;
using System.Collections;
using Oxide.Game.Rust.Cui;
using Oxide.Core.Configuration;
using Oxide.Core.Libraries.Covalence;
using Rust;
using System.IO;
using UnityEngine;

namespace Oxide.Plugins {
 [Info("DamageControl", "MSpeedie", "2.4.9", ResourceId = 2677)]
 [Description("Allows authorized users to control damage settings for Time, animals, apc, balloons, barrels, buildings, bgrades, heli, npcs, players and zombies")]
 // internal class DamageControl : RustPlugin
 class DamageControl: CovalencePlugin {
  // note we check isAdmin as well so Admins get this by default
  readonly string permAdmin = "damagecontrol.admin";

  // zero = damage immuned  1 = no modifier 0.5 half damage 2 double damage
  public float ModifyDeployed;
  public float ModifyDoor;
  public float ModifyFloor;
  public float ModifyFoundation;
  public float ModifyHighExternal;
  public float ModifyOther;
  public float ModifyRoof;
  public float ModifyStairs;
  public float ModifyTC;
  public float ModifyBarrel;
  public float ModifyWall;
  public bool  AllowDecay;

  // these are to make checking look cleaner
  // action
  readonly List < string > dcaction = new List < string > {
   "help",
   "list",
   "set"
  };

	readonly DynamicConfigFile dataFile = Interface.Oxide.DataFileSystem.GetFile("DamageControl");
	private Dictionary<string, float> EntityModifier = new Dictionary<string, float>();


  // Class
  // note the code does some mapping as well:
  // bradley = apc
  // scientist = npc
  // heli = helicopter
  // scarecrows, murderer = zombie  (I know they are different but how often to do use both at the same time?)
  readonly List < string > dclass = new List < string > {
   "chicken",
   "bear",
   "wolf",
   "boar",
   "horse",
   "stag",
   "buildingblock",
   "npc",
   "player",
   "GlobalTime",
   "PlayerTime",
   "AnimalTime",
   "NPCTime",
   "OtherTime",
   "HeliTime",
   "BradleyTime",
   "zombie",
   "apc",
   "helicopter",
   "building",
   "bgrade",
   "ballon"
  };

  // Time types
  readonly List < string > ttype = new List < string > {
  "0",
  "1",
  "2",
  "3",
  "4",
  "5",
  "6",
  "7",
  "8",
  "9",
  "10",
  "11",
  "12",
  "13",
  "14",
  "15",
  "16",
  "17",
  "18",
  "19",
  "20",
  "21",
  "22",
  "23"
  };

  // bgrade types
  readonly List < string > bgtype = new List < string > {
  "Twigs",
  "Wood",
  "Stone",
  "Metal",
  "TopTier"
  };

  // building material types
  readonly List < string > btype = new List < string > {
   "allowdecay",
   "deployed",
   "door",
   "floor",
   "foundation",
   "highexternal",
   "other",
   "roof",
   "stairs",
   "toolcupboard",
   "wall",
   "barrel"
  };

  // damage types (some seem rather redundant, go FacePunch)
  // this order matched the HitInfo, do not touch or it will break the list command
  readonly List < string > dtype = new List < string > {
   "generic",
   "hunger",
   "thirst",
   "cold",
   "drowned",
   "heat",
   "bleeding",
   "poison",
   "suicide",
   "bullet",
   "slash",
   "blunt",
   "fall",
   "radiation",
   "bite",
   "stab",
   "explosion",
   "radiationexposure",
   "coldexposure",
   "decay",
   "electricshock",
   "arrow"
  };

  // deployables list
  List < string > deployable_list = new List< string >();

  // max size of damage types, if this changed the dtype above needs to be updated
  private
  const int DamageTypeMax = (int) DamageType.LAST;

  // arrays of multipliers by class and one with zero to make buidlings immuned
  float[] _Zeromultipliers = new float[DamageTypeMax]; // immuned, zero damage
  float[] _Onemultipliers = new float[DamageTypeMax]; // normal damage


  // Animals
  float[] _Bearmultipliers = new float[DamageTypeMax]; // Bear
  float[] _Boarmultipliers = new float[DamageTypeMax]; // Boar
  float[] _Chickenmultipliers = new float[DamageTypeMax]; // Chicken
  float[] _Horsemultipliers = new float[DamageTypeMax]; // Horse
  float[] _Stagmultipliers = new float[DamageTypeMax]; // Stag
  float[] _Wolfmultipliers = new float[DamageTypeMax]; // Wolf

  // Balloon
  float[] _Balloonmultipliers = new float[DamageTypeMax]; // Balloon

  float[] _Buildingmultipliers = new float[DamageTypeMax]; // Buildings
  float[] _Zombiemultipliers = new float[DamageTypeMax]; // Scarecrow, Murderer (Halloween) and Zombies
  float[] _Playermultipliers = new float[DamageTypeMax]; // Players
  float[] _NPCmultipliers = new float[DamageTypeMax]; // Scientists and NPCs
  float[] _APCmultipliers = new float[DamageTypeMax]; // APC aka Bradley
  float[] _Helimultipliers = new float[DamageTypeMax]; // Helicopter

  // Time multiplier
  float[] _GlobalTimemultipliers = new float[24];  // Global Per Hour Multiplier
  float[] _PlayerTimemultipliers = new float[24];  // Player Per Hour Multiplier
  float[] _AnimalTimemultipliers = new float[24];  // Animal Per Hour Multiplier
  float[] _NPCTimemultipliers = new float[24];     // NPC Per Hour Multiplier
  float[] _HeliTimemultipliers = new float[24];    // Heli Per Hour Multiplier
  float[] _BradleyTimemultipliers = new float[24]; // Bradley Per Hour Multiplier
  float[] _OtherTimemultipliers = new float[24];   // Other Per Hour Multiplier

  // bgrade multipliers
  float _TwigsMultiplier  = 1.0F; // Twigs Multiplier
  float _WoodMultiplier  = 1.0F; // Wood Multiplier
  float _StoneMultiplier = 1.0F; // Stone Multiplier
  float _MetalMultiplier = 1.0F; // Metal Multiplier
  float _TopTierMultiplier = 1.0F; // TopTier Multiplier

  // to indicate I need to update the json file
  bool _didConfigChange;

  void Init() {
   if (!permission.PermissionExists(permAdmin)) permission.RegisterPermission(permAdmin, this);
   // LoadDefaultMessages();  // Done Automatically
   LoadConfigValues();
   build_dep_list();
   EntityModifier = dataFile.ReadObject<Dictionary<string, float>>();
  }

  protected override void LoadDefaultMessages() {
   // English
   lang.RegisterMessages(new Dictionary < string, string > {
    // general messages
    ["help"] = "You can use list to show a setting and set to set setting.For example /dc list building door or /dc set npc arrow 2.",
    ["nopermission"] = "You do not have permission to use that command.",
    ["wrongsyntax"] = "Incorrect Syntax used, please specify help, list or set and then the parameters for those actions.",
    ["wrongsyntaxList"] = "Incorrect Syntax used for action List.Parameters are optionally: Class, Type.",
    ["wrongsyntaxSet"] = "Incorrect Syntax used for action Set.Parameters are: Class, Type, Value.",
    ["wrongaction"] = "Action can be Help, List or Set.",
    ["wrongclass"] = "Class can only be set to one of Balloon, Bear, Boar, Chicken, Horse, Stag, Wolf, APC (or Bradley), BGrade, Building, BuildingBlock, Player, Heli, NPC (which includes scientists) , Zombie (which includes Scarecrows, Murderers).",
    ["wrongbtype"] = "That is not a supported type: allowdecay, foundation, wall, floor, door, stair, roof, highexternal, barrel, other.",
    ["wrongttype"] = "That is not a supported type: 0 through 23.",
    ["wrongbgtype"] = "That is not a supported type: twigs, wood, stone, metal, toptier.(or 0-4)",
    ["wrongtype"] = "That is not a supported type: Arrow, Bite, Bleeding, Blunt, Bullet, Cold, ColdExposure, Decay, Drowned, ElectricShock, Explosion, Fall, Generic, Heat, Hunger, Poison, Radiation, RadiationExposure, Slash, Stab, Suicide, Thirst.",
    ["wrongbvalues"] = "Building Values can only be set to true or false.",
    ["wrongnvalues"] = "Multiplier Values can only be set from 0 to 100.00.",
    ["frontmess"] = "You have set",
    ["bmiddlemess"] = "protection to",
    ["middlemess"] = "to",
    ["endmess"] = ".",
    // Building Types
    ["door"] = "Doors",
    ["floor"] = "Floors",
    ["foundation"] = "Foundations",
    ["other"] = "Other Building Materials",
    ["roof"] = "Roofs",
    ["stairs"] = "Stairs",
    ["wall"] = "Walls",
	["toolcupboard"] = "ToolCupboard",
	["deployed"] = "Deployable",
	["highexternal"] = "High External",
    // Class
    ["apc"] = "APC aka Bradley",
    ["bear"] = "bear",
    ["boar"] = "boar",
    ["balloon"] = "balloon",
    ["building"] = "Building",
    ["buildingblock"] = "Building Block",
    ["chicken"] = "Chicken",
    ["heli"] = "Helicopter",
    ["horse"] = "Horse",
    ["npc"] = "NPC aka Scientist",
    ["player"] = "Player",
    ["stag"] = "Stag",
	["GlobalTime"] = "Global Time",
	["PlayerTime"] = "PLayer Time",
	["AnimalTime"] = "Animal Time",
	["NPCTime"] = "NPC Time",
	["HeliTime"] = "Heli Time",
	["BradleyTime"] = "Bradley Time",
	["OtherTime"] = "Other Time",
	["bgrade"] = "Build Grade",
    ["wolf"] = "Wolf",
    ["zombie"] = "Zombie, Murderer and Scarecrows",
    ["murderer"] = "Zombie, Murderer and Scarecrows",
    ["scientist"] = "NPC aka Scientist",
    // Damage Types
    ["arrow"] = "Arrow",
    ["bite"] = "Bite",
    ["bleeding"] = "Bleeding",
    ["blunt"] = "Blunt",
    ["bullet"] = "Bullet",
    ["cold"] = "Cold",
    ["coldexposure"] = "Cold Exposure",
    ["decay"] = "Decay",
    ["drowned"] = "Drowned",
    ["electricshock"] = "Electric Shock",
    ["explosion"] = "Explosion",
    ["fall"] = "Fall",
    ["generic"] = "Generic",
    ["heat"] = "Heat",
    ["hunger"] = "Hunger",
    ["poison"] = "Poison",
    ["radiation"] = "Radiation",
    ["radiationexposure"] = "Radiation Exposure",
    ["slash"] = "Slash",
    ["stab"] = "Stab",
    ["suicide"] = "Suicide",
    ["thirst"] = "Thirst",
    // Multiplier headings
    ["multipliers"] = "Multipliers"
   }, this);
  }

	void build_dep_list()
    {
        foreach (var itemDef in ItemManager.GetItemDefinitions().ToList())
             {
                var mod = itemDef.GetComponent<ItemModDeployable>();
                if (mod != null)
				{
					if (itemDef.name.LastIndexOf(".item") > 0)
					{
						deployable_list.Add(itemDef.name.Substring(0,itemDef.name.LastIndexOf(".item")).Replace("_",".").ToLower());
						deployable_list.Add(itemDef.name.Substring(0,itemDef.name.LastIndexOf(".item")).Replace("_",".").ToLower()+".deployed"); // hack to deal with some having deployed and some not
					}
					else
					{
						deployable_list.Add(itemDef.name.Replace("_",".").ToLower());
						deployable_list.Add(itemDef.name.Replace("_",".").ToLower()+".deployed");  // hack to deal with some having deployed and some not
					}
				}
             }
		// deal with messed up repair_bench losing its "_" to become repairbench
		deployable_list.Add("repairbench.deployed");
		deployable_list.Add("refinery.small.deployed");

		// debugging dump
		//foreach (string p in deployable_list)
        //{
        //    PrintWarning(p);
        //}
    }


  void Loaded() => LoadConfigValues();
  protected override void LoadDefaultConfig() => Puts("New configuration file created.");

  void LoadConfigValues() {
   foreach(DamageType val in Enum.GetValues(typeof(DamageType))) {
    if (val == DamageType.LAST) continue;
    _APCmultipliers[(int) val] = Convert.ToSingle(GetConfigValue("APC_Multipliers", val.ToString().ToLower(), 1.0));
    _Balloonmultipliers[(int) val] = Convert.ToSingle(GetConfigValue("Balloon_Multipliers", val.ToString().ToLower(), 1.0));
    _Bearmultipliers[(int) val] = Convert.ToSingle(GetConfigValue("Bear_Multipliers", val.ToString().ToLower(), 1.0));
    _Boarmultipliers[(int) val] = Convert.ToSingle(GetConfigValue("Boar_Multipliers", val.ToString().ToLower(), 1.0));
    _Buildingmultipliers[(int) val] = Convert.ToSingle(GetConfigValue("BuildingBlock_Multipliers", val.ToString().ToLower(), 1.0));
    _Chickenmultipliers[(int) val] = Convert.ToSingle(GetConfigValue("Chicken_Multipliers", val.ToString().ToLower(), 1.0));
    _Helimultipliers[(int) val] = Convert.ToSingle(GetConfigValue("Heli_Multipliers", val.ToString().ToLower(), 1.0));
    _Horsemultipliers[(int) val] = Convert.ToSingle(GetConfigValue("Horse_Multipliers", val.ToString().ToLower(), 1.0));
    _NPCmultipliers[(int) val] = Convert.ToSingle(GetConfigValue("Scientist_Multipliers", val.ToString().ToLower(), 1.0));
    _Playermultipliers[(int) val] = Convert.ToSingle(GetConfigValue("Player_Multipliers", val.ToString().ToLower(), 1.0));
    _Stagmultipliers[(int) val] = Convert.ToSingle(GetConfigValue("Stag_Multipliers", val.ToString().ToLower(), 1.0));
    _Wolfmultipliers[(int) val] = Convert.ToSingle(GetConfigValue("Wolf_Multipliers", val.ToString().ToLower(), 1.0));
    _Zombiemultipliers[(int) val] = Convert.ToSingle(GetConfigValue("Zombie_Multipliers", val.ToString().ToLower(), 1.0)); // also murderers and scarecrows
    _Zeromultipliers[(int) val] = 0;
    _Onemultipliers[(int) val] = 1;
	}
   for (var i = 0; i < 24; i++) {
	   // Puts(i.ToString());
       _GlobalTimemultipliers[(int) i] = Convert.ToSingle(GetConfigValue("Global_Time_Multipliers", i.ToString().PadLeft(2,' '), 1.0)); // Time in hours
   }

   for (var i = 0; i < 24; i++) {
	   // Puts(i.ToString());
       _PlayerTimemultipliers[(int) i] = Convert.ToSingle(GetConfigValue("Player_Time_Multipliers", i.ToString().PadLeft(2,' '), 1.0)); // Time in hours
   }

   for (var i = 0; i < 24; i++) {
	   // Puts(i.ToString());
       _AnimalTimemultipliers[(int) i] = Convert.ToSingle(GetConfigValue("Animal_Time_Multipliers", i.ToString().PadLeft(2,' '), 1.0)); // Time in hours
   }

   for (var i = 0; i < 24; i++) {
	   // Puts(i.ToString());
       _NPCTimemultipliers[(int) i] = Convert.ToSingle(GetConfigValue("NPC_Time_Multipliers", i.ToString().PadLeft(2,' '), 1.0)); // Time in hours
   }

   for (var i = 0; i < 24; i++) {
	   // Puts(i.ToString());
       _HeliTimemultipliers[(int) i] = Convert.ToSingle(GetConfigValue("Heli_Time_Multipliers", i.ToString().PadLeft(2,' '), 1.0)); // Time in hours
   }

   for (var i = 0; i < 24; i++) {
	   // Puts(i.ToString());
       _BradleyTimemultipliers[(int) i] = Convert.ToSingle(GetConfigValue("Bradley_Time_Multipliers", i.ToString().PadLeft(2,' '), 1.0)); // Time in hours
   }

   for (var i = 0; i < 24; i++) {
	   // Puts(i.ToString());
       _OtherTimemultipliers[(int) i] = Convert.ToSingle(GetConfigValue("Other_Time_Multipliers", i.ToString().PadLeft(2,' '), 1.0)); // Time in hours
   }

   ModifyFoundation = Convert.ToSingle(GetConfigValue("Building", "ModifyFoundation",  1.0));
   ModifyFloor = Convert.ToSingle(GetConfigValue("Building", "ModifyFloor",  1.0));
   ModifyRoof = Convert.ToSingle(GetConfigValue("Building", "ModifyRoof",  1.0));
   ModifyWall = Convert.ToSingle(GetConfigValue("Building", "ModifyWall",  1.0));
   ModifyStairs = Convert.ToSingle(GetConfigValue("Building", "ModifyStairs",  1.0));
   ModifyDoor = Convert.ToSingle(GetConfigValue("Building", "ModifyDoor",  1.0));
   ModifyOther = Convert.ToSingle(GetConfigValue("Building", "ModifyOther",  1.0));
   ModifyDeployed = Convert.ToSingle(GetConfigValue("Building", "ModifyDeployed",  1.0));
   ModifyTC = Convert.ToSingle(GetConfigValue("Building", "ModifyToolCupboard",  1.0));
   ModifyBarrel= Convert.ToSingle(GetConfigValue("Building", "ModifyBarrel",  1.0));
   ModifyHighExternal = Convert.ToSingle(GetConfigValue("Building", "ModifyHighExternal",  1.0));

   AllowDecay = Convert.ToBoolean(GetConfigValue("Building", "AllowDecay", "true"));

   _TwigsMultiplier   = Convert.ToSingle(GetConfigValue("Building_Grade_Multipliers", "Twigs",   1.0));
   _WoodMultiplier    = Convert.ToSingle(GetConfigValue("Building_Grade_Multipliers", "Wood",    1.0));
   _StoneMultiplier   = Convert.ToSingle(GetConfigValue("Building_Grade_Multipliers", "Stone",   1.0));
   _MetalMultiplier   = Convert.ToSingle(GetConfigValue("Building_Grade_Multipliers", "Metal",   1.0));
   _TopTierMultiplier = Convert.ToSingle(GetConfigValue("Building_Grade_Multipliers", "TopTier", 1.0));

   if (!_didConfigChange) return;
   Puts("Configuration file updated.");
   SaveConfig();
  }

	object GetConfigValue(string category, string setting, object defaultValue)
	{
		var data = Config[category] as Dictionary < string, object > ;
		object value;
		if (data == null)
		{
			data = new Dictionary < string, object > ();
			Config[category] = data;
			_didConfigChange = true;
		}

		if (data.TryGetValue(setting, out value)) return value;
		value = defaultValue;
		data[setting] = value;
		_didConfigChange = true;
		return value;
	}

	object SetConfigValue(string category, string setting, object defaultValue)
	{
		var data = Config[category] as Dictionary < string, object > ;
		object value;

		if (data == null)
		{
		data = new Dictionary < string, object > ();
		Config[category] = data;
		_didConfigChange = true;
		}

		value = defaultValue;
		data[setting] = value;
		_didConfigChange = true;
		return value;
	}

  [Command("DamageControl", "damagecontrol", "damcon", "dc","global.dc","global.DamageControl")]
  void chatCommand_DamageControl(IPlayer iplayer, string command, string[] args) {

   string paramaaction = null;
   string paramaclass = null;
   string paramatype = null;
   string paramavalue = null;
   Boolean newbool = false;
   float newnumber = -1;
   iplayer.Reply("DamageControl running");

   if (!IsAllowed(iplayer))
   {
    iplayer.Reply(Lang("nopermission", iplayer.Id));
   }
   else
   {
    if (args == null || args.Length < 1)
	{
     iplayer.Reply(Lang("wrongsyntax", iplayer.Id));
     return;
    }
	else
	{
     paramaaction = args[0].ToLower();
     if (!dcaction.Contains(paramaaction))
	 {
      iplayer.Reply(Lang("wrongaction", iplayer.Id, args[0]));
      return;
     }
	 if (paramaaction == "help")
	 {
      iplayer.Reply(Lang("help", iplayer.Id, args[0]));
      return;
     }
     else if (paramaaction == "set" && args.Length != 4)
	 {
	  iplayer.Reply(Lang("wrongsyntaxSet", iplayer.Id));
      return;
	 }
     else if (paramaaction == "list" && args.Length < 2 )
	 {
      iplayer.Reply(Lang("wrongsyntaxList", iplayer.Id));
      return;
     }
	 else
	 {
      if (args.Length > 1)
	  {
		paramaclass = args[1].ToLower();
		if (paramaclass == "build")
		   paramaclass = "building";
	   else if (paramaclass.Contains("brad"))
		   paramaclass = "apc";
	   else if (paramaclass.Contains("murder"))
		   paramaclass = "zombie";
	   else if (paramaclass.Contains("heli"))
		   paramaclass = "helicopter";
	   else if (paramaclass == "science")
		   paramaclass = "npc";
	   }
      else
       paramaclass = null;
      if (args.Length > 2)
	  {
		paramatype = args[2].ToLower();
		if (paramatype == "stair")
			paramatype = "stairs";
		if (paramatype.Length > 6 && paramatype.Substring(0,6) == "modify")
			paramatype = paramatype.Substring(6);
	  }
      else
       paramatype = null;
      if (args.Length > 3)
       paramavalue = args[3].ToLower();
      else
       paramavalue = null;
     }

     if (paramaaction == "set" && paramaclass == null) {
      iplayer.Reply(Lang("wrongclass", iplayer.Id, args[1]));
      return;
     }
     if (paramaclass != null && paramaclass != "" && !dclass.Contains(paramaclass)) {
      iplayer.Reply(Lang("wrongclass", iplayer.Id, args[1]));
      return;
     }
     if (paramavalue == "1" && paramaclass.Contains("build") && paramatype.Contains("decay")) {
      paramavalue = "true";
     } else if (paramavalue == "0" && paramaclass.Contains("build") && paramatype.Contains("decay")) {
      paramavalue = "false";
     }
     if (paramavalue != "true" && paramavalue != "false" && paramavalue != null)
      try {
       newnumber = Convert.ToSingle(paramavalue);
      } catch (FormatException) {
       iplayer.Reply(Lang("wrongnvalues", iplayer.Id, args[3]));
       return;
      } catch (OverflowException) {
       iplayer.Reply(Lang("wrongnvalues", iplayer.Id, args[3]));
       return;
      }
     if (paramaclass.Contains("build") && paramatype.Contains("decay"))
	 {
		if (paramavalue != "true" && paramavalue != "false" && paramaaction == "set")
		{
			iplayer.Reply(Lang("wrongbvalues", iplayer.Id, args[3]));
			return;
		}
     } else if ((newnumber < 0 || newnumber > 100) && paramaaction == "set") {
      iplayer.Reply(Lang("wrongnvalues", iplayer.Id, args[3]));
      return;
     }
     if (paramaaction == "set" || paramatype != null) {
		// change text to boolean
		if (paramavalue == "true") {
		newbool = true;
		} else if (paramavalue == "false") {
		newbool = false;
		}

		if (paramaclass.Contains("Time")) {
			// check type values
			if (!ttype.Contains(paramatype)) {
				iplayer.Reply(Lang("wrongttype", iplayer.Id, args[2]));
				return;
			}
		} else if (paramaclass.Contains("bgrade")) {
			// Puts("before paramatype: " + paramatype);
			// convert numbers to names
			if (paramatype == "0" || paramatype.Contains("twig"))
				paramatype = "Twigs";
			else if (paramatype == "1" || paramatype.Contains("wood"))
				paramatype = "Wood";
			else if (paramatype == "2" || paramatype.Contains("stone"))
				paramatype = "Stone";
			else if (paramatype == "3" || paramatype.Contains("metal"))
				paramatype = "Metal";
			else if (paramatype == "4" || paramatype.Contains("toptier"))
				paramatype = "TopTier";
			// Puts("After paramatype: " + paramatype);

			// check type values
			if (!bgtype.Contains(paramatype)) {
				iplayer.Reply(Lang("wrongbgtype", iplayer.Id, args[2]));
				return;
			}
		} else if (!paramaclass.Contains("bgrade")  && (!paramaclass.Contains("build") || paramaclass.Contains("block"))) {
			// check type values
			if (!dtype.Contains(paramatype)) {
				iplayer.Reply(Lang("wrongtype", iplayer.Id, args[2]));
				return;
			}
		} else {
			// check type values
			if (!btype.Contains(paramatype)) {
				iplayer.Reply(Lang("wrongbtype", iplayer.Id, args[2]));
				return;
			}
		}
	 }

	 if (paramaaction == "set")
	 {
		if (paramaclass.Contains("bgrade"))
		{
			SetConfigValue("Building_Grade_Multipliers", paramatype, newnumber);
		}
		else if (paramaclass.Contains("build") && !paramaclass.Contains("block")) {
		if (paramatype.Contains("decay")) {
			AllowDecay = newbool;
			SetConfigValue("Building", "AllowDecay", newbool);
		}else if (paramatype.Contains("found")) {
			ModifyFoundation = newnumber;
			SetConfigValue("Building", "ModifyFoundation", newnumber);
		} else if (paramatype.Contains("floor")) {
			ModifyFloor = newnumber;
			SetConfigValue("Building", "ModifyFloor", newnumber);
		} else if (paramatype.Contains("door")) {
			ModifyDoor = newnumber;
			SetConfigValue("Building", "ModifyDoor", newnumber);
		} else if (paramatype.Contains("highexternal")) {
			ModifyHighExternal = newnumber;
			SetConfigValue("Building", "ModifyHighExternal", newnumber);
		} else if (paramatype.Contains("wall")) {
			ModifyWall = newnumber;
			SetConfigValue("Building", "ModifyWall", newnumber);
		} else if (paramatype.Contains("stair")) {
			ModifyStairs = newnumber;
			SetConfigValue("Building", "ModifyStairs", newnumber);
		} else if (paramatype.Contains("roof")) {
			ModifyRoof = newnumber;
			SetConfigValue("Building", "ModifyRoof", newnumber);
		} else if (paramatype.Contains("other")) {
			ModifyOther = newnumber;
			SetConfigValue("Building", "ModifyOther", newnumber);
		} else if (paramatype.Contains("deploy")) {
			ModifyDeployed = newnumber;
			SetConfigValue("Building", "ModifyDeployed", newnumber);
		} else if (paramatype.Contains("cupboard")) {
			ModifyTC = newnumber;
			SetConfigValue("Building", "ModifyToolCupboard", newnumber);
		} else if (paramatype.Contains("barrel")) {
			ModifyBarrel = newnumber;
			SetConfigValue("Building", "ModifyBarrel", newnumber);
		}

		} else if (paramaclass.Contains("build") && paramaclass.Contains("block")) {
		SetConfigValue("BuildingBlock_Multipliers", paramatype, newnumber);
		} else if (paramaclass.Contains("apc") || paramaclass.Contains("bradley")) {
		SetConfigValue("APC_Multipliers", paramatype, newnumber);
		} else if (paramaclass.Contains("heli")) {
		SetConfigValue("Heli_Multipliers", paramatype, newnumber);
		} else if (paramaclass.Contains("balloon")) {
		SetConfigValue("Balloon_Multipliers", paramatype, newnumber);
		} else if (paramaclass.Contains("npc") || paramaclass.Contains("scientist")) {
		SetConfigValue("Scientist_Multipliers", paramatype, newnumber);
		} else if (paramaclass.Contains("zombie") || paramaclass.Contains("murderer") || paramaclass.Contains("scarecrow")) {
		SetConfigValue("Zombie_Multipliers", paramatype, newnumber);
		} else if (paramaclass.Contains("player")) {
		SetConfigValue("Player_Multipliers", paramatype, newnumber);
		} else if (paramaclass.Contains("bear")) {
		SetConfigValue("Bear_Multipliers", paramatype, newnumber);
		} else if (paramaclass.Contains("boar")) {
		SetConfigValue("Boar_Multipliers", paramatype, newnumber);
		} else if (paramaclass.Contains("chicken")) {
		SetConfigValue("Chicken_Multipliers", paramatype, newnumber);
		} else if (paramaclass.Contains("horse")) {
		SetConfigValue("Horse_Multipliers", paramatype, newnumber);
		} else if (paramaclass.Contains("stag")) {
		SetConfigValue("Stag_Multipliers", paramatype, newnumber);
		} else if (paramaclass.Contains("GlobalTime")) {
		SetConfigValue("GlobalTime_Multipliers", paramatype, newnumber);
		} else if (paramaclass.Contains("PlayerTime")) {
		SetConfigValue("PlayerTime_Multipliers", paramatype, newnumber);
		} else if (paramaclass.Contains("AnimalTime")) {
		SetConfigValue("AnimalTime_Multipliers", paramatype, newnumber);
		} else if (paramaclass.Contains("NPCTime")) {
		SetConfigValue("NPCTime_Multipliers", paramatype, newnumber);
		} else if (paramaclass.Contains("OtherTime")) {
		SetConfigValue("OtherTime_Multipliers", paramatype, newnumber);
		} else if (paramaclass.Contains("HeliTime")) {
		SetConfigValue("HeliTime_Multipliers", paramatype, newnumber);
		} else if (paramaclass.Contains("BradleyTime")) {
		SetConfigValue("BradleyTime_Multipliers", paramatype, newnumber);
		} else if (paramaclass.Contains("wolf")) {
		SetConfigValue("Wolf_Multipliers", paramatype, newnumber);
		}
		SaveConfig();
		if (paramavalue != "true" && paramavalue != "false") {
		iplayer.Reply(Lang("frontmess", iplayer.Id) + " " + Lang(paramaclass, iplayer.Id) + " " + Lang(paramatype, iplayer.Id) + " " + Lang("multipliers", iplayer.Id) + " " +
			Lang("middlemess", iplayer.Id) + " " + newnumber.ToString("G4") + " " + Lang("endmess"));
		} else {
		iplayer.Reply(Lang("frontmess", iplayer.Id) + " " + Lang(paramaclass, iplayer.Id) + " " + Lang(paramatype, iplayer.Id) + " " +
						Lang("bmiddlemess", iplayer.Id) + " " + paramavalue + " " + Lang("endmess", iplayer.Id));
		}

     } else // list
     {
		if (paramaclass != null && paramatype != null) // dump a type per class
		{
		 printvalue(iplayer, paramaclass, paramatype, getHitScale(paramaclass,paramatype.ToLower()));
		}
		else if (paramaclass != null) // dump a class
		{
			if (paramaclass.Contains("bgrade"))
				for (var i = 0; i < bgtype.Count; i++) {
					printvalue(iplayer, paramaclass, bgtype[i], getHitScale(paramaclass,bgtype[i].ToLower()));
				}
			else if (paramaclass.Contains("build") && !paramaclass.Contains("block"))
				for (var i = 0; i < btype.Count; i++) {
					printvalue(iplayer, paramaclass, btype[i], getHitScale(paramaclass,btype[i].ToLower()));
				}
			else
				for (var i = 0; i < DamageTypeMax; i++) {
					printvalue(iplayer, paramaclass, dtype[i], getHitScale(paramaclass,dtype[i].ToLower()));
				}
		}
		// this is just too long to read in game so I have removed it
		//else // dump all
		//{
		//	// Buildings
		//	for (var k = 0; k < btype.Count; k++) {
		//			printvalue(player, paramaclass, btype[k], getHitScale(paramaclass,btype[k]));
		//		}
		//	// all other types
		//	for (var i = 0; i < dclass.Count-1; i++) {
		//		for (var j = 0; j < DamageTypeMax; j++) {
		//			printvalue(player, dclass[i], dtype[j], getHitScale(paramaclass,dtype[j]));
		//		}
		//	}
		//}
     }
    }
   }
   return;
  }

    void printvalue(IPlayer player, string paramaclass, string paramatype, string paravalue) {
	if (paramaclass.Contains("build") && !paramaclass.Contains("block"))
		 {
			player.Reply(Lang("frontmess", player.Id) + " " + Lang(paramaclass, player.Id) + " " + Lang(paramatype, player.Id) + " " +
	                Lang("bmiddlemess", player.Id) + " " + paravalue + " " + Lang("endmess", player.Id));
		 }
		else
		 {
			 player.Reply(Lang("frontmess", player.Id) + " " + Lang(paramaclass, player.Id) + " " + Lang(paramatype, player.Id) + " " + Lang("multipliers", player.Id) + " " +
								Lang("middlemess", player.Id) + " " + paravalue + " " + Lang("endmess"));
		 }
	}


    string getHitScale(string paramaclass, string paramatype) {

	float  tempnumber = -1;
	string tempstring = "Undefined";

	if (paramaclass.Contains("build") && !paramaclass.Contains("block")) {
       if (paramatype.Contains("found")) {
			tempstring = Convert.ToString(ModifyFoundation);
       } else if (paramatype.Contains("floor")) {
			tempstring = Convert.ToString(ModifyFloor);
       } else if (paramatype.Contains("door")) {
			tempstring = Convert.ToString(ModifyDoor);
       } else if (paramatype.Contains("wall")) {
			tempstring = Convert.ToString(ModifyWall);
       } else if (paramatype.Contains("stair")) {
			tempstring = Convert.ToString(ModifyStairs);
       } else if (paramatype.Contains("roof")) {
			tempstring = Convert.ToString(ModifyRoof);
       } else if (paramatype.Contains("other")) {
			tempstring = Convert.ToString(ModifyOther);
       } else if (paramatype.Contains("deployed")) {
			tempstring = Convert.ToString(ModifyDeployed);
       }  else if (paramatype.Contains("highexternal")) {
			tempstring = Convert.ToString(ModifyHighExternal);
       }  else if (paramatype.Contains("cupboard")) {
			tempstring = Convert.ToString(ModifyTC);
       } else if (paramatype.Contains("barrel")) {
			tempstring = Convert.ToString(ModifyBarrel);
       }
	}
	else
	{
		if (paramaclass.Contains("build") && paramaclass.Contains("block")) {
			tempnumber = _Buildingmultipliers[dtype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("apc") || paramaclass.Contains("bradley")) {
			tempnumber = _APCmultipliers[dtype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("heli")) {
			tempnumber = _Helimultipliers[dtype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("balloon")) {
			tempnumber = _Balloonmultipliers[dtype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("npc") || paramaclass.Contains("scientist")) {
			tempnumber = _NPCmultipliers[dtype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("zombie") || paramaclass.Contains("murderer") || (paramaclass.Contains("scarecrow") && !paramaclass.Contains("deployed"))) {
			tempnumber = _Zombiemultipliers[dtype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("player")) {
			tempnumber = _Playermultipliers[dtype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("bear")) {
			tempnumber = _Bearmultipliers[dtype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("boar")) {
			tempnumber = _Boarmultipliers[dtype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("chicken")) {
			tempnumber = _Chickenmultipliers[dtype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("horse")) {
			tempnumber = _Horsemultipliers[dtype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("stag")) {
			tempnumber = _Stagmultipliers[dtype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("GlobalTime")) {
			tempnumber = _GlobalTimemultipliers[ttype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("PlayerTime")) {
			tempnumber = _PlayerTimemultipliers[ttype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("AnimalTime")) {
			tempnumber = _AnimalTimemultipliers[ttype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("NPCTime")) {
			tempnumber = _NPCTimemultipliers[ttype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("OtherTime")) {
			tempnumber = _OtherTimemultipliers[ttype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("HeliTime")) {
			tempnumber = _HeliTimemultipliers[ttype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("BradleyTime")) {
			tempnumber = _BradleyTimemultipliers[ttype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("wolf")) {
			tempnumber = _Wolfmultipliers[dtype.IndexOf(paramatype)];
		} else if (paramaclass.Contains("bgrade")) {
			if (paramatype == "twigs" || paramatype == "0")
				tempnumber = _TwigsMultiplier;
			else if (paramatype == "wood" || paramatype == "1")
				tempnumber = _WoodMultiplier;
			else if (paramatype == "stone" || paramatype == "2")
				tempnumber = _StoneMultiplier;
			else if (paramatype == "metal" || paramatype == "3")
				tempnumber = _MetalMultiplier;
			else if (paramatype == "toptier" || paramatype == "4")
				tempnumber = _TopTierMultiplier;
		}
		tempstring = tempnumber.ToString();
	}
	return tempstring;
  }

  void setHitScale(HitInfo hitInfo, float[] _multipliers, float addlnmod) {

	//Puts ("addlnmod: " + addlnmod.ToString());

	// added logic to apply decay
	for (var i = 0; i < DamageTypeMax; i++)
	{
		if (AllowDecay == true &&
		   ((DamageType) i == Rust.DamageType.Decay || (DamageType) i == Rust.DamageType.Generic ) &&
		   _multipliers[i] * addlnmod < 0.01F &&
		   !(hitInfo.Initiator is BaseCombatEntity) &&
			hitInfo?.Weapon?.GetItem()?.info?.displayName?.english == null)
		{
			if (_multipliers[i] == 0)
				_multipliers[i] = 1;
			if (addlnmod == 0)
				addlnmod = 1;

			hitInfo.damageTypes.Scale((DamageType) i, _multipliers[i] * addlnmod);
		}
		else
			hitInfo.damageTypes.Scale((DamageType) i, _multipliers[i] * addlnmod);
		// Puts (_multipliers[i].ToString());
	}

  }

  void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo hitInfo) {

	float modifier       = 1.0F;
	int   Time           = 0;

	if (entity == null || hitInfo == null)
		{
			return; // Nothing to process
		}

		try
		{
				if (EntityModifier.ContainsKey(entity.ShortPrefabName))
					try
					{
						EntityModifier.TryGetValue(entity.ShortPrefabName, out modifier);
					}
					catch
					{
						modifier  = 1.0F;
					}
		}
		catch
		{
			modifier = 1.0F;
		}
	Time = Convert.ToInt32(Math.Floor(TOD_Sky.Instance.Cycle.Hour));

	// make sure the time is in range
	if (Time > 24 || Time < 0)
		Time = 0;

	// Apply the Global Time Mod
	modifier =  modifier * _GlobalTimemultipliers[Time];

	// debugging
	//PrintWarning("0 " + entity.ShortPrefabName.Replace("_","."));

	if(entity is LootContainer && entity.ShortPrefabName.Contains("barrel"))  // barrel
	{
		modifier = modifier * ModifyBarrel * _OtherTimemultipliers[Time];

		setHitScale(hitInfo, _Onemultipliers,modifier);
	}
	else if (entity is NPCMurderer || (entity.ShortPrefabName.Contains("scarecrow") && !entity.ShortPrefabName.Contains("deployed"))) // Scarecrows and Murderer (treated the same as zombies)
		{

			// Apply the NPC Time Mod
			modifier =  modifier * _NPCTimemultipliers[Time];
			setHitScale(hitInfo, _Zombiemultipliers,modifier);
			return;
		}
	else if (entity.ShortPrefabName.Contains("hotairballoon"))
	{
		setHitScale(hitInfo, _Balloonmultipliers,modifier);
		return;
	}
	else if (entity.ShortPrefabName.Contains("assets/rust.ai/agents/"))
		{
			// Apply the Animal Time Mod
			modifier =  modifier * _AnimalTimemultipliers[Time];
			if (entity.ShortPrefabName == "zombie") // Zombie
				{
				setHitScale(hitInfo, _Zombiemultipliers,modifier);
				}
			else if (entity.ShortPrefabName == "bear") // Bear
				{
				setHitScale(hitInfo, _Bearmultipliers,modifier);
				}
			else if (entity.ShortPrefabName == "boar") // Boar
				{
				setHitScale(hitInfo, _Boarmultipliers,modifier);
				}
			else if (entity.ShortPrefabName == "chicken") // Chicken
				{
				setHitScale(hitInfo, _Chickenmultipliers,modifier);
				}
			else if (entity.ShortPrefabName == "horse") // Horse
				{
				setHitScale(hitInfo, _Horsemultipliers,modifier);
				}
			else if (entity.ShortPrefabName == "stag") // Stag
				{
				setHitScale(hitInfo, _Stagmultipliers,modifier);
				}
			else if (entity.ShortPrefabName == "wolf") // Wolf
				{
				setHitScale(hitInfo, _Wolfmultipliers,modifier);
				}
			else // Animal not found
				{
				Puts ("Animal not found in Damage Control: " + entity.ShortPrefabName + " using Bear");
				setHitScale(hitInfo, _Bearmultipliers,modifier);
				}
			return;
		}
	else if (entity is BaseNpc || entity is NPCPlayerApex || entity is NPCPlayer || entity is Scientist || entity.name.Contains("/npc/scientist/htn")) // BotSpawn type Scientists, etc.{
			// Apply the NPC Time Mod
			modifier =  modifier * _NPCTimemultipliers[Time];
			setHitScale(hitInfo, _NPCmultipliers,modifier);
			return;
		}
	else if (entity as BradleyAPC != null) // APC
		{
			// Apply the Bradley Time Mod
			modifier =  modifier * _BradleyTimemultipliers[Time];
			setHitScale(hitInfo, _APCmultipliers,modifier);
			return;
		}
	else if (entity as BaseHelicopter != null) // Heli
		{
			// Apply the Heli Time Mod
			modifier =  modifier * _HeliTimemultipliers[Time];
			setHitScale(hitInfo, _Helimultipliers,modifier);
			return;
		}
	else if (entity as BasePlayer != null)
		{
			// Apply the Player Time Mod
			modifier =  modifier * _PlayerTimemultipliers[Time];
			setHitScale(hitInfo, _Playermultipliers,modifier);
			return;
		}
	// special overrides for building
	else if (entity is BuildingBlock || entity is Door || entity.ShortPrefabName.Contains("external") || entity.ShortPrefabName.Contains("hatch"))
	{
		// Apply the Other Time Mod
		modifier =  modifier * _OtherTimemultipliers[Time];

		if (entity.ShortPrefabName.Contains("foundation"))
			modifier = modifier * ModifyFoundation;
		else if (entity.ShortPrefabName.Contains("external"))
			modifier = modifier * ModifyHighExternal;
		else if (entity.ShortPrefabName.Contains("wall") && !(entity is Door) && !(entity.ShortPrefabName.Contains("external")))
			modifier = modifier * ModifyWall;
		else if (entity.ShortPrefabName.Contains("floor") && !entity.ShortPrefabName.Contains("hatch"))
			modifier = modifier * ModifyFloor;
		else if (entity.ShortPrefabName.Contains("roof"))
			modifier = modifier * ModifyRoof;
		else if ((entity is Door || entity.ShortPrefabName.Contains("hatch")) && !entity.ShortPrefabName.Contains("external"))
			modifier = modifier * ModifyDoor;
		else if (entity.ShortPrefabName.Contains("stairs"))
			modifier = modifier * ModifyStairs;
		else if (entity is BuildingBlock)
			modifier = modifier * ModifyOther;
		else if (deployable_list.Contains(entity.ShortPrefabName.Replace("_",".").ToLower()))  // this deal with high walls etc.modifier = modifier * ModifyDeployed;

		if (entity is BuildingBlock)
		{
			BuildingBlock buildingBlock = entity as BuildingBlock;

			if (buildingBlock.grade == BuildingGrade.Enum.Twigs)
				modifier = _TwigsMultiplier * modifier;
			else if (buildingBlock.grade == BuildingGrade.Enum.Wood )
				modifier = _WoodMultiplier * modifier;
			else if (buildingBlock.grade == BuildingGrade.Enum.Stone )
				modifier = _StoneMultiplier * modifier;
			else if (buildingBlock.grade == BuildingGrade.Enum.Metal )
				modifier = _MetalMultiplier * modifier;
			else if (buildingBlock.grade == BuildingGrade.Enum.TopTier )
				modifier = _TopTierMultiplier * modifier;
		}
		setHitScale(hitInfo, _Buildingmultipliers, modifier);
		//Puts("Building: " + modifier.ToString());
	}
	else if (entity.ShortPrefabName.Contains("cupboard.tool.deployed")) // TC
	{
		// Apply the Other Time Mod
		modifier = modifier * ModifyTC * _OtherTimemultipliers[Time];

		setHitScale(hitInfo, _Buildingmultipliers,modifier);
	}
	else if (deployable_list.Contains(entity.ShortPrefabName.Replace("_",".").ToLower())) // Deployed
	{
		// Apply the Other Time Mod
		modifier = modifier * ModifyDeployed * _OtherTimemultipliers[Time];

		setHitScale(hitInfo, _Buildingmultipliers,modifier);
	}

	//Puts("modifier: " + modifier);
    return; // any processing is completed
  }

  bool IsAllowed(IPlayer iplayer) {
   return iplayer != null && (iplayer.IsAdmin || iplayer.HasPermission(permAdmin));
  }

  T GetConfig < T > (string name, T value) => Config[name] == null ? value : (T) Convert.ChangeType(Config[name], typeof(T));
  string Lang(string key, string id = null, params object[] args) => string.Format(lang.GetMessage(key, this, id), args);

 }
}

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