Decompiled source of Spawner Tweaks v1.29.0
SpawnerTweaks.dll
Decompiled 2 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Cryptography; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using JetBrains.Annotations; using Microsoft.CodeAnalysis; using ServerSync; using Service; using TMPro; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyCompany("SpawnerTweaks")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+276c43cb865b220c304857ddb8dc73d5b629214a")] [assembly: AssemblyProduct("SpawnerTweaks")] [assembly: AssemblyTitle("SpawnerTweaks")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace Service { public class ConfigWrapper { private readonly ConfigFile ConfigFile; private readonly ConfigSync ConfigSync; private readonly Dictionary<string, Action<Terminal, string>> SettingHandlers = new Dictionary<string, Action<Terminal, string>>(); private static readonly HashSet<string> Truthies = new HashSet<string> { "1", "true", "yes", "on" }; private static readonly HashSet<string> Falsies = new HashSet<string> { "0", "false", "no", "off" }; public ConfigWrapper(string command, ConfigFile configFile, ConfigSync configSync) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown //IL_004a: Expected O, but got Unknown //IL_0045: Unknown result type (might be due to invalid IL or missing references) ConfigFile = configFile; ConfigSync = configSync; new ConsoleCommand(command, "[key] [value] - Toggles or sets a config value.", (ConsoleEvent)delegate(ConsoleEventArgs args) { if (args.Length >= 2 && SettingHandlers.TryGetValue(args[1].ToLower(), out Action<Terminal, string> value)) { if (args.Length == 2) { value(args.Context, ""); } else { value(args.Context, string.Join(" ", args.Args.Skip(2))); } } }, false, false, false, false, false, (ConsoleOptionsFetcher)(() => SettingHandlers.Keys.ToList()), false, false, false); } public ConfigEntry<bool> BindLocking(string group, string name, bool value, ConfigDescription description) { ConfigEntry<bool> val = ConfigFile.Bind<bool>(group, name, value, description); Register(val); ConfigSync.AddLockingConfigEntry<bool>(val).SynchronizedConfig = true; return val; } public ConfigEntry<bool> BindLocking(string group, string name, bool value, string description) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Expected O, but got Unknown return BindLocking(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty<object>())); } public ConfigEntry<T> Bind<T>(string group, string name, T value, ConfigDescription description, bool synchronizedSetting = true) { ConfigEntry<T> val = ConfigFile.Bind<T>(group, name, value, description); Register<T>(val); ConfigSync.AddConfigEntry<T>(val).SynchronizedConfig = synchronizedSetting; return val; } public ConfigEntry<T> Bind<T>(string group, string name, T value, string description, bool synchronizedSetting = true) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown return Bind(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty<object>()), synchronizedSetting); } private static void AddMessage(Terminal context, string message) { context.AddString(message); Player localPlayer = Player.m_localPlayer; if (localPlayer != null) { ((Character)localPlayer).Message((MessageType)1, message, 0, (Sprite)null); } } private void Register(ConfigEntry<bool> setting) { ConfigEntry<bool> setting2 = setting; string name = ((ConfigEntryBase)setting2).Definition.Key; string key = name.ToLower().Replace(' ', '_'); SettingHandlers.Add(key, delegate(Terminal terminal, string value) { Toggle(terminal, setting2, name, value); }); } private void Register<T>(ConfigEntry<T> setting) { ConfigEntry<T> setting2 = setting; string name = ((ConfigEntryBase)setting2).Definition.Key; string key = name.ToLower().Replace(' ', '_'); SettingHandlers.Add(key, delegate(Terminal terminal, string value) { SetValue<T>(terminal, setting2, name, value); }); } private static string State(bool value) { if (!value) { return "disabled"; } return "enabled"; } private static bool IsTruthy(string value) { return Truthies.Contains(value); } private static bool IsFalsy(string value) { return Falsies.Contains(value); } private static void Toggle(Terminal context, ConfigEntry<bool> setting, string name, string value) { if (value == "") { setting.Value = !setting.Value; } else if (IsTruthy(value)) { setting.Value = true; } else if (IsFalsy(value)) { setting.Value = false; } AddMessage(context, name + " " + State(setting.Value) + "."); } public static int TryParseInt(string value, int defaultValue) { if (int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var result)) { return result; } return defaultValue; } public static int TryParseInt(ConfigEntry<string> setting) { if (int.TryParse(setting.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var result)) { return result; } return TryParseInt((string)((ConfigEntryBase)setting).DefaultValue, 0); } private static float TryParseFloat(string value, float defaultValue) { if (float.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out var result)) { return result; } return defaultValue; } public static float TryParseFloat(ConfigEntry<string> setting) { if (float.TryParse(setting.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out var result)) { return result; } return TryParseFloat((string)((ConfigEntryBase)setting).DefaultValue, 0f); } private static void SetValue<T>(Terminal context, ConfigEntry<T> setting, string name, string value) { if (value == "") { AddMessage(context, $"{name}: {setting.Value}."); return; } setting.Value = (T)(object)value; AddMessage(context, name + " set to " + value + "."); } } public class Watcher { private static readonly Dictionary<string, byte[]> hashes = new Dictionary<string, byte[]>(); private static byte[] GetHash(string path) { using MD5 mD = MD5.Create(); using FileStream inputStream = File.OpenRead(path); return mD.ComputeHash(inputStream); } public static void Setup(string folder, string pattern, Action action) { Action action2 = action; FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(folder, pattern); fileSystemWatcher.Changed += delegate(object s, FileSystemEventArgs e) { byte[] hash = GetHash(e.FullPath); if (!hashes.ContainsKey(e.FullPath) || !hashes[e.FullPath].SequenceEqual(hash)) { hashes[e.FullPath] = hash; action2(); } }; fileSystemWatcher.IncludeSubdirectories = true; fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject; fileSystemWatcher.EnableRaisingEvents = true; } public static void Setup(ConfigFile config, ManualLogSource logger) { ConfigFile config2 = config; ManualLogSource logger2 = logger; string configFilePath = config2.ConfigFilePath; string directoryName = Path.GetDirectoryName(configFilePath); string fileName = Path.GetFileName(configFilePath); Setup(directoryName, fileName, delegate { if (!File.Exists(config2.ConfigFilePath)) { return; } try { logger2.LogDebug((object)"ReadConfigValues called"); config2.Reload(); } catch { logger2.LogError((object)("There was an issue loading your " + config2.ConfigFilePath)); logger2.LogError((object)"Please check your config entries for spelling and format!"); } }); } } public class DataHelper { public static ZPackage? Deserialize(string data) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Expected O, but got Unknown if (data == "") { return null; } return new ZPackage(data); } public static void InitZDO(GameObject obj, Vector3 position, Quaternion rotation, ZPackage data) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) ZNetView val = default(ZNetView); if (obj.TryGetComponent<ZNetView>(ref val)) { int stableHashCode = StringExtensionMethods.GetStableHashCode(val.GetPrefabName()); ZNetView.m_initZDO = ZDOMan.instance.CreateNewZDO(position, stableHashCode); Load(data, ZNetView.m_initZDO); ZNetView.m_initZDO.m_rotation = ((Quaternion)(ref rotation)).eulerAngles; ZNetView.m_initZDO.Type = val.m_type; ZNetView.m_initZDO.Distant = val.m_distant; ZNetView.m_initZDO.Persistent = val.m_persistent; ZNetView.m_initZDO.m_prefab = stableHashCode; ZNetView.m_initZDO.DataRevision = 1u; } } private static void Load(ZPackage pkg, ZDO zdo) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Unknown result type (might be due to invalid IL or missing references) pkg.SetPos(0); ZDOID uid = zdo.m_uid; int num = pkg.ReadInt(); if (((uint)num & (true ? 1u : 0u)) != 0) { byte b = pkg.ReadByte(); ZDOHelper.Init<float>(ZDOExtraData.s_floats, uid); for (int i = 0; i < b; i++) { ZDOExtraData.Set(uid, pkg.ReadInt(), pkg.ReadSingle()); } } if (((uint)num & 2u) != 0) { byte b2 = pkg.ReadByte(); ZDOHelper.Init<Vector3>(ZDOExtraData.s_vec3, uid); for (int j = 0; j < b2; j++) { ZDOExtraData.Set(uid, pkg.ReadInt(), pkg.ReadVector3()); } } if (((uint)num & 4u) != 0) { byte b3 = pkg.ReadByte(); ZDOHelper.Init<Quaternion>(ZDOExtraData.s_quats, uid); for (int k = 0; k < b3; k++) { ZDOExtraData.Set(uid, pkg.ReadInt(), pkg.ReadQuaternion()); } } if (((uint)num & 8u) != 0) { byte b4 = pkg.ReadByte(); ZDOHelper.Init<int>(ZDOExtraData.s_ints, uid); for (int l = 0; l < b4; l++) { ZDOExtraData.Set(uid, pkg.ReadInt(), pkg.ReadInt()); } } if (((uint)num & 0x40u) != 0) { byte b5 = pkg.ReadByte(); ZDOHelper.Init<long>(ZDOExtraData.s_longs, uid); for (int m = 0; m < b5; m++) { ZDOExtraData.Set(uid, pkg.ReadInt(), pkg.ReadLong()); } } if (((uint)num & 0x10u) != 0) { byte b6 = pkg.ReadByte(); ZDOHelper.Init<string>(ZDOExtraData.s_strings, uid); for (int n = 0; n < b6; n++) { ZDOExtraData.Set(uid, pkg.ReadInt(), pkg.ReadString()); } } if (((uint)num & 0x80u) != 0) { byte b7 = pkg.ReadByte(); ZDOHelper.Init<byte[]>(ZDOExtraData.s_byteArrays, uid); for (int num2 = 0; num2 < b7; num2++) { ZDOExtraData.Set(uid, pkg.ReadInt(), pkg.ReadByteArray()); } } } } public static class Hash { public static readonly int MaxAmount = StringExtensionMethods.GetStableHashCode("override_maximum_amount"); public static readonly int Spawn = StringExtensionMethods.GetStableHashCode("override_spawn"); public static readonly int Command = StringExtensionMethods.GetStableHashCode("override_command"); public static readonly int Biome = StringExtensionMethods.GetStableHashCode("override_biome"); public static readonly int Speed = StringExtensionMethods.GetStableHashCode("override_speed"); public static readonly int MaxCover = StringExtensionMethods.GetStableHashCode("override_maximum_cover"); public static readonly int SpawnCondition = StringExtensionMethods.GetStableHashCode("override_spawn_condition"); public static readonly int CoverOffset = StringExtensionMethods.GetStableHashCode("override_cover_offset"); public static readonly int SpawnOffset = StringExtensionMethods.GetStableHashCode("override_spawn_offset"); public static readonly int SpawnEffect = StringExtensionMethods.GetStableHashCode("override_spawn_effect"); public static readonly int TextBiome = StringExtensionMethods.GetStableHashCode("override_text_biome"); public static readonly int TextSpace = StringExtensionMethods.GetStableHashCode("override_text_space"); public static readonly int TextSleep = StringExtensionMethods.GetStableHashCode("override_text_sleep"); public static readonly int TextHappy = StringExtensionMethods.GetStableHashCode("override_text_happy"); public static readonly int TextCheck = StringExtensionMethods.GetStableHashCode("override_text_check"); public static readonly int TextExtract = StringExtensionMethods.GetStableHashCode("override_text_extract"); public static readonly int Name = StringExtensionMethods.GetStableHashCode("override_name"); public static readonly int FactionLegacy = StringExtensionMethods.GetStableHashCode("override_faction"); public static readonly int Faction = StringExtensionMethods.GetStableHashCode("faction"); public static readonly int Boss = StringExtensionMethods.GetStableHashCode("override_boss"); public static readonly int Resistances = StringExtensionMethods.GetStableHashCode("override_resistances"); public static readonly int Items = StringExtensionMethods.GetStableHashCode("override_items"); public static readonly int Attacks = StringExtensionMethods.GetStableHashCode("override_attacks"); public static readonly int Component = StringExtensionMethods.GetStableHashCode("override_component"); public static readonly int MinAmount = StringExtensionMethods.GetStableHashCode("override_minimum_amount"); public static readonly int Respawn = StringExtensionMethods.GetStableHashCode("override_respawn"); public static readonly int Changed = StringExtensionMethods.GetStableHashCode("override_changed"); public static readonly int MinLevel = StringExtensionMethods.GetStableHashCode("override_minimum_level"); public static readonly int MaxLevel = StringExtensionMethods.GetStableHashCode("override_maximum_level"); public static readonly int TriggerDistance = StringExtensionMethods.GetStableHashCode("override_trigger_distance"); public static readonly int TriggerNoise = StringExtensionMethods.GetStableHashCode("override_trigger_noise"); public static readonly int LevelChance = StringExtensionMethods.GetStableHashCode("override_level_chance"); public static readonly int Health = StringExtensionMethods.GetStableHashCode("override_health"); public static readonly int Data = StringExtensionMethods.GetStableHashCode("override_data"); public static readonly int Conversion = StringExtensionMethods.GetStableHashCode("override_conversion"); public static readonly int InputEffect = StringExtensionMethods.GetStableHashCode("override_input_effect"); public static readonly int UseEffect = StringExtensionMethods.GetStableHashCode("override_use_effect"); public static readonly int OutputEffect = StringExtensionMethods.GetStableHashCode("override_output_effect"); public static readonly int Item = StringExtensionMethods.GetStableHashCode("override_item"); public static readonly int SpawnItem = StringExtensionMethods.GetStableHashCode("override_spawn_item"); public static readonly int Amount = StringExtensionMethods.GetStableHashCode("override_amount"); public static readonly int StartEffect = StringExtensionMethods.GetStableHashCode("override_start_effect"); public static readonly int Text = StringExtensionMethods.GetStableHashCode("override_text"); public static readonly int Delay = StringExtensionMethods.GetStableHashCode("override_delay"); public static readonly int ItemOffset = StringExtensionMethods.GetStableHashCode("override_item_offset"); public static readonly int SpawnMaxY = StringExtensionMethods.GetStableHashCode("override_spawn_max_y"); public static readonly int SpawnRadius = StringExtensionMethods.GetStableHashCode("override_spawn_radius"); public static readonly int ItemStandPrefix = StringExtensionMethods.GetStableHashCode("override_item_stand_prefix"); public static readonly int ItemStandRange = StringExtensionMethods.GetStableHashCode("override_item_stand_range"); public static readonly int SpawnTime = StringExtensionMethods.GetStableHashCode("spawn_time"); public static readonly int PickableSpawn = StringExtensionMethods.GetStableHashCode("override_pickable_spawn"); public static readonly int PickableRespawn = StringExtensionMethods.GetStableHashCode("override_pickable_respawn"); public static readonly int RequiredGlobalKey = StringExtensionMethods.GetStableHashCode("override_required_globalkey"); public static readonly int ForbiddenGlobalKey = StringExtensionMethods.GetStableHashCode("override_forbidden_globalkey"); public static readonly int MaxFuel = StringExtensionMethods.GetStableHashCode("override_maximum_fuel"); public static readonly int Fuel = StringExtensionMethods.GetStableHashCode("override_fuel"); public static readonly int FuelUsage = StringExtensionMethods.GetStableHashCode("override_fuel_usage"); public static readonly int FuelEffect = StringExtensionMethods.GetStableHashCode("override_fuel_effect"); public static readonly int SpawnAreaSpawn = StringExtensionMethods.GetStableHashCode("override_spawnarea_spawn"); public static readonly int SpawnAreaRespawn = StringExtensionMethods.GetStableHashCode("override_spawnarea_respawn"); public static readonly int MaxNear = StringExtensionMethods.GetStableHashCode("override_max_near"); public static readonly int MaxTotal = StringExtensionMethods.GetStableHashCode("override_max_total"); public static readonly int NearRadius = StringExtensionMethods.GetStableHashCode("override_near_radius"); public static readonly int FarRadius = StringExtensionMethods.GetStableHashCode("override_far_radius"); } public class Helper { public static float Float(string arg, float defaultValue) { if (!float.TryParse(arg, NumberStyles.Float, CultureInfo.InvariantCulture, out var result)) { return defaultValue; } return result; } public static float? Float(string arg) { if (!float.TryParse(arg, NumberStyles.Float, CultureInfo.InvariantCulture, out var result)) { return null; } return result; } public static int Int(string arg, int defaultValue) { if (!int.TryParse(arg, NumberStyles.Integer, CultureInfo.InvariantCulture, out var result)) { return defaultValue; } return result; } public static int? Int(string arg) { if (!int.TryParse(arg, NumberStyles.Integer, CultureInfo.InvariantCulture, out var result)) { return null; } return result; } public static GameObject? GetPrefab(string hashStr) { if (int.TryParse(hashStr, out var result)) { return GetPrefab(result); } return GetPrefab(StringExtensionMethods.GetStableHashCode(hashStr)); } public static ItemDrop? GetItem(string hashStr) { if (int.TryParse(hashStr, out var result)) { return GetItem(result); } return GetItem(StringExtensionMethods.GetStableHashCode(hashStr)); } public static ItemDrop? GetItem(int hash) { GameObject? prefab = GetPrefab(hash); if (prefab == null) { return null; } return prefab.GetComponent<ItemDrop>(); } public static GameObject? GetAttack(string hashStr) { if (int.TryParse(hashStr, out var result)) { return GetAttack(result); } return GetAttack(StringExtensionMethods.GetStableHashCode(hashStr)); } public static GameObject GetAttack(int hash) { return ObjectDB.instance.GetItemPrefab(hash); } public static GameObject? GetPrefab(int hash) { if (hash == 0) { return null; } GameObject prefab = ZNetScene.instance.GetPrefab(hash); if (!Object.op_Implicit((Object)(object)prefab)) { return null; } return prefab; } public static EffectData? ParseEffect(string data) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown string[] array = data.Split(new char[1] { ',' }); EffectData val = new EffectData { m_prefab = GetPrefab(array[0]) }; if ((Object)(object)val.m_prefab == (Object)null) { return null; } if (array.Length > 1 && int.TryParse(array[1], out var result)) { val.m_randomRotation = (result & 1) > 0; val.m_inheritParentRotation = (result & 2) > 0; val.m_scale = (result & 4) > 0; val.m_inheritParentScale = (result & 8) > 0; val.m_attach = (result & 0x10) > 0; } if (array.Length > 2 && int.TryParse(array[2], out var result2)) { val.m_variant = result2; } if (array.Length > 3) { val.m_childTransform = array[3]; } return val; } public static DamageModifiers ParseDamageModifiers(string data) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Invalid comparison between Unknown and I4 //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Invalid comparison between Unknown and I4 //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Invalid comparison between Unknown and I4 //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Invalid comparison between Unknown and I4 //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Invalid comparison between Unknown and I4 //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Invalid comparison between Unknown and I4 //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Invalid comparison between Unknown and I4 //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Invalid comparison between Unknown and I4 //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Invalid comparison between Unknown and I4 //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) DamageModifiers result = default(DamageModifiers); string[] array = data.Split(new char[1] { '|' }); for (int i = 0; i < array.Length; i++) { string[] array2 = array[i].Split(new char[1] { ',' }); if (array2.Length >= 2) { DamageType val = (DamageType)Int(array2[0], 0); DamageModifier val2 = (DamageModifier)Int(array2[1], 0); if ((int)val == 1) { result.m_blunt = val2; } if ((int)val == 8) { result.m_chop = val2; } if ((int)val == 32) { result.m_fire = val2; } if ((int)val == 64) { result.m_frost = val2; } if ((int)val == 128) { result.m_lightning = val2; } if ((int)val == 16) { result.m_pickaxe = val2; } if ((int)val == 4) { result.m_pierce = val2; } if ((int)val == 256) { result.m_poison = val2; } if ((int)val == 2) { result.m_slash = val2; } if ((int)val == 512) { result.m_spirit = val2; } } } return result; } public static EffectList ParseEffects(string data) { //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Expected O, but got Unknown IEnumerable<EffectData> source = from effect in data.Split(new char[1] { '|' }) select ParseEffect(effect) into effect where effect != null select effect; return new EffectList { m_effectPrefabs = source.ToArray() }; } public static ItemConversion? ParseSmelterConversion(string data) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown string[] array = data.Split(new char[1] { ',' }); if (array.Length != 2) { return null; } return new ItemConversion { m_from = GetItem(array[0]), m_to = GetItem(array[1]) }; } public static ItemConversion? ParseFermenterConversion(string data) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown string[] array = data.Split(new char[1] { ',' }); if (array.Length < 2) { return null; } return new ItemConversion { m_from = GetItem(array[0]), m_to = GetItem(array[1]), m_producedItems = ((array.Length <= 2) ? 1 : Int(array[2], 1)) }; } public static List<ItemConversion> ParseSmelterConversions(string data) { return (from conversion in data.Split(new char[1] { '|' }) select ParseSmelterConversion(conversion) into conversion where conversion != null select conversion).ToList(); } public static List<ItemConversion> ParseFermenterConversions(string data) { return (from conversion in data.Split(new char[1] { '|' }) select ParseFermenterConversion(conversion) into conversion where conversion != null select conversion).ToList(); } public static SpawnData? ParseSpawnData(string data) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown string[] array = data.Split(new char[1] { ',' }); SpawnData val = new SpawnData { m_prefab = GetPrefab(array[0]) }; if ((Object)(object)val.m_prefab == (Object)null) { return null; } val.m_weight = 1f; val.m_minLevel = 1; val.m_maxLevel = 1; if (array.Length > 1) { val.m_weight = Float(array[1], 1f); } if (array.Length > 2) { val.m_minLevel = Int(array[2], 1); val.m_maxLevel = Int(array[2], 1); } if (array.Length > 3) { val.m_maxLevel = Int(array[3], 1); } return val; } public static List<SpawnData> ParseSpawnsData(string data) { return (from spawn in data.Split(new char[1] { '|' }) select ParseSpawnData(spawn) into spawn where spawn != null select spawn).ToList(); } public static DropData ParseDropData(string data) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) string[] array = data.Split(new char[1] { ',' }); DropData val = default(DropData); val.m_item = GetPrefab(array[0]); val.m_weight = 1f; val.m_stackMin = 1; val.m_stackMax = 1; DropData result = val; if (array.Length > 1) { result.m_weight = Float(array[1], 1f); } if (array.Length > 2) { result.m_stackMin = Int(array[2], 1); result.m_stackMax = Int(array[2], 1); } if (array.Length > 3) { result.m_stackMax = Int(array[3], 1); } return result; } public static Drop ParseCharacterDropData(string data) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Expected O, but got Unknown string[] array = data.Split(new char[1] { ',' }); Drop val = new Drop { m_prefab = GetPrefab(array[0]), m_chance = 1f, m_amountMin = 1, m_amountMax = 1 }; if (array.Length > 1) { val.m_chance = Float(array[1], 1f); } if (array.Length > 2) { val.m_amountMin = Int(array[2], 1); val.m_amountMax = Int(array[2], 1) + 1; } if (array.Length > 3) { val.m_amountMax = Int(array[3], 1) + 1; } if (array.Length > 4) { val.m_levelMultiplier = (Int(array[4], 0) & 1) > 0; val.m_onePerPlayer = (Int(array[4], 0) & 2) > 0; } return val; } public static List<DropData> ParseDropsData(string data) { return (from drop in data.Split(new char[1] { '|' }).Select(ParseDropData) where (Object)(object)drop.m_item != (Object)null select drop).ToList(); } public static List<Drop> ParseCharacterDropsData(string data) { return (from drop in data.Split(new char[1] { '|' }).Select(ParseCharacterDropData) where (Object)(object)drop.m_prefab != (Object)null select drop).ToList(); } public static ItemSet ParseItemSet(string data) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown ItemSet val = new ItemSet(); val.m_name = ""; val.m_items = (from item in data.Split(new char[1] { ',' }).Select(GetAttack) where Object.op_Implicit((Object)(object)item) select item).ToArray(); return val; } public static ItemSet[] ParseCharacterItemSets(string data) { return (from set in data.Split(new char[1] { '|' }).Select(ParseItemSet) where set.m_items.Length != 0 select set).ToArray(); } public static bool Float(ZNetView view, int hash, Action<float> action) { if ((Object)(object)view == (Object)null || !view.IsValid()) { return false; } float @float = view.GetZDO().GetFloat(hash, 0f); if (@float == 0f) { return false; } action(@float); return true; } public static void Float(ZNetView view, int hash, int legagyHash, Action<float> action) { if (!Float(view, hash, action)) { Float(view, legagyHash, action); } } public static void Long(ZNetView view, int hash, Action<long> action) { if (!((Object)(object)view == (Object)null) && view.IsValid()) { long @long = view.GetZDO().GetLong(hash, 0L); if (@long != 0L) { action(@long); } } } public static void Int(ZNetView view, int hash, Action<int> action) { if (!((Object)(object)view == (Object)null) && view.IsValid()) { int @int = view.GetZDO().GetInt(hash, 0); if (@int != 0) { action(@int); } } } public static void Bool(ZNetView view, int hash, Action action) { if (!((Object)(object)view == (Object)null) && view.IsValid() && view.GetZDO().GetBool(hash, false)) { action(); } } public static bool String(ZNetView view, int hash, Action<string> action) { if ((Object)(object)view == (Object)null || !view.IsValid()) { return false; } string @string = view.GetZDO().GetString(hash, ""); if (@string == "") { return false; } action(@string); return true; } public static bool HashList(ZNetView view, int hash, Action<int[]> action) { if ((Object)(object)view == (Object)null || !view.IsValid()) { return false; } string @string = view.GetZDO().GetString(hash, ""); if (@string == "") { return false; } int[] obj = (from s in @string.Split(new char[1] { ',' }) select StringExtensionMethods.GetStableHashCode(s)).ToArray(); action(obj); return true; } public static void String(ZNetView view, int hash, int legacyHash, Action<string> action) { if (!String(view, hash, action)) { String(view, legacyHash, action); } } public static bool Prefab(ZNetView view, int hash, Action<GameObject> action) { if ((Object)(object)view == (Object)null || !view.IsValid()) { return false; } int num = view.GetZDO().GetInt(hash, 0); if (num == 0) { num = StringExtensionMethods.GetStableHashCode(view.GetZDO().GetString(hash, "")); } GameObject prefab = GetPrefab(num); if ((Object)(object)prefab == (Object)null) { return false; } action(prefab); return true; } public static void Prefab(ZNetView view, int hash, int legacyHash, Action<GameObject> action) { if (!Prefab(view, hash, action)) { Prefab(view, legacyHash, action); } } public static void Item(ZNetView view, int hash, Action<ItemDrop> action) { if (!((Object)(object)view == (Object)null) && view.IsValid()) { int num = view.GetZDO().GetInt(hash, 0); if (num == 0) { num = StringExtensionMethods.GetStableHashCode(view.GetZDO().GetString(hash, "")); } ItemDrop item = GetItem(num); if (!((Object)(object)item == (Object)null)) { action(item); } } } public static void Offset(ZNetView view, int hash, Transform initial, Action<Transform> action) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) Transform initial2 = initial; if (!Object.op_Implicit((Object)(object)initial2)) { GameObject val = new GameObject(); val.transform.parent = ((Component)view).transform; val.transform.localPosition = Vector3.zero; val.transform.localRotation = Quaternion.identity; initial2 = val.transform; } String(view, hash, delegate(string value) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) string[] array = value.Split(new char[1] { ',' }); Vector3 localPosition = initial2.localPosition; localPosition.x = Float(array[0], localPosition.x); if (array.Length > 1) { localPosition.z = Float(array[1], localPosition.z); } if (array.Length > 2) { localPosition.y = Float(array[2], localPosition.y); } initial2.localPosition = localPosition; }); action(initial2); } public static int RollLevel(int min, int max, float chance) { int i; for (i = min; i < max; i++) { if (!(Random.Range(0f, 100f) <= chance)) { break; } } return i; } public static bool Owner(ZNetView view) { if (Object.op_Implicit((Object)(object)view) && view.IsValid()) { return view.IsOwner(); } return false; } } } namespace SpawnerTweaks { [HarmonyPatch(typeof(Beehive))] public class BeehivePatches { [HarmonyPatch("Awake")] [HarmonyPostfix] private static void Setup(Beehive __instance) { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Expected O, but got Unknown if (!Configuration.configBeehive.Value) { return; } Beehive obj = __instance; ZNetView nview = obj.m_nview; if (Object.op_Implicit((Object)(object)nview) && nview.IsValid()) { if (!Object.op_Implicit((Object)(object)__instance.m_beeEffect)) { __instance.m_beeEffect = new GameObject(); } Helper.Int(nview, Hash.MaxAmount, delegate(int value) { obj.m_maxHoney = value; }); Helper.Int(nview, Hash.Biome, delegate(int value) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) obj.m_biome = (Biome)value; }); Helper.Int(nview, Hash.SpawnCondition, delegate(int value) { obj.m_effectOnlyInDaylight = value != 1; }); Helper.Item(nview, Hash.Spawn, delegate(ItemDrop value) { obj.m_honeyItem = value; }); Helper.Float(nview, Hash.Speed, delegate(float value) { obj.m_secPerUnit = value; }); Helper.Float(nview, Hash.MaxCover, delegate(float value) { obj.m_maxCover = value; }); Helper.Offset(nview, Hash.CoverOffset, obj.m_coverPoint, delegate(Transform value) { obj.m_coverPoint = value; }); Helper.Offset(nview, Hash.SpawnOffset, obj.m_spawnPoint, delegate(Transform value) { obj.m_spawnPoint = value; }); Helper.String(nview, Hash.TextBiome, delegate(string value) { obj.m_areaText = value; }); Helper.String(nview, Hash.TextSpace, delegate(string value) { obj.m_freespaceText = value; }); Helper.String(nview, Hash.TextSleep, delegate(string value) { obj.m_sleepText = value; }); Helper.String(nview, Hash.TextHappy, delegate(string value) { obj.m_happyText = value; }); Helper.String(nview, Hash.TextCheck, delegate(string value) { obj.m_checkText = value; }); Helper.String(nview, Hash.TextExtract, delegate(string value) { obj.m_extractText = value; }); Helper.String(nview, Hash.Name, delegate(string value) { obj.m_name = value; }); } } } [HarmonyPatch(typeof(Character))] public class CharacterPatches { [HarmonyPatch("Awake")] [HarmonyPostfix] private static void Setup(Character __instance) { Character __instance2 = __instance; if (!Configuration.configCharacter.Value) { return; } Helper.String(__instance2.m_nview, Hash.Faction, Hash.FactionLegacy, delegate(string value) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) if (Enum.TryParse<Faction>(value, ignoreCase: true, out Faction result)) { __instance2.m_faction = result; } }); Helper.Int(__instance2.m_nview, Hash.Boss, delegate(int value) { __instance2.m_boss = value > 0; }); Helper.String(__instance2.m_nview, Hash.Name, delegate(string value) { __instance2.m_name = value; }); Helper.String(__instance2.m_nview, Hash.Resistances, delegate(string value) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) __instance2.m_damageModifiers = Helper.ParseDamageModifiers(value); }); CharacterDrop drop = default(CharacterDrop); if (((Component)__instance2).TryGetComponent<CharacterDrop>(ref drop)) { Helper.String(__instance2.m_nview, Hash.Items, delegate(string value) { drop.m_drops = Helper.ParseCharacterDropsData(value); }); } Humanoid humanoid = default(Humanoid); if (!((Component)__instance2).TryGetComponent<Humanoid>(ref humanoid)) { return; } Helper.String(__instance2.m_nview, Hash.Attacks, delegate(string value) { ItemSet[] array = Helper.ParseCharacterItemSets(value); if (array.Length != 0) { humanoid.m_randomWeapon = (GameObject[])(object)new GameObject[0]; humanoid.m_randomShield = (GameObject[])(object)new GameObject[0]; ((Terminal)Console.instance).AddString($"SpawnerTweaks: {__instance2.m_name} has {array.Length} item sets"); if (array.Length == 1) { humanoid.m_randomSets = (ItemSet[])(object)new ItemSet[0]; humanoid.m_defaultItems = array[0].m_items; } else { humanoid.m_randomSets = array; humanoid.m_defaultItems = (GameObject[])(object)new GameObject[0]; } } }); } [HarmonyPatch("Awake")] [HarmonyTranspiler] private static IEnumerable<CodeInstruction> DisableMaxHealthSetup(IEnumerable<CodeInstruction> instructions) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Call, (object)AccessTools.Method(typeof(Character), "SetupMaxHealth", (Type[])null, (Type[])null), (string)null) }).Set(OpCodes.Call, Transpilers.EmitDelegate<Action<Character>>((Action<Character>)delegate { }).operand).InstructionEnumeration(); } } [HarmonyPatch(typeof(ZNetView))] public class ComponentPatches { private static void AddComponent<T>(ZNetView view) where T : MonoBehaviour { Interactable component = ((Component)view).GetComponent<Interactable>(); Object.Destroy((Object)(object)((component is MonoBehaviour) ? component : null)); ((Component)view).gameObject.AddComponent<T>(); } private static void HandleComponent(ZNetView view) { string text = view.GetZDO().GetString(Hash.Component, "").ToLower(); if (text == "") { return; } string[] array = text.Split(new char[1] { ',' }); foreach (string obj in array) { if (obj == "altar" && !Object.op_Implicit((Object)(object)((Component)view).gameObject.GetComponent<OfferingBowl>())) { AddComponent<OfferingBowl>(view); } if (obj == "pickable" && !Object.op_Implicit((Object)(object)((Component)view).gameObject.GetComponent<Pickable>())) { AddComponent<Pickable>(view); } if (obj == "spawnpoint" && !Object.op_Implicit((Object)(object)((Component)view).gameObject.GetComponent<CreatureSpawner>())) { ((Component)view).gameObject.AddComponent<CreatureSpawner>(); } if (obj == "spawner" && !Object.op_Implicit((Object)(object)((Component)view).gameObject.GetComponent<SpawnArea>())) { ((Component)view).gameObject.AddComponent<SpawnArea>(); } if (obj == "chest" && !Object.op_Implicit((Object)(object)((Component)view).gameObject.GetComponent<Container>())) { AddComponent<Container>(view); } if (obj == "itemstand" && !Object.op_Implicit((Object)(object)((Component)view).gameObject.GetComponent<ItemStand>())) { AddComponent<ItemStand>(view); } if (obj == "beehive" && !Object.op_Implicit((Object)(object)((Component)view).gameObject.GetComponent<Beehive>())) { AddComponent<Beehive>(view); } } } [HarmonyPatch("Awake")] [HarmonyPostfix] private static void Setup(ZNetView __instance) { if (Configuration.configComponent.Value && Object.op_Implicit((Object)(object)__instance) && __instance.IsValid()) { HandleComponent(__instance); } } } public class Configuration { public static ConfigEntry<bool> configOfferingBowl; public static ConfigEntry<bool> configComponent; public static ConfigEntry<bool> configPickable; public static ConfigEntry<bool> configContainer; public static ConfigEntry<bool> configItemStand; public static ConfigEntry<bool> configSpawnArea; public static ConfigEntry<bool> configCharacter; public static ConfigEntry<bool> configCreatureSpawner; public static ConfigEntry<bool> configSmelter; public static ConfigEntry<bool> configBeehive; public static ConfigEntry<bool> configFermenter; public static ConfigEntry<bool> configNoCreatureSpawnerSuppression; public static ConfigEntry<bool> configNoCreatureRespawnerSuppression; public static void Init(ConfigWrapper wrapper) { string group = "1. General"; configNoCreatureSpawnerSuppression = wrapper.Bind(group, "No spawn point suppression (one time)", value: false, "One time spawn points can't be suppressed with player base (even when configured to respawn)."); configNoCreatureSpawnerSuppression.SettingChanged += delegate { NoSuppression.Update(); }; configNoCreatureRespawnerSuppression = wrapper.Bind(group, "No spawn point suppression (respawning)", value: false, "Respawning spawn points can't be suppressed with player base (even when configured to one time)."); configNoCreatureRespawnerSuppression.SettingChanged += delegate { NoSuppression.Update(); }; configCreatureSpawner = wrapper.Bind(group, "Spawn points", value: true, "Spawn point properties can be overridden."); configSmelter = wrapper.Bind(group, "Smelters", value: true, "Smelter properties can be overridden."); configBeehive = wrapper.Bind(group, "Beehives", value: true, "Beehive properties can be overridden."); configFermenter = wrapper.Bind(group, "Fermenters", value: true, "Fermenter properties can be overridden."); configComponent = wrapper.Bind(group, "Components", value: true, "Altars, pickables, spawners, etc. can be attached to any object."); configPickable = wrapper.Bind(group, "Pickables", value: true, "Pickable properties can be overridden."); configCharacter = wrapper.Bind(group, "Creatures", value: true, "Creature properties can be overridden."); configContainer = wrapper.Bind(group, "Chests", value: true, "Chest properties can be overridden."); configItemStand = wrapper.Bind(group, "Item stands", value: true, "Item stand properties can be overridden."); configSpawnArea = wrapper.Bind(group, "Spawners", value: true, "Spawner properties can be overridden."); configOfferingBowl = wrapper.Bind(group, "Boss altars", value: true, "Boss altar properties can be overridden."); } } [HarmonyPatch(typeof(Container))] public class ContainerPatches { [HarmonyPatch("Awake")] [HarmonyPostfix] private static void Setup(Container __instance) { Container __instance2 = __instance; if (Configuration.configContainer.Value) { Helper.String(__instance2.m_nview, Hash.Name, delegate(string value) { __instance2.m_name = value; }); } } [HarmonyPatch("AddDefaultItems")] [HarmonyPrefix] private static void ReplaceDefaultItems(Container __instance) { if (Configuration.configContainer.Value) { Container obj = __instance; Helper.Int(obj.m_nview, Hash.MinAmount, delegate(int value) { obj.m_defaultItems.m_dropMin = value; }); Helper.Int(obj.m_nview, Hash.MaxAmount, delegate(int value) { obj.m_defaultItems.m_dropMax = value; }); Helper.String(obj.m_nview, Hash.Items, delegate(string value) { obj.m_defaultItems.m_drops = Helper.ParseDropsData(value); obj.m_defaultItems.m_oneOfEach = true; }); } } [HarmonyPatch("CheckForChanges")] [HarmonyPostfix] private static void RespawnItems(Container __instance) { if (!Configuration.configContainer.Value) { return; } Container obj = __instance; if (!Helper.Owner(__instance.m_nview)) { return; } bool respawnContents = false; Helper.Float(obj.m_nview, Hash.Respawn, delegate(float respawn) { respawnContents = true; Helper.Long(obj.m_nview, Hash.Changed, delegate(long changed) { DateTime dateTime = new DateTime(changed); respawnContents = (ZNet.instance.GetTime() - dateTime).TotalMinutes >= (double)respawn; }); }); if (respawnContents) { ZDO zDO = obj.m_nview.GetZDO(); int changed2 = Hash.Changed; DateTime maxValue = DateTime.MaxValue; zDO.Set(changed2, maxValue.Ticks / 2); obj.m_nview.GetZDO().Set(ZDOVars.s_addedDefaultItems, false); obj.m_inventory.RemoveAll(); obj.AddDefaultItems(); obj.m_nview.GetZDO().Set(ZDOVars.s_addedDefaultItems, true); } } [HarmonyPatch("OnContainerChanged")] [HarmonyPostfix] private static void TriggerRespawn(Container __instance) { Container __instance2 = __instance; if (__instance2.m_loading || !Configuration.configContainer.Value) { return; } Helper.Bool(__instance2.m_nview, ZDOVars.s_addedDefaultItems, delegate { Helper.Float(__instance2.m_nview, Hash.Respawn, delegate { __instance2.m_nview.GetZDO().Set(Hash.Changed, ZNet.instance.GetTime().Ticks); }); }); } } [HarmonyPatch(typeof(CreatureSpawner))] public class CreatureSpawnerPatches { private static ZPackage? SpawnData; [HarmonyPatch("Awake")] [HarmonyPostfix] [HarmonyPriority(300)] private static void Setup(CreatureSpawner __instance) { if (!Configuration.configCreatureSpawner.Value) { return; } CreatureSpawner obj = __instance; ZNetView nview = obj.m_nview; if (!Object.op_Implicit((Object)(object)nview) || !nview.IsValid()) { return; } Helper.Float(nview, Hash.Respawn, delegate(float value) { obj.m_respawnTimeMinuts = value; }); Helper.Prefab(nview, Hash.Spawn, delegate(GameObject value) { obj.m_creaturePrefab = value; }); Helper.Int(nview, Hash.MaxLevel, delegate(int value) { obj.m_maxLevel = value; }); Helper.Int(nview, Hash.MinLevel, delegate(int value) { obj.m_minLevel = value; }); Helper.Int(nview, Hash.SpawnCondition, delegate(int value) { obj.m_spawnAtNight = true; obj.m_spawnAtDay = true; if (value == 1) { obj.m_spawnAtNight = false; } if (value == 2) { obj.m_spawnAtDay = false; } }); Helper.Float(nview, Hash.TriggerDistance, delegate(float value) { obj.m_triggerDistance = value; }); Helper.Float(nview, Hash.TriggerNoise, delegate(float value) { obj.m_triggerNoise = value; }); Helper.Float(nview, Hash.LevelChance, delegate(float value) { obj.m_levelupChance = value; }); Helper.String(nview, Hash.SpawnEffect, delegate(string value) { obj.m_spawnEffects = Helper.ParseEffects(value); }); } [HarmonyPatch("Spawn")] [HarmonyPrefix] private static void GetValues(CreatureSpawner __instance) { SpawnData = null; Helper.String(__instance.m_nview, Hash.Data, delegate(string value) { SpawnData = DataHelper.Deserialize(value); }); } [HarmonyPatch("Spawn")] [HarmonyPostfix] private static void SetupSpawn(CreatureSpawner __instance, ZNetView __result) { if (!Configuration.configCreatureSpawner.Value || !Object.op_Implicit((Object)(object)__result)) { return; } Character obj = ((Component)__result).GetComponent<Character>(); if (!Object.op_Implicit((Object)(object)obj)) { return; } OverrideLevel(__instance, obj); ZNetView nview = __instance.m_nview; Helper.Float(nview, Hash.Health, (Action<float>)obj.SetMaxHealth); Helper.String(nview, Hash.Faction, Hash.FactionLegacy, delegate(string value) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) obj.m_nview.GetZDO().Set(Hash.Faction, value); if (Enum.TryParse<Faction>(value, ignoreCase: true, out Faction result)) { obj.m_faction = result; } }); } private static void OverrideLevel(CreatureSpawner spawner, Character obj) { ZNetView nview = spawner.m_nview; bool setupLevel = false; Helper.Int(nview, Hash.MaxLevel, delegate { setupLevel = true; }); if (!setupLevel) { Helper.Int(nview, Hash.MinLevel, delegate { setupLevel = true; }); } if (!setupLevel) { Helper.Float(nview, Hash.LevelChance, delegate { setupLevel = true; }); } if (setupLevel) { obj.SetLevel(Helper.RollLevel(spawner.m_minLevel, spawner.m_maxLevel, spawner.m_levelupChance)); } } private static GameObject Instantiate(GameObject prefab, Vector3 position, Quaternion rotation) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) if (SpawnData != null) { DataHelper.InitZDO(prefab, position, rotation, SpawnData); } return Object.Instantiate<GameObject>(prefab, position, rotation); } [HarmonyPatch("Spawn")] [HarmonyTranspiler] private static IEnumerable<CodeInstruction> SetupData(IEnumerable<CodeInstruction> instructions) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Expected O, but got Unknown return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(CreatureSpawner), "m_creaturePrefab"), (string)null) }).Advance(3).Set(OpCodes.Call, Transpilers.EmitDelegate<Func<GameObject, Vector3, Quaternion, GameObject>>((Func<GameObject, Vector3, Quaternion, GameObject>)Instantiate).operand) .InstructionEnumeration(); } } [HarmonyPatch(typeof(CreatureSpawner), "UpdateSpawner")] public class CreatureSpawnerUpdateSpawner { private static void Prefix(CreatureSpawner __instance, ref float __state) { __state = 0f; if (__instance.m_respawnTimeMinuts != 0f && __instance.m_nview.GetZDO().GetConnection() == null) { __state = __instance.m_respawnTimeMinuts; __instance.m_respawnTimeMinuts = 0f; } } private static void Postfix(CreatureSpawner __instance, float __state) { if (__state != 0f) { __instance.m_respawnTimeMinuts = __state; } } } [HarmonyPatch(typeof(Fermenter))] public class FermenterPatches { [HarmonyPatch("Awake")] [HarmonyPostfix] private static void Setup(Fermenter __instance) { if (!Configuration.configFermenter.Value) { return; } Fermenter obj = __instance; ZNetView nview = obj.m_nview; if (Object.op_Implicit((Object)(object)nview) && nview.IsValid()) { Helper.Float(nview, Hash.Speed, delegate(float value) { obj.m_fermentationDuration = value; }); Helper.String(nview, Hash.InputEffect, delegate(string value) { obj.m_addedEffects = Helper.ParseEffects(value); }); Helper.String(nview, Hash.UseEffect, delegate(string value) { obj.m_tapEffects = Helper.ParseEffects(value); }); Helper.String(nview, Hash.OutputEffect, delegate(string value) { obj.m_spawnEffects = Helper.ParseEffects(value); }); Helper.String(nview, Hash.Conversion, delegate(string value) { obj.m_conversion = Helper.ParseFermenterConversions(value); }); } } } [HarmonyPatch(typeof(ItemStand))] public class ItemStandPatches { [HarmonyPatch("Awake")] [HarmonyPostfix] private static void Setup(ItemStand __instance) { ItemStand __instance2 = __instance; if (Configuration.configItemStand.Value) { Helper.String(__instance2.m_nview, Hash.Name, delegate(string value) { __instance2.m_name = value; }); } } [HarmonyPatch("UpdateVisual")] [HarmonyPrefix] private static void RespawnItem(ItemStand __instance) { if (!Configuration.configItemStand.Value) { return; } ItemStand obj = __instance; ZNetView view = obj.m_nview; if (!Helper.Owner(view)) { return; } bool respawnContents = false; Helper.Float(obj.m_nview, Hash.Respawn, delegate(float respawn) { respawnContents = true; Helper.Long(obj.m_nview, Hash.Changed, delegate(long changed) { DateTime dateTime = new DateTime(changed); respawnContents = (ZNet.instance.GetTime() - dateTime).TotalMinutes >= (double)respawn; }); }); if (!respawnContents) { return; } if (obj.HaveAttachment()) { obj.DropItem(); } ZDO zDO = view.GetZDO(); int changed2 = Hash.Changed; DateTime maxValue = DateTime.MaxValue; zDO.Set(changed2, maxValue.Ticks / 2); Helper.String(view, Hash.Item, delegate(string value) { string[] array = value.Split(new char[1] { ',' }); view.GetZDO().Set(ZDOVars.s_item, array[0]); if (array.Length > 1 && int.TryParse(array[1], out var result)) { view.GetZDO().Set(ZDOVars.s_variant, result, false); } else { view.GetZDO().Set(ZDOVars.s_variant, 0, false); } }); } [HarmonyPatch("DropItem")] [HarmonyPrefix] private static void TriggerRespawn(ItemStand __instance) { if (!Configuration.configItemStand.Value) { return; } ZNetView view = __instance.m_nview; if (Helper.Owner(view) && __instance.HaveAttachment()) { Helper.Float(view, Hash.Respawn, delegate { view.GetZDO().Set(Hash.Changed, ZNet.instance.GetTime().Ticks); }); } } } [HarmonyPatch(typeof(ZNetScene), "Awake")] public class NoSuppression { private static readonly Dictionary<int, bool> Originals = new Dictionary<int, bool>(); public static void Update() { Update(ZNetScene.instance); } public static void Update(int prefab, CreatureSpawner obj) { bool flag = obj.m_respawnTimeMinuts <= 0f; bool value; if (flag && Configuration.configNoCreatureSpawnerSuppression.Value) { obj.m_spawnInPlayerBase = true; } else if (!flag && Configuration.configNoCreatureRespawnerSuppression.Value) { obj.m_spawnInPlayerBase = true; } else if (Originals.TryGetValue(prefab, out value)) { obj.m_spawnInPlayerBase = value; } } public static void Update(ZNetScene scene) { Dictionary<int, bool> dictionary = new Dictionary<int, bool>(); foreach (KeyValuePair<int, GameObject> namedPrefab in scene.m_namedPrefabs) { CreatureSpawner component = namedPrefab.Value.GetComponent<CreatureSpawner>(); if (component != null) { Update(namedPrefab.Key, component); dictionary[namedPrefab.Key] = component.m_spawnInPlayerBase; } } foreach (KeyValuePair<ZDO, ZNetView> instance in scene.m_instances) { int prefab = instance.Key.GetPrefab(); if (dictionary.ContainsKey(prefab)) { CreatureSpawner component2 = ((Component)instance.Value).GetComponent<CreatureSpawner>(); if (component2 != null) { component2.m_spawnInPlayerBase = dictionary[prefab]; } } } } [HarmonyPriority(0)] private static void Postfix(ZNetScene __instance) { foreach (KeyValuePair<int, GameObject> namedPrefab in __instance.m_namedPrefabs) { if (!Originals.ContainsKey(namedPrefab.Key)) { CreatureSpawner component = namedPrefab.Value.GetComponent<CreatureSpawner>(); if (component != null) { Originals[namedPrefab.Key] = component.m_spawnInPlayerBase; } } } Update(__instance); } } [HarmonyPatch(typeof(OfferingBowl))] public class OfferingBowlPatches { private static ZPackage? SpawnData; private static void SetSpawn(OfferingBowl obj, ZNetView view) { OfferingBowl obj2 = obj; Helper.Prefab(view, Hash.Spawn, delegate(GameObject value) { ItemDrop component = value.GetComponent<ItemDrop>(); obj2.m_bossPrefab = null; obj2.m_itemPrefab = null; if (Object.op_Implicit((Object)(object)component)) { obj2.m_itemPrefab = component; } else { obj2.m_bossPrefab = value; } }); } private static void SetSpawnItem(OfferingBowl obj, ZNetView view) { OfferingBowl obj2 = obj; Helper.Prefab(view, Hash.SpawnItem, delegate(GameObject value) { ItemDrop component = value.GetComponent<ItemDrop>(); if (Object.op_Implicit((Object)(object)component)) { obj2.m_bossItem = component; } }); } private static void SetAmount(OfferingBowl obj, ZNetView view) { OfferingBowl obj2 = obj; Helper.Int(view, Hash.Amount, delegate(int value) { obj2.m_bossItems = value; obj2.m_useItemStands = value < 0; }); } private static void SetDelay(OfferingBowl obj, ZNetView view) { OfferingBowl obj2 = obj; Helper.Float(view, Hash.Delay, delegate(float value) { obj2.m_spawnBossDelay = value; }); } private static void SetName(OfferingBowl obj, ZNetView view) { OfferingBowl obj2 = obj; Helper.String(view, Hash.Name, delegate(string value) { obj2.m_name = value; }); } private static void SetText(OfferingBowl obj, ZNetView view) { OfferingBowl obj2 = obj; Helper.String(view, Hash.Text, delegate(string value) { obj2.m_useItemText = value; }); } private static void SetItemStandPrefix(OfferingBowl obj, ZNetView view) { OfferingBowl obj2 = obj; Helper.String(view, Hash.ItemStandPrefix, delegate(string value) { obj2.m_useItemStands = true; obj2.m_itemStandPrefix = value; }); } private static void SetItemStandRange(OfferingBowl obj, ZNetView view) { OfferingBowl obj2 = obj; Helper.Float(view, Hash.ItemStandRange, delegate(float value) { obj2.m_useItemStands = true; obj2.m_itemstandMaxRange = value; }); } private static void SetSpawnOffset(OfferingBowl obj, ZNetView view) { OfferingBowl obj2 = obj; Helper.Float(view, Hash.SpawnOffset, delegate(float value) { obj2.m_spawnYOffset = value; }); } private static void SetSpawnRadius(OfferingBowl obj, ZNetView view) { OfferingBowl obj2 = obj; Helper.Float(view, Hash.SpawnRadius, delegate(float value) { obj2.m_spawnBossMaxDistance = value; }); } private static void SetSpawnMaxY(OfferingBowl obj, ZNetView view) { OfferingBowl obj2 = obj; Helper.Float(view, Hash.SpawnMaxY, delegate(float value) { obj2.m_spawnBossMaxYDistance = value; }); } private static void SetItemOffset(OfferingBowl obj, ZNetView view) { OfferingBowl obj2 = obj; Helper.Offset(view, Hash.ItemOffset, obj2.m_itemSpawnPoint, delegate(Transform value) { obj2.m_itemSpawnPoint = value; }); } private static void SetStartEffect(OfferingBowl obj, ZNetView view) { OfferingBowl obj2 = obj; Helper.String(view, Hash.StartEffect, delegate(string value) { obj2.m_spawnBossStartEffects = Helper.ParseEffects(value); }); } private static void SetSpawnEffect(OfferingBowl obj, ZNetView view) { OfferingBowl obj2 = obj; Helper.String(view, Hash.SpawnEffect, delegate(string value) { obj2.m_spawnBossDoneffects = Helper.ParseEffects(value); }); } private static void SetUseEffect(OfferingBowl obj, ZNetView view) { OfferingBowl obj2 = obj; Helper.String(view, Hash.UseEffect, delegate(string value) { obj2.m_fuelAddedEffects = Helper.ParseEffects(value); }); } [HarmonyPatch("Awake")] [HarmonyPrefix] [HarmonyPriority(700)] public static void Setup(OfferingBowl __instance) { if (Configuration.configOfferingBowl.Value) { ZNetView componentInParent = ((Component)__instance).GetComponentInParent<ZNetView>(); if (Object.op_Implicit((Object)(object)componentInParent) && componentInParent.IsValid()) { SetSpawn(__instance, componentInParent); SetAmount(__instance, componentInParent); SetSpawnItem(__instance, componentInParent); SetName(__instance, componentInParent); SetText(__instance, componentInParent); SetItemStandPrefix(__instance, componentInParent); SetItemStandRange(__instance, componentInParent); SetDelay(__instance, componentInParent); SetItemOffset(__instance, componentInParent); SetSpawnRadius(__instance, componentInParent); SetSpawnMaxY(__instance, componentInParent); SetSpawnOffset(__instance, componentInParent); SetStartEffect(__instance, componentInParent); SetSpawnEffect(__instance, componentInParent); SetUseEffect(__instance, componentInParent); } } } public static bool CanRespawn(OfferingBowl obj) { if (!Configuration.configOfferingBowl.Value) { return true; } ZNetView view = ((Component)obj).GetComponentInParent<ZNetView>(); bool ret = true; Helper.Float(view, Hash.Respawn, delegate(float respawn) { Helper.Long(view, Hash.SpawnTime, delegate(long spawnTime) { DateTime time = ZNet.instance.GetTime(); DateTime dateTime = new DateTime(spawnTime); ret = respawn > 0f && (time - dateTime).TotalMinutes >= (double)respawn; }); }); return ret; } [HarmonyPatch("Interact")] [HarmonyPrefix] private static bool CheckBossRespawn(OfferingBowl __instance, bool hold, ref bool __result) { OfferingBowl __instance2 = __instance; if (!CanRespawn(__instance2)) { return false; } if (hold || __instance2.IsBossSpawnQueued() || !__instance2.m_useItemStands) { return true; } if (Object.op_Implicit((Object)(object)__instance2.m_bossPrefab)) { return true; } ZNetView componentInParent = ((Component)__instance2).GetComponentInParent<ZNetView>(); bool result = false; Helper.String(componentInParent, Hash.Command, delegate(string value) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) Vector3 position = ((Component)__instance2).transform.position; Quaternion rotation = ((Component)__instance2).transform.rotation; ServerExecution.Send(value, position, ((Quaternion)(ref rotation)).eulerAngles); result = true; }); __result = result; return false; } [HarmonyPatch("UseItem")] [HarmonyPrefix] private static bool CheckItemRespawn(OfferingBowl __instance) { return CanRespawn(__instance); } [HarmonyPatch("UseItem")] [HarmonyPostfix] private static bool UseItem(bool result, ItemData item, Humanoid user, OfferingBowl __instance) { Humanoid user2 = user; ItemData item2 = item; OfferingBowl __instance2 = __instance; if (!result) { return result; } OfferingBowl obj = __instance2; if (Object.op_Implicit((Object)(object)obj.m_bossPrefab) || Object.op_Implicit((Object)(object)obj.m_itemPrefab)) { return result; } if (obj.IsBossSpawnQueued()) { return result; } if (!Object.op_Implicit((Object)(object)obj.m_bossItem)) { return result; } if (item2.m_shared.m_name != obj.m_bossItem.m_itemData.m_shared.m_name) { return result; } if (user2.GetInventory().CountItems(obj.m_bossItem.m_itemData.m_shared.m_name, -1, true) < obj.m_bossItems) { return result; } Helper.String(((Component)obj).GetComponentInParent<ZNetView>(), Hash.Command, delegate(string value) { //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) user2.GetInventory().RemoveItem(item2.m_shared.m_name, obj.m_bossItems, -1, true); ((Character)user2).ShowRemovedMessage(obj.m_bossItem.m_itemData, obj.m_bossItems); ((Character)user2).Message((MessageType)2, "$msg_offerdone", 0, (Sprite)null); if (Object.op_Implicit((Object)(object)obj.m_itemSpawnPoint)) { obj.m_fuelAddedEffects.Create(obj.m_itemSpawnPoint.position, ((Component)obj).transform.rotation, (Transform)null, 1f, -1); } Vector3 position = ((Component)__instance2).transform.position; Quaternion rotation = ((Component)__instance2).transform.rotation; ServerExecution.Send(value, position, ((Quaternion)(ref rotation)).eulerAngles); }); return result; } [HarmonyPatch("SpawnBoss")] [HarmonyPostfix] private static void SetSpawnTime(OfferingBowl __instance) { ZNetView componentInParent = ((Component)__instance).GetComponentInParent<ZNetView>(); if (Object.op_Implicit((Object)(object)componentInParent)) { componentInParent.GetZDO().Set(Hash.SpawnTime, ZNet.instance.GetTime().Ticks); } } [HarmonyPatch("DelayedSpawnBoss")] [HarmonyPrefix] private static void GetValues(OfferingBowl __instance) { SpawnData = null; Helper.String(((Component)__instance).GetComponentInParent<ZNetView>(), Hash.Data, delegate(string value) { SpawnData = DataHelper.Deserialize(value); }); } private static void SetupSpawn(BaseAI baseAI, OfferingBowl bowl) { if (!Configuration.configOfferingBowl.Value) { return; } Character obj = ((Component)baseAI).GetComponent<Character>(); if (!Object.op_Implicit((Object)(object)obj)) { return; } ZNetView componentInParent = ((Component)bowl).GetComponentInParent<ZNetView>(); float levelChance = 10f; int minLevel = 1; int maxLevel = 1; Helper.Float(componentInParent, Hash.LevelChance, delegate(float value) { levelChance = value; }); Helper.Int(componentInParent, Hash.MinLevel, delegate(int value) { minLevel = value; }); Helper.Int(componentInParent, Hash.MaxLevel, delegate(int value) { maxLevel = value; }); int num = Helper.RollLevel(minLevel, maxLevel, levelChance); if (num > 1) { obj.SetLevel(num); } Helper.Float(componentInParent, Hash.Health, (Action<float>)obj.SetMaxHealth); Helper.String(componentInParent, Hash.Faction, Hash.FactionLegacy, delegate(string value) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) obj.m_nview.GetZDO().Set(Hash.Faction, value); if (Enum.TryParse<Faction>(value, ignoreCase: true, out Faction result)) { obj.m_faction = result; } }); } private static GameObject Instantiate(GameObject prefab, Vector3 position, Quaternion rotation) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) if (SpawnData != null) { DataHelper.InitZDO(prefab, position, rotation, SpawnData); } return Object.Instantiate<GameObject>(prefab, position, rotation); } [HarmonyPatch("DelayedSpawnBoss")] [HarmonyTranspiler] private static IEnumerable<CodeInstruction> SetData(IEnumerable<CodeInstruction> instructions) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Expected O, but got Unknown //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Expected O, but got Unknown //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Expected O, but got Unknown //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Expected O, but got Unknown //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Expected O, but got Unknown return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(OfferingBowl), "m_bossSpawnPoint"), (string)null) }).Advance(2).Set(OpCodes.Call, Transpilers.EmitDelegate<Func<GameObject, Vector3, Quaternion, GameObject>>((Func<GameObject, Vector3, Quaternion, GameObject>)Instantiate).operand) .MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Callvirt, (object)AccessTools.Method(typeof(BaseAI), "SetPatrolPoint", (Type[])null, (Type[])null), (string)null) }) .InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1] { new CodeInstruction(OpCodes.Ldarg_0, (object)null) }) .InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1] { new CodeInstruction(OpCodes.Call, Transpilers.EmitDelegate<Action<BaseAI, OfferingBowl>>((Action<BaseAI, OfferingBowl>)SetupSpawn).operand) }) .InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1] { new CodeInstruction(OpCodes.Ldloc_1, (object)null) }) .InstructionEnumeration(); } [HarmonyPatch("SpawnItem")] [HarmonyPostfix] public static bool SpawnItem(bool result, OfferingBowl __instance) { OfferingBowl __instance2 = __instance; if (result) { Helper.String(((Component)__instance2).GetComponentInParent<ZNetView>(), Hash.Command, delegate(string value) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) Vector3 position = ((Component)__instance2).transform.position; Quaternion rotation = ((Component)__instance2).transform.rotation; ServerExecution.Send(value, position, ((Quaternion)(ref rotation)).eulerAngles); }); } return result; } [HarmonyPatch("DelayedSpawnBoss")] [HarmonyPostfix] public static void DelayedSpawnBoss(OfferingBowl __instance) { OfferingBowl __instance2 = __instance; Helper.String(((Component)__instance2).GetComponentInParent<ZNetView>(), Hash.Command, delegate(string value) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) Vector3 bossSpawnPoint = __instance2.m_bossSpawnPoint; Quaternion rotation = ((Component)__instance2).transform.rotation; ServerExecution.Send(value, bossSpawnPoint, ((Quaternion)(ref rotation)).eulerAngles); }); } } [HarmonyPatch(typeof(LocationProxy), "SpawnLocation")] public class UpdateOfferingBowls { private static void Postfix(LocationProxy __instance, bool __result) { if (__result && Configuration.configOfferingBowl.Value) { GameObject instance = __instance.m_instance; OfferingBowl val = ((instance != null) ? instance.GetComponentInChildren<OfferingBowl>() : null); if ((Object)(object)val != (Object)null) { OfferingBowlPatches.Setup(val); } } } } [HarmonyPatch(typeof(Pickable))] public class PickablePatches { private static void SetSpawn(Pickable obj, ZNetView view) { Pickable obj2 = obj; Helper.Prefab(view, Hash.PickableSpawn, Hash.Spawn, delegate(GameObject value) { obj2.m_itemPrefab = value; }); } private static void SetRespawn(Pickable obj, ZNetView view) { Pickable obj2 = obj; Helper.Float(view, Hash.PickableRespawn, Hash.Respawn, delegate(float value) { obj2.m_respawnTimeMinutes = value; }); } private static void SetAmount(Pickable obj, ZNetView view) { Pickable obj2 = obj; Helper.Int(view, Hash.Amount, delegate(int value) { obj2.m_amount = value; }); } private static void SetName(Pickable obj, ZNetView view) { Pickable obj2 = obj; Helper.String(view, Hash.Name, delegate(string value) { obj2.m_overrideName = value; }); } private static void SetSpawnOffset(Pickable obj, ZNetView view) { Pickable obj2 = obj; Helper.Float(view, Hash.SpawnOffset, delegate(float value) { obj2.m_spawnOffset = value; }); } private static void SetUseEffect(Pickable obj, ZNetView view) { Pickable obj2 = obj; Helper.String(view, Hash.UseEffect, delegate(string value) { obj2.m_pickEffector = Helper.ParseEffects(value); }); } [HarmonyPatch("Awake")] [HarmonyPrefix] private static void Setup(Pickable __instance) { if (Configuration.configPickable.Value) { ZNetView component = ((Component)__instance).GetComponent<ZNetView>(); if (Object.op_Implicit((Object)(object)component) && component.IsValid()) { SetRespawn(__instance, component); SetSpawn(__instance, component); SetAmount(__instance, component); SetName(__instance, component); SetSpawnOffset(__instance, component); SetUseEffect(__instance, component); } } } [HarmonyPatch("Awake")] [HarmonyPostfix] private static void StartRespawnLoop(Pickable __instance) { if (!Configuration.configPickable.Value) { return; } ZNetView component = ((Component)__instance).GetComponent<ZNetView>(); if (Object.op_Implicit((Object)(object)component) && component.IsValid() && __instance.m_respawnTimeMinutes != 0f) { bool checkPickable = false; Helper.Int(component, Hash.SpawnCondition, delegate { checkPickable = true; }); Helper.String(component, Hash.RequiredGlobalKey, delegate { checkPickable = true; }); Helper.String(component, Hash.ForbiddenGlobalKey, delegate { checkPickable = true; }); if (checkPickable) { ((MonoBehaviour)__instance).InvokeRepeating("CheckCondition", Random.Range(1f, 5f), 30f); } } } private static void SetStack(ItemDrop obj, int amount) { if (obj != null) { obj.SetStack(amount); } } [HarmonyPatch("Drop")] [HarmonyTranspiler] private static IEnumerable<CodeInstruction> SetStackAmount(IEnumerable<CodeInstruction> instructions) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Callvirt, (object)AccessTools.Method(typeof(ItemDrop), "SetStack", (Type[])null, (Type[])null), (string)null) }).Set(OpCodes.Call, Transpilers.EmitDelegate<Action<ItemDrop, int>>((Action<ItemDrop, int>)SetStack).operand).InstructionEnumeration(); } [HarmonyPatch("GetHoverName")] [HarmonyPrefix] private static bool GetHoverName(Pickable __instance, ref string __result) { if (string.IsNullOrEmpty(__instance.m_overrideName) && !Object.op_Implicit((Object)(object)__instance.m_itemPrefab)) { __result = Utils.GetPrefabName(((Component)__instance).gameObject); return false; } return true; } } public static class PickableExtensions { private static readonly int SpawnCondition = StringExtensionMethods.GetStableHashCode("override_spawn_condition"); private static readonly int RequiredGlobalKey = StringExtensionMethods.GetStableHashCode("override_required_globalkey"); private static readonly int ForbiddenGlobalKey = StringExtensionMethods.GetStableHashCode("override_forbidden_globalkey"); private static void SetPicked(Pickable obj, bool value) { obj.m_picked = value; if (Object.op_Implicit((Object)(object)obj.m_hideWhenPicked)) { obj.m_hideWhenPicked.SetActive(!value); } } public static void CheckCondition(this Pickable obj) { ZNetView nview = obj.m_nview; if (!Object.op_Implicit((Object)(object)nview) || !nview.IsValid()) { return; } bool picked = nview.GetZDO().GetBool(ZDOVars.s_picked, false); if (picked) { return; } Helper.Int(nview, SpawnCondition, delegate(int value) { if (value == 1 && EnvMan.IsNight()) { picked = true; } if (value == 2 && EnvMan.IsDay()) { picked = true; } }); if (!picked) { Helper.HashList(nview, RequiredGlobalKey, delegate(int[] value) { HashSet<int> hashSet2 = (from s in ZoneSystem.instance.GetGlobalKeys() select StringExtensionMethods.GetStableHashCode(s)).ToHashSet(); foreach (int item2 in value) { if (!hashSet2.Contains(item2)) { picked = true; } } }); } if (!picked) { Helper.HashList(nview, ForbiddenGlobalKey, delegate(int[] value) { HashSet<int> hashSet = (from s in ZoneSystem.instance.GetGlobalKeys() select StringExtensionMethods.GetStableHashCode(s)).ToHashSet(); foreach (int item in value) { if (hashSet.Contains(item)) { picked = true; } } }); } SetPicked(obj, picked); } } [HarmonyPatch(typeof(ZNet), "RPC_PeerInfo")] public class ServerExecution { public static string RPC_Command = "SpawnerTweaks_Command"; public static void Send(string command, Vector3 center, Vector3 rot) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) string text = Parse(command, center, rot); if (!Object.op_Implicit((Object)(object)ZNet.instance) || ZNet.instance.IsServer()) { ((Terminal)Console.instance).TryRunCommand(text, false, false); return; } ZRpc serverRPC = ZNet.instance.GetServerRPC(); if (serverRPC != null) { string rPC_Command = RPC_Command; object[] array = new string[1] { text }; serverRPC.Invoke(rPC_Command, array); } } private static void RPC_Do_Command(ZRpc rpc, string command) { ((Terminal)Console.instance).TryRunCommand(command, false, false); } private static void Postfix(ZNet __instance, ZRpc rpc) { if (__instance.IsDedicated()) { rpc.Register<string>(RPC_Command, (Action<ZRpc, string>)RPC_Do_Command); } } private static string Parse(string command, Vector3 center, Vector3 rot) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) Vector2i zone = ZoneSystem.GetZone(center); string text = command.Replace("$$x", center.x.ToString(NumberFormatInfo.InvariantInfo)).Replace("$$y", center.y.ToString(NumberFormatInfo.InvariantInfo)).Replace("$$z", center.z.ToString(NumberFormatInfo.InvariantInfo)) .Replace("$$i", zone.x.ToString(NumberFormatInfo.InvariantInfo)) .Replace("$$j", zone.y.ToString(NumberFormatInfo.InvariantInfo)) .Replace("$$a", rot.y.ToString(NumberFormatInfo.InvariantInfo)) .Replace("<x>", center.x.ToString(NumberFormatInfo.InvariantInfo)) .Replace("<y>", center.y.ToString(NumberFormatInfo.InvariantInfo)) .Replace("<z>", center.z.ToString(NumberFormatInfo.InvariantInfo)) .Replace("<i>", zone.x.ToString(NumberFormatInfo.InvariantInfo)) .Replace("<j>", zone.y.ToString(NumberFormatInfo.InvariantInfo)) .Replace("<a>", rot.y.ToString(NumberFormatInfo.InvariantInfo)); string[] array = (from s in text.Split(new char[1] { ' ' }) select s.Split(new char[1] { '=' }) into a select a[^1].Trim()).SelectMany((string s) => s.Split(new char[1] { ',' })).ToArray(); foreach (string text2 in array) { if (Enumerable.Contains(text2, '*') || Enumerable.Contains(text2, '/') || Enumerable.Contains(text2, '+') || Enumerable.Contains(text2, '-')) { text = text.Replace(text2, Evaluate(text2).ToString(NumberFormatInfo.InvariantInfo)); } } return text; } private static float Evaluate(string expression) { string[] array = expression.Split(new char[1] { '*' }); if (array.Length > 1) { float num = 1f; string[] array2 = array; foreach (string expression2 in array2) { num *= Evaluate(expression2); } return num; } string[] array3 = expression.Split(new char[1] { '/' }); if (array3.Length > 1) { float num2 = Evaluate(array3[0]); for (int j = 1; j < array3.Length; j++) { num2 /= Evaluate(array3[j]); } return num2; } string[] array4 = expression.Split(new char[1] { '+' }); if (array4.Length > 1) { float num3 = 0f; string[] array2 = array4; foreach (string expression3 in array2) { num3 += Evaluate(expression3); } return num3; } string[] array5 = expression.Split(new char[1] { '-' }); if (array5.Where((string s) => s != "").Count() > 1) { float num4 = Evaluate(array5[0]); for (int k = 1; k < array5.Length; k++) { if (array5[k] == "" && k + 1 < array5.Length) { array5[k + 1] = "-" + array5[k + 1]; } else { num4 -= Evaluate(array5[k]); } } return num4; } try { return float.Parse(expression.Trim(), NumberFormatInfo.InvariantInfo); } catch { throw new Exception("Failed to parse expression: " + expression); } } } [HarmonyPatch(typeof(Smelter))] public class SmelterPatches { [HarmonyPatch("Awake")] [HarmonyPostfix] private static void Setup(Smelter __instance) { if (!Configuration.configSmelter.Value) { return; } Smelter obj = __instance; ZNetView nview = obj.m_nview; if (Object.op_Implicit((Object)(object)nview) && nview.IsValid()) { Helper.Int(nview, Hash.FuelUsage, delegate(int value) { obj.m_fuelPerProduct = value; }); Helper.Int(nview, Hash.MaxAmount, delegate(int value) { obj.m_maxOre = value; }); Helper.Int(nview, Hash.MaxFuel, delegate(int value) { obj.m_maxFuel = value; }); Helper.Item(nview, Hash.Fuel, delegate(ItemDrop value) { obj.m_fuelItem = value; }); Helper.Float(nview, Hash.Speed, delegate(float value) { obj.m_secPerProduct = value; }); Helper.String(nview, Hash.InputEffect, delegate(string value) { obj.m_oreAddedEffects = Helper.ParseEffects(value); }); Helper.String(nview, Hash.FuelEffect, delegate(string value) { obj.m_fuelAddedEffects = Helper.ParseEffects(value); }); Helper.String(nview, Hash.OutputEffect, delegate(string value) { obj.m_produceEffects = Helper.ParseEffects(value); }); Helper.String(nview, Hash.Conversion, delegate(string value) { obj.m_conversion = Helper.ParseSmelterConversions(value); }); } } } [HarmonyPatch(typeof(SpawnArea))] public class SpawnAreaPatches { private static float? SpawnHealth; private static string? SpawnFaction; private static int? SpawnLevel; private static ZPackage? SpawnData; private static Character? Spawned = null; private static readonly int Tamed = StringExtensionMethods.GetStableHashCode("Tamed"); private static readonly int Stack = StringExtensionMethods.GetStableHashCode("stack"); [HarmonyPatch("Awake")] [HarmonyPostfix] private static void Setup(SpawnArea __instance) { if (!Configuration.configSpawnArea.Value) { return; } SpawnArea obj = __instance; ZNetView nview = obj.m_nview; if (Object.op_Implicit((Object)(object)nview) && nview.IsValid()) { Helper.Float(nview, Hash.LevelChance, delegate(float value) { obj.m_levelupChance = value; }); Helper.Float(nview, Hash.SpawnRadius, delegate(float value) { obj.m_spawnRadius = value; }); Helper.Float(nview, Hash.NearRadius, delegate(float value) { obj.m_nearRadius = value; }); Helper.Float(nview, Hash.FarRadius, delegate(float value) { obj.m_farRadius = value; }); Helper.Float(nview, Hash.TriggerDistance, delegate(float value) { obj.m_triggerDistance = value; }); Helper.Int(nview, Hash.MaxNear, delegate(int value) { obj.m_maxNear = value; }); Helper.Int(nview, Hash.MaxTotal, delegate(int value) { obj.m_maxTotal = value; }); Helper.Float(nview, Hash.SpawnAreaRespawn, Hash.Respawn, delegate(float value) { obj.m_spawnIntervalSec = value; }); Helper.String(nview, Hash.SpawnEffect, delegate(string value) { obj.m_spawnEffects = Helper.ParseEffects(value); }); Helper.String(nview, Hash.SpawnAreaSpawn, Hash.Spawn, delegate(string value) { obj.m_prefabs = Helper.ParseSpawnsData(value); }); Helper.Int(nview, Hash.SpawnCondition, delegate(int value) { obj.m_onGroundOnly = (value & 4) > 0; }); } } [HarmonyPatch("UpdateSpawn")] [HarmonyPrefix] private static bool PickableCheck(SpawnArea __instance) { Pickable component = ((Component)__instance).GetComponent<Pickable>(); if (component == null) { return true; } return !component.m_picked; } [HarmonyPatch("SelectWeightedPrefab")] [HarmonyPostfix] private static void GetSpawnedData(SpawnArea __instance, SpawnData __result) { SpawnArea __instance2 = __instance; SpawnData __result2 = __result; Spawned = null; SpawnHealth = null; SpawnFaction = null; SpawnLevel = null; SpawnData = null; int? minLevel = null; int? maxLevel = null; Helper.Float(__instance2.m_nview, Hash.Health, delegate(float value) { SpawnHealth = value; }); Helper.String(__instance2.m_nview, Hash.Faction, delegate(string value) { SpawnFaction = value; }); Helper.Int(__instance2.m_nview, Hash.MinLevel, delegate(int value) { minLevel = value; }); Helper.Int(__instance2.m_nview, Hash.MaxLevel, delegate(int value) { maxLevel = value; }); Helper.String(__instance2.m_nview, Hash.SpawnAreaSpawn, Hash.Spawn, delegate(string value) { int num = __instance2.m_prefabs.IndexOf(__result2); string[] array = value.Split(new char[1] { '|' })[num].Split(new char[1] { ',' }); if (array.Length > 2) { minLevel = Helper.Int(array[2]); } if (array.Length > 3) { maxLevel = Helper.Int(array[3]); } if (array.Length > 4) { float? spawnHealth = Helper.Float(array[4]); if (spawnHealth.HasValue) { SpawnHealth = spawnHealth; if (array.Length > 5) { SpawnData = DataHelper.Deserialize(array[5]); } } else { if (Enum.TryParse<Faction>(array[4], ignoreCase: true, out Faction _)) { SpawnFaction = array[4]; } else { SpawnData = DataHelper.Deserialize(array[4]); } if (array.Length > 5) { SpawnHealth = Helper.Float(array[5]); } } } }); if (minLevel.HasValue && maxLevel.HasValue) { SpawnLevel = Helper.RollLevel(minLevel.Value, maxLevel.Value, __instance2.m_levelupChance); } } [HarmonyPatch("SpawnOne")] [HarmonyPrefix] private static bool CheckTime(SpawnArea __instance) { if (!Configuration.configSpawnArea.Value) { return true; } int @int = __instance.m_nview.GetZDO().GetInt(Hash.SpawnCondition, 0); if (@int <= 0) { return true; } if ((@int & 1) > 0 && EnvMan.IsNight()) { return false; } if ((@int & 2) > 0 && EnvMan.IsDay()) { return false; } return true; } private static Vector3 GetCenterPoint(Character character, GameObject obj) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) Spawned = character; if (character == null) { return obj.transform.position; } return character.GetCenterPoint(); } [HarmonyPatch("SpawnOne")] [HarmonyTranspiler] private static IEnumerable<CodeInstruction> FixCenterPoint(IEnumerable<CodeInstruction> instructions) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Expected O, but got Unknown return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Callvirt, (object)AccessTools.Method(typeof(Character), "GetCenterPoint", (Type[])null, (Type[])null), (string)null) }).InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1] { new CodeInstruction(OpCodes.Ldloc_S, (object)4) }).Set(OpCodes.Call, Transpilers.EmitDelegate<Func<Character, GameObject, Vector3>>((Func<Character, GameObject, Vector3>)GetCenterPoint).operand) .InstructionEnumeration(); } private static GameObject Instantiate(GameObject prefab, Vector3 position, Quaternion rotation) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) if (SpawnData != null) { DataHelper.InitZDO(prefab, position, rotation, SpawnData); } return Object.Instantiate<GameObject>(prefab, position, rotation); } [HarmonyPatch("SpawnOne")] [HarmonyTranspiler] private static IEnumerable<CodeInstruction> SetData(IEnumerable<CodeInstruction> instructions) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Ldc_I4, (object)360, (string)null) }).Advance(5).Set(OpCodes.Call, Transpilers.EmitDelegate<Func<GameObject, Vector3, Quaternion, GameObject>>((Func<GameObject, Vector3, Quaternion, GameObject>)Instantiate).operand) .InstructionEnumeration(); } [HarmonyPatch("SpawnOne")] [HarmonyPostfix] [HarmonyPriority(100)] private static void ApplyChanges() { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)Spawned == (Object)null)) { if (SpawnFaction != null && Enum.TryParse<Faction>(SpawnFaction, ignoreCase: true, out Faction result)) { Spawned.m_faction = result; Spawned.m_nview.GetZDO().Set(Hash.Faction, SpawnFaction); } if (SpawnLevel.HasValue) { Spawned.SetLevel(SpawnLevel.Value); } if (SpawnHealth.HasValue) { Spawned.SetMaxHealth(SpawnHealth.Value); } } } [HarmonyPatch("GetInstances")] [HarmonyPrefix] private static bool GetInstances(SpawnArea __instance, out int near, out int total) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) near = 0; total = 0; Vector3 position = ((Component)__instance).transform.position; HashSet<int> hashSet = __instance.m_prefabs.Select((SpawnData x) => StringExtensionMethods.GetStableHashCode(((Object)x.m_prefab).name)).ToHashSet(); foreach (ZDO key in ZNetScene.instance.m_instances.Keys) { if (hashSet.Contains(key.GetPrefab()) && !key.GetBool(Tamed, false)) { float num = Utils.DistanceXZ(position, key.GetPosition());