C#:
using Newtonsoft.Json;
using Oxide.Core;
using System.Collections.Generic;
using System.IO;
namespace Oxide.Plugins {
[Info("UpdaterNpcSpawn", "KpucTaJl", "1.0.0")]
internal class UpdaterNpcSpawn : RustPlugin {
private const bool En = false;
#region Old NpcSpawn Config
public class ConfigOldNpcSpawn {
[JsonProperty(En ? "Can NpcSpawn NPCs attack animals? [true/false]" : "Могут ли кастомные NPC атаковать животных? [true/false]")]
public bool CanTargetAnimal {
get;
set;
}
[JsonProperty(En ? "Can NpcSpawn NPCs attack other NPCs? [true/false]" : "Могут ли кастомные NPC атаковать других NPC? [true/false]")]
public bool CanTargetNpc {
get;
set;
}
[JsonProperty(En ? "Can NpcSpawn NPCs attack sleeping players? [true/false]" : "Могут ли кастомные NPC атаковать спящих игроков? [true/false]")]
public bool CanTargetSleepingPlayer {
get;
set;
}
[JsonProperty(En ? "Can NpcSpawn NPCs attack wounded players? [true/false]" : "Могут ли кастомные NPC атаковать игроков в состоянии Wounded? [true/false]")]
public bool CanTargetWoundedPlayer {
get;
set;
}
[JsonProperty(En ? "Can NpcSpawn NPCs attack players in SafeZone? [true/false]" : "Могут ли кастомные NPC атаковать игроков в SafeZone? [true/false]")]
public bool CanTargetSafeZonePlayer {
get;
set;
}
[JsonProperty(En ? "Prefab path used for all NpcSpawn NPCs" : "Используемый prefab для кастомных NPC")]
public string Prefab {
get;
set;
}
[JsonProperty(En ? "Weapons with custom NPC parameters" : "Список оружия, у которого нет значений стандартных параметров для использования NPC")]
public Dictionary<string, DefaultSettings> WeaponsParameters {
get;
set;
}
[JsonProperty(En ? "NPC Weapons by Distance Category" : "Список оружия для использования NPC по категориям в зависимости от расстояния до цели")]
public Dictionary<int, HashSet<string>> Weapons {
get;
set;
}
[JsonProperty(En ? "Configuration version" : "Версия конфигурации")]
public VersionNumber PluginVersion {
get;
set;
}
}
public ConfigOldNpcSpawn CfgOldNpcSpawn {
get;
set;
}
= null;
private void ReadAndRenameConfigOldNpcSpawn() {
CfgOldNpcSpawn = ReadConfigFile<ConfigOldNpcSpawn>("NpcSpawn.json") ?? new ConfigOldNpcSpawn {
CanTargetAnimal = false, CanTargetNpc = false, CanTargetSleepingPlayer = false, CanTargetWoundedPlayer = false, CanTargetSafeZonePlayer = false, Prefab = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_heavy.prefab", WeaponsParameters = new Dictionary<string, DefaultSettings> {
["rifle.bolt"]
= new DefaultSettings {
EffectiveRange = 150f, AttackLengthMin = -1f, AttackLengthMax = -1f
}
, ["speargun"] = new DefaultSettings {
EffectiveRange = 15f, AttackLengthMin = -1f, AttackLengthMax = -1f
}
, ["bow.compound"] = new DefaultSettings {
EffectiveRange = 15f, AttackLengthMin = -1f, AttackLengthMax = -1f
}
, ["crossbow"] = new DefaultSettings {
EffectiveRange = 15f, AttackLengthMin = -1f, AttackLengthMax = -1f
}
, ["bow.hunting"] = new DefaultSettings {
EffectiveRange = 15f, AttackLengthMin = -1f, AttackLengthMax = -1f
}
, ["smg.2"] = new DefaultSettings {
EffectiveRange = 20f, AttackLengthMin = 0.4f, AttackLengthMax = 0.4f
}
, ["shotgun.double"] = new DefaultSettings {
EffectiveRange = 10f, AttackLengthMin = 0.3f, AttackLengthMax = 1f
}
, ["pistol.eoka"] = new DefaultSettings {
EffectiveRange = 10f, AttackLengthMin = -1f, AttackLengthMax = -1f
}
, ["rifle.l96"] = new DefaultSettings {
EffectiveRange = 150f, AttackLengthMin = -1f, AttackLengthMax = -1f
}
, ["pistol.nailgun"] = new DefaultSettings {
EffectiveRange = 15f, AttackLengthMin = 0f, AttackLengthMax = 0.46f
}
, ["pistol.python"] = new DefaultSettings {
EffectiveRange = 15f, AttackLengthMin = 0.175f, AttackLengthMax = 0.525f
}
, ["pistol.semiauto"] = new DefaultSettings {
EffectiveRange = 15f, AttackLengthMin = 0f, AttackLengthMax = 0.46f
}
, ["pistol.prototype17"] = new DefaultSettings {
EffectiveRange = 15f, AttackLengthMin = 0f, AttackLengthMax = 0.46f
}
, ["smg.thompson"] = new DefaultSettings {
EffectiveRange = 20f, AttackLengthMin = 0.4f, AttackLengthMax = 0.4f
}
, ["shotgun.waterpipe"] = new DefaultSettings {
EffectiveRange = 10f, AttackLengthMin = -1f, AttackLengthMax = -1f
}
, ["multiplegrenadelauncher"] = new DefaultSettings {
EffectiveRange = 20f, AttackLengthMin = -1f, AttackLengthMax = -1f
}
, ["snowballgun"] = new DefaultSettings {
EffectiveRange = 5f, AttackLengthMin = 2f, AttackLengthMax = 2f
}
, ["legacy bow"] = new DefaultSettings {
EffectiveRange = 15f, AttackLengthMin = -1f, AttackLengthMax = -1f
}
, ["blunderbuss"] = new DefaultSettings {
EffectiveRange = 10f, AttackLengthMin = 0.3f, AttackLengthMax = 1f
}
, ["revolver.hc"] = new DefaultSettings {
EffectiveRange = 20f, AttackLengthMin = 0.4f, AttackLengthMax = 0.4f
}
, ["t1_smg"] = new DefaultSettings {
EffectiveRange = 20f, AttackLengthMin = 0.4f, AttackLengthMax = 0.4f
}
, ["minicrossbow"] = new DefaultSettings {
EffectiveRange = 15f, AttackLengthMin = -1f, AttackLengthMax = -1f
}
, ["blowpipe"] = new DefaultSettings {
EffectiveRange = 15f, AttackLengthMin = -1f, AttackLengthMax = -1f
}
}
, Weapons = new Dictionary<int, HashSet<string>> {
[0]
= new HashSet<string> {
"bone.club", "knife.bone", "knife.butcher", "candycaneclub", "knife.combat", "longsword", "mace", "machete", "paddle", "pitchfork", "salvaged.cleaver", "salvaged.sword", "spear.stone", "spear.wooden", "chainsaw", "hatchet", "jackhammer", "pickaxe", "axe.salvaged", "hammer.salvaged", "icepick.salvaged", "stonehatchet", "stone.pickaxe", "torch", "sickle", "rock", "snowball", "mace.baseballbat", "concretepickaxe", "concretehatchet", "lumberjack.hatchet", "lumberjack.pickaxe", "diverhatchet", "diverpickaxe", "divertorch", "knife.skinning", "vampire.stake", "shovel", "spear.cny", "frontier_hatchet", "boomerang"
}
, [1] = new HashSet<string> {
"speargun", "bow.compound", "crossbow", "bow.hunting", "shotgun.double", "pistol.eoka", "flamethrower", "pistol.m92", "pistol.nailgun", "multiplegrenadelauncher", "shotgun.pump", "pistol.python", "pistol.revolver", "pistol.semiauto", "pistol.prototype17", "snowballgun", "shotgun.spas12", "shotgun.waterpipe", "shotgun.m4", "legacy bow", "military flamethrower", "blunderbuss", "minicrossbow", "blowpipe"
}
, [2] = new HashSet<string> {
"smg.2", "smg.mp5", "rifle.semiauto", "smg.thompson", "rifle.sks", "revolver.hc", "t1_smg"
}
, [3] = new HashSet<string> {
"rifle.ak", "rifle.lr300", "lmg.m249", "rifle.m39", "hmlmg", "rifle.ak.ice", "rifle.ak.diver", "minigun", "rifle.ak.med"
}
, [4] = new HashSet<string> {
"rifle.bolt", "rifle.l96"
}
}
, PluginVersion = new VersionNumber(2, 8, 4)
}
;
string path = Path.Combine(Interface.Oxide.ConfigDirectory, "NpcSpawn.json");
string oldPath = Path.Combine(Interface.Oxide.ConfigDirectory, "NpcSpawn_old.json");
Directory.Move(path, oldPath);
}
#endregion Old NpcSpawn Config
#region New NpcSpawn Config
public class ConfigNewNpcSpawn {
[JsonProperty(En ? "Delay after plugin startup before random positions are generated in biomes" : "Задержка после запуска плагина, по истечении которой будут генерироваться случайные позиции в биомах")]
public float GeneratePositionDelay {
get;
set;
}
[JsonProperty(En ? "Weapons with custom NPC parameters" : "Список оружия, у которого нет значений стандартных параметров для использования NPC")]
public Dictionary<string, DefaultSettings> WeaponsParameters {
get;
set;
}
[JsonProperty(En ? "NPC Weapons by Distance Category" : "Список оружия для использования NPC по категориям в зависимости от расстояния до цели")]
public Dictionary<int, HashSet<string>> Weapons {
get;
set;
}
[JsonProperty(En ? "Configuration version" : "Версия конфигурации")]
public VersionNumber PluginVersion {
get;
set;
}
}
public ConfigNewNpcSpawn CfgNewNpcSpawn {
get;
set;
}
= null;
private void GenerateAndSaveConfigNewNpcSpawn() {
CfgNewNpcSpawn = new ConfigNewNpcSpawn {
GeneratePositionDelay = 5f, WeaponsParameters = CfgOldNpcSpawn.WeaponsParameters, Weapons = CfgOldNpcSpawn.Weapons, PluginVersion = new VersionNumber(3, 0, 0)
}
;
WriteConfigFile<ConfigNewNpcSpawn>("NpcSpawn.json", CfgNewNpcSpawn);
}
#endregion New NpcSpawn Config
#region Helpers
public class DefaultSettings {
[JsonProperty(En ? "Effective Range" : "Дальность прицельной стрельбы")]
public float EffectiveRange {
get;
set;
}
[JsonProperty(En ? "Minimum Attack Duration" : "Минимальная продолжительность стрельбы")]
public float AttackLengthMin {
get;
set;
}
[JsonProperty(En ? "Maximum Attack Duration" : "Максимальная продолжительность стрельбы")]
public float AttackLengthMax {
get;
set;
}
}
private static T ReadConfigFile<T>(string fileName) {
string path = Path.Combine(Interface.Oxide.ConfigDirectory, fileName);
if (File.Exists(path)) {
string json = File.ReadAllText(path);
return JsonConvert.DeserializeObject<T>(json);
}
else return default(T);
}
private static void WriteConfigFile<T>(string fileName, T config) {
string path = Path.Combine(Interface.Oxide.ConfigDirectory, fileName);
string json = JsonConvert.SerializeObject(config, Formatting.Indented);
File.WriteAllText(path, json);
}
private static void DeletePluginFile(string fileName) {
string path = Path.Combine(Interface.Oxide.PluginDirectory, fileName);
if (File.Exists(path)) File.Delete(path);
}
#endregion Helpers
#region Oxide Hooks
private void OnServerInitialized() {
DeletePluginFile("NpcSpawn.cs");
ReadAndRenameConfigOldNpcSpawn();
GenerateAndSaveConfigNewNpcSpawn();
DeletePluginFile("UpdaterNpcSpawn.cs");
}
#endregion Oxide Hooks
}
}