using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Bootstrap; using HarmonyLib; using LitJson2; using SoftReferenceableAssets; using UnityEngine; using UnityEngine.Audio; using UnityEngine.SceneManagement; using UpgradeWorld; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("Balrond Biomes")] [assembly: AssemblyDescription("Valheim Game Rework")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Balrond - Worm Works Studio")] [assembly: AssemblyProduct("Balrond")] [assembly: AssemblyCopyright("Copyright © 2023")] [assembly: AssemblyTrademark("Balrond")] [assembly: ComVisible(false)] [assembly: Guid("f405ea1c-ac25-47a3-9aa2-a8f56c14bfd6")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] public static class BalrondHashCompat { private static readonly MethodInfo _getStableHashCodeStringBool; private static readonly MethodInfo _getStableHashCodeString; private static readonly bool _initialized; static BalrondHashCompat() { try { Type typeFromHandle = typeof(StringExtensionMethods); _getStableHashCodeStringBool = typeFromHandle.GetMethod("GetStableHashCode", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[2] { typeof(string), typeof(bool) }, null); _getStableHashCodeString = typeFromHandle.GetMethod("GetStableHashCode", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[1] { typeof(string) }, null); _initialized = true; } catch { _initialized = false; } } public static int StableHash(string value) { if (value == null) { return 0; } try { if (_getStableHashCodeStringBool != null) { return (int)_getStableHashCodeStringBool.Invoke(null, new object[2] { value, false }); } if (_getStableHashCodeString != null) { return (int)_getStableHashCodeString.Invoke(null, new object[1] { value }); } } catch { } return FallbackStableHash(value); } private static int FallbackStableHash(string value) { int num = 5381; int num2 = num; for (int i = 0; i < value.Length; i += 2) { num = ((num << 5) + num) ^ value[i]; if (i == value.Length - 1) { break; } num2 = ((num2 << 5) + num2) ^ value[i + 1]; } return num + num2 * 1566083941; } } public class FishProcreation : MonoBehaviour { private static readonly int ZdoNextBreedKey = StringExtensionMethods.GetStableHashCode("Balrond_FishNextBreed"); private static readonly int ZdoBornKey = StringExtensionMethods.GetStableHashCode("Balrond_FishBorn"); public float m_updateInterval = 120f; public float m_partnerRange = 8f; public float m_totalCheckRange = 16f; public int m_maxFishNearby = 8; public float m_spawnChance = 0.2f; public float m_breedCooldown = 450f; public float m_childMaturityTime = 900f; public float m_spawnOffset = 2f; private ZNetView m_nview; private Fish m_fish; private GameObject m_myPrefab; private void Awake() { m_nview = ((Component)this).GetComponent(); m_fish = ((Component)this).GetComponent(); if ((Object)(object)m_nview != (Object)null && m_nview.IsValid() && m_nview.GetZDO() != null) { ZDO zDO = m_nview.GetZDO(); if (zDO.GetLong(ZdoBornKey, 0L) == 0) { zDO.Set(ZdoBornKey, GetTime().Ticks); } if (zDO.GetLong(ZdoNextBreedKey, 0L) == 0) { SetNextBreed(Random.Range(m_childMaturityTime * 0.5f, m_childMaturityTime)); } } ((MonoBehaviour)this).InvokeRepeating("TryProcreate", Random.Range(m_updateInterval, m_updateInterval * 1.5f), m_updateInterval); } private void TryProcreate() { if (!((Object)(object)m_nview == (Object)null) && m_nview.IsValid() && m_nview.IsOwner() && !((Object)(object)m_fish == (Object)null) && !m_fish.IsOutOfWater() && IsMature() && BreedCooldownReady() && !(Random.value > m_spawnChance)) { if ((Object)(object)m_myPrefab == (Object)null && (Object)(object)ZNetScene.instance != (Object)null) { m_myPrefab = ZNetScene.instance.GetPrefab(m_nview.GetZDO().GetPrefab()); } if (!((Object)(object)m_myPrefab == (Object)null) && !TooManyNearby() && HasPartner()) { SpawnBabyFish(); SetNextBreed(m_breedCooldown); } } } private bool HasPartner() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) int nrOfInstances = SpawnSystem.GetNrOfInstances(m_myPrefab, ((Component)this).transform.position, m_partnerRange, false, true); return nrOfInstances >= 2; } private bool TooManyNearby() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) int nrOfInstances = SpawnSystem.GetNrOfInstances(m_myPrefab, ((Component)this).transform.position, m_totalCheckRange, false, false); return nrOfInstances >= m_maxFishNearby; } private bool IsMature() { ZDO zdo = GetZdo(); if (zdo == null) { return false; } long num = zdo.GetLong(ZdoBornKey, 0L); if (num <= 0) { return true; } return (GetTime() - new DateTime(num)).TotalSeconds >= (double)m_childMaturityTime; } private bool BreedCooldownReady() { ZDO zdo = GetZdo(); if (zdo == null) { return false; } long num = zdo.GetLong(ZdoNextBreedKey, 0L); if (num <= 0) { return true; } return GetTime() >= new DateTime(num); } private void SetNextBreed(float secondsFromNow) { ZDO zdo = GetZdo(); if (zdo != null) { zdo.Set(ZdoNextBreedKey, GetTime().AddSeconds(secondsFromNow).Ticks); } } private void SpawnBabyFish() { //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) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: 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_0026: 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: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) Vector2 insideUnitCircle = Random.insideUnitCircle; Vector2 val = ((Vector2)(ref insideUnitCircle)).normalized * m_spawnOffset; Vector3 val2 = ((Component)this).transform.position + new Vector3(val.x, 0f, val.y); GameObject val3 = Object.Instantiate(m_myPrefab, val2, Quaternion.Euler(0f, Random.Range(0f, 360f), 0f)); ItemDrop component = ((Component)this).GetComponent(); ItemDrop component2 = val3.GetComponent(); if ((Object)(object)component != (Object)null && (Object)(object)component2 != (Object)null) { component2.SetQuality(component.m_itemData.m_quality); } ZNetView component3 = val3.GetComponent(); if ((Object)(object)component3 != (Object)null && component3.IsValid() && component3.GetZDO() != null) { ZDO zDO = component3.GetZDO(); zDO.Set(ZdoBornKey, GetTime().Ticks); zDO.Set(ZdoNextBreedKey, GetTime().AddSeconds(m_childMaturityTime).Ticks); } } private ZDO GetZdo() { if ((Object)(object)m_nview == (Object)null || !m_nview.IsValid()) { return null; } return m_nview.GetZDO(); } private DateTime GetTime() { return ((Object)(object)ZNet.instance != (Object)null) ? ZNet.instance.GetTime() : DateTime.Now; } } namespace UpgradeWorld { public class CommandRegistration { public string name = ""; public string description = ""; public string[] commands = new string[0]; public void AddCommand() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown //IL_0022: Unknown result type (might be due to invalid IL or missing references) new ConsoleCommand(name, description, (ConsoleEvent)delegate(ConsoleEventArgs args) { string[] array = commands; foreach (string text in array) { args.Context.TryRunCommand(text, false, false); } }, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false); } } [HarmonyPatch(typeof(Terminal), "InitTerminal")] public static class Upgrade { private static List registrations = new List(); public const string GUID = "upgrade_world"; public static void Register(string name, string description, params string[] commands) { if (Chainloader.PluginInfos.ContainsKey("upgrade_world")) { registrations.Add(new CommandRegistration { name = name, description = description, commands = commands }); } } private static void Postfix() { foreach (CommandRegistration registration in registrations) { registration.AddCommand(); } } } } namespace BalrondNature { public class TableMapper { public static CraftingStation cauldron; public static CraftingStation workbench; public static CraftingStation heavyWorkbench; public static CraftingStation forge; public static CraftingStation ironworks; public static CraftingStation blackforge; public static CraftingStation stoneCutter; public static CraftingStation artisian; public static CraftingStation magetable; public static CraftingStation runeforge; public static CraftingStation tannery; public static CraftingStation fletcher; public static CraftingStation grill; public static CraftingStation alchemylab; public static List pieces = new List(); public static void setupTables(List list) { pieces = list; prepareTables(); } private static CraftingStation FindStation(List list, string name) { GameObject val = list.Find((GameObject x) => ((Object)x).name == name); if ((Object)(object)val != (Object)null) { return val.GetComponent(); } Debug.LogWarning((object)("TableMapper - Station not found: " + name)); return null; } private static void prepareTables() { cauldron = FindStation(pieces, "piece_cauldron"); workbench = FindStation(pieces, "piece_workbench"); heavyWorkbench = FindStation(pieces, "piece_heavy_workbench_bal"); forge = FindStation(pieces, "forge"); ironworks = FindStation(pieces, "piece_metalworks_bal"); blackforge = FindStation(pieces, "blackforge"); stoneCutter = FindStation(pieces, "piece_stonecutter"); artisian = FindStation(pieces, "piece_artisanstation"); runeforge = FindStation(pieces, "piece_runeforge_bal"); magetable = FindStation(pieces, "piece_magetable"); fletcher = FindStation(pieces, "piece_fletcher_bal"); } } } namespace BalrondExtendedAnimals { public class BalrondTranslator { public static Dictionary> translations = new Dictionary>(); public static Dictionary getLanguage(string language) { Dictionary result = null; try { result = translations[language]; } catch (Exception) { } return result; } } [DisallowMultipleComponent] public class AnimalAITamable : MonoBehaviour, Interactable, TextReceiver { private const float m_playerMaxDistance = 15f; private const float m_tameDeltaTime = 3f; private static readonly List s_nearbyPlayers = new List(); private static int s_itemMask; [Header("Tameable")] public float m_fedDuration = 30f; public float m_tamingTime = 1800f; public bool m_startsTamed; public EffectList m_tamedEffect = new EffectList(); public EffectList m_sootheEffect = new EffectList(); public EffectList m_petEffect = new EffectList(); public float m_tamingSpeedMultiplierRange = 60f; public float m_tamingBoostMultiplier = 2f; public bool m_nameBeforeText = true; public string m_tameText = "$hud_tamelove"; private const string RPC_SetNameKey = "BalrondExtendedAnimals_SetName"; private bool m_rpcRegistered; [Header("Balrond rules")] public bool m_canBeTamed = true; public bool m_canProcreateWild = true; public bool m_canProcreateTamed = true; [Header("Consume items")] public List m_consumeItems = new List(); public float m_consumeRange = 2f; public float m_consumeSearchRange = 5f; public float m_consumeSearchInterval = 10f; public EffectList m_consumeItemEffects = new EffectList(); public Action m_onConsumedItem; [Header("Procreation")] public bool m_enableProcreation = true; public float m_updateInterval = 10f; public float m_totalCheckRange = 10f; public int m_maxCreatures = 4; public float m_partnerCheckRange = 3f; public float m_pregnancyChance = 0.5f; public float m_pregnancyDuration = 10f; public int m_requiredLovePoints = 4; public GameObject m_offspring; public int m_minOffspringLevel; public float m_spawnOffset = 2f; public float m_spawnOffsetMax; public bool m_spawnRandomDirection; public GameObject m_seperatePartner; public GameObject m_noPartnerOffspring; public EffectList m_birthEffects = new EffectList(); public EffectList m_loveEffects = new EffectList(); [Header("AnimalAI bridge")] public bool m_disableFleeWhenTamed = true; public bool m_clearTargetWhenTamed = true; public bool m_clearAlertedWhenTamed = true; public bool m_disableAfraidOfFireWhenTamed; [Header("Naming")] public bool m_allowRename = true; public int m_maxNameLength = 10; private ZNetView m_nview; private Character m_character; private BaseAI m_baseAI; private AnimalAI m_animalAI; private Piece m_piece; private ItemDrop m_consumeTarget; private float m_consumeSearchTimer; private float m_lastPetTime; private GameObject m_myPrefab; private GameObject m_offspringPrefab; private static readonly BindingFlags Flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; private static readonly FieldInfo FI_AnimalAI_Target = typeof(AnimalAI).GetField("m_target", Flags); private static readonly FieldInfo FI_AnimalAI_InDangerTimer = typeof(AnimalAI).GetField("m_inDangerTimer", Flags); private static readonly FieldInfo FI_BaseAI_AfraidOfFire = typeof(BaseAI).GetField("m_afraidOfFire", Flags); private static readonly FieldInfo FI_BaseAI_AvoidFire = typeof(BaseAI).GetField("m_avoidFire", Flags); private static readonly MethodInfo MI_BaseAI_SetAlerted = typeof(BaseAI).GetMethod("SetAlerted", Flags); public static AnimalAITamable AddTo(GameObject go) { AnimalAITamable component = go.GetComponent(); return Object.op_Implicit((Object)(object)component) ? component : go.AddComponent(); } private void Awake() { AnimalAITamable[] components = ((Component)this).GetComponents(); if (components.Length > 1 && (Object)(object)components[0] != (Object)(object)this) { Object.Destroy((Object)(object)this); return; } CacheComponents(); if (Object.op_Implicit((Object)(object)m_character)) { Character character = m_character; character.m_onDeath = (Action)Delegate.Combine(character.m_onDeath, new Action(OnDeath)); } if ((Object)(object)m_nview != (Object)null && m_nview.IsValid()) { if (!m_rpcRegistered) { m_rpcRegistered = true; m_nview.Register("BalrondExtendedAnimals_SetName", (Action)RPC_SetName); } ((MonoBehaviour)this).CancelInvoke("TamingUpdate"); if (m_canBeTamed) { ((MonoBehaviour)this).InvokeRepeating("TamingUpdate", 3f, 3f); } ((MonoBehaviour)this).CancelInvoke("Procreate"); if (m_enableProcreation && m_canProcreateTamed) { ((MonoBehaviour)this).InvokeRepeating("Procreate", Random.Range(m_updateInterval, m_updateInterval + m_updateInterval * 0.5f), m_updateInterval); } } if (m_startsTamed && Object.op_Implicit((Object)(object)m_character)) { m_character.SetTamed(true); OnBecomeTamed(); } } private void Update() { EnsureComponents(); if (m_disableFleeWhenTamed && IsTamed()) { ApplyTamedAnimalAIState(); } UpdateConsume(Time.deltaTime); } public void CacheComponents() { m_nview = ((Component)this).GetComponent(); m_character = ((Component)this).GetComponent(); m_baseAI = ((Component)this).GetComponent(); m_animalAI = ((Component)this).GetComponent(); m_piece = ((Component)this).GetComponent(); } private void EnsureComponents() { if (!Object.op_Implicit((Object)(object)m_nview)) { m_nview = ((Component)this).GetComponent(); } if (!Object.op_Implicit((Object)(object)m_character)) { m_character = ((Component)this).GetComponent(); } if (!Object.op_Implicit((Object)(object)m_baseAI)) { m_baseAI = ((Component)this).GetComponent(); } if (!Object.op_Implicit((Object)(object)m_animalAI)) { m_animalAI = ((Component)this).GetComponent(); } if (!Object.op_Implicit((Object)(object)m_piece)) { m_piece = ((Component)this).GetComponent(); } } public bool IsTamed() { EnsureComponents(); return (Object.op_Implicit((Object)(object)m_character) && m_character.IsTamed()) || m_startsTamed; } public bool IsHungry() { EnsureComponents(); if (!Object.op_Implicit((Object)(object)m_nview) || !m_nview.IsValid()) { return false; } ZDO zDO = m_nview.GetZDO(); if (zDO == null) { return false; } long num = zDO.GetLong(ZDOVars.s_tameLastFeeding, 0L); if (num == 0) { return true; } DateTime dateTime = new DateTime(num); return (ZNet.instance.GetTime() - dateTime).TotalSeconds > (double)m_fedDuration; } public string GetName() { EnsureComponents(); string text = (Object.op_Implicit((Object)(object)m_character) ? m_character.m_name : (Object.op_Implicit((Object)(object)m_piece) ? m_piece.m_name : ((Object)((Component)this).gameObject).name)); if (Object.op_Implicit((Object)(object)m_nview) && m_nview.IsValid()) { string text2 = m_nview.GetZDO().GetString(ZDOVars.s_tamedName, ""); if (!string.IsNullOrEmpty(text2)) { return text2; } } return Localization.instance.Localize(text); } public string GetHoverName() { string text = GetText(); return (!string.IsNullOrEmpty(text)) ? StringExtensionMethods.RemoveRichTextTags(text) : GetName(); } public string GetStatusString() { EnsureComponents(); if (Object.op_Implicit((Object)(object)m_baseAI) && m_baseAI.IsAlerted()) { return "$hud_tamefrightened"; } if (IsHungry()) { return "$hud_tamehungry"; } return IsTamed() ? "$hud_tamehappy" : "$hud_tameinprogress"; } public string GetHoverText() { EnsureComponents(); if (!Object.op_Implicit((Object)(object)m_nview) || !m_nview.IsValid()) { return ""; } string name = GetName(); if (IsTamed()) { name += Localization.instance.Localize(" ( $hud_tame, " + GetStatusString() + " )"); string text = name + Localization.instance.Localize("\n[$KEY_Use] $hud_pet"); if (m_allowRename) { text += ((!ZInput.IsNonClassicFunctionality() || !ZInput.IsGamepadActive()) ? Localization.instance.Localize("\n[$KEY_AltPlace + $KEY_Use] $hud_rename") : Localization.instance.Localize("\n[$KEY_AltKeys + $KEY_Use] $hud_rename")); } return text; } if (!m_canBeTamed) { return name + Localization.instance.Localize(" ( $hud_wild )"); } int tameness = GetTameness(); return (tameness <= 0) ? (name + Localization.instance.Localize(" ( $hud_wild, " + GetStatusString() + " )")) : (name + Localization.instance.Localize(" ( $hud_tameness " + tameness + "%, " + GetStatusString() + " )")); } public bool Interact(Humanoid user, bool hold, bool alt) { //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) EnsureComponents(); if (!Object.op_Implicit((Object)(object)m_nview) || !m_nview.IsValid() || hold) { return false; } if (alt && m_allowRename) { RequestRename(); return true; } if (!IsTamed() || Time.time - m_lastPetTime <= 1f) { return false; } m_lastPetTime = Time.time; m_petEffect.Create(((Component)this).transform.position, ((Component)this).transform.rotation, (Transform)null, 1f, -1); string text = (m_nameBeforeText ? (GetHoverName() + " " + m_tameText) : m_tameText); ((Character)user).Message((MessageType)2, text, 0, (Sprite)null); return true; } public bool UseItem(Humanoid user, ItemData item) { //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) EnsureComponents(); if (!m_canBeTamed) { return false; } if (!Object.op_Implicit((Object)(object)m_nview) || !m_nview.IsValid() || item == null) { return false; } if (!CanConsume(item)) { return false; } if (!IsHungry()) { ((Character)user).Message((MessageType)2, GetHoverName() + " $hud_tamehappy", 0, (Sprite)null); return true; } if (Object.op_Implicit((Object)(object)m_baseAI) && m_baseAI.IsAlerted()) { ((Character)user).Message((MessageType)2, GetHoverName() + " $hud_tamefrightened", 0, (Sprite)null); return true; } if (Vector3.Distance(((Component)user).transform.position, ((Component)this).transform.position) > 15f) { return false; } if (!user.GetInventory().RemoveOneItem(item)) { return false; } ItemDrop item2 = (Object.op_Implicit((Object)(object)item.m_dropPrefab) ? item.m_dropPrefab.GetComponent() : null); OnConsumedItem(item2); return true; } private void RequestRename() { if (IsTamed() && (Object)(object)TextInput.instance != (Object)null) { TextInput.instance.RequestText((TextReceiver)(object)this, "$hud_rename", m_maxNameLength); } } public string GetText() { EnsureComponents(); if (!Object.op_Implicit((Object)(object)m_nview) || !m_nview.IsValid()) { return ""; } return m_nview.GetZDO().GetString(ZDOVars.s_tamedName, ""); } public void SetText(string text) { EnsureComponents(); if (Object.op_Implicit((Object)(object)m_nview) && m_nview.IsValid()) { if (text == null) { text = ""; } text = text.Trim(); if (text.Length > m_maxNameLength) { text = text.Substring(0, m_maxNameLength); } m_nview.InvokeRPC("BalrondExtendedAnimals_SetName", new object[1] { text }); } } private void RPC_SetName(long sender, string name) { EnsureComponents(); if (Object.op_Implicit((Object)(object)m_nview) && m_nview.IsValid() && m_nview.IsOwner() && IsTamed()) { if (name == null) { name = ""; } name = name.Trim(); if (name.Length > m_maxNameLength) { name = name.Substring(0, m_maxNameLength); } m_nview.GetZDO().Set(ZDOVars.s_tamedName, name); } } private void TamingUpdate() { //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) EnsureComponents(); if (m_canBeTamed && Object.op_Implicit((Object)(object)m_nview) && m_nview.IsValid() && m_nview.IsOwner() && !IsTamed() && !IsHungry() && (!Object.op_Implicit((Object)(object)m_baseAI) || !m_baseAI.IsAlerted())) { DecreaseRemainingTime(3f); if (GetRemainingTime() <= 0f) { Tame(); } else { m_sootheEffect.Create(((Component)this).transform.position, ((Component)this).transform.rotation, (Transform)null, 1f, -1); } } } private void Tame() { //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) EnsureComponents(); if (!m_canBeTamed) { return; } if ((Object)(object)Game.instance != (Object)null) { Game.instance.IncrementPlayerStat((PlayerStatType)48, 1f); } if (Object.op_Implicit((Object)(object)m_nview) && m_nview.IsValid() && m_nview.IsOwner() && Object.op_Implicit((Object)(object)m_character) && !IsTamed()) { m_character.SetTamed(true); OnBecomeTamed(); m_tamedEffect.Create(((Component)this).transform.position, ((Component)this).transform.rotation, (Transform)null, 1f, -1); Player closestPlayer = Player.GetClosestPlayer(((Component)this).transform.position, 30f); if (Object.op_Implicit((Object)(object)closestPlayer)) { ((Character)closestPlayer).Message((MessageType)2, m_character.m_name + " $hud_tamedone", 0, (Sprite)null); } } } private void OnBecomeTamed() { EnsureComponents(); if (Object.op_Implicit((Object)(object)m_baseAI)) { ForceSetAlerted(alert: false); ClearAnimalTarget(); if (m_disableAfraidOfFireWhenTamed) { TrySetField(FI_BaseAI_AfraidOfFire, m_baseAI, false); TrySetField(FI_BaseAI_AvoidFire, m_baseAI, false); } } } private void ApplyTamedAnimalAIState() { EnsureComponents(); if (Object.op_Implicit((Object)(object)m_animalAI)) { if (m_clearTargetWhenTamed) { ClearAnimalTarget(); TrySetField(FI_AnimalAI_InDangerTimer, m_animalAI, m_animalAI.m_timeToSafe + 0.1f); } if (m_clearAlertedWhenTamed) { ForceSetAlerted(alert: false); } } } private void ClearAnimalTarget() { if (FI_AnimalAI_Target != null && Object.op_Implicit((Object)(object)m_animalAI)) { FI_AnimalAI_Target.SetValue(m_animalAI, null); } } private void ForceSetAlerted(bool alert) { if (MI_BaseAI_SetAlerted != null && Object.op_Implicit((Object)(object)m_baseAI)) { MI_BaseAI_SetAlerted.Invoke(m_baseAI, new object[1] { alert }); } } private static void TrySetField(FieldInfo field, object instance, object value) { if (field != null && instance != null) { field.SetValue(instance, value); } } private void OnDeath() { } private int GetTameness() { return (int)((1f - Mathf.Clamp01(GetRemainingTime() / m_tamingTime)) * 100f); } private void ResetFeedingTimer() { EnsureComponents(); if (Object.op_Implicit((Object)(object)m_nview) && m_nview.IsValid()) { m_nview.GetZDO().Set(ZDOVars.s_tameLastFeeding, ZNet.instance.GetTime().Ticks); } } private void DecreaseRemainingTime(float time) { //IL_0047: Unknown result type (might be due to invalid IL or missing references) EnsureComponents(); if (!Object.op_Implicit((Object)(object)m_nview) || !m_nview.IsValid()) { return; } float remainingTime = GetRemainingTime(); s_nearbyPlayers.Clear(); Player.GetPlayersInRange(((Component)this).transform.position, m_tamingSpeedMultiplierRange, s_nearbyPlayers); foreach (Player s_nearbyPlayer in s_nearbyPlayers) { if (((Character)s_nearbyPlayer).GetSEMan().HaveStatusAttribute((StatusAttribute)8)) { time *= m_tamingBoostMultiplier; } } float num = remainingTime - time; if (num < 0f) { num = 0f; } m_nview.GetZDO().Set(ZDOVars.s_tameTimeLeft, num); } private float GetRemainingTime() { EnsureComponents(); return (!Object.op_Implicit((Object)(object)m_nview) || !m_nview.IsValid()) ? 0f : m_nview.GetZDO().GetFloat(ZDOVars.s_tameTimeLeft, m_tamingTime); } private void OnConsumedItem(ItemDrop item) { //IL_002c: 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_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0077: 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_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) if (IsHungry()) { Vector3 val = (Object.op_Implicit((Object)(object)m_character) ? m_character.GetCenterPoint() : ((Component)this).transform.position); m_sootheEffect.Create(val, Quaternion.identity, (Transform)null, 1f, -1); } ResetFeedingTimer(); m_onConsumedItem?.Invoke(item); m_consumeItemEffects.Create(((Component)this).transform.position, Quaternion.identity, (Transform)null, 1f, -1); if ((Object)(object)m_character != (Object)null && (Object)(object)m_character.m_zanim != (Object)null) { m_character.m_zanim.SetTrigger("consume"); } } public bool CanConsume(ItemData item) { if (item == null || m_consumeItems == null) { return false; } foreach (ItemDrop consumeItem in m_consumeItems) { if (Object.op_Implicit((Object)(object)consumeItem) && consumeItem.m_itemData.m_shared.m_name == item.m_shared.m_name) { return true; } } return false; } private void UpdateConsume(float dt) { //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) EnsureComponents(); if (!Object.op_Implicit((Object)(object)m_nview) || !m_nview.IsValid() || !m_nview.IsOwner() || m_consumeItems == null || m_consumeItems.Count == 0 || !IsHungry() || (Object.op_Implicit((Object)(object)m_baseAI) && m_baseAI.IsAlerted())) { return; } m_consumeSearchTimer += dt; if (m_consumeSearchTimer > m_consumeSearchInterval) { m_consumeSearchTimer = 0f; m_consumeTarget = FindClosestConsumableItem(m_consumeSearchRange); } if (Object.op_Implicit((Object)(object)m_consumeTarget) && Object.op_Implicit((Object)(object)m_baseAI) && m_baseAI.MoveTo(dt, ((Component)m_consumeTarget).transform.position, m_consumeRange, false)) { m_baseAI.LookAt(((Component)m_consumeTarget).transform.position); if (m_baseAI.IsLookingAt(((Component)m_consumeTarget).transform.position, 20f, false) && m_consumeTarget.RemoveOne()) { OnConsumedItem(m_consumeTarget); m_consumeTarget = null; } } } private ItemDrop FindClosestConsumableItem(float maxRange) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_00df: 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) EnsureComponents(); if (s_itemMask == 0) { s_itemMask = LayerMask.GetMask(new string[1] { "item" }); } Collider[] array = Physics.OverlapSphere(((Component)this).transform.position, maxRange, s_itemMask); ItemDrop val = null; float num = 999999f; Collider[] array2 = array; foreach (Collider val2 in array2) { if (!Object.op_Implicit((Object)(object)val2.attachedRigidbody)) { continue; } ItemDrop component = ((Component)val2.attachedRigidbody).GetComponent(); if (!Object.op_Implicit((Object)(object)component)) { continue; } ZNetView component2 = ((Component)component).GetComponent(); if (Object.op_Implicit((Object)(object)component2) && component2.IsValid() && CanConsume(component.m_itemData)) { float num2 = Vector3.Distance(((Component)component).transform.position, ((Component)this).transform.position); if (!Object.op_Implicit((Object)(object)val) || num2 < num) { val = component; num = num2; } } } return (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)m_baseAI) && m_baseAI.HavePath(((Component)val).transform.position)) ? val : null; } private void Procreate() { //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_01e0: Unknown result type (might be due to invalid IL or missing references) //IL_022e: Unknown result type (might be due to invalid IL or missing references) //IL_02a6: Unknown result type (might be due to invalid IL or missing references) //IL_02b1: Unknown result type (might be due to invalid IL or missing references) EnsureComponents(); if (!m_enableProcreation || !m_canProcreateTamed || !Object.op_Implicit((Object)(object)m_nview) || !m_nview.IsValid() || !m_nview.IsOwner() || m_nview.GetZDO() == null || (Object)(object)ZNetScene.instance == (Object)null || (Object)(object)ZNet.instance == (Object)null || !IsTamed() || (Object)(object)m_offspring == (Object)null) { return; } if ((Object)(object)m_offspringPrefab == (Object)null) { m_offspringPrefab = ZNetScene.instance.GetPrefab(Utils.GetPrefabName(m_offspring)); m_myPrefab = ZNetScene.instance.GetPrefab(m_nview.GetZDO().GetPrefab()); } if ((Object)(object)m_offspringPrefab == (Object)null || (Object)(object)m_myPrefab == (Object)null) { return; } if (IsPregnant()) { if (IsDue()) { ResetPregnancy(); SpawnOffspring(parentIsTamed: true); } } else { if ((Object.op_Implicit((Object)(object)m_baseAI) && m_baseAI.IsAlerted()) || IsHungry() || Random.value > m_pregnancyChance) { return; } int num = SpawnSystem.GetNrOfInstances(m_myPrefab, ((Component)this).transform.position, m_totalCheckRange, false, false) + SpawnSystem.GetNrOfInstances(m_offspringPrefab, ((Component)this).transform.position, m_totalCheckRange, false, false); if (num >= m_maxCreatures) { return; } GameObject val = (Object.op_Implicit((Object)(object)m_seperatePartner) ? m_seperatePartner : m_myPrefab); int nrOfInstances = SpawnSystem.GetNrOfInstances(val, ((Component)this).transform.position, m_partnerCheckRange, false, false); if (Object.op_Implicit((Object)(object)m_noPartnerOffspring) || ((Object.op_Implicit((Object)(object)m_seperatePartner) || nrOfInstances >= 2) && (!Object.op_Implicit((Object)(object)m_seperatePartner) || nrOfInstances >= 1))) { if (nrOfInstances > 0 && m_loveEffects != null) { m_loveEffects.Create(((Component)this).transform.position, ((Component)this).transform.rotation, (Transform)null, 1f, -1); } int num2 = GetLovePoints() + 1; m_nview.GetZDO().Set(ZDOVars.s_lovePoints, num2, false); if (num2 >= m_requiredLovePoints) { m_nview.GetZDO().Set(ZDOVars.s_lovePoints, 0, false); MakePregnant(); } } } } private void SpawnOffspring(bool parentIsTamed) { //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: 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_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) GameObject val = m_offspringPrefab; if (Object.op_Implicit((Object)(object)m_noPartnerOffspring)) { int nrOfInstances = SpawnSystem.GetNrOfInstances(Object.op_Implicit((Object)(object)m_seperatePartner) ? m_seperatePartner : m_myPrefab, ((Component)this).transform.position, m_partnerCheckRange, false, true); if ((!Object.op_Implicit((Object)(object)m_seperatePartner) && nrOfInstances < 2) || (Object.op_Implicit((Object)(object)m_seperatePartner) && nrOfInstances < 1)) { val = m_noPartnerOffspring; } } Vector3 forward = ((Component)this).transform.forward; if (m_spawnRandomDirection) { float num = Random.Range(0f, (float)Math.PI * 2f); ((Vector3)(ref forward))..ctor(Mathf.Cos(num), 0f, Mathf.Sin(num)); } float num2 = ((m_spawnOffsetMax > 0f) ? Random.Range(m_spawnOffset, m_spawnOffsetMax) : m_spawnOffset); GameObject val2 = Object.Instantiate(val, ((Component)this).transform.position - forward * num2, Quaternion.LookRotation(-((Component)this).transform.forward, Vector3.up)); Character component = val2.GetComponent(); int num3 = Mathf.Max(m_minOffspringLevel, Object.op_Implicit((Object)(object)m_character) ? m_character.GetLevel() : m_minOffspringLevel); if (Object.op_Implicit((Object)(object)component)) { component.SetTamed(parentIsTamed); component.SetLevel(num3); } else { ItemDrop component2 = val2.GetComponent(); if (Object.op_Implicit((Object)(object)component2)) { component2.SetQuality(num3); } } m_birthEffects.Create(val2.transform.position, Quaternion.identity, (Transform)null, 1f, -1); } public int GetLovePoints() { EnsureComponents(); return ((Object)(object)m_nview != (Object)null && m_nview.IsValid()) ? m_nview.GetZDO().GetInt(ZDOVars.s_lovePoints, 0) : 0; } public bool ReadyForProcreation() { if (!m_enableProcreation || !m_canProcreateTamed) { return false; } if (!IsTamed()) { return false; } return !IsPregnant() && !IsHungry(); } private void MakePregnant() { EnsureComponents(); if (Object.op_Implicit((Object)(object)m_nview) && m_nview.IsValid()) { m_nview.GetZDO().Set(ZDOVars.s_pregnant, ZNet.instance.GetTime().Ticks); } } private void ResetPregnancy() { EnsureComponents(); if (Object.op_Implicit((Object)(object)m_nview) && m_nview.IsValid()) { m_nview.GetZDO().Set(ZDOVars.s_pregnant, 0L); } } private bool IsDue() { EnsureComponents(); if (!Object.op_Implicit((Object)(object)m_nview) || !m_nview.IsValid()) { return false; } long num = m_nview.GetZDO().GetLong(ZDOVars.s_pregnant, 0L); if (num == 0) { return false; } DateTime dateTime = new DateTime(num); return (ZNet.instance.GetTime() - dateTime).TotalSeconds > (double)m_pregnancyDuration; } private bool IsPregnant() { EnsureComponents(); return (Object)(object)m_nview != (Object)null && m_nview.IsValid() && m_nview.GetZDO().GetLong(ZDOVars.s_pregnant, 0L) > 0; } public void CopyFromTameable(Tameable tameable) { if (Object.op_Implicit((Object)(object)tameable)) { m_fedDuration = tameable.m_fedDuration; m_tamingTime = tameable.m_tamingTime; m_startsTamed = tameable.m_startsTamed; m_tamedEffect = tameable.m_tamedEffect; m_sootheEffect = tameable.m_sootheEffect; m_petEffect = tameable.m_petEffect; m_tamingSpeedMultiplierRange = tameable.m_tamingSpeedMultiplierRange; m_tamingBoostMultiplier = tameable.m_tamingBoostMultiplier; m_nameBeforeText = tameable.m_nameBeforeText; m_tameText = tameable.m_tameText; } } public void CopyFromProcreation(Procreation procreation) { if (Object.op_Implicit((Object)(object)procreation)) { m_updateInterval = procreation.m_updateInterval; m_totalCheckRange = procreation.m_totalCheckRange; m_maxCreatures = procreation.m_maxCreatures; m_partnerCheckRange = procreation.m_partnerCheckRange; m_pregnancyChance = procreation.m_pregnancyChance; m_pregnancyDuration = procreation.m_pregnancyDuration; m_requiredLovePoints = procreation.m_requiredLovePoints; m_offspring = procreation.m_offspring; m_minOffspringLevel = procreation.m_minOffspringLevel; m_spawnOffset = procreation.m_spawnOffset; m_spawnOffsetMax = procreation.m_spawnOffsetMax; m_spawnRandomDirection = procreation.m_spawnRandomDirection; m_seperatePartner = procreation.m_seperatePartner; m_noPartnerOffspring = procreation.m_noPartnerOffspring; m_birthEffects = procreation.m_birthEffects; m_loveEffects = procreation.m_loveEffects; } } public void CopyFromMonsterAI(MonsterAI monsterAI) { if (Object.op_Implicit((Object)(object)monsterAI)) { m_consumeItems = new List(monsterAI.m_consumeItems ?? new List()); m_consumeRange = monsterAI.m_consumeRange; m_consumeSearchRange = monsterAI.m_consumeSearchRange; m_consumeSearchInterval = monsterAI.m_consumeSearchInterval; Humanoid component = ((Component)this).GetComponent(); if ((Object)(object)component != (Object)null) { m_consumeItemEffects = component.m_consumeItemEffects; } } } public void CopyValuesFrom(GameObject sourcePrefab) { if (Object.op_Implicit((Object)(object)sourcePrefab)) { CopyFromTameable(sourcePrefab.GetComponent()); CopyFromProcreation(sourcePrefab.GetComponent()); CopyFromMonsterAI(sourcePrefab.GetComponent()); } } public void SetConsumeItems(params ItemDrop[] items) { m_consumeItems = new List(); if (items == null) { return; } foreach (ItemDrop val in items) { if (Object.op_Implicit((Object)(object)val)) { m_consumeItems.Add(val); } } } public void SetProcreationEnabled(bool enabled) { m_enableProcreation = enabled; ((MonoBehaviour)this).CancelInvoke("Procreate"); if (enabled && ((Behaviour)this).isActiveAndEnabled) { EnsureComponents(); if ((Object)(object)m_nview != (Object)null && m_nview.IsValid()) { ((MonoBehaviour)this).InvokeRepeating("Procreate", Random.Range(m_updateInterval, m_updateInterval + m_updateInterval * 0.5f), m_updateInterval); } } } } [DisallowMultipleComponent] internal sealed class MonsterHunger : MonoBehaviour { private static readonly int ZdoLastFedKey = StringExtensionMethods.GetStableHashCode("BalrondExtendedAnimals_LastFed"); private static readonly List EmptyDiet = new List(); public float hungerTime = 600f; public bool gateEatingByHunger = true; public float minHeal = 10f; public float minHealFraction = 0.1f; public float maxHealFraction = 0.25f; public bool clampToMissingHealth = true; private MonsterAI _ai; private ZNetView _nview; private Character _character; private Tameable _tameable; private List _cachedDiet; private bool _dietCached; private void Awake() { _ai = ((Component)this).GetComponent(); _nview = ((Component)this).GetComponent(); _character = ((Component)this).GetComponent(); _tameable = ((Component)this).GetComponent(); if ((Object)(object)_ai == (Object)null || (Object)(object)_character == (Object)null) { ((Behaviour)this).enabled = false; return; } if ((Object)(object)_tameable != (Object)null) { ((Behaviour)this).enabled = false; return; } CacheDietIfNeeded(); if (!_dietCached) { ((Behaviour)this).enabled = false; return; } MonsterAI ai = _ai; ai.m_onConsumedItem = (Action)Delegate.Combine(ai.m_onConsumedItem, new Action(OnConsumedItem)); EnsureLastFedInitialized(); } private void OnDestroy() { if ((Object)(object)_ai != (Object)null) { MonsterAI ai = _ai; ai.m_onConsumedItem = (Action)Delegate.Remove(ai.m_onConsumedItem, new Action(OnConsumedItem)); } } private void Update() { if ((Object)(object)_ai == (Object)null) { ((Behaviour)this).enabled = false; } else { if (!IsOwner() || !gateEatingByHunger) { return; } CacheDietIfNeeded(); if (!_dietCached) { return; } if (IsHungryNow()) { if (_ai.m_consumeItems == null || _ai.m_consumeItems.Count == 0 || _ai.m_consumeItems == EmptyDiet) { _ai.m_consumeItems = _cachedDiet; } } else if (_ai.m_consumeItems != EmptyDiet) { _ai.m_consumeItems = EmptyDiet; } } } public bool IsHungryNow() { DateTime lastFedTime = GetLastFedTime(); return (GetSafeTime() - lastFedTime).TotalSeconds > (double)hungerTime; } private void OnConsumedItem(ItemDrop item) { if (IsOwner()) { SetLastFedNow(); HealFromConsumedItem(item); } } private void HealFromConsumedItem(ItemDrop item) { if ((Object)(object)_character == (Object)null) { return; } float health = _character.GetHealth(); float maxHealth = _character.GetMaxHealth(); if (maxHealth <= 0f) { return; } float num = maxHealth - health; if (!(num <= 0.01f)) { float num2 = Mathf.Clamp01(minHealFraction); float num3 = Mathf.Clamp01(maxHealFraction); if (num3 < num2) { num3 = num2; } float num4 = maxHealth * Random.Range(num2, num3); if (num4 < minHeal) { num4 = minHeal; } if (clampToMissingHealth && num4 > num) { num4 = num; } if (!(num4 <= 0f)) { _character.Heal(num4, true); } } } private void CacheDietIfNeeded() { if (!_dietCached && !((Object)(object)_ai == (Object)null) && _ai.m_consumeItems != null && _ai.m_consumeItems.Count > 0) { _cachedDiet = new List(_ai.m_consumeItems); _dietCached = true; } } private bool IsOwner() { if ((Object)(object)_nview == (Object)null) { return true; } return _nview.IsValid() && _nview.IsOwner(); } private void EnsureLastFedInitialized() { ZDO zdo = GetZdo(); if (zdo != null) { long num = zdo.GetLong(ZdoLastFedKey, 0L); if (num == 0) { SetLastFedNow(); } } } private DateTime GetLastFedTime() { ZDO zdo = GetZdo(); if (zdo == null) { return GetSafeTime(); } long num = zdo.GetLong(ZdoLastFedKey, 0L); if (num <= 0) { return GetSafeTime(); } try { return new DateTime(num); } catch { return GetSafeTime(); } } private void SetLastFedNow() { ZDO zdo = GetZdo(); if (zdo != null) { zdo.Set(ZdoLastFedKey, GetSafeTime().Ticks); } } private ZDO GetZdo() { if ((Object)(object)_nview == (Object)null || !_nview.IsValid()) { return null; } return _nview.GetZDO(); } private DateTime GetSafeTime() { return ((Object)(object)ZNet.instance != (Object)null) ? ZNet.instance.GetTime() : DateTime.Now; } } [DisallowMultipleComponent] public sealed class WildProcreation : MonoBehaviour { private static readonly int ZdoHasWildChildKey = StringExtensionMethods.GetStableHashCode("Balrond_WildProcreation_HasChild"); private static readonly int ZdoNextTryKey = StringExtensionMethods.GetStableHashCode("Balrond_WildProcreation_NextTry"); private static readonly int ZdoChildBornKey = StringExtensionMethods.GetStableHashCode("Balrond_WildProcreation_ChildBorn"); public float m_updateInterval = 120f; public float m_partnerCheckRange = 8f; public float m_totalCheckRange = 20f; public int m_maxCreatures = 6; public float m_spawnChance = 0.1f; public float m_initialDelay = 300f; public float m_failedTryCooldown = 180f; public GameObject m_offspring; public GameObject m_seperatePartner; public float m_spawnOffset = 2f; public float m_spawnOffsetMax; public bool m_spawnRandomDirection; public int m_minOffspringLevel; private ZNetView m_nview; private Character m_character; private BaseAI m_baseAI; private GameObject m_myPrefab; private GameObject m_offspringPrefab; private void Awake() { m_nview = ((Component)this).GetComponent(); m_character = ((Component)this).GetComponent(); m_baseAI = ((Component)this).GetComponent(); if ((Object)(object)m_nview == (Object)null) { ((Behaviour)this).enabled = false; } else { ((MonoBehaviour)this).InvokeRepeating("TryWildProcreate", Random.Range(m_updateInterval, m_updateInterval * 1.5f), m_updateInterval); } } public void ConfigureFrom(Procreation source) { if (!((Object)(object)source == (Object)null)) { m_updateInterval = Mathf.Max(60f, source.m_updateInterval * 2f); m_partnerCheckRange = source.m_partnerCheckRange; m_totalCheckRange = source.m_totalCheckRange; m_maxCreatures = Mathf.Max(2, source.m_maxCreatures); m_spawnChance = Mathf.Clamp(source.m_pregnancyChance * 0.35f, 0.02f, 0.15f); m_offspring = source.m_offspring; m_seperatePartner = source.m_seperatePartner; m_spawnOffset = source.m_spawnOffset; m_spawnOffsetMax = source.m_spawnOffsetMax; m_spawnRandomDirection = source.m_spawnRandomDirection; m_minOffspringLevel = source.m_minOffspringLevel; } } private void TryWildProcreate() { if (IsValidOwner() && !IsTamedSafe() && (!((Object)(object)m_baseAI != (Object)null) || !m_baseAI.IsAlerted()) && !HasAlreadyMadeChild() && CooldownReady()) { if (!ResolvePrefabs()) { SetNextTry(m_failedTryCooldown); } else if (HasNearbyOffspring()) { SetPermanentChildBlock(); } else if (TooManyNearby()) { SetNextTry(m_failedTryCooldown); } else if (!HasPartner()) { SetNextTry(m_failedTryCooldown); } else if (Random.value > m_spawnChance) { SetNextTry(m_failedTryCooldown); } else if (SpawnOffspring()) { SetPermanentChildBlock(); } else { SetNextTry(m_failedTryCooldown); } } } private bool ResolvePrefabs() { if ((Object)(object)ZNetScene.instance == (Object)null) { return false; } ZDO zdo = GetZdo(); if (zdo == null) { return false; } if ((Object)(object)m_myPrefab == (Object)null) { m_myPrefab = ZNetScene.instance.GetPrefab(zdo.GetPrefab()); } if ((Object)(object)m_offspringPrefab == (Object)null && (Object)(object)m_offspring != (Object)null) { m_offspringPrefab = ZNetScene.instance.GetPrefab(Utils.GetPrefabName(m_offspring)); } return (Object)(object)m_myPrefab != (Object)null && (Object)(object)m_offspringPrefab != (Object)null; } private bool HasPartner() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) GameObject val = (((Object)(object)m_seperatePartner != (Object)null) ? m_seperatePartner : m_myPrefab); if ((Object)(object)val == (Object)null) { return false; } int nrOfInstances = SpawnSystem.GetNrOfInstances(val, ((Component)this).transform.position, m_partnerCheckRange, false, false); return ((Object)(object)m_seperatePartner == (Object)null) ? (nrOfInstances >= 2) : (nrOfInstances >= 1); } private bool TooManyNearby() { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)m_myPrefab == (Object)null || (Object)(object)m_offspringPrefab == (Object)null) { return true; } int nrOfInstances = SpawnSystem.GetNrOfInstances(m_myPrefab, ((Component)this).transform.position, m_totalCheckRange, false, false); int nrOfInstances2 = SpawnSystem.GetNrOfInstances(m_offspringPrefab, ((Component)this).transform.position, m_totalCheckRange, false, false); return nrOfInstances + nrOfInstances2 >= m_maxCreatures; } private bool HasNearbyOffspring() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)m_offspringPrefab == (Object)null) { return false; } int nrOfInstances = SpawnSystem.GetNrOfInstances(m_offspringPrefab, ((Component)this).transform.position, m_totalCheckRange, false, false); return nrOfInstances > 0; } private bool SpawnOffspring() { //IL_0021: 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_00aa: 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_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)m_offspringPrefab == (Object)null) { return false; } Vector3 forward = ((Component)this).transform.forward; if (m_spawnRandomDirection) { float num = Random.Range(0f, (float)Math.PI * 2f); ((Vector3)(ref forward))..ctor(Mathf.Cos(num), 0f, Mathf.Sin(num)); } float num2 = ((m_spawnOffsetMax > 0f) ? Random.Range(m_spawnOffset, m_spawnOffsetMax) : m_spawnOffset); if (num2 <= 0f) { num2 = 2f; } GameObject val = Object.Instantiate(m_offspringPrefab, ((Component)this).transform.position - forward * num2, Quaternion.LookRotation(-((Component)this).transform.forward, Vector3.up)); if ((Object)(object)val == (Object)null) { return false; } Character component = val.GetComponent(); int num3 = (((Object)(object)m_character != (Object)null) ? m_character.GetLevel() : m_minOffspringLevel); int num4 = Mathf.Max(m_minOffspringLevel, num3); if ((Object)(object)component != (Object)null) { component.SetTamed(false); component.SetLevel(num4); } else { ItemDrop component2 = val.GetComponent(); if ((Object)(object)component2 != (Object)null) { component2.SetQuality(num4); } } ZDO zdo = GetZdo(); if (zdo != null) { zdo.Set(ZdoChildBornKey, GetTime().Ticks); } return true; } private bool IsValidOwner() { return (Object)(object)m_nview != (Object)null && m_nview.IsValid() && m_nview.IsOwner() && m_nview.GetZDO() != null && (Object)(object)ZNet.instance != (Object)null; } private bool IsTamedSafe() { if ((Object)(object)m_character == (Object)null) { return false; } try { return m_character.IsTamed(); } catch { return false; } } private bool HasAlreadyMadeChild() { ZDO zdo = GetZdo(); return zdo == null || zdo.GetBool(ZdoHasWildChildKey, false); } private void SetPermanentChildBlock() { ZDO zdo = GetZdo(); if (zdo != null) { zdo.Set(ZdoHasWildChildKey, true); zdo.Set(ZdoNextTryKey, GetTime().AddYears(10).Ticks); } } private bool CooldownReady() { ZDO zdo = GetZdo(); if (zdo == null) { return false; } long num = zdo.GetLong(ZdoNextTryKey, 0L); if (num <= 0) { SetNextTry(m_initialDelay + Random.Range(0f, m_initialDelay)); return false; } try { return GetTime() >= new DateTime(num); } catch { SetNextTry(m_failedTryCooldown); return false; } } private void SetNextTry(float seconds) { ZDO zdo = GetZdo(); if (zdo != null) { seconds = Mathf.Max(60f, seconds); zdo.Set(ZdoNextTryKey, GetTime().AddSeconds(seconds).Ticks); } } private ZDO GetZdo() { if ((Object)(object)m_nview == (Object)null || !m_nview.IsValid()) { return null; } return m_nview.GetZDO(); } private DateTime GetTime() { return ((Object)(object)ZNet.instance != (Object)null) ? ZNet.instance.GetTime() : DateTime.Now; } } [BepInPlugin("balrond.astafaraios.BalrondMonsterMayhem", "BalrondMonsterMayhem", "0.3.2")] public class Launch : BaseUnityPlugin { [HarmonyPatch(typeof(ZoneSystem), "SetupLocations")] private static class ZoneSystem_SetupLocations_Patch { private static void Postfix(ZoneSystem __instance) { if (!((Object)(object)__instance == (Object)null) && __instance.m_locations != null) { locationBuilder.editLocations(__instance.m_locations); } } } [HarmonyPatch(typeof(Game), "Awake")] private static class Game_Awake_Patch { private static void Prefix() { SpawnSystemLifecyclePatch.Reset(); SetupNewHudElements(); } } [HarmonyPatch(typeof(ZNetScene), "Awake")] private static class ZNetScene_Awake_Patch { private static void Prefix(ZNetScene __instance) { if ((Object)(object)__instance == (Object)null || __instance.m_prefabs == null) { Debug.LogWarning((object)(projectName + ": ZNetScene prefab list is not ready.")); return; } modResourceLoader.AddPrefabsToZnetScene(__instance); monsterCloneService.RegisterVariants(__instance, MonsterVariantRegistry.Variants); if ((Object)(object)RandEventSystem.instance != (Object)null && RandEventSystem.instance.m_events != null) { eventBuilder.EditEvents(RandEventSystem.instance.m_events, __instance.m_prefabs); eventBuilder.AddNewEvents(RandEventSystem.instance.m_events, __instance.m_prefabs); } monsterManager.SetupMonsterList(__instance.m_prefabs); monsterManager.EditMonsters(); EggHatchService.SetupEggHatching(__instance); GrowthService.SetupGrowth(__instance); TamableService.SetupBreeding(__instance); if (!IsDedicatedServer()) { ShaderReplacment.runMaterialFix(); } } } private readonly Harmony harmony = new Harmony("balrond.astafaraios.BalrondMonsterMayhem"); public const string PluginGUID = "balrond.astafaraios.BalrondMonsterMayhem"; public const string PluginName = "BalrondMonsterMayhem"; public const string PluginVersion = "0.3.2"; public static readonly ModResourceLoader modResourceLoader = new ModResourceLoader(); public static readonly DatabaseAddMethods databaseAddMethods = new DatabaseAddMethods(); public static readonly MonsterManager monsterManager = new MonsterManager(); public static readonly SpawnerBuilder spawnerBuilder = new SpawnerBuilder(); public static readonly ItemEdits itemEdits = new ItemEdits(); public static readonly EventBuilder eventBuilder = new EventBuilder(); public static readonly MonsterFeeding monsterFeeding = new MonsterFeeding(); public static readonly LocationBuilder locationBuilder = new LocationBuilder(); public static readonly JsonLoader jsonLoader = new JsonLoader(); public static readonly MonsterCloneService monsterCloneService = new MonsterCloneService(); public static GameObject gui; public static GameObject gui2; public static string projectName = "BalrondMonsterMayhem"; public static GameObject RootObject; public static GameObject PrefabContainer; private static readonly string GUI_PATH = "_GameMain/LoadingGUI/PixelFix/IngameGui/EnemyHud/HudRoot/HudBase"; private static readonly string GUI_BOSS_PATH = "_GameMain/LoadingGUI/PixelFix/IngameGui/EnemyHud/HudRoot/HudBaseBoss"; private void Awake() { jsonLoader.loadJson(); CreatePrefabContainer(); modResourceLoader.loadAssets(); monsterManager.RegisterLootAliases(MonsterVariantRegistry.BuildLootAliasMap()); harmony.PatchAll(); } public void Start() { RegisterUpgrade("trollcaveRemove", "remove vanilla troll caves before moving them", LocationBuilder.vanillaLocationsYouEdit, "locations_remove biomes=BlackForest"); RegisterUpgrade("trollcaveAdd", "add updated troll caves to Moutains and Deepnorth", LocationBuilder.vanillaLocationsYouEdit, "locations_add"); Upgrade.Register("BalrondMonsterMayhem_fixZoneAfterTroll", "covers spots left by removing caves", "vegetation_add biomes=BlackForest start"); } private void RegisterUpgrade(string keySuffix, string description, IEnumerable names, string lineName) { string name = "BalrondMonsterMayhem_" + keySuffix; string text = string.Format("{0} {1} start", lineName, string.Join(",", names)); Upgrade.Register(name, description, text); } public void CreatePrefabContainer() { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Expected O, but got Unknown if (!((Object)(object)RootObject != (Object)null) || !((Object)(object)PrefabContainer != (Object)null)) { RootObject = new GameObject("_ValheimReforgedRoot"); Object.DontDestroyOnLoad((Object)(object)RootObject); PrefabContainer = new GameObject("Prefabs"); PrefabContainer.transform.parent = RootObject.transform; PrefabContainer.SetActive(false); } } public static GameObject cloneMe(GameObject source, string name) { GameObject val = Object.Instantiate(source, PrefabContainer.transform); ((Object)val).name = name; fixMaterials(val, source); val.SetActive(true); return val; } public static GameObject fixMaterials(GameObject clone, GameObject source) { MeshRenderer[] componentsInChildren = source.GetComponentsInChildren(); foreach (MeshRenderer val in componentsInChildren) { MeshRenderer[] componentsInChildren2 = clone.GetComponentsInChildren(); foreach (MeshRenderer val2 in componentsInChildren2) { if (((Object)val).name == ((Object)val2).name) { ((Renderer)val2).materials = ((Renderer)val).sharedMaterials; ((Renderer)val2).sharedMaterials = ((Renderer)val).sharedMaterials; break; } } } return clone; } private void OnDestroy() { harmony.UnpatchSelf(); } public static bool IsObjectDBValid() { return (Object)(object)ObjectDB.instance != (Object)null && ObjectDB.instance.m_items.Count != 0 && ObjectDB.instance.m_recipes.Count != 0 && (Object)(object)ObjectDB.instance.GetItemPrefab("Amber") != (Object)null; } [HarmonyPrefix] [HarmonyPatch(typeof(RandEventSystem), "StartRandomEvent")] private static void RandEventSystem_StartRandomEvent(ref bool __runOriginal) { int nrOfPlayers = ZNet.instance.GetNrOfPlayers(); __runOriginal = nrOfPlayers >= 2; if (!__runOriginal && !ZNet.IsSinglePlayer) { Debug.Log((object)$"Not enough players online for raid. Min player count: {2}, currently online: {nrOfPlayers}"); } } public static void SetupNewHudElements() { //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) Scene activeScene = SceneManager.GetActiveScene(); if (!(((Scene)(ref activeScene)).name != "main")) { if ((Object)(object)gui == (Object)null) { gui = GameObject.Find(GUI_PATH); } if ((Object)(object)gui2 == (Object)null) { gui2 = GameObject.Find(GUI_BOSS_PATH); } SetupRegularHud(); SetupBossHud(); } } private static void SetupRegularHud() { if (!((Object)(object)gui == (Object)null) && modResourceLoader != null) { if ((Object)(object)modResourceLoader.lvl4 == (Object)null) { modResourceLoader.LoadNewStars(); } AttachToGui(gui, modResourceLoader.lvl4, modResourceLoader.lvl5, modResourceLoader.lvl6, modResourceLoader.lvl7); } } private static void SetupBossHud() { if (!((Object)(object)gui2 == (Object)null) && modResourceLoader != null) { if ((Object)(object)modResourceLoader.lvl2boss == (Object)null) { modResourceLoader.LoadNewBossStars(); } AttachToGui(gui2, modResourceLoader.lvl2boss, modResourceLoader.lvl3boss, modResourceLoader.lvl4boss, modResourceLoader.lvl5boss, modResourceLoader.lvl6boss, modResourceLoader.lvl7boss); } } private static void AttachToGui(GameObject parent, params GameObject[] elements) { if ((Object)(object)parent == (Object)null || elements == null) { return; } foreach (GameObject val in elements) { if ((Object)(object)val != (Object)null) { val.transform.SetParent(parent.transform, false); } } } private static bool IsDedicatedServer() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 return (int)SystemInfo.graphicsDeviceType == 4; } } public class BaseLevelEffectSetupValue { public float scale = 1.1f; public float saturation = 0.5f; public float hue = -0.1f; public float value = -0.1f; public bool setEmmisive = false; public float sumValue = 0.05f; public LevelSetup setup = null; public GameObject enabledObject = null; public GameObject enabledObjectLevel2 = null; public GameObject enabledObjectLevel3 = null; public bool setEmissive = false; public Color emissive = Color.white; public void GetSetup(LevelEffects levelEffects) { //IL_0056: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)levelEffects == (Object)null) { Debug.LogWarning((object)"LevelEffects is null"); return; } List levelSetups = levelEffects.m_levelSetups; int num = levelSetups?.Count ?? 0; if (num > 0) { setup = levelSetups.Last(); ApplySetupValues(); } else { SetDefaultValues(num, ((Component)levelEffects).transform.localScale.y); } HandleCharacterSpecificAdjustments(levelEffects); } private void ApplySetupValues() { //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) if (setup != null) { scale = setup.m_scale; saturation = setup.m_saturation; hue = setup.m_hue; value = setup.m_value; enabledObject = setup.m_enableObject; enabledObjectLevel2 = enabledObject; enabledObjectLevel3 = enabledObject; emissive = setup.m_emissiveColor; setEmissive = setup.m_setEmissiveColor; } } private void SetDefaultValues(int levels, float baseScale) { switch (levels) { case 0: scale = baseScale; saturation = 0f; hue = 0f; value = 0f; break; case 1: scale = baseScale + 0.05f; saturation = 0.5f; hue = -0.05f; value = -0.05f; break; case 2: scale = baseScale + 0.1f; saturation = 0.5f; hue = -0.1f; value = -0.1f; break; } } private void HandleCharacterSpecificAdjustments(LevelEffects levelEffects) { Character character = levelEffects.m_character; object obj; if (character == null) { obj = null; } else { GameObject gameObject = ((Component)character).gameObject; obj = ((gameObject != null) ? ((Object)gameObject).name : null); } string text = (string)obj; if (string.IsNullOrEmpty(text)) { return; } string text2 = text; string text3 = text2; if (!(text3 == "Deer")) { if (text3 == "Boar") { EditBoar(levelEffects); } } else { EditDeer(levelEffects); } } private void EditDeer(LevelEffects levelEffects) { if (levelEffects.m_levelSetups.Count >= 2) { GameObject enableObject = levelEffects.m_levelSetups[0].m_enableObject; GameObject enableObject2 = levelEffects.m_levelSetups[1].m_enableObject; enabledObjectLevel2 = enableObject; enabledObjectLevel3 = enableObject2; Transform parent = enableObject.transform.parent; object obj; if (parent == null) { obj = null; } else { Transform obj2 = parent.Find("Antler1"); obj = ((obj2 != null) ? ((Component)obj2).gameObject : null); } GameObject val = (GameObject)obj; if ((Object)(object)val != (Object)null) { enabledObject = val; levelEffects.m_levelSetups[0].m_enableObject = val; levelEffects.m_levelSetups[1].m_enableObject = val; } } } private void EditBoar(LevelEffects levelEffects) { } } public static class EggHatchService { private sealed class EggGrowConfig { public string GrowTo { get; set; } public bool Tame { get; set; } public bool RequireFire { get; set; } public bool RequireRoof { get; set; } public int GrowupTime { get; set; } } private static readonly Dictionary EggGrowConfigs = new Dictionary { { "VoltureEgg", new EggGrowConfig { GrowTo = "VoltureNestling_bal", Tame = true, RequireFire = true, RequireRoof = false, GrowupTime = 6000 } }, { "DragonEgg", new EggGrowConfig { GrowTo = "Hatchling", Tame = false, RequireFire = true, RequireRoof = false, GrowupTime = 9000 } }, { "CrowEgg_bal", new EggGrowConfig { GrowTo = "CrowNestling_bal", Tame = true, RequireFire = true, RequireRoof = false, GrowupTime = 4000 } }, { "SerpentEgg_bal", new EggGrowConfig { GrowTo = "Serpentling_bal", Tame = false, RequireFire = false, RequireRoof = false, GrowupTime = 7000 } }, { "LeechEgg_bal", new EggGrowConfig { GrowTo = "LeechLarva_bal", Tame = false, RequireFire = false, RequireRoof = false, GrowupTime = 5000 } }, { "Larva_bal", new EggGrowConfig { GrowTo = "SeekerBrood", Tame = false, RequireFire = true, RequireRoof = false, GrowupTime = 6000 } } }; public static void SetupEggHatching(ZNetScene zNetScene) { if ((Object)(object)zNetScene == (Object)null || zNetScene.m_prefabs == null) { return; } GameObject val = TamableService.FindPrefabInZnet("ChickenEgg", zNetScene); EggGrow val2 = (((Object)(object)val != (Object)null) ? val.GetComponent() : null); if ((Object)(object)val2 == (Object)null) { Debug.LogWarning((object)(Launch.projectName + ": ChickenEgg EggGrow template not found.")); } foreach (KeyValuePair eggGrowConfig in EggGrowConfigs) { string key = eggGrowConfig.Key; EggGrowConfig value = eggGrowConfig.Value; GameObject val3 = TamableService.FindPrefabInZnet(key, zNetScene); if ((Object)(object)val3 == (Object)null) { Debug.LogWarning((object)(Launch.projectName + ": egg prefab not found in ZNetScene: " + key)); continue; } GameObject val4 = TamableService.FindPrefabInZnet(value.GrowTo, zNetScene); if ((Object)(object)val4 == (Object)null) { Debug.LogWarning((object)(Launch.projectName + ": egg grown prefab not found in ZNetScene: " + value.GrowTo + " for " + ((Object)val3).name)); } else { AddEggGrow(val3, val2, value, zNetScene); } } } private static void LogPossiblePrefabMatches(ZNetScene zNetScene, string missingName) { if ((Object)(object)zNetScene == (Object)null || zNetScene.m_prefabs == null || string.IsNullOrEmpty(missingName)) { return; } string text = missingName.Replace("(Clone)", "").Replace("_bal", "").Replace("_", "") .ToLowerInvariant(); foreach (GameObject prefab in zNetScene.m_prefabs) { if (!((Object)(object)prefab == (Object)null)) { string text2 = ((Object)prefab).name.Replace("(Clone)", "").Replace("_bal", "").Replace("_", "") .ToLowerInvariant(); if (text2.Contains(text) || text.Contains(text2) || text2.Contains("leech") || text2.Contains("larv") || text2.Contains("egg")) { Debug.LogWarning((object)(Launch.projectName + ": possible egg/grown match for " + missingName + ": " + ((Object)prefab).name)); } } } } private static void AddEggGrow(GameObject egg, EggGrow chickenTemplate, EggGrowConfig config, ZNetScene zNetScene) { if ((Object)(object)egg == (Object)null || config == null || (Object)(object)zNetScene == (Object)null) { return; } GameObject val = TamableService.FindPrefabInZnet(config.GrowTo, zNetScene); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)(Launch.projectName + ": egg grown prefab not found: " + config.GrowTo + " for " + ((Object)egg).name)); return; } EggGrow val2 = egg.GetComponent(); if ((Object)(object)val2 == (Object)null) { val2 = egg.AddComponent(); } val2.m_growTime = config.GrowupTime; val2.m_tamed = config.Tame; val2.m_requireNearbyFire = config.RequireFire; val2.m_requireUnderRoof = config.RequireRoof; val2.m_grownPrefab = val; if ((Object)(object)chickenTemplate != (Object)null) { val2.m_hatchEffect = chickenTemplate.m_hatchEffect; } Transform val3 = egg.transform.Find("Not Growing"); val2.m_notGrowingObject = (((Object)(object)val3 != (Object)null) ? ((Component)val3).gameObject : null); } } public static class GrowthService { private sealed class GrowConfig { public string Primary { get; set; } public string Secondary { get; set; } public int GrowupTime { get; set; } } private static readonly Dictionary GrowConfigs = new Dictionary { { "NeckTadpole_bal", new GrowConfig { Primary = "Neck", Secondary = "NeckBrute_bal", GrowupTime = 3500 } }, { "Doe_bal", new GrowConfig { Primary = "Stag_bal", Secondary = "Deer", GrowupTime = 3500 } }, { "Boar_piggy", new GrowConfig { Primary = "Hog_bal", Secondary = "Boar", GrowupTime = 3500 } }, { "Serpentling_bal", new GrowConfig { Primary = "Serpent", GrowupTime = 8000 } }, { "VoltureNestling_bal", new GrowConfig { Primary = "Volture", GrowupTime = 5000 } }, { "CrowNestling_bal", new GrowConfig { Primary = "GiantCrow_bal", GrowupTime = 4000 } }, { "LeechLarva_bal", new GrowConfig { Primary = "Leech", Secondary = "LeechPrimal_bal", GrowupTime = 4000 } }, { "Fox_Cub_bal", new GrowConfig { Primary = "Fox_bal", GrowupTime = 4500 } }, { "Wolf_cub", new GrowConfig { Primary = "Wolf", GrowupTime = 4000 } }, { "SeekerBrood", new GrowConfig { Primary = "Seeker", Secondary = "SeekerBrute", GrowupTime = 10000 } }, { "GoatKid_bal", new GrowConfig { Primary = "Goat_bal", GrowupTime = 4500 } }, { "HabrokBirb_bal", new GrowConfig { Primary = "Habrok_bal", GrowupTime = 6000 } }, { "Lox_Calf", new GrowConfig { Primary = "Lox", GrowupTime = 7000 } }, { "Bunny_bal", new GrowConfig { Primary = "Hare", GrowupTime = 2500 } }, { "BjornCub_bal", new GrowConfig { Primary = "Bjorn", GrowupTime = 12500 } } }; public static void SetupGrowth(ZNetScene zNetScene) { if ((Object)(object)zNetScene == (Object)null || zNetScene.m_prefabs == null) { return; } foreach (KeyValuePair growConfig in GrowConfigs) { string key = growConfig.Key; GrowConfig value = growConfig.Value; GameObject val = TamableService.FindPrefabInZnet(key, zNetScene); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)(Launch.projectName + ": growup prefab not found in ZNetScene: " + key)); continue; } GameObject val2 = TamableService.FindPrefabInZnet(value.Primary, zNetScene); if ((Object)(object)val2 == (Object)null) { Debug.LogWarning((object)(Launch.projectName + ": grown prefab not found in ZNetScene: " + value.Primary + " for " + ((Object)val).name)); continue; } if (!string.IsNullOrEmpty(value.Secondary)) { GameObject val3 = TamableService.FindPrefabInZnet(value.Secondary, zNetScene); if ((Object)(object)val3 == (Object)null) { Debug.LogWarning((object)(Launch.projectName + ": secondary grown prefab not found in ZNetScene: " + value.Secondary + " for " + ((Object)val).name)); } } AddGrowUp(val, zNetScene, value); } } private static void LogPossiblePrefabMatches(ZNetScene zNetScene, string missingName) { if ((Object)(object)zNetScene == (Object)null || zNetScene.m_prefabs == null || string.IsNullOrEmpty(missingName)) { return; } string text = missingName.Replace("(Clone)", "").Replace("_bal", "").Replace("_", "") .ToLowerInvariant(); foreach (GameObject prefab in zNetScene.m_prefabs) { if (!((Object)(object)prefab == (Object)null)) { string text2 = ((Object)prefab).name.Replace("(Clone)", "").Replace("_bal", "").Replace("_", "") .ToLowerInvariant(); if (text2.Contains(text) || text.Contains(text2) || text2.Contains("leech") || text2.Contains("larv") || text2.Contains("fox") || text2.Contains("goat")) { Debug.LogWarning((object)(Launch.projectName + ": possible growup match for " + missingName + ": " + ((Object)prefab).name)); } } } } private static void AddGrowUp(GameObject prefab, ZNetScene zNetScene, GrowConfig config) { //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Expected O, but got Unknown //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Expected O, but got Unknown if ((Object)(object)prefab == (Object)null || (Object)(object)zNetScene == (Object)null || config == null) { return; } Growup val = prefab.GetComponent(); if ((Object)(object)val == (Object)null) { val = prefab.AddComponent(); } val.m_growTime = config.GrowupTime; val.m_inheritTame = true; GameObject val2 = TamableService.FindPrefabInZnet(config.Primary, zNetScene); if ((Object)(object)val2 == (Object)null) { Debug.LogWarning((object)(Launch.projectName + ": grown prefab not found: " + config.Primary + " for " + ((Object)prefab).name)); } else if (!string.IsNullOrEmpty(config.Secondary)) { GameObject val3 = TamableService.FindPrefabInZnet(config.Secondary, zNetScene); if ((Object)(object)val3 == (Object)null) { Debug.LogWarning((object)(Launch.projectName + ": secondary grown prefab not found: " + config.Secondary + " for " + ((Object)prefab).name)); val.m_grownPrefab = val2; val.m_altGrownPrefabs = null; } else { val.m_grownPrefab = null; val.m_altGrownPrefabs = new List { new GrownEntry { m_weight = 0.5f, m_prefab = val2 }, new GrownEntry { m_weight = 0.5f, m_prefab = val3 } }; } } else { val.m_grownPrefab = val2; val.m_altGrownPrefabs = null; } } } public class LevelEffectGenerator { private readonly BaseLevelEffectSetupValue baseSetup = new BaseLevelEffectSetupValue(); public void CreateVisuals(LevelEffects levelEffects) { if (!((Object)(object)levelEffects == (Object)null)) { baseSetup.GetSetup(levelEffects); int num = levelEffects.m_levelSetups?.Count ?? 0; int num2 = Mathf.Max(0, 6 - num); for (int i = 0; i < num2; i++) { float delta = baseSetup.sumValue * (float)(i + 1); LevelSetup item = CreateSetup(delta, num2, i + 1); levelEffects.m_levelSetups.Add(item); } } } public LevelEffects CreateLevelEffectAt(Transform visual, SkinnedMeshRenderer meshRenderer) { if ((Object)(object)meshRenderer == (Object)null) { return null; } return InitLevelEffects(visual, meshRenderer); } public LevelEffects CreateLevelEffectComponent(Transform visual) { SkinnedMeshRenderer[] componentsInChildren = ((Component)visual).GetComponentsInChildren(); if (componentsInChildren.Length == 1) { return InitLevelEffects(visual, componentsInChildren[0]); } return null; } private LevelEffects InitLevelEffects(Transform visual, SkinnedMeshRenderer renderer) { LevelEffects val = ((Component)visual).gameObject.AddComponent(); val.m_mainRender = (Renderer)(object)renderer; Transform parent = visual.parent; val.m_character = (Character)(object)((parent != null) ? ((Component)parent).GetComponent() : null); return val; } private LevelSetup CreateSetup(float delta, int maxLevels, int level) { //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) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_002c: 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_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0071: 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_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Expected O, but got Unknown return new LevelSetup { m_scale = baseSetup.scale + delta, m_saturation = baseSetup.saturation + delta, m_hue = baseSetup.hue + delta, m_value = baseSetup.value + delta, m_enableObject = PickEnabledObject(maxLevels, level), m_setEmissiveColor = baseSetup.setEmissive, m_emissiveColor = new Color(baseSetup.emissive.r + delta, baseSetup.emissive.g + delta, baseSetup.emissive.b + delta, baseSetup.emissive.a) }; } private GameObject PickEnabledObject(int maxLevels, int level) { if (maxLevels >= 6) { if (level > 4) { return baseSetup.enabledObjectLevel3; } if (level > 2) { return baseSetup.enabledObjectLevel2; } } else if (maxLevels == 3) { if (level > 3) { return baseSetup.enabledObjectLevel3; } if (level > 2) { return baseSetup.enabledObjectLevel2; } } else { switch (level) { case 2: return baseSetup.enabledObjectLevel3; case 1: return baseSetup.enabledObjectLevel2; } } return baseSetup.enabledObject; } } public static class MonsterResistanceManager { private static readonly Dictionary _presets; static MonsterResistanceManager() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0050: 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_0086: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01e5: Unknown result type (might be due to invalid IL or missing references) //IL_0200: Unknown result type (might be due to invalid IL or missing references) //IL_021b: Unknown result type (might be due to invalid IL or missing references) //IL_0236: Unknown result type (might be due to invalid IL or missing references) //IL_0251: Unknown result type (might be due to invalid IL or missing references) //IL_026c: Unknown result type (might be due to invalid IL or missing references) //IL_0287: Unknown result type (might be due to invalid IL or missing references) //IL_02a2: Unknown result type (might be due to invalid IL or missing references) //IL_02bd: Unknown result type (might be due to invalid IL or missing references) //IL_02d8: Unknown result type (might be due to invalid IL or missing references) //IL_02f3: Unknown result type (might be due to invalid IL or missing references) //IL_030e: Unknown result type (might be due to invalid IL or missing references) //IL_0329: Unknown result type (might be due to invalid IL or missing references) //IL_0344: Unknown result type (might be due to invalid IL or missing references) //IL_035f: Unknown result type (might be due to invalid IL or missing references) //IL_037a: Unknown result type (might be due to invalid IL or missing references) //IL_0395: Unknown result type (might be due to invalid IL or missing references) //IL_03b0: Unknown result type (might be due to invalid IL or missing references) //IL_03cb: Unknown result type (might be due to invalid IL or missing references) //IL_03e6: Unknown result type (might be due to invalid IL or missing references) //IL_0401: Unknown result type (might be due to invalid IL or missing references) //IL_041c: Unknown result type (might be due to invalid IL or missing references) //IL_0437: Unknown result type (might be due to invalid IL or missing references) //IL_0452: Unknown result type (might be due to invalid IL or missing references) //IL_046d: Unknown result type (might be due to invalid IL or missing references) //IL_0488: Unknown result type (might be due to invalid IL or missing references) //IL_04a3: Unknown result type (might be due to invalid IL or missing references) //IL_04be: Unknown result type (might be due to invalid IL or missing references) //IL_04d9: Unknown result type (might be due to invalid IL or missing references) //IL_04f4: Unknown result type (might be due to invalid IL or missing references) //IL_050f: Unknown result type (might be due to invalid IL or missing references) //IL_052a: Unknown result type (might be due to invalid IL or missing references) //IL_0545: Unknown result type (might be due to invalid IL or missing references) //IL_0560: Unknown result type (might be due to invalid IL or missing references) //IL_057b: Unknown result type (might be due to invalid IL or missing references) //IL_0596: Unknown result type (might be due to invalid IL or missing references) //IL_05b1: Unknown result type (might be due to invalid IL or missing references) //IL_05cc: Unknown result type (might be due to invalid IL or missing references) //IL_05e7: Unknown result type (might be due to invalid IL or missing references) //IL_0602: Unknown result type (might be due to invalid IL or missing references) //IL_061d: Unknown result type (might be due to invalid IL or missing references) //IL_0638: Unknown result type (might be due to invalid IL or missing references) //IL_0653: Unknown result type (might be due to invalid IL or missing references) //IL_066e: Unknown result type (might be due to invalid IL or missing references) //IL_0689: Unknown result type (might be due to invalid IL or missing references) //IL_06a4: Unknown result type (might be due to invalid IL or missing references) //IL_06bf: Unknown result type (might be due to invalid IL or missing references) //IL_06da: Unknown result type (might be due to invalid IL or missing references) //IL_06f5: Unknown result type (might be due to invalid IL or missing references) //IL_0710: Unknown result type (might be due to invalid IL or missing references) //IL_072b: Unknown result type (might be due to invalid IL or missing references) //IL_0746: Unknown result type (might be due to invalid IL or missing references) //IL_0761: Unknown result type (might be due to invalid IL or missing references) //IL_077c: Unknown result type (might be due to invalid IL or missing references) //IL_0797: Unknown result type (might be due to invalid IL or missing references) //IL_07b2: Unknown result type (might be due to invalid IL or missing references) //IL_07cd: Unknown result type (might be due to invalid IL or missing references) //IL_07e8: Unknown result type (might be due to invalid IL or missing references) //IL_0803: Unknown result type (might be due to invalid IL or missing references) //IL_081e: Unknown result type (might be due to invalid IL or missing references) //IL_0839: Unknown result type (might be due to invalid IL or missing references) //IL_0854: Unknown result type (might be due to invalid IL or missing references) //IL_086f: Unknown result type (might be due to invalid IL or missing references) //IL_088a: Unknown result type (might be due to invalid IL or missing references) //IL_08a5: Unknown result type (might be due to invalid IL or missing references) //IL_08c0: Unknown result type (might be due to invalid IL or missing references) //IL_08db: Unknown result type (might be due to invalid IL or missing references) //IL_08f6: Unknown result type (might be due to invalid IL or missing references) //IL_0911: Unknown result type (might be due to invalid IL or missing references) //IL_092c: Unknown result type (might be due to invalid IL or missing references) //IL_0947: Unknown result type (might be due to invalid IL or missing references) //IL_0962: Unknown result type (might be due to invalid IL or missing references) //IL_097d: Unknown result type (might be due to invalid IL or missing references) //IL_0998: Unknown result type (might be due to invalid IL or missing references) //IL_09b3: Unknown result type (might be due to invalid IL or missing references) //IL_09ce: Unknown result type (might be due to invalid IL or missing references) //IL_09e9: Unknown result type (might be due to invalid IL or missing references) //IL_0a04: Unknown result type (might be due to invalid IL or missing references) //IL_0a1f: Unknown result type (might be due to invalid IL or missing references) //IL_0a3a: Unknown result type (might be due to invalid IL or missing references) //IL_0a55: Unknown result type (might be due to invalid IL or missing references) //IL_0a70: Unknown result type (might be due to invalid IL or missing references) //IL_0a8b: Unknown result type (might be due to invalid IL or missing references) //IL_0aa6: Unknown result type (might be due to invalid IL or missing references) //IL_0ac1: Unknown result type (might be due to invalid IL or missing references) //IL_0adc: Unknown result type (might be due to invalid IL or missing references) //IL_0af7: Unknown result type (might be due to invalid IL or missing references) //IL_0b12: Unknown result type (might be due to invalid IL or missing references) //IL_0b2d: Unknown result type (might be due to invalid IL or missing references) //IL_0b48: Unknown result type (might be due to invalid IL or missing references) //IL_0b63: Unknown result type (might be due to invalid IL or missing references) //IL_0b7e: Unknown result type (might be due to invalid IL or missing references) //IL_0b99: Unknown result type (might be due to invalid IL or missing references) //IL_0bb4: Unknown result type (might be due to invalid IL or missing references) //IL_0bcf: Unknown result type (might be due to invalid IL or missing references) //IL_0bea: Unknown result type (might be due to invalid IL or missing references) //IL_0c05: Unknown result type (might be due to invalid IL or missing references) //IL_0c20: Unknown result type (might be due to invalid IL or missing references) //IL_0c3b: Unknown result type (might be due to invalid IL or missing references) //IL_0c56: Unknown result type (might be due to invalid IL or missing references) //IL_0c71: Unknown result type (might be due to invalid IL or missing references) //IL_0c8c: Unknown result type (might be due to invalid IL or missing references) //IL_0ca7: Unknown result type (might be due to invalid IL or missing references) //IL_0cc2: Unknown result type (might be due to invalid IL or missing references) //IL_0cdd: Unknown result type (might be due to invalid IL or missing references) //IL_0cf8: Unknown result type (might be due to invalid IL or missing references) //IL_0d13: Unknown result type (might be due to invalid IL or missing references) //IL_0d2e: Unknown result type (might be due to invalid IL or missing references) //IL_0d49: Unknown result type (might be due to invalid IL or missing references) //IL_0d64: Unknown result type (might be due to invalid IL or missing references) //IL_0d7f: Unknown result type (might be due to invalid IL or missing references) //IL_0d9a: Unknown result type (might be due to invalid IL or missing references) //IL_0db5: Unknown result type (might be due to invalid IL or missing references) //IL_0dd0: Unknown result type (might be due to invalid IL or missing references) //IL_0deb: Unknown result type (might be due to invalid IL or missing references) //IL_0e06: Unknown result type (might be due to invalid IL or missing references) //IL_0e21: Unknown result type (might be due to invalid IL or missing references) //IL_0e3c: Unknown result type (might be due to invalid IL or missing references) //IL_0e57: Unknown result type (might be due to invalid IL or missing references) //IL_0e72: Unknown result type (might be due to invalid IL or missing references) //IL_0e8d: Unknown result type (might be due to invalid IL or missing references) //IL_0ea8: Unknown result type (might be due to invalid IL or missing references) //IL_0ec3: Unknown result type (might be due to invalid IL or missing references) //IL_0ede: Unknown result type (might be due to invalid IL or missing references) //IL_0ef9: Unknown result type (might be due to invalid IL or missing references) //IL_0f14: Unknown result type (might be due to invalid IL or missing references) //IL_0f2f: Unknown result type (might be due to invalid IL or missing references) //IL_0f4a: Unknown result type (might be due to invalid IL or missing references) //IL_0f65: Unknown result type (might be due to invalid IL or missing references) //IL_0f80: Unknown result type (might be due to invalid IL or missing references) //IL_0f9b: Unknown result type (might be due to invalid IL or missing references) //IL_0fb6: Unknown result type (might be due to invalid IL or missing references) //IL_0fd1: Unknown result type (might be due to invalid IL or missing references) //IL_0fec: Unknown result type (might be due to invalid IL or missing references) //IL_1007: Unknown result type (might be due to invalid IL or missing references) //IL_1022: Unknown result type (might be due to invalid IL or missing references) //IL_103d: Unknown result type (might be due to invalid IL or missing references) //IL_1058: Unknown result type (might be due to invalid IL or missing references) //IL_1073: Unknown result type (might be due to invalid IL or missing references) //IL_108e: Unknown result type (might be due to invalid IL or missing references) //IL_10a9: Unknown result type (might be due to invalid IL or missing references) //IL_10c4: Unknown result type (might be due to invalid IL or missing references) //IL_10e7: Unknown result type (might be due to invalid IL or missing references) //IL_1112: Unknown result type (might be due to invalid IL or missing references) //IL_1135: Unknown result type (might be due to invalid IL or missing references) //IL_1168: Unknown result type (might be due to invalid IL or missing references) //IL_118b: Unknown result type (might be due to invalid IL or missing references) //IL_11ae: Unknown result type (might be due to invalid IL or missing references) //IL_11d1: Unknown result type (might be due to invalid IL or missing references) //IL_11f4: Unknown result type (might be due to invalid IL or missing references) //IL_1217: Unknown result type (might be due to invalid IL or missing references) //IL_123a: Unknown result type (might be due to invalid IL or missing references) //IL_126d: Unknown result type (might be due to invalid IL or missing references) //IL_144b: Unknown result type (might be due to invalid IL or missing references) //IL_15cf: Unknown result type (might be due to invalid IL or missing references) //IL_16f9: Unknown result type (might be due to invalid IL or missing references) //IL_18ce: Unknown result type (might be due to invalid IL or missing references) //IL_1932: Unknown result type (might be due to invalid IL or missing references) //IL_19d5: Unknown result type (might be due to invalid IL or missing references) //IL_1b1a: Unknown result type (might be due to invalid IL or missing references) //IL_1b45: Unknown result type (might be due to invalid IL or missing references) //IL_1b95: Unknown result type (might be due to invalid IL or missing references) //IL_1baf: Unknown result type (might be due to invalid IL or missing references) //IL_1bc9: Unknown result type (might be due to invalid IL or missing references) //IL_1be3: Unknown result type (might be due to invalid IL or missing references) //IL_1bfd: Unknown result type (might be due to invalid IL or missing references) //IL_1c17: Unknown result type (might be due to invalid IL or missing references) //IL_1c2c: Unknown result type (might be due to invalid IL or missing references) //IL_1c57: Unknown result type (might be due to invalid IL or missing references) //IL_1c87: Unknown result type (might be due to invalid IL or missing references) //IL_1ca1: Unknown result type (might be due to invalid IL or missing references) //IL_1cbb: Unknown result type (might be due to invalid IL or missing references) //IL_1cd0: Unknown result type (might be due to invalid IL or missing references) //IL_1cfb: Unknown result type (might be due to invalid IL or missing references) //IL_1d1e: Unknown result type (might be due to invalid IL or missing references) //IL_1d46: Unknown result type (might be due to invalid IL or missing references) //IL_1d5b: Unknown result type (might be due to invalid IL or missing references) //IL_1d86: Unknown result type (might be due to invalid IL or missing references) //IL_1dbe: Unknown result type (might be due to invalid IL or missing references) //IL_1dd8: Unknown result type (might be due to invalid IL or missing references) //IL_1df2: Unknown result type (might be due to invalid IL or missing references) //IL_1e0c: Unknown result type (might be due to invalid IL or missing references) //IL_1e26: Unknown result type (might be due to invalid IL or missing references) //IL_1e40: Unknown result type (might be due to invalid IL or missing references) //IL_1e5a: Unknown result type (might be due to invalid IL or missing references) //IL_1e74: Unknown result type (might be due to invalid IL or missing references) //IL_1e8e: Unknown result type (might be due to invalid IL or missing references) //IL_1ea8: Unknown result type (might be due to invalid IL or missing references) //IL_1ec2: Unknown result type (might be due to invalid IL or missing references) //IL_1edc: Unknown result type (might be due to invalid IL or missing references) _presets = new Dictionary(StringComparer.OrdinalIgnoreCase) { { "FrostbjornBrown_bal", CreateModifiers((DamageModifier)1, (DamageModifier)0, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)3, (DamageModifier)2, (DamageModifier)8, (DamageModifier)5) }, { "MossRootStatic_bal", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)0, (DamageModifier)2, (DamageModifier)4, (DamageModifier)2, (DamageModifier)0, (DamageModifier)2, (DamageModifier)1, (DamageModifier)7) }, { "FrostDrake_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)5, (DamageModifier)1, (DamageModifier)0, (DamageModifier)1) }, { "WildWisp_bal", CreateModifiers((DamageModifier)1, (DamageModifier)1, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)2, (DamageModifier)2, (DamageModifier)5, (DamageModifier)5) }, { "CorpseCollector_bal", CreateModifiers((DamageModifier)0, (DamageModifier)1, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)8, (DamageModifier)8, (DamageModifier)3, (DamageModifier)2) }, { "CrabSea_bal", CreateModifiers((DamageModifier)0, (DamageModifier)1, (DamageModifier)1, (DamageModifier)4, (DamageModifier)2, (DamageModifier)0, (DamageModifier)2, (DamageModifier)2, (DamageModifier)8, (DamageModifier)5) }, { "CrabForest_bal", CreateModifiers((DamageModifier)0, (DamageModifier)1, (DamageModifier)1, (DamageModifier)4, (DamageModifier)2, (DamageModifier)2, (DamageModifier)0, (DamageModifier)2, (DamageModifier)5, (DamageModifier)5) }, { "CrabStone_bal", CreateModifiers((DamageModifier)0, (DamageModifier)1, (DamageModifier)1, (DamageModifier)4, (DamageModifier)2, (DamageModifier)2, (DamageModifier)5, (DamageModifier)2, (DamageModifier)0, (DamageModifier)5) }, { "Ashdrake_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)3, (DamageModifier)2, (DamageModifier)0, (DamageModifier)8, (DamageModifier)0) }, { "Stormdrake_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)5, (DamageModifier)3, (DamageModifier)8, (DamageModifier)0) }, { "Forsaken_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)7, (DamageModifier)1, (DamageModifier)3, (DamageModifier)2) }, { "Bjorn", CreateModifiers((DamageModifier)1, (DamageModifier)0, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)1, (DamageModifier)2, (DamageModifier)8, (DamageModifier)5) }, { "Unbjorn", CreateModifiers((DamageModifier)1, (DamageModifier)0, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)1, (DamageModifier)2, (DamageModifier)3, (DamageModifier)2) }, { "Fox_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)1, (DamageModifier)2, (DamageModifier)1, (DamageModifier)5) }, { "LostSoul_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)2, (DamageModifier)2, (DamageModifier)3, (DamageModifier)5) }, { "Troll", CreateModifiers((DamageModifier)1, (DamageModifier)0, (DamageModifier)2, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)5, (DamageModifier)1, (DamageModifier)7, (DamageModifier)5) }, { "Troll_ru", CreateModifiers((DamageModifier)1, (DamageModifier)0, (DamageModifier)2, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)5, (DamageModifier)1, (DamageModifier)7, (DamageModifier)5) }, { "TrollOutcast_bal", CreateModifiers((DamageModifier)1, (DamageModifier)0, (DamageModifier)2, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)5, (DamageModifier)1, (DamageModifier)7, (DamageModifier)5) }, { "TrollBrute_bal", CreateModifiers((DamageModifier)1, (DamageModifier)0, (DamageModifier)2, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)5, (DamageModifier)1, (DamageModifier)7, (DamageModifier)5) }, { "TrollUndead_bal", CreateModifiers((DamageModifier)2, (DamageModifier)0, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)0, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2) }, { "TrollAshlands", CreateModifiers((DamageModifier)8, (DamageModifier)0, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)3, (DamageModifier)2, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2) }, { "Greydwarf_Frozen_bal", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)3, (DamageModifier)0, (DamageModifier)5, (DamageModifier)7) }, { "Greydwarf_Scorched_bal", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)3, (DamageModifier)2, (DamageModifier)0, (DamageModifier)5, (DamageModifier)7) }, { "goblin_skeleton_bal", CreateModifiers((DamageModifier)8, (DamageModifier)0, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)7, (DamageModifier)7, (DamageModifier)3, (DamageModifier)2) }, { "Stag_bal", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0) }, { "StagGhost_bal", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)3, (DamageModifier)0, (DamageModifier)0, (DamageModifier)3, (DamageModifier)5) }, { "Habrok_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)8, (DamageModifier)8, (DamageModifier)8, (DamageModifier)0) }, { "HabrokBirb_bal", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)8, (DamageModifier)8, (DamageModifier)8, (DamageModifier)1) }, { "GiantCrow_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)8, (DamageModifier)8, (DamageModifier)0, (DamageModifier)1) }, { "GoatKid_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)7, (DamageModifier)2, (DamageModifier)0, (DamageModifier)7) }, { "NeckTadpole_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)0, (DamageModifier)2, (DamageModifier)5, (DamageModifier)7) }, { "Doe_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)0, (DamageModifier)2, (DamageModifier)0, (DamageModifier)7) }, { "NeckBrute_bal", CreateModifiers((DamageModifier)7, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)0, (DamageModifier)2, (DamageModifier)5, (DamageModifier)1) }, { "Goleming_bal", CreateModifiers((DamageModifier)2, (DamageModifier)7, (DamageModifier)5, (DamageModifier)4, (DamageModifier)2, (DamageModifier)5, (DamageModifier)5, (DamageModifier)0, (DamageModifier)3, (DamageModifier)5) }, { "Penguin_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)5, (DamageModifier)0, (DamageModifier)0, (DamageModifier)5) }, { "Goat_bal", CreateModifiers((DamageModifier)1, (DamageModifier)7, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)5, (DamageModifier)0, (DamageModifier)0, (DamageModifier)5) }, { "Moth_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)2, (DamageModifier)0, (DamageModifier)1, (DamageModifier)7) }, { "DarkBat_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)5, (DamageModifier)0, (DamageModifier)3, (DamageModifier)5) }, { "Skeleton_Hildir", CreateModifiers((DamageModifier)8, (DamageModifier)0, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)3, (DamageModifier)7, (DamageModifier)7, (DamageModifier)3, (DamageModifier)2) }, { "GoblinShaman_Hildir", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)7, (DamageModifier)7, (DamageModifier)1, (DamageModifier)5) }, { "Fenring_Cultist_Hildir", CreateModifiers((DamageModifier)0, (DamageModifier)7, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)2, (DamageModifier)0, (DamageModifier)0, (DamageModifier)1) }, { "Skeleton_Hildir_nochest", CreateModifiers((DamageModifier)8, (DamageModifier)0, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)3, (DamageModifier)7, (DamageModifier)7, (DamageModifier)3, (DamageModifier)2) }, { "GoblinBruteBros_nochest", CreateModifiers((DamageModifier)7, (DamageModifier)1, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)5) }, { "GoblinShaman_Hildir_nochest", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)7, (DamageModifier)7, (DamageModifier)1, (DamageModifier)5) }, { "GoblinBrute_Hildir", CreateModifiers((DamageModifier)7, (DamageModifier)1, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)5) }, { "Fenring_Cultist_Hildir_nochest", CreateModifiers((DamageModifier)0, (DamageModifier)7, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)2, (DamageModifier)0, (DamageModifier)0, (DamageModifier)1) }, { "Abomination", CreateModifiers((DamageModifier)1, (DamageModifier)2, (DamageModifier)1, (DamageModifier)2, (DamageModifier)4, (DamageModifier)6, (DamageModifier)7, (DamageModifier)2, (DamageModifier)3, (DamageModifier)0) }, { "Hare", CreateModifiers((DamageModifier)7, (DamageModifier)8, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)7, (DamageModifier)7, (DamageModifier)0, (DamageModifier)5) }, { "Leech", CreateModifiers((DamageModifier)7, (DamageModifier)8, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)5, (DamageModifier)2, (DamageModifier)2, (DamageModifier)3, (DamageModifier)1) }, { "Charred_Archer", CreateModifiers((DamageModifier)2, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)2, (DamageModifier)7, (DamageModifier)3, (DamageModifier)2) }, { "Charred_Melee", CreateModifiers((DamageModifier)2, (DamageModifier)7, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)2, (DamageModifier)1, (DamageModifier)3, (DamageModifier)2) }, { "Charred_Mage", CreateModifiers((DamageModifier)2, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)2, (DamageModifier)7, (DamageModifier)3, (DamageModifier)8) }, { "Charred_Twitcher", CreateModifiers((DamageModifier)2, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)2, (DamageModifier)7, (DamageModifier)3, (DamageModifier)2) }, { "Surtling", CreateModifiers((DamageModifier)0, (DamageModifier)7, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)3, (DamageModifier)2, (DamageModifier)1, (DamageModifier)7, (DamageModifier)0) }, { "Dragon", CreateModifiers((DamageModifier)0, (DamageModifier)7, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)3, (DamageModifier)7, (DamageModifier)8, (DamageModifier)7) }, { "GoblinKing", CreateModifiers((DamageModifier)2, (DamageModifier)0, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)7, (DamageModifier)7, (DamageModifier)3, (DamageModifier)8) }, { "GoblinBrute", CreateModifiers((DamageModifier)7, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)8) }, { "GoblinShaman", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)7, (DamageModifier)7, (DamageModifier)7, (DamageModifier)7) }, { "Goblin", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0) }, { "Draugr_Elite", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)7, (DamageModifier)7, (DamageModifier)3, (DamageModifier)2) }, { "DraugrArcher", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)0, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2) }, { "Draugr_Ranged", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)0, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2) }, { "Draugr_Archer", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)0, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2) }, { "Draugr", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)0, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2) }, { "Skeleton_Poison", CreateModifiers((DamageModifier)2, (DamageModifier)8, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)7, (DamageModifier)7, (DamageModifier)3, (DamageModifier)2) }, { "Skeleton", CreateModifiers((DamageModifier)2, (DamageModifier)8, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)7, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2) }, { "Skeleton_NoArcher", CreateModifiers((DamageModifier)2, (DamageModifier)8, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)1, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2) }, { "gd_king", CreateModifiers((DamageModifier)1, (DamageModifier)8, (DamageModifier)7, (DamageModifier)2, (DamageModifier)4, (DamageModifier)2, (DamageModifier)7, (DamageModifier)8, (DamageModifier)5, (DamageModifier)5) }, { "MossRoot_bal", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)0, (DamageModifier)2, (DamageModifier)4, (DamageModifier)2, (DamageModifier)0, (DamageModifier)2, (DamageModifier)1, (DamageModifier)7) }, { "Greydwarf_Crusher_bal", CreateModifiers((DamageModifier)7, (DamageModifier)8, (DamageModifier)7, (DamageModifier)2, (DamageModifier)4, (DamageModifier)2, (DamageModifier)7, (DamageModifier)8, (DamageModifier)5, (DamageModifier)5) }, { "Greydwarf_Moss_bal", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)7, (DamageModifier)2, (DamageModifier)4, (DamageModifier)2, (DamageModifier)7, (DamageModifier)8, (DamageModifier)5, (DamageModifier)5) }, { "GreylingBeeKeeper_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)2, (DamageModifier)4, (DamageModifier)2, (DamageModifier)0, (DamageModifier)2, (DamageModifier)1, (DamageModifier)7) }, { "GreylingElite_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)2, (DamageModifier)4, (DamageModifier)2, (DamageModifier)0, (DamageModifier)2, (DamageModifier)7, (DamageModifier)7) }, { "Greydwarf_Elite", CreateModifiers((DamageModifier)7, (DamageModifier)8, (DamageModifier)7, (DamageModifier)2, (DamageModifier)4, (DamageModifier)2, (DamageModifier)7, (DamageModifier)8, (DamageModifier)5, (DamageModifier)5) }, { "Greyling", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)0, (DamageModifier)2, (DamageModifier)4, (DamageModifier)2, (DamageModifier)0, (DamageModifier)2, (DamageModifier)7, (DamageModifier)7) }, { "Greydwarf", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)7, (DamageModifier)2, (DamageModifier)4, (DamageModifier)2, (DamageModifier)7, (DamageModifier)2, (DamageModifier)1, (DamageModifier)1) }, { "Greydwarf_Shaman", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)7, (DamageModifier)2, (DamageModifier)4, (DamageModifier)2, (DamageModifier)7, (DamageModifier)8, (DamageModifier)5, (DamageModifier)5) }, { "Deer", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0) }, { "Hatchling", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)5, (DamageModifier)1, (DamageModifier)0, (DamageModifier)1) }, { "BlobElite", CreateModifiers((DamageModifier)2, (DamageModifier)1, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)8, (DamageModifier)8, (DamageModifier)3, (DamageModifier)0) }, { "Blob", CreateModifiers((DamageModifier)2, (DamageModifier)1, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)2, (DamageModifier)2, (DamageModifier)3, (DamageModifier)8) }, { "DvergerMage", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)1, (DamageModifier)1, (DamageModifier)7, (DamageModifier)5) }, { "DvergerMageFire", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)7, (DamageModifier)1, (DamageModifier)7, (DamageModifier)5) }, { "DvergerMageIce", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)1, (DamageModifier)7, (DamageModifier)7, (DamageModifier)5) }, { "DvergerMageSupport", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)7, (DamageModifier)7, (DamageModifier)1, (DamageModifier)5) }, { "Dverger", CreateModifiers((DamageModifier)0, (DamageModifier)7, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)7, (DamageModifier)7, (DamageModifier)7, (DamageModifier)5) }, { "Tick", CreateModifiers((DamageModifier)2, (DamageModifier)7, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)2, (DamageModifier)2, (DamageModifier)7, (DamageModifier)7) }, { "SeekerBrood", CreateModifiers((DamageModifier)2, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)2, (DamageModifier)2, (DamageModifier)7, (DamageModifier)0) }, { "SeekerBrute", CreateModifiers((DamageModifier)2, (DamageModifier)0, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)8, (DamageModifier)8, (DamageModifier)1, (DamageModifier)1) }, { "Seeker", CreateModifiers((DamageModifier)2, (DamageModifier)0, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)8, (DamageModifier)8, (DamageModifier)1, (DamageModifier)7) }, { "SeekerQueen", CreateModifiers((DamageModifier)2, (DamageModifier)7, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)8, (DamageModifier)8, (DamageModifier)5, (DamageModifier)5) }, { "Bonemass", CreateModifiers((DamageModifier)0, (DamageModifier)1, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)0, (DamageModifier)8, (DamageModifier)3, (DamageModifier)2) }, { "Eikthyr", CreateModifiers((DamageModifier)7, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)7, (DamageModifier)3, (DamageModifier)1, (DamageModifier)5) }, { "Neck", CreateModifiers((DamageModifier)0, (DamageModifier)7, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)1, (DamageModifier)2, (DamageModifier)3, (DamageModifier)7) }, { "BattleHog_bal", CreateModifiers((DamageModifier)1, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)1, (DamageModifier)2, (DamageModifier)1, (DamageModifier)1) }, { "Hog_bal", CreateModifiers((DamageModifier)1, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)1, (DamageModifier)2, (DamageModifier)1, (DamageModifier)1) }, { "Boar_piggy", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)7, (DamageModifier)2, (DamageModifier)0, (DamageModifier)7) }, { "Boar", CreateModifiers((DamageModifier)1, (DamageModifier)0, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)7, (DamageModifier)2, (DamageModifier)1, (DamageModifier)7) }, { "Spectre_bal", CreateModifiers((DamageModifier)7, (DamageModifier)0, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)1, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2) }, { "GhostYagluth_bal", CreateModifiers((DamageModifier)7, (DamageModifier)0, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)1, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2) }, { "Wraith", CreateModifiers((DamageModifier)7, (DamageModifier)0, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)1, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2) }, { "Disir_bal", CreateModifiers((DamageModifier)7, (DamageModifier)0, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)1, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2) }, { "Haugbui_bal", CreateModifiers((DamageModifier)7, (DamageModifier)0, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)1, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2) }, { "Ghost", CreateModifiers((DamageModifier)1, (DamageModifier)1, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)1, (DamageModifier)2, (DamageModifier)3, (DamageModifier)6) }, { "Fenring_Brute_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)5, (DamageModifier)2, (DamageModifier)7, (DamageModifier)1) }, { "Ulv", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)5, (DamageModifier)2, (DamageModifier)7, (DamageModifier)0) }, { "Fenring", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)5, (DamageModifier)2, (DamageModifier)7, (DamageModifier)7) }, { "Fenring_Cultist", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)5, (DamageModifier)0, (DamageModifier)7, (DamageModifier)1) }, { "Bat", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)5, (DamageModifier)0, (DamageModifier)5, (DamageModifier)5) }, { "Serpent", CreateModifiers((DamageModifier)7, (DamageModifier)8, (DamageModifier)8, (DamageModifier)4, (DamageModifier)1, (DamageModifier)5, (DamageModifier)2, (DamageModifier)2, (DamageModifier)5, (DamageModifier)1) }, { "Serpentling_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)5, (DamageModifier)2, (DamageModifier)0, (DamageModifier)1, (DamageModifier)5) }, { "BonemawSerpent", CreateModifiers((DamageModifier)8, (DamageModifier)8, (DamageModifier)7, (DamageModifier)4, (DamageModifier)1, (DamageModifier)3, (DamageModifier)2, (DamageModifier)2, (DamageModifier)5, (DamageModifier)1) }, { "Shark_bal", CreateModifiers((DamageModifier)7, (DamageModifier)7, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)5, (DamageModifier)2, (DamageModifier)2, (DamageModifier)1, (DamageModifier)5) }, { "Ell_bal", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)8, (DamageModifier)3, (DamageModifier)1, (DamageModifier)5) }, { "LeechPrimal_bal", CreateModifiers((DamageModifier)7, (DamageModifier)8, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)5, (DamageModifier)2, (DamageModifier)2, (DamageModifier)3, (DamageModifier)1) }, { "BlobLava_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)3, (DamageModifier)2, (DamageModifier)0, (DamageModifier)1, (DamageModifier)5) }, { "AshboneGiant_bal", CreateModifiers((DamageModifier)2, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)0, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2) }, { "MossGolem_bal", CreateModifiers((DamageModifier)2, (DamageModifier)1, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)0, (DamageModifier)0, (DamageModifier)3, (DamageModifier)5) }, { "Bloodling_bal", CreateModifiers((DamageModifier)0, (DamageModifier)1, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)8, (DamageModifier)8, (DamageModifier)8, (DamageModifier)0) }, { "Yotun_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)5, (DamageModifier)5, (DamageModifier)8, (DamageModifier)8) }, { "YotunWarrior_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)5, (DamageModifier)5, (DamageModifier)8, (DamageModifier)8) }, { "Kelpie_bal", CreateModifiers((DamageModifier)7, (DamageModifier)0, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)5, (DamageModifier)3, (DamageModifier)8, (DamageModifier)7, (DamageModifier)8) }, { "Deathsquito", CreateModifiers((DamageModifier)2, (DamageModifier)7, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)2, (DamageModifier)2, (DamageModifier)7, (DamageModifier)7) }, { "BlobTar", CreateModifiers((DamageModifier)2, (DamageModifier)1, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)7, (DamageModifier)8, (DamageModifier)3, (DamageModifier)8) }, { "BogWitchKvastur", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)0, (DamageModifier)8, (DamageModifier)1, (DamageModifier)7) }, { "Fader", CreateModifiers((DamageModifier)2, (DamageModifier)7, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)3, (DamageModifier)2, (DamageModifier)1, (DamageModifier)3, (DamageModifier)2) }, { "FallenValkyrie", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)3, (DamageModifier)7, (DamageModifier)8, (DamageModifier)0, (DamageModifier)1) }, { "Gjall", CreateModifiers((DamageModifier)2, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)8, (DamageModifier)8, (DamageModifier)1, (DamageModifier)1) }, { "Mistile", CreateModifiers((DamageModifier)0, (DamageModifier)7, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)8, (DamageModifier)0, (DamageModifier)1, (DamageModifier)7) }, { "Volture", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)8, (DamageModifier)8, (DamageModifier)8, (DamageModifier)1) }, { "Chicken", CreateModifiers((DamageModifier)7, (DamageModifier)8, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)7, (DamageModifier)7, (DamageModifier)0, (DamageModifier)5) }, { "Hen", CreateModifiers((DamageModifier)7, (DamageModifier)8, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)7, (DamageModifier)7, (DamageModifier)0, (DamageModifier)5) }, { "Lox", CreateModifiers((DamageModifier)1, (DamageModifier)0, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)7, (DamageModifier)2, (DamageModifier)1, (DamageModifier)7) }, { "Lox_Calf", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)7, (DamageModifier)2, (DamageModifier)0, (DamageModifier)7) }, { "Wolf", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)5, (DamageModifier)2, (DamageModifier)7, (DamageModifier)0) }, { "Wolf_cub", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)1, (DamageModifier)2, (DamageModifier)0, (DamageModifier)5) }, { "piece_TrainingDummy", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)5) }, { "TrainingDummy", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)5) }, { "Player", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0) }, { "Hive", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)0, (DamageModifier)0, (DamageModifier)1, (DamageModifier)5) }, { "TheHive", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)5) }, { "GoblinArcher", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0) }, { "GoblinBruteBros", CreateModifiers((DamageModifier)7, (DamageModifier)1, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)5) }, { "TentaRoot", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)0, (DamageModifier)2, (DamageModifier)4, (DamageModifier)2, (DamageModifier)0, (DamageModifier)2, (DamageModifier)1, (DamageModifier)7) }, { "tentacle_plant_bal", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)0, (DamageModifier)2, (DamageModifier)4, (DamageModifier)2, (DamageModifier)0, (DamageModifier)2, (DamageModifier)1, (DamageModifier)7) }, { "staff_greenroots_tentaroot", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)0, (DamageModifier)2, (DamageModifier)4, (DamageModifier)2, (DamageModifier)0, (DamageModifier)2, (DamageModifier)1, (DamageModifier)7) }, { "Asksvin", CreateModifiers((DamageModifier)7, (DamageModifier)7, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)2, (DamageModifier)0, (DamageModifier)7, (DamageModifier)5) }, { "Asksvin_hatchling", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)2, (DamageModifier)0, (DamageModifier)0, (DamageModifier)5) }, { "Morgen", CreateModifiers((DamageModifier)2, (DamageModifier)0, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)0, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2) }, { "Morgen_NonSleeping", CreateModifiers((DamageModifier)2, (DamageModifier)0, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)0, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2) }, { "AshlandsGolem_bal", CreateModifiers((DamageModifier)2, (DamageModifier)7, (DamageModifier)5, (DamageModifier)4, (DamageModifier)2, (DamageModifier)1, (DamageModifier)2, (DamageModifier)0, (DamageModifier)3, (DamageModifier)5) }, { "LeechLarva_bal", CreateModifiers((DamageModifier)7, (DamageModifier)8, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)5, (DamageModifier)2, (DamageModifier)2, (DamageModifier)3, (DamageModifier)5) }, { "BjornCub_bal", CreateModifiers((DamageModifier)1, (DamageModifier)0, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)1, (DamageModifier)2, (DamageModifier)8, (DamageModifier)5) }, { "Frostbjorn_bal", CreateModifiers((DamageModifier)1, (DamageModifier)0, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)3, (DamageModifier)2, (DamageModifier)8, (DamageModifier)5) }, { "Fox_cub_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)1, (DamageModifier)2, (DamageModifier)1, (DamageModifier)5) }, { "PolarBear_bal", CreateModifiers((DamageModifier)1, (DamageModifier)0, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)3, (DamageModifier)2, (DamageModifier)8, (DamageModifier)5) }, { "VoltureNestling_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)8, (DamageModifier)8, (DamageModifier)8, (DamageModifier)1) }, { "CrowNestling_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)8, (DamageModifier)8, (DamageModifier)8, (DamageModifier)1) } }; AddPresets(CreateModifiers((DamageModifier)2, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)2, (DamageModifier)7, (DamageModifier)3, (DamageModifier)2), "Charred_Archer_Fader"); AddPresets(CreateModifiers((DamageModifier)2, (DamageModifier)7, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)2, (DamageModifier)1, (DamageModifier)3, (DamageModifier)2), "Charred_Melee_Dyrnwyn", "Charred_Melee_Fader"); AddPresets(CreateModifiers((DamageModifier)2, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)2, (DamageModifier)7, (DamageModifier)3, (DamageModifier)2), "Charred_Twitcher_Summoned"); AddPresets(CreateModifiers((DamageModifier)0, (DamageModifier)7, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)7, (DamageModifier)7, (DamageModifier)7, (DamageModifier)5), "DvergerAshlands", "DvergerTest", "Dverger_event"); AddPresets(CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)1, (DamageModifier)1, (DamageModifier)7, (DamageModifier)5), "DvergerMage_event"); AddPresets(CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)7, (DamageModifier)1, (DamageModifier)7, (DamageModifier)5), "DvergerMageFire_event"); AddPresets(CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)1, (DamageModifier)7, (DamageModifier)7, (DamageModifier)5), "DvergerMageIce_event"); AddPresets(CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)7, (DamageModifier)7, (DamageModifier)1, (DamageModifier)5), "DvergerMageSupport_event"); AddPresets(CreateModifiers((DamageModifier)1, (DamageModifier)0, (DamageModifier)2, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)5, (DamageModifier)1, (DamageModifier)3, (DamageModifier)5), "Troll_Summoned"); AddPresets(CreateModifiers((DamageModifier)7, (DamageModifier)8, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)5, (DamageModifier)2, (DamageModifier)2, (DamageModifier)3, (DamageModifier)1), "Leech_cave"); AddPresets(CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)0, (DamageModifier)2, (DamageModifier)4, (DamageModifier)2, (DamageModifier)0, (DamageModifier)2, (DamageModifier)1, (DamageModifier)7), "TentaRoot", "tentacle_plant_bal", "staff_greenroots_tentaroot"); AddPresets(CreateModifiers((DamageModifier)2, (DamageModifier)8, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)7, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2), "Skeleton_Friendly", "Skeleton_Variant_Guardian", "Skeleton_Variant_Protector", "Skeleton_Variant_Vanguard", "Skeleton_Variant_Defender", "Skeleton_Variant_Sentry", "Skeleton_Variant_Warden", "Skeleton_Variant_Archer", "Skeleton_Variant_Firestarter", "Skeleton_Variant_Sharpshooter", "Skeleton_Variant_Coldblood", "Skeleton_Variant_Soulpiercer", "Skeleton_Variant_Hunter", "Skeleton_Variant_Assassin", "Skeleton_Variant_Cutthroat", "Skeleton_Variant_Brute", "Skeleton_Variant_Duelist", "Skeleton_Variant_Berserker", "Skeleton_Variant_Bonebreaker", "Skeleton_Variant_Swordmaster", "Skeleton_Variant_Executioner", "Skeleton_Variant_Marauder", "Skeleton_Variant_Mercenary", "Skeleton_Variant_Fighter", "Skeleton_Variant_Warrior", "Skeleton_Variant_Bruiser", "Skeleton_Variant_Solider", "Skeleton_Variant_Thug", "Skeleton_Variant_Scout", "Skeleton_Variant_Savage", "Skeleton_Variant_Pugilist", "Skeleton_Variant_Corsair", "Skeleton_Variant_Sailor", "Skeleton_Variant_Stabber", "Skeleton_Variant_Thief", "Skeleton_Variant_Lightbringer", "Skeleton_Variant_Reaper", "Skeleton_Variant_Frozenhammer", "Skeleton_Variant_Icecrusher", "Skeleton_Variant_Soulshreder", "Skeleton_Variant_Blackblade", "Skeleton_Variant_Soulcalibur", "Skeleton_Variant_Splasher", "Skeleton_Variant_Pyromancer", "Skeleton_Variant_Cryomancer", "Skeleton_Variant_Thundercaller", "Skeleton_Variant_Venomancer", "Skeleton_Variant_Cultist", "Skeleton_Variant_Mage", "Skeleton_Variant_Cleric", "Skeleton_Variant_Reaver"); AddPresets(CreateModifiers((DamageModifier)2, (DamageModifier)8, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)1, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2), "Skeleton_NoArcher_Variant_Guardian", "Skeleton_NoArcher_Variant_Protector", "Skeleton_NoArcher_Variant_Vanguard", "Skeleton_NoArcher_Variant_Defender", "Skeleton_NoArcher_Variant_Sentry", "Skeleton_NoArcher_Variant_Warden", "Skeleton_NoArcher_Variant_Hunter", "Skeleton_NoArcher_Variant_Assassin", "Skeleton_NoArcher_Variant_Cutthroat", "Skeleton_NoArcher_Variant_Brute", "Skeleton_NoArcher_Variant_Duelist", "Skeleton_NoArcher_Variant_Berserker", "Skeleton_NoArcher_Variant_Bonebreaker", "Skeleton_NoArcher_Variant_Swordmaster", "Skeleton_NoArcher_Variant_Executioner", "Skeleton_NoArcher_Variant_Marauder", "Skeleton_NoArcher_Variant_Mercenary", "Skeleton_NoArcher_Variant_Fighter", "Skeleton_NoArcher_Variant_Warrior", "Skeleton_NoArcher_Variant_Bruiser", "Skeleton_NoArcher_Variant_Solider", "Skeleton_NoArcher_Variant_Thug", "Skeleton_NoArcher_Variant_Scout", "Skeleton_NoArcher_Variant_Savage", "Skeleton_NoArcher_Variant_Pugilist", "Skeleton_NoArcher_Variant_Corsair", "Skeleton_NoArcher_Variant_Sailor", "Skeleton_NoArcher_Variant_Stabber", "Skeleton_NoArcher_Variant_Thief", "Skeleton_NoArcher_Variant_Lightbringer", "Skeleton_NoArcher_Variant_Reaper", "Skeleton_NoArcher_Variant_Frozenhammer", "Skeleton_NoArcher_Variant_Icecrusher", "Skeleton_NoArcher_Variant_Soulshreder", "Skeleton_NoArcher_Variant_Blackblade", "Skeleton_NoArcher_Variant_Soulcalibur", "Skeleton_NoArcher_Variant_Splasher", "Skeleton_NoArcher_Variant_Pyromancer", "Skeleton_NoArcher_Variant_Thundercaller", "Skeleton_NoArcher_Variant_Mage", "Skeleton_NoArcher_Variant_Reaver"); AddPresets(CreateModifiers((DamageModifier)2, (DamageModifier)8, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)7, (DamageModifier)7, (DamageModifier)3, (DamageModifier)2), "Skeleton_Poison_Variant_Guardian", "Skeleton_Poison_Variant_Protector", "Skeleton_Poison_Variant_Vanguard", "Skeleton_Poison_Variant_Defender", "Skeleton_Poison_Variant_Sentry", "Skeleton_Poison_Variant_Warden", "Skeleton_Poison_Variant_Hunter", "Skeleton_Poison_Variant_Assassin", "Skeleton_Poison_Variant_Cutthroat", "Skeleton_Poison_Variant_Brute", "Skeleton_Poison_Variant_Duelist", "Skeleton_Poison_Variant_Berserker", "Skeleton_Poison_Variant_Bonebreaker", "Skeleton_Poison_Variant_Swordmaster", "Skeleton_Poison_Variant_Executioner", "Skeleton_Poison_Variant_Marauder", "Skeleton_Poison_Variant_Mercenary", "Skeleton_Poison_Variant_Fighter", "Skeleton_Poison_Variant_Warrior", "Skeleton_Poison_Variant_Bruiser", "Skeleton_Poison_Variant_Solider", "Skeleton_Poison_Variant_Thug", "Skeleton_Poison_Variant_Savage", "Skeleton_Poison_Variant_Pugilist", "Skeleton_Poison_Variant_Corsair", "Skeleton_Poison_Variant_Stabber", "Skeleton_Poison_Variant_Thief", "Skeleton_Poison_Variant_Blackblade", "Skeleton_Poison_Variant_Splasher", "Skeleton_Poison_Variant_Venomancer", "Skeleton_Poison_Variant_Reaver"); AddPresets(CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)0, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2), "Draugr_Variant_Guardian", "Draugr_Variant_Protector", "Draugr_Variant_Vanguard", "Draugr_Variant_Defender", "Draugr_Variant_Sentry", "Draugr_Variant_Warden", "Draugr_Variant_Archer", "Draugr_Variant_Firestarter", "Draugr_Variant_Sharpshooter", "Draugr_Variant_Coldblood", "Draugr_Variant_Soulpiercer", "Draugr_Variant_Hunter", "Draugr_Variant_Assassin", "Draugr_Variant_Cutthroat", "Draugr_Variant_Brute", "Draugr_Variant_Duelist", "Draugr_Variant_Berserker", "Draugr_Variant_Bonebreaker", "Draugr_Variant_Swordmaster", "Draugr_Variant_Executioner", "Draugr_Variant_Marauder", "Draugr_Variant_Mercenary", "Draugr_Variant_Fighter", "Draugr_Variant_Warrior", "Draugr_Variant_Bruiser", "Draugr_Variant_Solider", "Draugr_Variant_Thug", "Draugr_Variant_Scout", "Draugr_Variant_Savage", "Draugr_Variant_Pugilist", "Draugr_Variant_Corsair", "Draugr_Variant_Sailor", "Draugr_Variant_Stabber", "Draugr_Variant_Thief", "Draugr_Variant_Lightbringer", "Draugr_Variant_Reaper", "Draugr_Variant_Frozenhammer", "Draugr_Variant_Icecrusher", "Draugr_Variant_Soulshreder", "Draugr_Variant_Blackblade", "Draugr_Variant_Soulcalibur", "Draugr_Variant_Splasher", "Draugr_Variant_Pyromancer", "Draugr_Variant_Cryomancer", "Draugr_Variant_Thundercaller", "Draugr_Variant_Venomancer", "Draugr_Variant_Cultist", "Draugr_Variant_Mage", "Draugr_Variant_Cleric", "Draugr_Variant_Reaver"); AddPresets(CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)0, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2), "Draugr_Ranged_Variant_Archer", "Draugr_Ranged_Variant_Firestarter", "Draugr_Ranged_Variant_Sharpshooter", "Draugr_Ranged_Variant_Coldblood", "Draugr_Ranged_Variant_Soulpiercer", "Draugr_Ranged_Variant_Cleric", "Draugr_Ranged_Variant_Venomancer", "Draugr_Ranged_Variant_Cultist", "Draugr_Ranged_Variant_Cryomancer"); AddPresets(CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)7, (DamageModifier)7, (DamageModifier)3, (DamageModifier)2), "Draugr_Elite_Variant_Bonebreaker", "Draugr_Elite_Variant_Swordmaster", "Draugr_Elite_Variant_Executioner", "Draugr_Elite_Variant_Warrior", "Draugr_Elite_Variant_Bruiser", "Draugr_Elite_Variant_Solider", "Draugr_Elite_Variant_Thug", "Draugr_Elite_Variant_Sailor", "Draugr_Elite_Variant_Reaper", "Draugr_Elite_Variant_Frozenhammer", "Draugr_Elite_Variant_Blackblade", "Draugr_Elite_Variant_Soulcalibur", "Draugr_Elite_Variant_Splasher", "Draugr_Elite_Variant_Cultist", "Draugr_Elite_Variant_Mage", "Draugr_Elite_Variant_Reaver"); AddPresets(CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0), "GoblinArcher", "Goblin_Variant_Guardian", "Goblin_Variant_Protector", "Goblin_Variant_Vanguard", "Goblin_Variant_Defender", "Goblin_Variant_Sentry", "Goblin_Variant_Warden", "Goblin_Variant_Archer", "Goblin_Variant_Firestarter", "Goblin_Variant_Sharpshooter", "Goblin_Variant_Coldblood", "Goblin_Variant_Hunter", "Goblin_Variant_Brute", "Goblin_Variant_Duelist", "Goblin_Variant_Berserker", "Goblin_Variant_Marauder", "Goblin_Variant_Mercenary", "Goblin_Variant_Fighter", "Goblin_Variant_Warrior", "Goblin_Variant_Bruiser", "Goblin_Variant_Solider", "Goblin_Variant_Thug", "Goblin_Variant_Scout", "Goblin_Variant_Corsair", "Goblin_Variant_Stabber", "Goblin_Variant_Thief", "Goblin_Variant_Lightbringer", "Goblin_Variant_Cleric", "GoblinArcher_Variant_Archer", "GoblinArcher_Variant_Firestarter", "GoblinArcher_Variant_Sharpshooter", "GoblinArcher_Variant_Coldblood", "GoblinArcher_Variant_Soulpiercer", "GoblinArcher_Variant_Cleric"); AddPresets(CreateModifiers((DamageModifier)7, (DamageModifier)1, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)5), "GoblinBruteBros", "GoblinCheftain_bal"); AddPresets(CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)7, (DamageModifier)7, (DamageModifier)1, (DamageModifier)5), "GoblinShaman_Variant_Pyromancer", "GoblinShaman_Variant_Cryomancer", "GoblinShaman_Variant_Thundercaller", "GoblinShaman_Variant_Venomancer", "GoblinShaman_Variant_Cultist", "GoblinShaman_Variant_Mage"); AddPreset("BlobFrost", CreateModifiers((DamageModifier)2, (DamageModifier)1, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)3, (DamageModifier)8, (DamageModifier)3, (DamageModifier)8)); AddPreset("BlobLava", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)3, (DamageModifier)2, (DamageModifier)0, (DamageModifier)1, (DamageModifier)5)); AddPreset("BlobTar", CreateModifiers((DamageModifier)2, (DamageModifier)1, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)7, (DamageModifier)8, (DamageModifier)3, (DamageModifier)8)); AddPreset("Asksvin", CreateModifiers((DamageModifier)7, (DamageModifier)7, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)2, (DamageModifier)0, (DamageModifier)7, (DamageModifier)5)); AddPreset("Asksvin_hatchling", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)2, (DamageModifier)0, (DamageModifier)0, (DamageModifier)5)); AddPreset("BogWitchKvastur", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)5)); AddPresets(CreateModifiers((DamageModifier)7, (DamageModifier)8, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)7, (DamageModifier)7, (DamageModifier)0, (DamageModifier)5), "Chicken", "Hen"); AddPresets(CreateModifiers((DamageModifier)2, (DamageModifier)7, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)2, (DamageModifier)2, (DamageModifier)7, (DamageModifier)7), "Deathsquito", "Deathsquito_bal"); AddPreset("Fader", CreateModifiers((DamageModifier)2, (DamageModifier)7, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)2, (DamageModifier)1, (DamageModifier)3, (DamageModifier)2)); AddPreset("FallenValkyrie", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)7, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)7, (DamageModifier)7, (DamageModifier)0, (DamageModifier)1)); AddPreset("Gjall", CreateModifiers((DamageModifier)2, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)8, (DamageModifier)8, (DamageModifier)1, (DamageModifier)1)); AddPresets(CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)5), "Hive", "TheHive"); AddPresets(CreateModifiers((DamageModifier)1, (DamageModifier)0, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)7, (DamageModifier)2, (DamageModifier)1, (DamageModifier)7), "Lox"); AddPresets(CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)7, (DamageModifier)2, (DamageModifier)0, (DamageModifier)7), "Lox_Calf"); AddPreset("Mistile", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)5)); AddPresets(CreateModifiers((DamageModifier)2, (DamageModifier)0, (DamageModifier)5, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)0, (DamageModifier)0, (DamageModifier)3, (DamageModifier)2), "Morgen", "Morgen_NonSleeping"); AddPresets(CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)5), "piece_TrainingDummy", "TrainingDummy", "Player"); AddPreset("StoneGolem", CreateModifiers((DamageModifier)2, (DamageModifier)7, (DamageModifier)5, (DamageModifier)4, (DamageModifier)2, (DamageModifier)5, (DamageModifier)5, (DamageModifier)0, (DamageModifier)3, (DamageModifier)5)); AddPreset("Volture", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)1, (DamageModifier)8, (DamageModifier)8, (DamageModifier)8, (DamageModifier)1)); AddPreset("VoltureNestling_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)7, (DamageModifier)8, (DamageModifier)8, (DamageModifier)8, (DamageModifier)1)); AddPreset("CrowNestling_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)8, (DamageModifier)8, (DamageModifier)8, (DamageModifier)1)); AddPreset("Wolf", CreateModifiers((DamageModifier)0, (DamageModifier)8, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)5, (DamageModifier)2, (DamageModifier)7, (DamageModifier)0)); AddPreset("Wolf_cub", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)1, (DamageModifier)2, (DamageModifier)0, (DamageModifier)5)); AddPreset("AshlandsGolem_bal", CreateModifiers((DamageModifier)2, (DamageModifier)7, (DamageModifier)5, (DamageModifier)4, (DamageModifier)2, (DamageModifier)1, (DamageModifier)2, (DamageModifier)0, (DamageModifier)3, (DamageModifier)5)); AddPreset("LeechLarva_bal", CreateModifiers((DamageModifier)7, (DamageModifier)8, (DamageModifier)0, (DamageModifier)4, (DamageModifier)4, (DamageModifier)5, (DamageModifier)2, (DamageModifier)2, (DamageModifier)1, (DamageModifier)5)); AddPreset("BjornCub_bal", CreateModifiers((DamageModifier)1, (DamageModifier)0, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)1, (DamageModifier)2, (DamageModifier)8, (DamageModifier)5)); AddPreset("Frostbjorn_bal", CreateModifiers((DamageModifier)1, (DamageModifier)0, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)3, (DamageModifier)2, (DamageModifier)8, (DamageModifier)5)); AddPreset("Fox_cub_bal", CreateModifiers((DamageModifier)0, (DamageModifier)0, (DamageModifier)8, (DamageModifier)4, (DamageModifier)4, (DamageModifier)8, (DamageModifier)1, (DamageModifier)2, (DamageModifier)1, (DamageModifier)5)); AddPreset("PolarBear_bal", CreateModifiers((DamageModifier)1, (DamageModifier)0, (DamageModifier)1, (DamageModifier)4, (DamageModifier)4, (DamageModifier)2, (DamageModifier)3, (DamageModifier)2, (DamageModifier)8, (DamageModifier)5)); } private static void AddPreset(string id, DamageModifiers mods) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) _presets[id] = mods; } private static void AddPresets(DamageModifiers mods, params string[] ids) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) foreach (string key in ids) { _presets[key] = mods; } } public static bool TryApply(GameObject gameObject, string monsterName) { //IL_0051: 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) if ((Object)(object)gameObject == (Object)null || string.IsNullOrEmpty(monsterName)) { return false; } Humanoid component = gameObject.GetComponent(); if ((Object)(object)component == (Object)null) { return false; } if (!_presets.TryGetValue(monsterName, out var value)) { return false; } ((Character)component).m_damageModifiers = value; return true; } public static bool TryGet(string monsterName, out DamageModifiers mods) { return _presets.TryGetValue(monsterName, out mods); } private static DamageModifiers CreateModifiers(DamageModifier blunt = (DamageModifier)0, DamageModifier slash = (DamageModifier)0, DamageModifier pierce = (DamageModifier)0, DamageModifier chop = (DamageModifier)4, DamageModifier pickaxe = (DamageModifier)4, DamageModifier fire = (DamageModifier)0, DamageModifier frost = (DamageModifier)0, DamageModifier lightning = (DamageModifier)0, DamageModifier poison = (DamageModifier)0, DamageModifier spirit = (DamageModifier)5) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_000b: 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) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001b: 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_0023: 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) //IL_002b: 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_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0036: 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_003f: 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_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //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_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) return new DamageModifiers { m_blunt = blunt, m_slash = slash, m_pierce = pierce, m_chop = chop, m_pickaxe = pickaxe, m_fire = fire, m_frost = frost, m_lightning = lightning, m_poison = poison, m_spirit = spirit }; } } public sealed class MonsterVariantDefinition { public string OriginalName { get; } public string NewName { get; } public Faction? Faction { get; } public string DisplayName { get; } public string LootSourceName { get; } public string SpawnTemplateName { get; } public string SpawnTemplateSpawnerName { get; } public bool AddGeneratedSpawn { get; } public Action ConfigureClone { get; } public Action ConfigureSpawn { get; } public MonsterVariantDefinition(string originalName, string newName, Faction? faction = null, string displayName = null, string lootSourceName = null, string spawnTemplateName = null, string spawnTemplateSpawnerName = null, bool addGeneratedSpawn = false, Action configureClone = null, Action configureSpawn = null) { OriginalName = originalName; NewName = newName; Faction = faction; DisplayName = displayName; LootSourceName = lootSourceName; SpawnTemplateName = spawnTemplateName; SpawnTemplateSpawnerName = spawnTemplateSpawnerName; AddGeneratedSpawn = addGeneratedSpawn; ConfigureClone = configureClone; ConfigureSpawn = configureSpawn; } } public static class MonsterVariantRegistry { public static readonly List Variants = new List { new MonsterVariantDefinition("Troll_Summoned", "TrollAshlands", (Faction)3, "$tag_trollashlands_bal", "TrollUndead_bal"), new MonsterVariantDefinition("Dverger", "Dverger_event", (Faction)8, null, "Dverger"), new MonsterVariantDefinition("DvergerMage", "DvergerMage_event", (Faction)8, null, "DvergerMage"), new MonsterVariantDefinition("DvergerMageFire", "DvergerMageFire_event", (Faction)8, null, "DvergerMageFire"), new MonsterVariantDefinition("DvergerMageIce", "DvergerMageIce_event", (Faction)8, null, "DvergerMageIce"), new MonsterVariantDefinition("DvergerMageSupport", "DvergerMageSupport_event", (Faction)8, null, "DvergerMageSupport"), new MonsterVariantDefinition("DarkBat_bal", "DarkBatPlains_bal", (Faction)7, "$enemy_darkbat_plains_bal", "DarkBat_bal", "Bat", "Bat"), new MonsterVariantDefinition("Draugr", "Draugr_Floodplains_bal", (Faction)7, "$enemy_draugr_floodplains_bal", "Draugr"), new MonsterVariantDefinition("Draugr", "Draugr_Mistfen_bal", (Faction)9, "$enemy_draugr_mistfen_bal", "Draugr") }; public static Dictionary BuildLootAliasMap() { Dictionary dictionary = new Dictionary(); foreach (MonsterVariantDefinition variant in Variants) { if (variant != null && !string.IsNullOrEmpty(variant.NewName)) { string text = (string.IsNullOrEmpty(variant.LootSourceName) ? variant.OriginalName : variant.LootSourceName); if (!string.IsNullOrEmpty(text) && text != variant.NewName) { dictionary[variant.NewName] = text; } } } return dictionary; } } public static class TamableService { public class BreedingConfig { public bool UsesAnimalAITamable { get; set; } public bool CanBeTamed { get; set; } public bool CanProcreateWild { get; set; } public bool CanProcreateTamed { get; set; } public float FeedDuration { get; set; } public float TamingTime { get; set; } public bool Commandable { get; set; } public float? UpdateInterval { get; set; } public float? TotalCheckRange { get; set; } public int? MaxCreatures { get; set; } public float? PartnerCheckRange { get; set; } public float? PregnancyChance { get; set; } public float? PregnancyDuration { get; set; } public int? RequiredLovePoints { get; set; } public string Offspring { get; set; } public int? MinOffspringLevel { get; set; } public float? SpawnOffset { get; set; } public float? SpawnOffsetMax { get; set; } public bool? SpawnRandomDirection { get; set; } public string SeparatePartner { get; set; } public string NoPartnerOffspring { get; set; } public List ConsumeItems { get; set; } } private static readonly Dictionary Configs = new Dictionary { { "Asksvin", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = true, CanProcreateWild = true, CanProcreateTamed = true, UpdateInterval = 45f, FeedDuration = 300f, TamingTime = 3000f, Commandable = true, Offspring = "AsksvinEgg", PregnancyChance = 0.2f, PregnancyDuration = 180f, MaxCreatures = 8, RequiredLovePoints = 5, PartnerCheckRange = 4f, TotalCheckRange = 15f } }, { "Neck", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = true, CanProcreateWild = true, CanProcreateTamed = true, UpdateInterval = 45f, FeedDuration = 400f, TamingTime = 1800f, Commandable = false, SeparatePartner = "NeckBrute_bal", Offspring = "NeckTadpole_bal", PregnancyChance = 0.25f, PregnancyDuration = 180f, MaxCreatures = 8, RequiredLovePoints = 4, PartnerCheckRange = 4f, TotalCheckRange = 15f } }, { "NeckBrute_bal", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = true, CanProcreateWild = true, CanProcreateTamed = true, UpdateInterval = 45f, FeedDuration = 300f, TamingTime = 2400f, Commandable = true, SeparatePartner = "Neck", Offspring = "NeckTadpole_bal", PregnancyChance = 0.2f, PregnancyDuration = 180f, MaxCreatures = 8, RequiredLovePoints = 5, PartnerCheckRange = 4f, TotalCheckRange = 15f } }, { "Boar", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = true, CanProcreateWild = true, CanProcreateTamed = true, UpdateInterval = 45f, FeedDuration = 300f, TamingTime = 1800f, Commandable = false, SeparatePartner = "Hog_bal", Offspring = "Boar_piggy", PregnancyChance = 0.33f, PregnancyDuration = 180f, MaxCreatures = 8, RequiredLovePoints = 4, PartnerCheckRange = 4f, TotalCheckRange = 15f } }, { "Hog_bal", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = true, CanProcreateWild = true, CanProcreateTamed = true, UpdateInterval = 45f, FeedDuration = 300f, TamingTime = 2400f, Commandable = true, SeparatePartner = "Boar", Offspring = "Boar_piggy", PregnancyChance = 0.2f, PregnancyDuration = 240f, MaxCreatures = 8, RequiredLovePoints = 6, PartnerCheckRange = 3f, TotalCheckRange = 10f } }, { "Stag_bal", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = true, CanProcreateWild = true, CanProcreateTamed = true, UpdateInterval = 45f, FeedDuration = 300f, TamingTime = 3000f, Commandable = false, SeparatePartner = "Deer", Offspring = "Doe_bal", PregnancyChance = 0.25f, PregnancyDuration = 240f, MaxCreatures = 6, RequiredLovePoints = 5, PartnerCheckRange = 3f, TotalCheckRange = 15f } }, { "Wolf", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = true, CanProcreateWild = true, CanProcreateTamed = true, UpdateInterval = 45f, FeedDuration = 300f, TamingTime = 2600f, Commandable = true, Offspring = "Wolf_cub", PregnancyChance = 0.33f, PregnancyDuration = 240f, MaxCreatures = 8, RequiredLovePoints = 5, PartnerCheckRange = 3f, TotalCheckRange = 10f } }, { "Goat_bal", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = true, CanProcreateWild = true, CanProcreateTamed = true, UpdateInterval = 45f, FeedDuration = 250f, TamingTime = 2400f, Commandable = false, NoPartnerOffspring = "Milk_bal", Offspring = "GoatKid_bal", PregnancyChance = 0.25f, PregnancyDuration = 240f, MaxCreatures = 6, RequiredLovePoints = 5, PartnerCheckRange = 3f, TotalCheckRange = 10f } }, { "Lox", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = true, CanProcreateWild = true, CanProcreateTamed = true, UpdateInterval = 45f, FeedDuration = 300f, TamingTime = 4500f, Commandable = true, Offspring = "Lox_Calf", PregnancyChance = 0.2f, PregnancyDuration = 300f, MaxCreatures = 6, RequiredLovePoints = 6, PartnerCheckRange = 6f, TotalCheckRange = 20f } }, { "Fox_bal", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = true, CanProcreateWild = true, CanProcreateTamed = true, UpdateInterval = 45f, FeedDuration = 390f, TamingTime = 4500f, Commandable = false, Offspring = "Fox_Cub_bal", PregnancyChance = 0.25f, PregnancyDuration = 300f, MaxCreatures = 6, RequiredLovePoints = 5, PartnerCheckRange = 3f, TotalCheckRange = 10f } }, { "Serpent", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = false, CanProcreateWild = true, CanProcreateTamed = true, UpdateInterval = 45f, FeedDuration = 200f, TamingTime = 6000f, Commandable = false, Offspring = "SerpentEgg_bal", PregnancyChance = 0.2f, PregnancyDuration = 360f, MaxCreatures = 4, RequiredLovePoints = 6, PartnerCheckRange = 10f, TotalCheckRange = 30f } }, { "Volture", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = true, CanProcreateWild = true, CanProcreateTamed = true, UpdateInterval = 45f, FeedDuration = 300f, TamingTime = 3000f, Commandable = true, Offspring = "VoltureEgg", PregnancyChance = 0.25f, PregnancyDuration = 180f, MaxCreatures = 6, RequiredLovePoints = 5, PartnerCheckRange = 5f, TotalCheckRange = 20f } }, { "GiantCrow_bal", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = true, CanProcreateWild = true, CanProcreateTamed = true, UpdateInterval = 45f, FeedDuration = 300f, TamingTime = 3000f, Commandable = true, Offspring = "CrowEgg_bal", PregnancyChance = 0.25f, PregnancyDuration = 120f, MaxCreatures = 6, RequiredLovePoints = 3, PartnerCheckRange = 5f, TotalCheckRange = 20f } }, { "Leech", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = false, CanProcreateWild = true, CanProcreateTamed = false, UpdateInterval = 45f, FeedDuration = 390f, TamingTime = 3000f, Commandable = false, SeparatePartner = "LeechPrimal_bal", Offspring = "LeechEgg_bal", PregnancyChance = 0.2f, PregnancyDuration = 280f, MaxCreatures = 7, RequiredLovePoints = 4, PartnerCheckRange = 4f, TotalCheckRange = 15f } }, { "LeechPrimal_bal", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = false, CanProcreateWild = true, CanProcreateTamed = false, UpdateInterval = 45f, FeedDuration = 390f, TamingTime = 3000f, Commandable = false, SeparatePartner = "Leech", Offspring = "LeechEgg_bal", PregnancyChance = 0.2f, PregnancyDuration = 280f, MaxCreatures = 6, RequiredLovePoints = 5, PartnerCheckRange = 4f, TotalCheckRange = 15f } }, { "Seeker", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = true, CanProcreateWild = true, CanProcreateTamed = true, UpdateInterval = 45f, FeedDuration = 180f, TamingTime = 3600f, Commandable = false, SeparatePartner = "SeekerBrute", Offspring = "Larva_bal", PregnancyChance = 0.2f, PregnancyDuration = 240f, MaxCreatures = 5, RequiredLovePoints = 5, PartnerCheckRange = 6f, TotalCheckRange = 20f } }, { "SeekerBrute", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = true, CanProcreateWild = true, CanProcreateTamed = true, UpdateInterval = 45f, FeedDuration = 180f, TamingTime = 6000f, Commandable = false, SeparatePartner = "Seeker", Offspring = "Larva_bal", PregnancyChance = 0.15f, PregnancyDuration = 360f, MaxCreatures = 4, RequiredLovePoints = 7, PartnerCheckRange = 7f, TotalCheckRange = 25f } }, { "Habrok_bal", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = true, CanProcreateWild = true, CanProcreateTamed = true, UpdateInterval = 45f, FeedDuration = 240f, TamingTime = 40000f, Commandable = false, Offspring = "HabrokBirb_bal", PregnancyChance = 0.2f, PregnancyDuration = 280f, MaxCreatures = 4, RequiredLovePoints = 7, PartnerCheckRange = 6f, TotalCheckRange = 22f } }, { "Bjorn", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = true, CanProcreateWild = true, CanProcreateTamed = true, UpdateInterval = 45f, FeedDuration = 200f, TamingTime = 8000f, Commandable = true, Offspring = "BjornCub_bal", PregnancyChance = 0.15f, PregnancyDuration = 420f, MaxCreatures = 4, RequiredLovePoints = 7, PartnerCheckRange = 6f, TotalCheckRange = 25f } }, { "Greyling", new BreedingConfig { UsesAnimalAITamable = false, CanBeTamed = true, CanProcreateWild = false, CanProcreateTamed = false, UpdateInterval = 45f, FeedDuration = 200f, TamingTime = 2400f, Commandable = true } } }; public static void SetupBreeding(ZNetScene zNetScene) { if ((Object)(object)zNetScene == (Object)null || zNetScene.m_prefabs == null) { return; } GameObject val = FindPrefabInZnet("Boar", zNetScene); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)(Launch.projectName + ": Boar template not found.")); return; } Tameable component = val.GetComponent(); Procreation component2 = val.GetComponent(); MonsterAI component3 = val.GetComponent(); Dictionary itemLookup = MonsterFeeding.BuildItemLookup(zNetScene.m_prefabs); foreach (KeyValuePair config in Configs) { string key = config.Key; BreedingConfig value = config.Value; GameObject val2 = FindPrefabInZnet(key, zNetScene); if ((Object)(object)val2 == (Object)null) { Debug.LogWarning((object)(Launch.projectName + ": breeding prefab not found in ZNetScene: " + key)); LogPossiblePrefabMatches(zNetScene, key); continue; } if (!string.IsNullOrEmpty(value.Offspring)) { GameObject val3 = FindPrefabInZnet(value.Offspring, zNetScene); if ((Object)(object)val3 == (Object)null) { Debug.LogWarning((object)(Launch.projectName + ": breeding offspring prefab not found in ZNetScene: " + value.Offspring + " for " + ((Object)val2).name)); LogPossiblePrefabMatches(zNetScene, value.Offspring); } } if (value.UsesAnimalAITamable) { SetupAnimalAITamable(val2, zNetScene, val, component, component2, component3, value); } else { SetupVanillaBreeding(val2, zNetScene, component, component2, value); } MonsterFeeding.ApplyDietToPrefab(val2, itemLookup); } foreach (GameObject prefab in zNetScene.m_prefabs) { if (!((Object)(object)prefab == (Object)null) && !Configs.ContainsKey(Utils.GetPrefabName(prefab))) { MonsterFeeding.ApplyDietToPrefab(prefab, itemLookup); } } } private static void LogPossiblePrefabMatches(ZNetScene zNetScene, string missingName) { if ((Object)(object)zNetScene == (Object)null || zNetScene.m_prefabs == null || string.IsNullOrEmpty(missingName)) { return; } string text = missingName.Replace("(Clone)", "").Replace("_bal", "").Replace("_", "") .ToLowerInvariant(); foreach (GameObject prefab in zNetScene.m_prefabs) { if (!((Object)(object)prefab == (Object)null)) { string text2 = ((Object)prefab).name.Replace("(Clone)", "").Replace("_bal", "").Replace("_", "") .ToLowerInvariant(); if (text2.Contains(text) || text.Contains(text2) || text2.Contains("leech") || text2.Contains("larv") || text2.Contains("fox") || text2.Contains("goat")) { Debug.LogWarning((object)(Launch.projectName + ": possible breeding match for " + missingName + ": " + ((Object)prefab).name)); } } } } private static void SetupMonsterHungerIfAllowed(GameObject prefab, Dictionary itemLookup) { if (!Object.op_Implicit((Object)(object)prefab)) { return; } MonsterAI component = prefab.GetComponent(); if (!((Object)(object)component == (Object)null) && !((Object)(object)prefab.GetComponent() != (Object)null) && !((Object)(object)prefab.GetComponent() != (Object)null) && MonsterFeeding.TryBuildDietList(((Object)prefab).name, itemLookup, out var diet) && diet != null && diet.Count != 0) { component.m_consumeItems = diet; MonsterHunger component2 = prefab.GetComponent(); if ((Object)(object)component2 == (Object)null) { prefab.AddComponent(); } } } private static void SetupVanillaBreeding(GameObject prefab, ZNetScene zNetScene, Tameable tameableTemplate, Procreation procreationTemplate, BreedingConfig config) { if (!((Object)(object)prefab == (Object)null) && !((Object)(object)zNetScene == (Object)null) && config != null) { if (config.CanBeTamed) { AddTameableFromTemplate(prefab, tameableTemplate, config); } if (config.CanBeTamed && config.CanProcreateTamed) { AddProcreationFromTemplate(prefab, zNetScene, procreationTemplate, config); } } } private static void AddWildProcreation(GameObject prefab, ZNetScene zNetScene, Procreation procreationTemplate, BreedingConfig config) { if ((Object)(object)prefab == (Object)null || (Object)(object)zNetScene == (Object)null || config == null || string.IsNullOrEmpty(config.Offspring)) { return; } GameObject val = FindPrefabInZnet(config.Offspring, zNetScene); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)(Launch.projectName + ": WildProcreation offspring not found: " + config.Offspring + " for " + ((Object)prefab).name)); return; } WildProcreation wildProcreation = prefab.GetComponent(); if ((Object)(object)wildProcreation == (Object)null) { wildProcreation = prefab.AddComponent(); } wildProcreation.m_updateInterval = Mathf.Max(120f, (config.UpdateInterval ?? 120f) * 2f); wildProcreation.m_partnerCheckRange = config.PartnerCheckRange ?? 8f; wildProcreation.m_totalCheckRange = config.TotalCheckRange ?? 20f; wildProcreation.m_maxCreatures = Mathf.Max(2, config.MaxCreatures ?? 6); wildProcreation.m_spawnChance = Mathf.Clamp((config.PregnancyChance ?? 0.1f) * 0.35f, 0.02f, 0.12f); wildProcreation.m_offspring = val; wildProcreation.m_seperatePartner = (string.IsNullOrEmpty(config.SeparatePartner) ? null : FindPrefabInZnet(config.SeparatePartner, zNetScene)); wildProcreation.m_spawnOffset = config.SpawnOffset ?? 2f; wildProcreation.m_spawnOffsetMax = config.SpawnOffsetMax ?? 0f; wildProcreation.m_spawnRandomDirection = config.SpawnRandomDirection ?? false; wildProcreation.m_minOffspringLevel = config.MinOffspringLevel ?? 1; } private static void SetupAnimalAITamable(GameObject prefab, ZNetScene zNetScene, GameObject sourcePrefab, Tameable tameableTemplate, Procreation procreationTemplate, MonsterAI monsterAITemplate, BreedingConfig config) { if ((Object)(object)prefab == (Object)null || (Object)(object)zNetScene == (Object)null || config == null) { return; } AnimalAITamable animalAITamable = AnimalAITamable.AddTo(prefab); if (!((Object)(object)animalAITamable == (Object)null)) { if ((Object)(object)sourcePrefab != (Object)null) { animalAITamable.CopyValuesFrom(sourcePrefab); } if ((Object)(object)tameableTemplate != (Object)null) { animalAITamable.CopyFromTameable(tameableTemplate); } if ((Object)(object)procreationTemplate != (Object)null) { animalAITamable.CopyFromProcreation(procreationTemplate); } if ((Object)(object)monsterAITemplate != (Object)null) { animalAITamable.CopyFromMonsterAI(monsterAITemplate); } animalAITamable.m_canBeTamed = config.CanBeTamed; animalAITamable.m_canProcreateWild = false; animalAITamable.m_canProcreateTamed = config.CanProcreateTamed; animalAITamable.m_fedDuration = config.FeedDuration; animalAITamable.m_tamingTime = config.TamingTime; animalAITamable.m_enableProcreation = config.CanProcreateTamed; ApplyAnimalAIProcreationConfig(animalAITamable, zNetScene, config); ApplyConsumeItems(animalAITamable, zNetScene, config); } } private static void AddTameableFromTemplate(GameObject prefab, Tameable template, BreedingConfig config) { if (!((Object)(object)prefab == (Object)null) && !((Object)(object)template == (Object)null) && config != null) { Tameable val = prefab.GetComponent(); if ((Object)(object)val == (Object)null) { val = prefab.AddComponent(); } CopyPublicFields(template, val); val.m_fedDuration = config.FeedDuration; val.m_tamingTime = config.TamingTime; val.m_commandable = config.Commandable; } } private static void AddProcreationFromTemplate(GameObject prefab, ZNetScene zNetScene, Procreation template, BreedingConfig config) { if (!((Object)(object)prefab == (Object)null) && !((Object)(object)zNetScene == (Object)null) && !((Object)(object)template == (Object)null) && config != null) { Procreation val = prefab.GetComponent(); if ((Object)(object)val == (Object)null) { val = prefab.AddComponent(); } CopyPublicFields(template, val); ApplyProcreationConfig(val, zNetScene, config); } } private static void ApplyProcreationConfig(Procreation procreation, ZNetScene zNetScene, BreedingConfig config) { if (config.UpdateInterval.HasValue) { procreation.m_updateInterval = config.UpdateInterval.Value; } if (config.TotalCheckRange.HasValue) { procreation.m_totalCheckRange = config.TotalCheckRange.Value; } if (config.MaxCreatures.HasValue) { procreation.m_maxCreatures = config.MaxCreatures.Value; } if (config.PartnerCheckRange.HasValue) { procreation.m_partnerCheckRange = config.PartnerCheckRange.Value; } if (config.PregnancyChance.HasValue) { procreation.m_pregnancyChance = config.PregnancyChance.Value; } if (config.PregnancyDuration.HasValue) { procreation.m_pregnancyDuration = config.PregnancyDuration.Value; } if (config.RequiredLovePoints.HasValue) { procreation.m_requiredLovePoints = config.RequiredLovePoints.Value; } if (!string.IsNullOrEmpty(config.Offspring)) { procreation.m_offspring = FindPrefabInZnet(config.Offspring, zNetScene); } if (config.MinOffspringLevel.HasValue) { procreation.m_minOffspringLevel = config.MinOffspringLevel.Value; } if (config.SpawnOffset.HasValue) { procreation.m_spawnOffset = config.SpawnOffset.Value; } if (config.SpawnOffsetMax.HasValue) { procreation.m_spawnOffsetMax = config.SpawnOffsetMax.Value; } if (config.SpawnRandomDirection.HasValue) { procreation.m_spawnRandomDirection = config.SpawnRandomDirection.Value; } procreation.m_seperatePartner = (string.IsNullOrEmpty(config.SeparatePartner) ? null : FindPrefabInZnet(config.SeparatePartner, zNetScene)); procreation.m_noPartnerOffspring = (string.IsNullOrEmpty(config.NoPartnerOffspring) ? null : FindPrefabInZnet(config.NoPartnerOffspring, zNetScene)); } private static void ApplyAnimalAIProcreationConfig(AnimalAITamable animal, ZNetScene zNetScene, BreedingConfig config) { if (config.UpdateInterval.HasValue) { animal.m_updateInterval = config.UpdateInterval.Value; } if (config.TotalCheckRange.HasValue) { animal.m_totalCheckRange = config.TotalCheckRange.Value; } if (config.MaxCreatures.HasValue) { animal.m_maxCreatures = config.MaxCreatures.Value; } if (config.PartnerCheckRange.HasValue) { animal.m_partnerCheckRange = config.PartnerCheckRange.Value; } if (config.PregnancyChance.HasValue) { animal.m_pregnancyChance = config.PregnancyChance.Value; } if (config.PregnancyDuration.HasValue) { animal.m_pregnancyDuration = config.PregnancyDuration.Value; } if (config.RequiredLovePoints.HasValue) { animal.m_requiredLovePoints = config.RequiredLovePoints.Value; } if (!string.IsNullOrEmpty(config.Offspring)) { animal.m_offspring = FindPrefabInZnet(config.Offspring, zNetScene); } if (config.MinOffspringLevel.HasValue) { animal.m_minOffspringLevel = config.MinOffspringLevel.Value; } if (config.SpawnOffset.HasValue) { animal.m_spawnOffset = config.SpawnOffset.Value; } if (config.SpawnOffsetMax.HasValue) { animal.m_spawnOffsetMax = config.SpawnOffsetMax.Value; } if (config.SpawnRandomDirection.HasValue) { animal.m_spawnRandomDirection = config.SpawnRandomDirection.Value; } animal.m_seperatePartner = (string.IsNullOrEmpty(config.SeparatePartner) ? null : FindPrefabInZnet(config.SeparatePartner, zNetScene)); animal.m_noPartnerOffspring = (string.IsNullOrEmpty(config.NoPartnerOffspring) ? null : FindPrefabInZnet(config.NoPartnerOffspring, zNetScene)); } private static void ApplyConsumeItems(AnimalAITamable animal, ZNetScene zNetScene, BreedingConfig config) { if (config.ConsumeItems == null || config.ConsumeItems.Count == 0) { return; } List list = new List(); foreach (string consumeItem in config.ConsumeItems) { GameObject val = FindPrefabInZnet(consumeItem, zNetScene); if (!((Object)(object)val == (Object)null)) { ItemDrop component = val.GetComponent(); if ((Object)(object)component != (Object)null) { list.Add(component); } } } animal.m_consumeItems = list; } public static bool TryGetConfig(GameObject go, out BreedingConfig config) { config = null; if ((Object)(object)go == (Object)null) { return false; } string prefabName = Utils.GetPrefabName(go); return Configs.TryGetValue(prefabName, out config); } public static bool CanUseWildProcreation(GameObject go) { BreedingConfig config; return TryGetConfig(go, out config) && config.CanProcreateWild; } public static bool CanUseTamedProcreation(GameObject go) { BreedingConfig config; return TryGetConfig(go, out config) && config.CanProcreateTamed; } public static bool CanBeTamed(GameObject go) { BreedingConfig config; return TryGetConfig(go, out config) && config.CanBeTamed; } public static GameObject FindPrefabInZnet(string name, ZNetScene zNetScene) { if (string.IsNullOrEmpty(name) || (Object)(object)zNetScene == (Object)null || zNetScene.m_prefabs == null) { return null; } string cleanName = Utils.GetPrefabName(name); GameObject val = zNetScene.m_prefabs.Find((GameObject x) => (Object)(object)x != (Object)null && ((Object)x).name == cleanName); if ((Object)(object)val != (Object)null) { return val; } GameObject val2 = zNetScene.m_prefabs.Find((GameObject x) => (Object)(object)x != (Object)null && Utils.GetPrefabName(((Object)x).name) == cleanName); if ((Object)(object)val2 != (Object)null) { return val2; } GameObject val3 = zNetScene.m_prefabs.Find((GameObject x) => (Object)(object)x != (Object)null && string.Equals(Utils.GetPrefabName(((Object)x).name), cleanName, StringComparison.OrdinalIgnoreCase)); if ((Object)(object)val3 != (Object)null) { return val3; } return null; } private static void CopyPublicFields(T source, T target) where T : Component { if (!((Object)(object)source == (Object)null) && !((Object)(object)target == (Object)null)) { FieldInfo[] fields = typeof(T).GetFields(BindingFlags.Instance | BindingFlags.Public); FieldInfo[] array = fields; foreach (FieldInfo fieldInfo in array) { fieldInfo.SetValue(target, fieldInfo.GetValue(source)); } } } } internal class AttackList { public static string[] attacks = new string[92] { "Frog_BiteAttack_bal", "blobacid_attack_bal", "frostdrake_bite_bal", "frostdrake_claw_left_bal", "frostdrake_claw_right_bal", "frostdrake_spit_shotgun_bal", "frostdrake_spit_shotgun_ground_bal", "WildWisp_attack_bal", "Wisp_kamikaze_bal", "Corpse_Attack1_bal", "Corpse_Attack2_bal", "Corpse_Attack3_bal", "Frostbjorn_Attack_bal", "Frostbjorn_RageAttack_bal", "Frostbjorn_Taunt_bal", "Habrok_Bite_bal", "Habrok_Headbutt_bal", "habrok_Pounce_bal", "HabrokBirb_Bite_bal", "Greydwarf_Moss_RootSpawn_bal", "battlehog_base_attack_bal", "penguin_base_attack_bal", "polarbear_attack_bal", "bear_attack_bal", "bear_attackBite_bal", "bear_attack2_bal", "bear_attackStanding_bal", "bloodling_aoe_bal", "crabForest_attack_bal", "crabSea_attack_bal", "crabSea_attack2_bal", "crabSea_attack3_bal", "crabStone_attack_bal", "crabStone_attack2_bal", "crabStone_attack3_bal", "CrowHit_melee_bal", "Deathsquito_sting_bal", "darkbat_melee_bal", "Ell_BiteAttack_bal", "Ell_shock_bal", "Goat_charge_bal", "Goleming_attack_bal", "Goleming_punch_bal", "Goleming_throw_bal", "GreydwarfBeeKeeper_throw_bal", "Greydwarf_crasher_attack_bal", "Greydwarf_crasher_attack_left_bal", "Greydwarf_crasher_claw_bal", "Greydwarf_crasher_claw_left_bal", "GreylingBee_attack_bal", "GreylingBee_attack_left_bal", "GreylingElite_attackSlam_bal", "GreylingElite_attack_bal", "GreyWatcherAttackMelee_bal", "hog_base_attack_bal", "hog_smack_attack_bal", "Leech_PrimalBiteAttack_bal", "mossroot_attack_bal", "Moth_attack_bal", "NeckBrute_BiteAttack_bal", "NeckBrute_spit_bal", "moth_melee_bal", "Shark_attack_bal", "StagGhost_antler_bal", "Stag_antler_bal", "Stag_charge_bal", "StormDrake_lighting_bolt_bal", "SerpentBaby_attack_bal", "GoblinSkeleton_attack_bal", "FenringBrute_attack_claw_double_bal", "lostsoul_attack_bal", "Greydwarf_frozen_attack_bal", "Greydwarf_scorched_attack_bal", "Fox_Attack1_bal", "Fox_Attack2_bal", "Fox_Attack3_bal", "AshlandsGolem_hat_bal", "AshlandsGolem_attack1_spike_bal", "AshlandsGolem_attack2_left_groundslam_bal", "AshlandsGolem_attack3_spikesweep_bal", "AshlandsGolem_attack_doublesmash_bal", "AshlandsGolem_clubs_bal", "AshlandsGolem_spikes_bal", "Greydwarf_throwFrozen_bal", "Greydwarf_throwScorch_bal", "bjorncub_bite_bal", "wyvern_bite_bal", "wyvern_claw_left_bal", "wyvern_claw_right_bal", "wyvern_firebreath_bal", "wyvern_spit_shotgun_bal", "wyvern_taunt_bal" }; } internal class ItemList { public static string[] items = new string[0]; } internal class MonsterList { public static string[] monsters = new string[54] { "BlobAcid_bal", "MossRootStatic_bal", "Goleming_bal", "FrostDrake_bal", "WildWisp_bal", "CorpseCollector_bal", "Bunny_bal", "AshlandsGolem_bal", "Doe_bal", "NeckTadpole_bal", "Fenring_Brute_bal", "Fox_bal", "Penguin_bal", "Ell_bal", "LostSoul_bal", "LeechLarva_bal", "BjornCub_bal", "VoltureNestling_bal", "CrowNestling_bal", "CrabSea_bal", "CrabStone_bal", "DarkBat_bal", "Habrok_bal", "HabrokBirb_bal", "TrollOutcast_bal", "TrollBrute_bal", "Frostbjorn_bal", "FrostbjornBrown_bal", "Deathsquito_bal", "GhostYagluth_bal", "GiantCrow_bal", "GoatKid_bal", "Goat_bal", "goblin_skeleton_bal", "Greydwarf_Crusher_bal", "Greydwarf_Frozen_bal", "Greydwarf_Moss_bal", "Greydwarf_Scorched_bal", "GreylingBeeKeeper_bal", "GreylingElite_bal", "Hog_bal", "LeechPrimal_bal", "MossRoot_bal", "Moth_bal", "NeckBrute_bal", "Serpentling_bal", "Shark_bal", "StagGhost_bal", "Stag_bal", "Stormdrake_bal", "TrollUndead_bal", "Fox_cub_bal", "PolarBear_bal", "BullFrog_bal" }; } internal class OtherObjectList { public static string[] other = new string[66] { "fx_blobacid_tarball_hit_bal", "blobacid_projectile_acidball_bal", "fx_Wsp_kamikaze_bal", "fx_WispSpawn_bal", "fx_Wisp_die_bal", "fx_Wisp_attack_bal", "BjornCub_ragdoll_bal", "root_beam_projectile_bal", "bloodling_selfDestruct_bal", "deer_ragdoll_bal", "deerghost_ragdoll_bal", "fx_crab_death_bal", "GreydwarfBeekeper_throw_projectile_bal", "moss_tentacle_spawn_bal", "moth_aoe_bal", "NeckBrute_Ragdoll_bal", "neck_spit_projectile_bal", "sfx_bear_alerted_bal", "sfx_bear_attack_bal", "sfx_bear_birth_bal", "sfx_bear_death_bal", "sfx_bear_hit_bal", "sfx_bear_idle_bal", "sfx_goleming_alerted_bal", "sfx_goleming_attack_bal", "sfx_goleming_death_bal", "sfx_goleming_hit_bal", "sfx_goleming_idle_bal", "sfx_lootbox_poof_bal", "sfx_neckBruteSpit_bal", "sfx_rock_destroyed_bal", "sfx_wings_flying_bal", "stormdrake_lightingBolt_bal", "vfx_neckSpitHit_bal", "vfx_shark_death_bal", "sfx_penguin_hurt_bal", "sfx_penguin_idle_bal", "sfx_penguin_death_bal", "sfx_penguin_alerted_bal", "ell_shock_aoe_bal", "vfx_thunderbolt_explosion_bal", "spiritbolt_projectile_bal", "vfx_spiritbolt_explosion_bal", "fx_TrollUndead_Gibs_bal", "vfx_LostSoulDeath_bal", "Spawner_Bear_bal", "Spawner_BearCub_bal", "Spawner_CrabSea_bal", "Spawner_FenringBrute_bal", "Spawner_GoblinSkeleton_bal", "Spawner_GreydwarfFrozen_bal", "Spawner_GreydwarfScorched_bal", "Spawner_Habrok_bal", "Spawner_HabrokBirb_bal", "Spawner_LostSoul_bal", "Spawner_PolarBear_bal", "Spawner_Stag_bal", "Spawner_StagGhost_bal", "Spawner_TrollOutcat_bal", "Spawner_TrollUndead_bal", "Spawner_NeckBrute_bal", "Spawner_NeckTadpole_bal", "Spawner_GiantCrow_bal", "vfx_ashlandsgolem_wakeup_bal", "vfx_ashlandsgolem_death_bal", "Ashlandsgolem_ragdoll_bal" }; } [HarmonyPatch(typeof(SpawnSystem), "Awake")] public static class SpawnSystemLifecyclePatch { private static bool _patched; public static void Reset() { _patched = false; } private static void Postfix(SpawnSystem __instance) { if (_patched || (Object)(object)__instance == (Object)null || __instance.m_spawnLists == null || (Object)(object)ZNetScene.instance == (Object)null || ZNetScene.instance.m_prefabs == null) { return; } foreach (SpawnSystemList spawnList in __instance.m_spawnLists) { if (!((Object)(object)spawnList == (Object)null) && spawnList.m_spawners != null) { switch (((Object)spawnList).name) { case "_SpawnList_base": Launch.spawnerBuilder.createSpawners(spawnList, Launch.modResourceLoader, ZNetScene.instance.m_prefabs); break; case "_SpawnList_mistlands": case "_SpawnList_ashlands": Launch.spawnerBuilder.editExistingSpawners(spawnList, ZNetScene.instance.m_prefabs); break; } } } _patched = true; } } [DisallowMultipleComponent] internal sealed class PlayerRace : MonoBehaviour { private static readonly int ZdoRaceKey = StringExtensionMethods.GetStableHashCode("BalrondRace"); private const string CustomDataRaceKey = "BalrondRace"; private const string DefaultRace = "Human"; private ZNetView _nview; private Player _player; private VisEquipment _vis; private SkinnedMeshRenderer _bodyRenderer; private Transform _visualRoot; private int _playerMaterialIndex = -1; private Material _playerMaterialInstance; private GameObject _currentEars; private GameObject _currentFangs; private GameObject _currentHorns; private GameObject _currentEyes; private string _currentRace = "Human"; public Dictionary Races { get; } = new Dictionary(StringComparer.Ordinal); private void Awake() { _nview = ((Component)this).GetComponent(); _player = ((Component)this).GetComponent(); _vis = ((Component)this).GetComponent(); if ((Object)(object)_nview == (Object)null || (Object)(object)_player == (Object)null || (Object)(object)_vis == (Object)null) { ((Behaviour)this).enabled = false; return; } _bodyRenderer = _vis.m_bodyModel; if ((Object)(object)_bodyRenderer != (Object)null) { _visualRoot = ((Component)_bodyRenderer).transform.parent; CachePlayerMaterialSlot(); } LoadRaceFromData(); ApplyRaceVisuals(_currentRace); } public void RefreshVisuals() { _bodyRenderer = (((Object)(object)_vis != (Object)null) ? _vis.m_bodyModel : null); if (!((Object)(object)_bodyRenderer == (Object)null)) { _visualRoot = ((Component)_bodyRenderer).transform.parent; CachePlayerMaterialSlot(); ApplyRaceVisuals(_currentRace); } } public string GetRace() { return _currentRace; } public void SetRace(string race) { if (string.IsNullOrEmpty(race)) { race = "Human"; } if (!(race == _currentRace)) { _currentRace = race; if (IsOwner()) { SaveRaceToData(race); } ApplyRaceVisuals(race); } } public bool HasRaceStruct(string race) { return !string.IsNullOrEmpty(race) && Races.ContainsKey(race); } public RaceStruct GetRaceStruct(string race) { RaceStruct value; return Races.TryGetValue(race, out value) ? value : default(RaceStruct); } private void LoadRaceFromData() { string text = "Human"; if (_nview.IsValid() && _nview.GetZDO() != null) { string text2 = _nview.GetZDO().GetString(ZdoRaceKey, ""); if (!string.IsNullOrEmpty(text2)) { text = text2; } } if ((text == "Human" || string.IsNullOrEmpty(text)) && _player.m_customData != null && _player.m_customData.TryGetValue("BalrondRace", out var value) && !string.IsNullOrEmpty(value)) { text = value; } _currentRace = (string.IsNullOrEmpty(text) ? "Human" : text); if (_player.m_customData != null) { _player.m_customData["BalrondRace"] = _currentRace; } } private void SaveRaceToData(string race) { if (_player.m_customData != null) { _player.m_customData["BalrondRace"] = race; } if (_nview.IsValid() && _nview.GetZDO() != null) { _nview.GetZDO().Set(ZdoRaceKey, race); } } private void ApplyRaceVisuals(string race) { //IL_0054: 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) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) if (string.IsNullOrEmpty(race)) { race = "Human"; } if (HasRaceStruct(race) && !((Object)(object)_bodyRenderer == (Object)null) && !((Object)(object)_visualRoot == (Object)null)) { RaceStruct raceStruct = GetRaceStruct(race); _visualRoot.localScale = ((raceStruct.scale == Vector3.zero) ? Vector3.one : raceStruct.scale); ApplyBodyTexture(raceStruct); ApplyAttachments(raceStruct); } } private void ApplyBodyTexture(RaceStruct rs) { if (_playerMaterialIndex < 0) { return; } if ((Object)(object)_playerMaterialInstance == (Object)null) { Material[] materials = ((Renderer)_bodyRenderer).materials; if (_playerMaterialIndex >= 0 && _playerMaterialIndex < materials.Length) { _playerMaterialInstance = materials[_playerMaterialIndex]; } } if ((Object)(object)_playerMaterialInstance == (Object)null) { return; } Texture val = ChooseBodyTexture(rs); if (!((Object)(object)val == (Object)null)) { if (_playerMaterialInstance.HasProperty("_MainTex")) { _playerMaterialInstance.SetTexture("_MainTex", val); } else if (_playerMaterialInstance.HasProperty("_mainTex")) { _playerMaterialInstance.SetTexture("_mainTex", val); } } } private Texture ChooseBodyTexture(RaceStruct rs) { int modelIndex = _vis.GetModelIndex(); return (modelIndex == 1) ? rs.bodyFemale : rs.bodyMale; } private void ApplyAttachments(RaceStruct rs) { if (Object.op_Implicit((Object)(object)_currentEars)) { _currentEars.SetActive(false); } if (Object.op_Implicit((Object)(object)_currentFangs)) { _currentFangs.SetActive(false); } if (Object.op_Implicit((Object)(object)_currentHorns)) { _currentHorns.SetActive(false); } if (Object.op_Implicit((Object)(object)_currentEyes)) { _currentEyes.SetActive(false); } _currentEars = null; _currentFangs = null; _currentHorns = null; _currentEyes = null; if (rs.hasEar) { _currentEars = EnableChild(rs.ears); } if (rs.hasFangs) { _currentFangs = EnableChild(rs.fangs); } if (rs.hasHorns) { _currentHorns = EnableChild(rs.horns); } if (rs.hasEyes) { _currentEyes = EnableChild(rs.eyes); } } private GameObject EnableChild(string childName) { if (string.IsNullOrEmpty(childName) || (Object)(object)_visualRoot == (Object)null) { return null; } Transform val = FindDeepChild(_visualRoot, childName); if ((Object)(object)val == (Object)null) { return null; } ((Component)val).gameObject.SetActive(true); return ((Component)val).gameObject; } private void CachePlayerMaterialSlot() { _playerMaterialIndex = -1; _playerMaterialInstance = null; if ((Object)(object)_bodyRenderer == (Object)null) { return; } Material[] sharedMaterials = ((Renderer)_bodyRenderer).sharedMaterials; if (sharedMaterials == null) { return; } for (int i = 0; i < sharedMaterials.Length; i++) { Material val = sharedMaterials[i]; if (!((Object)(object)val == (Object)null)) { string name = ((Object)val).name; if (name.IndexOf("PlayerMaterial", StringComparison.OrdinalIgnoreCase) >= 0) { _playerMaterialIndex = i; break; } } } } private bool IsOwner() { return (Object)(object)_nview != (Object)null && _nview.IsValid() && _nview.IsOwner(); } public static Transform FindDeepChild(Transform parent, string name) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown if ((Object)(object)parent == (Object)null || string.IsNullOrEmpty(name)) { return null; } foreach (Transform item in parent) { Transform val = item; if (((Object)val).name == name) { return val; } Transform val2 = FindDeepChild(val, name); if ((Object)(object)val2 != (Object)null) { return val2; } } return null; } } public static class PrefabTools { public static GameObject FindPrefab(ZNetScene scene, string name) { if ((Object)(object)scene == (Object)null || scene.m_prefabs == null || string.IsNullOrEmpty(name)) { return null; } return ((IEnumerable)scene.m_prefabs).FirstOrDefault((Func)((GameObject x) => (Object)(object)x != (Object)null && ((Object)x).name == name)); } public static GameObject FindPrefab(List prefabs, string name) { if (prefabs == null || string.IsNullOrEmpty(name)) { return null; } return ((IEnumerable)prefabs).FirstOrDefault((Func)((GameObject x) => (Object)(object)x != (Object)null && ((Object)x).name == name)); } public static bool AddPrefabOnce(ZNetScene scene, GameObject prefab) { if ((Object)(object)scene == (Object)null || scene.m_prefabs == null || (Object)(object)prefab == (Object)null) { return false; } if ((Object)(object)FindPrefab(scene, ((Object)prefab).name) != (Object)null) { return false; } scene.m_prefabs.Add(prefab); return true; } } [Serializable] public struct RaceStruct { public string race; [Header("Attachments")] public bool hasEar; public bool hasFangs; public bool hasHorns; public bool hasEyes; public string ears; public string fangs; public string horns; public string eyes; [Header("Body")] public Texture bodyMale; public Texture bodyFemale; [Header("Scale")] public Vector3 scale; } public class ItemEdits { private List items; private List buildPieces; private GameObject FindItem(List list, string name) { GameObject val = list.Find((GameObject x) => ((Object)x).name == name); if ((Object)(object)val != (Object)null) { return val; } Debug.LogWarning((object)("BalrondMonsterMayhem: Item Not Found: " + name)); return null; } private Requirement createReq(string name, int amount, int amountPerLevel) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown Requirement val = new Requirement(); val.m_recover = true; ItemDrop component = FindItem(items, name).GetComponent(); val.m_resItem = component; val.m_amount = amount; val.m_amountPerLevel = amountPerLevel; return val; } public void editItems(List list) { foreach (GameObject item in list) { changeItem(item); } } private void changeItem(GameObject gameObject) { switch (((Object)gameObject).name) { case "HelmetBerserkerHood": editArmor(gameObject, 4f, 2f); break; case "ArmorBerserkerChest": editArmor(gameObject, 4f, 2f); break; case "ArmorBerserkerLegs": editArmor(gameObject, 4f, 2f); break; case "bjorn_bite": editBearAttackDamage(gameObject, 0, 0, 55); break; case "bjorn_claws": editBearAttackDamage(gameObject, 25); break; case "bjorn_swipe_l": case "bjorn_swipe_r": case "bjorn_swipe_combo": editBearAttackDamage(gameObject, 13); break; case "bjorn_slam": editBearAttackDamage(gameObject, 0, 25); break; } } private void CheckStats(GameObject gameObject) { string name = ((Object)gameObject).name; string text = name; } private void editBearAttackDamage(GameObject gameObject, int slash = 0, int blunt = 0, int pierce = 0) { ItemDrop component = gameObject.GetComponent(); component.m_itemData.m_shared.m_damages.m_slash = slash; component.m_itemData.m_shared.m_damages.m_blunt = blunt; component.m_itemData.m_shared.m_damages.m_pierce = pierce; } private void editSpiritDamageStat(GameObject gameObject, int spiritDamage) { ItemDrop component = gameObject.GetComponent(); component.m_itemData.m_shared.m_damages.m_spirit = spiritDamage; if (((Object)gameObject).name == "skeleton_mace" || ((Object)gameObject).name == "imp_fireball_attack") { component.m_itemData.m_shared.m_damages.m_blunt += spiritDamage; } } private void editSurtlingDamageStat(GameObject gameObject, int fireDamage) { ItemDrop component = gameObject.GetComponent(); component.m_itemData.m_shared.m_damages.m_fire = fireDamage; component.m_itemData.m_shared.m_damages.m_blunt += fireDamage; } private void editStackAndWeight(GameObject gameObject, float weight = -1f, int stack = 1) { ItemDrop component = gameObject.GetComponent(); component.m_itemData.m_shared.m_weight = ((weight == -1f) ? component.m_itemData.m_shared.m_weight : weight); component.m_itemData.m_shared.m_autoStack = true; component.m_itemData.m_shared.m_maxStackSize = stack; } private void editArmorSetEffect(GameObject gameObject, int setSize, string statusName, string setName) { ItemDrop component = gameObject.GetComponent(); component.m_itemData.m_shared.m_setName = setName; component.m_itemData.m_shared.m_setSize = setSize; component.m_itemData.m_shared.m_setStatusEffect = ObjectDB.instance.m_StatusEffects.Find((StatusEffect x) => ((Object)x).name == statusName); } private void editQualityValues(GameObject gameObject, float weightRatio = 0f, int quality = 4, float weight = -1f, float sppedDebuff = 0f, float equipeSpeed = -1f) { ItemDrop component = gameObject.GetComponent(); component.m_itemData.m_shared.m_weight = ((weight == -1f) ? ((float)component.m_itemData.m_shared.m_maxQuality) : weight); component.m_itemData.m_shared.m_scaleWeightByQuality = ((weightRatio == 0f) ? component.m_itemData.m_shared.m_scaleWeightByQuality : weightRatio); component.m_itemData.m_shared.m_equipDuration = ((equipeSpeed == -1f) ? component.m_itemData.m_shared.m_equipDuration : equipeSpeed); component.m_itemData.m_shared.m_movementModifier = sppedDebuff; component.m_itemData.m_shared.m_maxQuality = quality; } private void editDefense(GameObject gameObject, float blockPower = -1f, float blockPowerPerLevel = -1f, float deflectionForce = -1f, float deflectionForcePerLevel = 0f, float blockBonus = -1f) { ItemDrop component = gameObject.GetComponent(); component.m_itemData.m_shared.m_blockPower = ((blockPower == -1f) ? component.m_itemData.m_shared.m_blockPower : blockPower); component.m_itemData.m_shared.m_blockPowerPerLevel = ((blockPowerPerLevel == -1f) ? component.m_itemData.m_shared.m_blockPowerPerLevel : blockPowerPerLevel); component.m_itemData.m_shared.m_deflectionForce = ((deflectionForce == -1f) ? component.m_itemData.m_shared.m_deflectionForce : deflectionForce); component.m_itemData.m_shared.m_deflectionForcePerLevel = ((deflectionForcePerLevel == -1f) ? component.m_itemData.m_shared.m_deflectionForcePerLevel : deflectionForcePerLevel); component.m_itemData.m_shared.m_timedBlockBonus = ((blockBonus == -1f) ? component.m_itemData.m_shared.m_timedBlockBonus : blockBonus); } private void editArmor(GameObject gameObject, float armor = -1f, float armorPerLevel = -1f) { ItemDrop component = gameObject.GetComponent(); component.m_itemData.m_shared.m_armor = ((armor == -1f) ? component.m_itemData.m_shared.m_armor : armor); component.m_itemData.m_shared.m_armorPerLevel = ((armorPerLevel == -1f) ? component.m_itemData.m_shared.m_armorPerLevel : armorPerLevel); } private void editDurability(GameObject gameObject, float durability = -1f, float durabilityPerLevel = -1f, float useDrain = -1f) { ItemDrop component = gameObject.GetComponent(); component.m_itemData.m_durability = ((durability == -1f) ? component.m_itemData.m_durability : durability); component.m_itemData.m_shared.m_durabilityPerLevel = ((durabilityPerLevel == -1f) ? component.m_itemData.m_shared.m_durabilityPerLevel : durabilityPerLevel); component.m_itemData.m_shared.m_useDurabilityDrain = ((useDrain == -1f) ? component.m_itemData.m_shared.m_useDurabilityDrain : useDrain); } private void editValueAndTeleport(GameObject gameObject, int newValue = -1, bool teleportable = true) { ItemDrop component = gameObject.GetComponent(); int value = component.m_itemData.m_shared.m_value; component.m_itemData.m_shared.m_value = ((newValue != -1) ? newValue : value); component.m_itemData.m_shared.m_teleportable = teleportable; } } public class EventBuilder { private SpawnData spawnData; private List prefabList; public void EditEvents(List randomEvents, List allPrefabs) { prefabList = allPrefabs; foreach (RandomEvent randomEvent in randomEvents) { randomEvent.m_notRequiredGlobalKeys?.Clear(); randomEvent.m_altNotRequiredPlayerKeys?.Clear(); randomEvent.m_altRequiredNotKnownItems?.Clear(); Debug.Log((object)("Editing Event: " + randomEvent.m_name)); ApplyModifications(randomEvent); } } private void ModifyEvent(RandomEvent evt, Biome biome, bool nearBase, int durationMultiplier) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) evt.m_biome = biome; evt.m_nearBaseOnly = nearBase; evt.m_duration *= (float)durationMultiplier; evt.m_notRequiredGlobalKeys = new List(); } private void setSpawnDataObject(SpawnData spawn = null) { if (spawnData == null && spawn != null) { spawnData = spawn; } } private void ApplyModifications(RandomEvent evt) { //IL_04fd: Unknown result type (might be due to invalid IL or missing references) //IL_0504: Unknown result type (might be due to invalid IL or missing references) //IL_0505: Unknown result type (might be due to invalid IL or missing references) //IL_0412: Unknown result type (might be due to invalid IL or missing references) //IL_041c: Unknown result type (might be due to invalid IL or missing references) //IL_041d: Unknown result type (might be due to invalid IL or missing references) //IL_0355: Unknown result type (might be due to invalid IL or missing references) //IL_035f: Unknown result type (might be due to invalid IL or missing references) //IL_0360: Unknown result type (might be due to invalid IL or missing references) //IL_07db: Unknown result type (might be due to invalid IL or missing references) //IL_07e5: Unknown result type (might be due to invalid IL or missing references) //IL_07e6: Unknown result type (might be due to invalid IL or missing references) switch (evt.m_name) { case "surtlings": { ModifyEvent(evt, (Biome)571, nearBase: true, 1); setSpawnDataObject(evt.m_spawn?[0]); evt.m_pauseIfNoPlayerInArea = false; evt.m_requiredGlobalKeys = new List { "defeated_goblinking" }; SpawnData obj6 = evt.m_spawn[0]; obj6.m_maxSpawned *= 2; evt.m_spawn[0].m_maxLevel = 4; evt.m_spawn[0].m_groupSizeMax = 3; AddSpawner(evt, "SurtlingSpawner_bal", 22); break; } case "foresttrolls": { ModifyEvent(evt, (Biome)580, nearBase: false, 1); evt.m_pauseIfNoPlayerInArea = false; SpawnData obj2 = evt.m_spawn[0]; obj2.m_maxSpawned *= 2; evt.m_spawn[0].m_maxLevel = 3; evt.m_spawn[0].m_groupSizeMax = 1; setSpawnDataObject(evt.m_spawn?[0]); evt.m_forceEnvironment = "Misty"; evt.m_requiredGlobalKeys = new List { "defeated_bonemass", "KilledTroll" }; break; } case "blobs": { evt.m_biome = (Biome)(evt.m_biome | 0x200); evt.m_pauseIfNoPlayerInArea = false; evt.m_forceEnvironment = "Bonemass"; setSpawnDataObject(evt.m_spawn?[0]); SpawnData obj7 = evt.m_spawn[0]; obj7.m_maxSpawned *= 2; evt.m_spawn[0].m_maxLevel = 3; evt.m_spawn[0].m_groupSizeMax = 4; SpawnData obj8 = evt.m_spawn[1]; obj8.m_maxSpawned *= 2; evt.m_spawn[1].m_maxLevel = 3; evt.m_spawn[1].m_groupSizeMax = 2; break; } case "army_bonemass": { evt.m_biome = (Biome)(evt.m_biome | 0x260); evt.m_forceEnvironment = "Bonemass"; evt.m_pauseIfNoPlayerInArea = false; setSpawnDataObject(evt.m_spawn?[0]); SpawnData obj3 = evt.m_spawn[0]; obj3.m_maxSpawned += 2; evt.m_spawn[0].m_maxLevel = 3; evt.m_spawn[0].m_groupSizeMax = 4; evt.m_spawn[0].m_spawnChance = 75f; SpawnData obj4 = evt.m_spawn[1]; obj4.m_maxSpawned += 2; evt.m_spawn[1].m_maxLevel = 3; evt.m_spawn[1].m_groupSizeMax = 2; eventAddPoisonSkeleton(evt); eventAddSkeletonSpawner(evt); eventAddDraugrSpawner(evt); break; } case "army_moder": evt.m_biome = (Biome)(evt.m_biome | 0x40); evt.m_forceEnvironment = "SnowStorm"; evt.m_pauseIfNoPlayerInArea = false; setSpawnDataObject(evt.m_spawn?[0]); evt.m_spawn[0].m_maxLevel = 3; evt.m_spawn[0].m_groupSizeMax = 2; AddMonster(evt, "FrostDrake_bal", 55, 2, 3); AddMonster(evt, "Stormdrake_bal", 55, 2, 3); break; case "army_eikthyr": evt.m_forceEnvironment = "Misty"; setSpawnDataObject(evt.m_spawn?[0]); evt.m_pauseIfNoPlayerInArea = false; evt.m_spawn[0].m_maxLevel = 2; evt.m_spawn[0].m_groupSizeMax = 1; evt.m_spawn[1].m_maxLevel = 2; evt.m_spawn[1].m_groupSizeMax = 1; AddMonster(evt, "NeckBrute_bal", 50, 1, 2); AddMonster(evt, "Stag_bal", 50, 1); AddMonster(evt, "Hog_bal", 50, 1, 2); AddMonster(evt, "Bjorn", 5, 1); break; case "army_theelder": evt.m_forceEnvironment = "DeepForest Mist"; evt.m_pauseIfNoPlayerInArea = false; setSpawnDataObject(evt.m_spawn?[0]); evt.m_spawn[0].m_maxSpawned = 2; evt.m_spawn[0].m_maxLevel = 2; evt.m_spawn[0].m_groupSizeMax = 2; evt.m_spawn[1].m_maxSpawned = 2; evt.m_spawn[1].m_maxLevel = 2; evt.m_spawn[1].m_groupSizeMax = 2; evt.m_spawn[2].m_spawnChance = 50f; evt.m_spawn[2].m_maxSpawned = 1; evt.m_spawn[2].m_maxLevel = 2; AddMonster(evt, "Greyling", 75, 2, 3); AddMonster(evt, "GreylingElite_bal", 15, 1, 2); AddMonster(evt, "GreylingBeeKeeper_bal", 15, 1, 2); AddMonster(evt, "Greydwarf_Moss_bal", 10, 1, 2); AddMonster(evt, "Greydwarf_Crusher_bal", 5, 1); eventAddGreydwarfSpawner(evt); break; case "wolves": { evt.m_pauseIfNoPlayerInArea = false; evt.m_nearBaseOnly = false; setSpawnDataObject(evt.m_spawn?[0]); SpawnData obj = evt.m_spawn[0]; obj.m_maxSpawned *= 2; evt.m_spawn[0].m_maxLevel = 3; AddMonster(evt, "Ulv", 25, 2, 2); break; } case "skeletons": { evt.m_biome = (Biome)(evt.m_biome | 0x260); evt.m_forceEnvironment = "GdKing"; evt.m_pauseIfNoPlayerInArea = false; evt.m_nearBaseOnly = false; setSpawnDataObject(evt.m_spawn?[0]); evt.m_spawn[0].m_maxLevel = 5; evt.m_spawn[0].m_groupSizeMax = 4; evt.m_spawn[0].m_spawnChance = 75f; SpawnData obj5 = evt.m_spawn[1]; obj5.m_maxSpawned *= 2; evt.m_spawn[1].m_maxLevel = 4; evt.m_spawn[1].m_groupSizeMax = 2; eventAddSkeletonSpawner(evt); AddMonster(evt, "TrollUndead_bal", 10, 1, 2); AddMonster(evt, "GhostYagluth_bal", 15, 2, 2); break; } case "boss_gdking": if (spawnData != null) { AddMonster(evt, "Greydwarf_Shaman", 25, 3, 2); } break; case "boss_eikthyr": if (spawnData != null) { AddMonster(evt, "StagGhost_bal", 75, 3, 3); } break; case "boss_moder": if (spawnData != null) { AddMonster(evt, "Stormdrake_bal", 44, 2, 2); AddMonster(evt, "FrostDrake_bal", 44, 2, 2); } break; case "boss_bonemass": if (spawnData != null) { AddMonster(evt, "Blob", 22, 2, 3); AddMonster(evt, "BlobElite", 33, 1, 3); } break; case "boss_goblinking": if (spawnData != null) { AddMonster(evt, "goblin_skeleton_bal", 33, 2, 3); AddMonster(evt, "GhostYagluth_bal", 22, 1, 3); } break; } } private void AddSpawner(RandomEvent evt, string prefabName, int chance) { GameObject val = prefabList.Find((GameObject x) => ((Object)x).name == prefabName); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Couldn't find spawner prefab: " + prefabName)); return; } SpawnData val2 = CreateSpawnData(spawnData, val, "event_" + prefabName, chance, 1, 1); if (val2 != null) { evt.m_spawn.Add(val2); } } public void AddMonster(RandomEvent evt, string name, int chance = 50, int amount = 2, int maxLevel = 1) { GameObject val = prefabList.Find((GameObject x) => ((Object)x).name == name); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Couldn't find monster prefab: " + name)); return; } SpawnData val2 = CreateSpawnData(spawnData, val, "event_" + evt.m_name + "_" + name, chance, amount, maxLevel); if (val2 != null) { evt.m_spawn.Add(val2); } } private SpawnData CreateSpawnData(SpawnData template, GameObject prefab, string name, int chance, int amount, int maxLevel) { //IL_0004: 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) //IL_0010: 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_001e: 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_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: 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_0048: Unknown result type (might be due to invalid IL or missing references) SpawnData val = (SpawnData)((template != null) ? ((object)template.Clone()) : ((object)new SpawnData { m_spawnAtDay = true, m_spawnAtNight = true, m_huntPlayer = true, m_canSpawnCloseToPlayer = true, m_maxAltitude = 2000f, m_minAltitude = 0f, m_biome = (Biome)895, m_biomeArea = (BiomeArea)3 })); val.m_name = name; val.m_prefab = prefab; val.m_spawnChance = chance; val.m_maxSpawned = amount; val.m_groupSizeMax = amount; val.m_groupSizeMin = 1; val.m_maxLevel = maxLevel; return val; } public RandomEvent AddAmbushEvent(List allPrefabs, RandomEvent baseEvent, string eventname, Biome biome, string monsterName1, string monsterName2, string globalKey = "") { //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) prefabList = allPrefabs; RandomEvent val = baseEvent.Clone(); val.m_duration = 60f; val.m_eventRange = 48f; val.m_forceEnvironment = "Misty"; val.m_forceMusic = "CombatEventL4"; val.m_nearBaseOnly = false; val.m_requiredGlobalKeys = new List { globalKey }; val.m_altRequiredPlayerKeysAny = new List(); val.m_notRequiredGlobalKeys = new List(); val.m_altRequiredKnownItems = new List(); val.m_altRequiredNotKnownItems = new List(); val.m_random = true; val.m_enabled = true; val.m_pauseIfNoPlayerInArea = false; val.m_name = "Ambush_" + eventname; val.m_startMessage = "$tag_ambush_start_bal"; val.m_endMessage = ""; val.m_biome = biome; val.m_spawn[0].m_name = val.m_name + " - " + monsterName1; val.m_spawn[0].m_prefab = prefabList.Find((GameObject x) => ((Object)x).name == monsterName1); val.m_spawn[0].m_maxSpawned = 2; val.m_spawn[0].m_biome = biome; val.m_spawn[0].m_biomeArea = (BiomeArea)3; val.m_spawn[0].m_maxLevel = 3; val.m_spawn[0].m_groupSizeMax = 1; val.m_spawn[0].m_groupSizeMin = 1; val.m_spawn[0].m_spawnChance = 75f; val.m_spawn[0].m_minAltitude = 1f; val.m_spawn[0].m_maxAltitude = 10000f; val.m_spawn[0].m_huntPlayer = true; SpawnData val2 = val.m_spawn[0].Clone(); val2.m_prefab = prefabList.Find((GameObject x) => ((Object)x).name == monsterName2); val2.m_name = val.m_name + " - " + monsterName2; val2.m_maxSpawned = 2; val2.m_maxLevel = 2; val.m_spawn.Add(val2); return val; } public void AddNewEvents(List randomEvents, List allPrefabs) { prefabList = allPrefabs; string baseName = "surtlings"; RandomEvent val = randomEvents.Find((RandomEvent x) => x.m_name == baseName); if (val != null) { string forestTrollsBase = "foresttrolls"; RandomEvent baseEvent = randomEvents.Find((RandomEvent x) => x.m_name == forestTrollsBase); List collection = new List { DarkNightEvent(val), GhostNightEvent(val), BloodMoonEvent(val), FeedingTimeEvent(val), BlackMassEvent(val), NewForestTrolls(baseEvent) }; RandomEvent baseEvent2 = randomEvents.Find((RandomEvent x) => x.m_name == "wolves"); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "NeckHunt", (Biome)1, "Neck", "NeckBrute_bal")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "GreylingHunt", (Biome)1, "Greyling", "GreylingElite_bal")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "GreydwarfHunt1", (Biome)8, "Greydwarf", "Greydwarf_Elite", "defeated_eikthyr")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "GreydwarfHunt2", (Biome)8, "Greydwarf_Shaman", "Greydwarf_Moss_bal", "defeated_eikthyr")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "GreydwarfHunt3", (Biome)8, "Greydwarf_Elite", "Greydwarf_Crusher_bal", "defeated_gdking")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "SkeletonHunt", (Biome)8, "Skeleton", "Skeleton_Poison", "defeated_gdking")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "SkeletonHunt2", (Biome)2, "Skeleton_Poison", "goblin_skeleton_bal", "defeated_bonemass")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "LeechHunt", (Biome)2, "Leech", "LeechPrimal_bal", "defeated_gdking")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "GhostHunt", (Biome)2, "Ghost", "Wraith", "defeated_bonemass")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "DraugrHunt", (Biome)2, "Draugr", "Draugr_Elite", "defeated_gdking")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "FenringHunt", (Biome)4, "Fenring", "Fenring_Cultist", "defeated_bonemass")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "FoxHunt", (Biome)16, "Fox_bal", "Fox_bal", "defeated_bonemass")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "HabrokHunt", (Biome)16, "Habrok_bal", "Habrok_bal", "defeated_bonemass")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "GoblinHunt1", (Biome)16, "Goblin", "GoblinShaman", "defeated_dragon")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "GoblinHunt1", (Biome)16, "Goblin", "GoblinBrute", "defeated_dragon")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "SeekerHunt1", (Biome)512, "SeekerBrood", "Seeker", "defeated_dragon")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "SeekerHunt2", (Biome)512, "Seeker", "SeekerBrute", "defeated_dragon")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "CharredHunt1", (Biome)32, "Charred_Twitcher", "Charred_Mage", "defeated_queen")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "CharredHunt2", (Biome)32, "Charred_Archer", "Charred_Melee", "defeated_queen")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "FaderHunt1", (Biome)32, "Charred_Twitcher_Summoned", "Charred_Archer_Fader", "defeated_queen")); randomEvents.Add(AddAmbushEvent(allPrefabs, baseEvent2, "FaderHunt2", (Biome)32, "Charred_Twitcher_Summoned", "Charred_Melee_Fader", "defeated_queen")); randomEvents.AddRange(collection); } } private RandomEvent DarkNightEvent(RandomEvent baseEvent) { Debug.Log((object)"Creating event: DarkNight"); List keys = new List { "defeated_gdking" }; List list = new List(); if (spawnData != null) { list.Add(EventCreateMonster(baseEvent, "DarkNight", "DarkBat_bal", 99, 10, 4)); } return CreateEvent(baseEvent, (Biome)27, keys, new List(), list, "DarkNight", "The Darkest Night starts", "The Dark night passes", "CombatEventL2", "Darklands_dark"); } private RandomEvent GhostNightEvent(RandomEvent baseEvent) { Debug.Log((object)"Creating event: GhostNight"); List keys = new List { "defeated_gdking" }; List list = new List(); if (spawnData != null) { list.Add(EventCreateMonster(baseEvent, "GhostNight", "Ghost", 75, 3, 3)); list.Add(EventCreateMonster(baseEvent, "GhostNight", "Wraith", 22, 1, 1)); list.Add(EventCreateMonster(baseEvent, "GhostNight", "LostSoul_bal", 33, 2, 3)); } return CreateEvent(baseEvent, (Biome)63, keys, new List(), list, "GhostNightEvent", "The Spirits awaken", "The Spirits rest again", "CombatEventL1", "Crypt"); } private RandomEvent FeedingTimeEvent(RandomEvent baseEvent) { Debug.Log((object)"Creating event: FeedingTime"); List keys = new List { "defeated_bonemass" }; List list = new List(); if (spawnData != null) { list.Add(EventCreateMonster(baseEvent, "FeedingTime", "Serpentling_bal", 75, 6, 3)); list.Add(EventCreateMonster(baseEvent, "FeedingTime", "Serpent", 25, 3, 3)); } return CreateEvent(baseEvent, (Biome)256, keys, new List(), list, "FeedingTime", "The Serpent Feeding Season started", "The feeding season ended", "CombatEventL3", "Misty"); } private RandomEvent BloodMoonEvent(RandomEvent baseEvent) { Debug.Log((object)"Creating event: BloodMoon"); List keys = new List { "defeated_bonemass", "killedFenring" }; List list = new List(); if (spawnData != null) { list.Add(EventCreateMonster(baseEvent, "BloodMoon", "Bat", 44, 8, 5)); list.Add(EventCreateMonster(baseEvent, "BloodMoon", "Ulv", 77, 6, 3)); list.Add(EventCreateMonster(baseEvent, "BloodMoon", "Fenring", 66, 4, 2)); list.Add(EventCreateMonster(baseEvent, "BloodMoon", "Fenring_Cultist", 33, 2, 2)); } return CreateEvent(baseEvent, (Biome)895, keys, new List(), list, "BloodMoon", "The Blood Moon rises", "The Blood Moon fades away", "CombatEventL4", "Darklands_dark"); } private RandomEvent BlackMassEvent(RandomEvent baseEvent) { Debug.Log((object)"Creating event: BlackMass"); List keys = new List { "defeated_goblinking" }; List noKeys = new List(); List list = new List(); if (spawnData != null) { list.Add(EventCreateMonster(baseEvent, "BlackMass", "BlobTar", 75, 6, 3)); } return CreateEvent(baseEvent, (Biome)571, keys, noKeys, list, "BlackMass", "Black Mass starts", "Black Mass ends", "CombatEventL4", "Ashlands_ashrain"); } private RandomEvent NewForestTrolls(RandomEvent baseEvent) { Debug.Log((object)"Creating event: NewForestTrolls"); List keys = new List { "KilledTroll" }; List list = new List(); if (spawnData != null) { list.Add(EventCreateMonster(baseEvent, "NewForestTrolls", "TrollOutcast_bal", 66, 3, 2)); list.Add(EventCreateMonster(baseEvent, "NewForestTrolls", "TrollBrute_bal", 22, 1, 1)); } return CreateEvent(baseEvent, (Biome)11, keys, new List(), list, "NewForestTrolls", "Rush of Forest Trolls starts", "Rush of Forest Trolls ends", baseEvent.m_forceMusic, baseEvent.m_forceEnvironment); } private RandomEvent DvergerRevangeEvent(RandomEvent baseEvent) { //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) Debug.Log((object)"Creating event: DvergerRevange"); List keys = new List { "defeated_goblinking", "killedDverger" }; List noKeys = new List { "defeated_queen" }; List list = new List(); if (spawnData != null) { list.Add(EventCreateMonster(baseEvent, "DvergerRevange", "DvergerMage_event", 75, 2, 3)); list.Add(EventCreateMonster(baseEvent, "DvergerRevange", "DvergerMageFire_event", 75, 1, 2)); list.Add(EventCreateMonster(baseEvent, "DvergerRevange", "DvergerMageIce_event", 75, 1, 2)); list.Add(EventCreateMonster(baseEvent, "DvergerRevange", "DvergerMageSupport_event", 75, 1, 2)); list.Add(EventCreateMonster(baseEvent, "DvergerRevange", "Dverger_event", 50, 2, 2)); } Biome biome = (Biome)127; return CreateEvent(baseEvent, biome, keys, noKeys, list, "DvergerRevange", "It's payback time", "Hope you learned the lesson", "CombatEventL3", "Twilight_SnowStorm", 200f); } private RandomEvent SeekerHuntEvent(RandomEvent baseEvent) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) Debug.Log((object)"Creating event: SeekerHunt"); List list = new List(); List list2 = new List(); List list3 = new List(); Biome biome = (Biome)127; list.Add("defeated_goblinking"); list.Add("killedSeeker"); list2.Add("defeated_queen"); if (spawnData != null) { list3.Add(EventCreateMonster(baseEvent, "SeekerHunt", "SeekerBrood", 75, 10, 3)); list3.Add(EventCreateMonster(baseEvent, "SeekerHunt", "Seeker", 50, 2, 2)); list3.Add(EventCreateMonster(baseEvent, "SeekerHunt", "SeekerBrute", 25, 1, 1)); } return CreateEvent(baseEvent, biome, list, list2, list3, "SeekerHunt", "The Hive hungers", "THe Hive have feasted", "CombatEventL2", "Eikthyr", 200f); } private RandomEvent DeathBreedingSeasonEvent(RandomEvent baseEvent) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) Debug.Log((object)"Creating event: DeathBreedingSeason"); List list = new List(); List list2 = new List(); List list3 = new List(); Biome biome = (Biome)555; list.Add("defeated_dragon"); list.Add("killedInsecto"); list2.Add("defeated_queen"); if (spawnData != null) { list3.Add(EventCreateMonster(baseEvent, "DeathBreedingSeason", "Deathsquito_bal_event", 75, 4, 3)); list3.Add(EventCreateMonster(baseEvent, "DeathBreedingSeason", "Tick", 50, 8, 2)); } return CreateEvent(baseEvent, biome, list, list2, list3, "DeathBreedingSeason", "Breeding Season starts", "Breeding Season ends", "CombatEventL4", "Clear", 200f); } private RandomEvent CreateEvent(RandomEvent baseEvent, Biome biome, List keys, List noKeys, List spawns, string name, string start, string stop, string music, string env, float duration = 100f, bool random = true) { //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) RandomEvent val = baseEvent.Clone(); val.m_name = name; val.m_startMessage = start; val.m_endMessage = stop; val.m_forceMusic = music ?? val.m_forceMusic; val.m_forceEnvironment = env; val.m_requiredGlobalKeys = keys; val.m_notRequiredGlobalKeys = noKeys; val.m_spawn = spawns; val.m_biome = biome; val.m_duration = duration; val.m_random = random; return val; } private SpawnData EventCreateMonster(RandomEvent baseEvent, string eventName, string name, int chance, int amount, int maxLvl) { //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) if (baseEvent == null || baseEvent.m_spawn == null || baseEvent.m_spawn.Count == 0) { return null; } GameObject val = prefabList.Find((GameObject x) => ((Object)x).name == name); if ((Object)(object)val == (Object)null) { return null; } SpawnData val2 = baseEvent.m_spawn[0].Clone(); val2.m_name = "event_" + eventName + "_" + name; val2.m_prefab = val; val2.m_spawnChance = chance; val2.m_maxSpawned = amount; val2.m_groupSizeMax = amount; val2.m_groupSizeMin = 1; val2.m_maxLevel = maxLvl; val2.m_spawnAtDay = true; val2.m_spawnAtNight = true; val2.m_huntPlayer = true; val2.m_canSpawnCloseToPlayer = true; val2.m_maxAltitude = 2000f; val2.m_minAltitude = 0f; val2.m_biome = (Biome)895; val2.m_biomeArea = (BiomeArea)3; return val2; } private void eventAddPoisonSkeleton(RandomEvent randomEvent) { SpawnData val = randomEvent.m_spawn[1].Clone(); val.m_name = "event_Skeleton_Poison"; val.m_prefab = prefabList.Find((GameObject x) => ((Object)x).name == "Skeleton_Poison"); val.m_spawnChance = 50f; val.m_maxSpawned = 2; randomEvent.m_spawn.Add(val); } private void eventAddSkeletonSpawner(RandomEvent randomEvent) { SpawnData val = randomEvent.m_spawn[0].Clone(); val.m_name = "event_BonePileSpawner"; val.m_prefab = prefabList.Find((GameObject x) => ((Object)x).name == "BonePileSpawner"); val.m_spawnChance = 10f; val.m_maxSpawned = 1; val.m_levelUpMinCenterDistance = 1E+14f; val.m_maxLevel = 0; val.m_groupSizeMax = 1; randomEvent.m_spawn.Add(val); } private void eventAddDraugrSpawner(RandomEvent randomEvent) { SpawnData val = randomEvent.m_spawn[0].Clone(); val.m_name = "event_Spawner_DraugrPile"; val.m_prefab = prefabList.Find((GameObject x) => ((Object)x).name == "Spawner_DraugrPile"); val.m_spawnChance = 10f; val.m_maxSpawned = 1; val.m_levelUpMinCenterDistance = 1E+14f; val.m_maxLevel = 0; val.m_groupSizeMax = 1; randomEvent.m_spawn.Add(val); } private void eventAddGreydwarfSpawner(RandomEvent randomEvent) { SpawnData val = randomEvent.m_spawn[0].Clone(); val.m_name = "event_Spawner_GreydwarfNest"; val.m_prefab = prefabList.Find((GameObject x) => ((Object)x).name == "Spawner_GreydwarfNest"); val.m_spawnChance = 5f; val.m_maxSpawned = 1; val.m_levelUpMinCenterDistance = 1E+14f; val.m_maxLevel = 0; val.m_groupSizeMax = 1; randomEvent.m_spawn.Add(val); } private void eventSurtlingSpawner(RandomEvent randomEvent) { SpawnData val = randomEvent.m_spawn[0].Clone(); val.m_name = "event_SurtlingSpawner_bal"; val.m_prefab = prefabList.Find((GameObject x) => ((Object)x).name == "SurtlingSpawner"); val.m_spawnChance = 10f; val.m_maxSpawned = 1; val.m_levelUpMinCenterDistance = 1E+14f; val.m_maxLevel = 0; val.m_groupSizeMax = 1; randomEvent.m_spawn.Add(val); } } public class LocationBuilder { public static List vanillaLocationsYouEdit = new List { "TrollCave02" }; public List locations = new List(); public void editLocations(List locationList) { if (locationList == null || locationList.Count == 0) { Debug.LogWarning((object)"LOCATION LIST IS EMPTY!"); } else { DeepNorthSetup(locationList); } } public void DebugMe(List locationList) { for (int i = 0; i < locationList.Count; i++) { GetLog(locationList[i], i); } } private ZoneLocation FindLocation(List locationList, string name) { return locationList.Find((ZoneLocation x) => x.m_prefabName == name); } private void DeepNorthSetup(List locationList) { Debug.Log((object)(Launch.projectName + ": Preparing Locations for Deep North")); HashSet hashSet = new HashSet { "TrollCave02" }; foreach (string item in hashSet) { ZoneLocation val = FindLocation(locationList, item); if (val != null) { editLocation(val); } else { Debug.LogWarning((object)("Location not found: " + item)); } } } private void editLocation(ZoneLocation zoneLocation) { //IL_0002: 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) _ = zoneLocation.m_prefab; if (0 == 0) { zoneLocation.m_enable = true; zoneLocation.m_biome = (Biome)68; zoneLocation.m_minDistanceFromSimilar = 44f; zoneLocation.m_minAltitude = 3f; zoneLocation.m_minDistance = 0f; zoneLocation.m_maxDistance = 0f; string prefabName = zoneLocation.m_prefabName; if (prefabName != "Mistlands_Harbour1") { zoneLocation.m_maxAltitude = 3000f; } if (prefabName == "MountainWell1") { zoneLocation.m_minAltitude = 0f; zoneLocation.m_maxAltitude = 3000f; } } } private void changeBiomeSetup(List locationList) { Debug.Log((object)(Launch.projectName + ": Editing Locations for world spawn")); } private void ApplyToLocations(List locationList, string[] names, Action action) { for (int i = 0; i < names.Length; i++) { ZoneLocation val = FindLocation(locationList, names[i]); if (val != null) { action(val); } else { Debug.LogWarning((object)("Location not found: " + names[i])); } } } private void locationEditSpecial(ZoneLocation loc) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_007b: 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_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_0257: Unknown result type (might be due to invalid IL or missing references) string prefabName = loc.m_prefabName; if (IsIn(prefabName, "SunkenCrypt", "SunkenCrypt4")) { loc.m_biome = (Biome)2; loc.m_minDistance = 600f; loc.m_maxDistance = 10500f; loc.m_minAltitude = 0f; loc.m_maxAltitude = 100000f; loc.m_iconPlaced = true; loc.m_quantity *= 2; loc.m_prioritized = true; loc.m_biomeArea = (BiomeArea)3; loc.m_minDistanceFromSimilar = 33f; return; } if (prefabName == "MountainCave02") { loc.m_biome = (Biome)68; loc.m_minAltitude = 20f; loc.m_maxAltitude = 100000f; loc.m_minDistance = 600f; loc.m_quantity *= 3; loc.m_maxDistance = 10500f; loc.m_minDistanceFromSimilar = 33f; return; } if (IsIn(prefabName, "Crypt3", "Crypt4")) { loc.m_biome = (Biome)607; loc.m_minDistance = 600f; loc.m_maxDistance = 10500f; loc.m_minAltitude = 15f; loc.m_maxAltitude = 100000f; loc.m_minDistanceFromSimilar = 33f; loc.m_quantity *= 2; return; } if (prefabName == "WoodFarm1") { loc.m_biome = (Biome)95; loc.m_minDistance = 300f; loc.m_maxDistance = 10500f; loc.m_minAltitude = 10f; loc.m_maxAltitude = 10000f; loc.m_quantity *= 2; return; } if (prefabName == "WoodVillage1") { loc.m_biome = (Biome)95; loc.m_minDistance = 1500f; loc.m_maxDistance = 10500f; loc.m_minAltitude = 10f; loc.m_maxAltitude = 10000f; loc.m_quantity *= 2; return; } if (IsIn(prefabName, "GoblinCamp2", "StoneTower1", "StoneTower3", "Ruin3")) { loc.m_biome = (Biome)25; loc.m_minDistance = 2500f; loc.m_maxDistance = 10500f; loc.m_minAltitude = 10f; loc.m_maxAltitude = 100000f; return; } switch (prefabName) { case "Eikthyrnir": loc.m_group = "bossarena"; loc.m_minDistance = 300f; loc.m_maxDistance = 800f; loc.m_quantity = 30; loc.m_unique = true; break; case "GDKing": loc.m_group = "bossarena"; loc.m_minDistanceFromSimilar = 1000f; loc.m_minDistance = 1000f; loc.m_maxDistance = 2500f; loc.m_quantity = 10; loc.m_unique = true; break; case "Bonemass": loc.m_group = "bossarena"; loc.m_minDistanceFromSimilar = 1000f; loc.m_minDistance = 1500f; loc.m_maxDistance = 3500f; loc.m_quantity = 10; loc.m_unique = true; break; case "Dragonqueen": loc.m_group = "bossarena"; loc.m_minDistanceFromSimilar = 1000f; loc.m_minDistance = 300f; loc.m_maxDistance = 5000f; loc.m_quantity = 10; loc.m_unique = true; break; case "GoblinKing": loc.m_group = "bossarena"; loc.m_minDistanceFromSimilar = 1000f; loc.m_minDistance = 3000f; loc.m_maxDistance = 7000f; loc.m_quantity = 10; loc.m_unique = true; break; case "Mistlands_DvergrBossEntrance1": loc.m_group = "bossarena"; loc.m_minDistanceFromSimilar = 1000f; loc.m_minDistance = 5500f; loc.m_maxDistance = 8500f; loc.m_quantity = 10; loc.m_unique = true; break; case "FaderLocation": loc.m_group = "bossarena"; loc.m_quantity = 10; loc.m_unique = true; break; } } private void biomeSwap(ZoneLocation zoneLocation) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0013: 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_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0029: 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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_01d5: Unknown result type (might be due to invalid IL or missing references) //IL_027c: Unknown result type (might be due to invalid IL or missing references) //IL_02bd: Unknown result type (might be due to invalid IL or missing references) //IL_02e4: Unknown result type (might be due to invalid IL or missing references) //IL_0345: Unknown result type (might be due to invalid IL or missing references) //IL_037e: Unknown result type (might be due to invalid IL or missing references) //IL_03c4: Unknown result type (might be due to invalid IL or missing references) //IL_03e8: Unknown result type (might be due to invalid IL or missing references) string prefabName = zoneLocation.m_prefabName; Biome biome = (Biome)11; Biome biome2 = (Biome)514; Biome biome3 = (Biome)9; Biome biome4 = (Biome)48; Biome biome5 = (Biome)95; Biome biome6 = (Biome)68; Biome biome7 = (Biome)94; Biome biome8 = (Biome)596; Biome biome9 = (Biome)86; if (IsIn(prefabName, "Ruin1", "Ruin2")) { editLocationParams(zoneLocation, biome); zoneLocation.m_minAltitude = 5f; zoneLocation.m_maxAltitude = 150f; } if (IsIn(prefabName, "TarPit1", "TarPit2", "TarPit3")) { editLocationParams(zoneLocation, biome4); zoneLocation.m_minAltitude = 5f; zoneLocation.m_maxAltitude = 70f; return; } switch (prefabName) { case "SwampWell1": editLocationParams(zoneLocation, biome9); return; case "ShipSetting01": editLocationParams(zoneLocation, biome5); zoneLocation.m_minAltitude = -5f; zoneLocation.m_maxAltitude = 25f; return; case "MountainGrave01": editLocationParams(zoneLocation, biome8); return; case "InfestedTree01": editLocationParams(zoneLocation, biome2); return; } if (IsIn(prefabName, "AbandonedLogCabin02", "AbandonedLogCabin03", "AbandonedLogCabin04")) { editLocationParams(zoneLocation, biome6, 1000); } else if (prefabName == "StoneTowerRuins03") { editLocationParams(zoneLocation, biome3); } else if (IsIn(prefabName, "WoodHouse1", "WoodHouse2", "WoodHouse3", "WoodHouse4", "WoodHouse5", "WoodHouse6", "WoodHouse7", "WoodHouse8", "WoodHouse9", "WoodHouse10", "WoodHouse11", "WoodHouse12", "WoodHouse13", "StoneHouse3", "StoneHouse4")) { editLocationParams(zoneLocation, biome5); } else if (IsIn(prefabName, "SwampRuin1", "SwampRuin2", "StoneTowerRuins04")) { editLocationParams(zoneLocation, biome7); } else if (prefabName == "StoneTowerRuins05") { editLocationParams(zoneLocation, biome9, 1000); } else if (IsIn(prefabName, "StoneTowerRuins06", "StoneTowerRuins07", "StoneTowerRuins08", "StoneTowerRuins09", "StoneTowerRuins10", "StoneWall1", "StoneWall2")) { editLocationParams(zoneLocation, biome5, 1000); } else if (IsIn(prefabName, "StoneHenge6", "StoneHouse5_heath")) { editLocationParams(zoneLocation, biome5, 1500); } else if (IsIn(prefabName, "SwampHut1", "SwampHut2", "SwampHut3", "SwampHut5")) { editLocationParams(zoneLocation, biome7, 1500); } else if (prefabName == "SwampHut4") { editLocationParams(zoneLocation, biome7); } } private void editLocationParams(ZoneLocation zoneLocation, Biome biome, int minDistance = 500) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) zoneLocation.m_enable = true; zoneLocation.m_biome = biome; zoneLocation.m_quantity *= 2; zoneLocation.m_minAltitude = ((zoneLocation.m_minAltitude == 0f) ? 10f : zoneLocation.m_minAltitude); zoneLocation.m_maxAltitude = ((zoneLocation.m_maxAltitude == 0f) ? 3000f : zoneLocation.m_maxAltitude); zoneLocation.m_minDistance = minDistance; zoneLocation.m_maxDistance = 0f; } private bool IsIn(string name, params string[] options) { for (int i = 0; i < options.Length; i++) { if (name == options[i]) { return true; } } return false; } private static void GetLog(ZoneLocation location, int counter) { //IL_006d: Unknown result type (might be due to invalid IL or missing references) if (location == null) { Debug.LogWarning((object)("Skipping id: " + counter)); return; } Debug.LogWarning((object)("ID: " + counter)); Debug.LogWarning((object)("m_name: " + ((location.m_name != null) ? location.m_name.ToString() : ""))); _ = location.m_prefab; Debug.LogWarning((object)("m_prefab: " + ((object)location.m_prefab/*cast due to .constrained prefix*/).ToString())); Debug.LogWarning((object)("m_prefabName: " + ((location.m_prefabName != null) ? location.m_prefabName.ToString() : ""))); Debug.LogWarning((object)("m_quantity: " + location.m_quantity)); Debug.LogWarning((object)("m_groupMax: " + location.m_groupMax.ToString())); Debug.LogWarning((object)("m_group: " + ((location.m_group != null) ? location.m_group.ToString() : ""))); Debug.LogWarning((object)("m_biome: " + ((object)Unsafe.As(ref location.m_biome)/*cast due to .constrained prefix*/).ToString())); Debug.LogWarning((object)("m_biomeArea: " + ((object)Unsafe.As(ref location.m_biomeArea)/*cast due to .constrained prefix*/).ToString())); Debug.LogWarning((object)("m_enable: " + location.m_enable)); Debug.LogWarning((object)("m_unique: " + location.m_unique)); Debug.LogWarning((object)("m_clearArea: " + location.m_clearArea)); Debug.LogWarning((object)("m_centerFirst: " + location.m_centerFirst)); Debug.LogWarning((object)("m_iconAlways: " + location.m_iconAlways)); Debug.LogWarning((object)("m_iconPlaced: " + location.m_iconPlaced)); Debug.LogWarning((object)("m_surroundBetterThanAverage: " + location.m_surroundBetterThanAverage)); Debug.LogWarning((object)("m_surroundCheckDistance: " + location.m_surroundCheckDistance)); Debug.LogWarning((object)("m_surroundCheckLayers: " + location.m_surroundCheckLayers)); Debug.LogWarning((object)("m_surroundCheckVegetation: " + location.m_surroundCheckVegetation)); Debug.LogWarning((object)("m_prioritized: " + location.m_prioritized)); Debug.LogWarning((object)("m_randomRotation: " + location.m_randomRotation)); Debug.LogWarning((object)("m_slopeRotation: " + location.m_slopeRotation)); Debug.LogWarning((object)("m_minDistance: " + location.m_minDistance)); Debug.LogWarning((object)("m_maxDistance: " + location.m_maxDistance)); Debug.LogWarning((object)("m_minDistanceFromSimilar: " + location.m_minDistanceFromSimilar)); Debug.LogWarning((object)("m_maxDistanceFromSimilar: " + location.m_maxDistanceFromSimilar)); Debug.LogWarning((object)("m_maximumVegetation: " + location.m_maximumVegetation)); Debug.LogWarning((object)("m_interiorRadius: " + location.m_interiorRadius)); Debug.LogWarning((object)("m_exteriorRadius: " + location.m_exteriorRadius)); Debug.LogWarning((object)("m_foldout: " + location.m_foldout)); Debug.LogWarning((object)("m_snapToWater: " + location.m_snapToWater)); Debug.LogWarning((object)("m_inForest: " + location.m_inForest)); Debug.LogWarning((object)("m_minAltitude: " + location.m_minAltitude)); Debug.LogWarning((object)("m_maxAltitude: " + location.m_maxAltitude)); Debug.LogWarning((object)("m_minTerrainDelta: " + location.m_minTerrainDelta)); Debug.LogWarning((object)("m_maxTerrainDelta: " + location.m_maxTerrainDelta)); Debug.LogWarning((object)("m_forestTresholdMin: " + location.m_forestTresholdMin)); Debug.LogWarning((object)("m_forestTresholdMax: " + location.m_forestTresholdMax)); } public static AssetID AssetIDFromObject(Object obj) { //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_0014: Unknown result type (might be due to invalid IL or missing references) int instanceID = obj.GetInstanceID(); return new AssetID(1u, 1u, 1u, (uint)instanceID); } private ZoneLocation setupLocation(GameObject obj, ZoneLocation location, int amount, int minAlt, int maxAlt, int minDistance, int maxDistance, float similarDistance, float minDelta, float maxDelta, float forestMin, float forestMax, string group = "") { location.m_quantity = amount; location.m_group = group; location.m_minAltitude = minAlt; location.m_maxAltitude = maxAlt; location.m_minDistance = minDistance; location.m_maxDistance = maxDistance; location.m_minDistanceFromSimilar = similarDistance; location.m_minTerrainDelta = (minDelta = 0f); location.m_maxTerrainDelta = maxDelta; location.m_interiorRadius = obj.GetComponent().m_interiorRadius; location.m_exteriorRadius = obj.GetComponent().m_exteriorRadius; location.m_forestTresholdMin = (forestMin = -1f); location.m_forestTresholdMax = forestMax; return location; } } public sealed class MonsterCloneService { private readonly Dictionary createdClones = new Dictionary(); public IReadOnlyDictionary CreatedClones => createdClones; public void RegisterVariants(ZNetScene zNetScene, IEnumerable variants) { if ((Object)(object)zNetScene == (Object)null || zNetScene.m_prefabs == null || variants == null) { return; } foreach (MonsterVariantDefinition variant in variants) { RegisterVariant(zNetScene, variant); } } public GameObject RegisterVariant(ZNetScene zNetScene, MonsterVariantDefinition variant) { if ((Object)(object)zNetScene == (Object)null || zNetScene.m_prefabs == null || variant == null) { return null; } if (string.IsNullOrEmpty(variant.OriginalName) || string.IsNullOrEmpty(variant.NewName)) { return null; } GameObject val = PrefabTools.FindPrefab(zNetScene, variant.NewName); if ((Object)(object)val != (Object)null) { createdClones[variant.NewName] = val; return val; } GameObject val2 = PrefabTools.FindPrefab(zNetScene, variant.OriginalName); if ((Object)(object)val2 == (Object)null) { Debug.LogWarning((object)("[" + Launch.projectName + "] Clone source prefab not found: " + variant.OriginalName + " -> " + variant.NewName)); return null; } GameObject val3 = ClonePrefab(val2, variant.NewName); ApplyFactionAndName(val3, variant); CopyLootIfNeeded(zNetScene, val3, variant); variant.ConfigureClone?.Invoke(val3); PrefabTools.AddPrefabOnce(zNetScene, val3); createdClones[variant.NewName] = val3; Debug.LogWarning((object)("[" + Launch.projectName + "] Registered monster variant: " + variant.OriginalName + " -> " + variant.NewName)); return val3; } public static GameObject ClonePrefab(GameObject source, string name) { GameObject val = Object.Instantiate(source, Launch.PrefabContainer.transform); ((Object)val).name = name; FixMaterials(val, source); val.SetActive(true); return val; } public static GameObject FixMaterials(GameObject clone, GameObject source) { if ((Object)(object)clone == (Object)null || (Object)(object)source == (Object)null) { return clone; } MeshRenderer[] componentsInChildren = source.GetComponentsInChildren(true); foreach (MeshRenderer val in componentsInChildren) { MeshRenderer[] componentsInChildren2 = clone.GetComponentsInChildren(true); foreach (MeshRenderer val2 in componentsInChildren2) { if (!(((Object)val).name != ((Object)val2).name)) { ((Renderer)val2).sharedMaterials = ((Renderer)val).sharedMaterials; break; } } } SkinnedMeshRenderer[] componentsInChildren3 = source.GetComponentsInChildren(true); foreach (SkinnedMeshRenderer val3 in componentsInChildren3) { SkinnedMeshRenderer[] componentsInChildren4 = clone.GetComponentsInChildren(true); foreach (SkinnedMeshRenderer val4 in componentsInChildren4) { if (!(((Object)val3).name != ((Object)val4).name)) { ((Renderer)val4).sharedMaterials = ((Renderer)val3).sharedMaterials; break; } } } return clone; } private static void ApplyFactionAndName(GameObject clone, MonsterVariantDefinition variant) { //IL_004d: 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_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)clone == (Object)null || variant == null) { return; } Character component = clone.GetComponent(); if ((Object)(object)component != (Object)null) { if (variant.Faction.HasValue) { component.m_faction = variant.Faction.Value; } if (!string.IsNullOrEmpty(variant.DisplayName)) { component.m_name = variant.DisplayName; } } Humanoid component2 = clone.GetComponent(); if ((Object)(object)component2 != (Object)null && variant.Faction.HasValue) { ((Character)component2).m_faction = variant.Faction.Value; } } private static void CopyLootIfNeeded(ZNetScene zNetScene, GameObject clone, MonsterVariantDefinition variant) { if ((Object)(object)clone == (Object)null || variant == null) { return; } string text = (string.IsNullOrEmpty(variant.LootSourceName) ? variant.OriginalName : variant.LootSourceName); if (!string.IsNullOrEmpty(text) && !(text == ((Object)clone).name)) { GameObject val = PrefabTools.FindPrefab(zNetScene, text); if (!((Object)(object)val == (Object)null)) { CopyCharacterDrop(val, clone); } } } public static void CopyCharacterDrop(GameObject source, GameObject target) { //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008c: 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_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Expected O, but got Unknown if ((Object)(object)source == (Object)null || (Object)(object)target == (Object)null) { return; } CharacterDrop component = source.GetComponent(); if ((Object)(object)component == (Object)null) { return; } CharacterDrop val = target.GetComponent(); if ((Object)(object)val == (Object)null) { val = target.AddComponent(); } val.m_drops = new List(); foreach (Drop drop in component.m_drops) { if (drop != null) { val.m_drops.Add(new Drop { m_prefab = drop.m_prefab, m_amountMin = drop.m_amountMin, m_amountMax = drop.m_amountMax, m_chance = drop.m_chance, m_levelMultiplier = drop.m_levelMultiplier, m_onePerPlayer = drop.m_onePerPlayer }); } } } } public class SpawnerBuilder { public List newSpawners = new List(); private string[] ingore = new string[0]; public string[] monsterNames = new string[54] { "Bjorn", "Hen", "Deathsquito", "Serpent", "Boar", "Deer", "Wraith", "Wolf", "Leech", "Fenring", "Troll", "DraugrElite", "Draugr", "Skeleton", "SeekerDrone", "Surtling", "Dverger", "Greydwarf", "Greyling", "GreydwarfElite", "Greydwarf Shaman", "Neck", "Hatchling", "Abomination", "StoneGolem", "BonemawSerpent", "projectile_ashlandmeteor", "Lox", "Wolf", "Blob", "Charred_Archer", "Charred_Melee", "Charred_Twitcher", "Asksvin", "Morgen_NonSleeping", "FallenValkyrie", "Volture", "CinderSky", "CinderStorm", "Gjall", "Seeker", "SeekerBrute", "SeekerBrood", "FireFlies", "Fish1", "Fish2", "Fish3", "Fish5", "Fish6", "Fish7", "Fish8", "Fish9", "Fish10", "Fish11" }; private SpawnData FindSpawnData(SpawnSystemList spawnSystemList, string name, string spawnerName = "") { if (spawnerName != "") { SpawnData val = spawnSystemList.m_spawners.Find((SpawnData x) => x.m_name == spawnerName); if (val != null) { return val; } } return spawnSystemList.m_spawners.Find((SpawnData x) => ((Object)x.m_prefab).name == name); } public void editExistingSpawners(SpawnSystemList spawnSystemList, List znetPrefabs) { newSpawners.Clear(); string[] array = monsterNames; foreach (string monsterName in array) { List list = spawnSystemList.m_spawners.FindAll((SpawnData x) => ((Object)x.m_prefab).name == monsterName); if (list.Count <= 0) { continue; } foreach (SpawnData item in list) { editMonsterSpawner(item, znetPrefabs); } } if (newSpawners.Count > 0) { AddSpawnersOnce(spawnSystemList, newSpawners); } } public void createSpawners(SpawnSystemList spawnSystemList, ModResourceLoader modResourceLoader, List znetPrefabs) { editExistingSpawners(spawnSystemList, znetPrefabs); newSpawners.Clear(); foreach (GameObject monster in modResourceLoader.monsterPrefabs) { List list = spawnSystemList.m_spawners.FindAll((SpawnData x) => ((Object)x.m_prefab).name == ((Object)monster).name); if (list.Count == 0 && !ingore.Contains(((Object)monster).name)) { setupMonster(monster, spawnSystemList, znetPrefabs); } } createVariantSpawners(spawnSystemList, znetPrefabs); if (newSpawners.Count > 0) { AddSpawnersOnce(spawnSystemList, newSpawners); } } private void AddSpawnersOnce(SpawnSystemList spawnSystemList, IEnumerable spawners) { if ((Object)(object)spawnSystemList == (Object)null || spawnSystemList.m_spawners == null || spawners == null) { return; } foreach (SpawnData spawner in spawners) { if (spawner != null && !((Object)(object)spawner.m_prefab == (Object)null) && !HasSpawner(spawnSystemList, spawner.m_name, ((Object)spawner.m_prefab).name)) { spawnSystemList.m_spawners.Add(spawner); } } } private bool HasSpawner(SpawnSystemList spawnSystemList, string spawnerName, string prefabName) { if ((Object)(object)spawnSystemList == (Object)null || spawnSystemList.m_spawners == null) { return false; } return spawnSystemList.m_spawners.Any((SpawnData x) => x != null && x.m_name == spawnerName && (Object)(object)x.m_prefab != (Object)null && ((Object)x.m_prefab).name == prefabName); } private void createVariantSpawners(SpawnSystemList spawnSystemList, List znetPrefabs) { if ((Object)(object)spawnSystemList == (Object)null || znetPrefabs == null) { return; } foreach (MonsterVariantDefinition variant in MonsterVariantRegistry.Variants) { if (variant == null || !variant.AddGeneratedSpawn) { continue; } GameObject val = znetPrefabs.Find((GameObject x) => (Object)(object)x != (Object)null && ((Object)x).name == variant.NewName); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("[" + Launch.projectName + "] Variant spawn prefab missing: " + variant.NewName)); continue; } string text = (string.IsNullOrEmpty(variant.SpawnTemplateName) ? variant.OriginalName : variant.SpawnTemplateName); SpawnData val2 = FindSpawnData(spawnSystemList, text, variant.SpawnTemplateSpawnerName ?? string.Empty); if (val2 == null) { Debug.LogWarning((object)("[" + Launch.projectName + "] Variant spawn template missing: " + variant.NewName + ", template=" + text + ", spawner=" + variant.SpawnTemplateSpawnerName)); } else { SpawnData val3 = val2.Clone(); val3.m_name = variant.NewName; val3.m_prefab = val; variant.ConfigureSpawn?.Invoke(val3); newSpawners.Add(val3); } } } private SpawnData editSpawnerData(SpawnData spawnData, string spawnerName = "", int maxSpawned = -99, int minlevel = 1, int maxlevel = 3, int spawnChance = 25, bool spawnDay = true, bool spawnNight = true, int groupMin = -99, int groupMax = -99, int groupRadius = -99) { if (spawnData == null) { return spawnData; } spawnData.m_name = ((spawnerName != "") ? spawnerName : spawnData.m_name); spawnData.m_maxSpawned = ((maxSpawned != -99) ? maxSpawned : spawnData.m_maxSpawned); spawnData.m_minLevel = ((minlevel != -99) ? minlevel : spawnData.m_minLevel); spawnData.m_maxLevel = ((maxlevel != -99) ? maxlevel : spawnData.m_maxLevel); spawnData.m_spawnChance = ((spawnChance != -99) ? ((float)spawnChance) : spawnData.m_spawnChance); spawnData.m_spawnAtDay = spawnDay; spawnData.m_spawnAtNight = spawnNight; spawnData.m_groupSizeMin = ((groupMin != -99) ? groupMin : spawnData.m_groupSizeMin); spawnData.m_groupSizeMax = ((groupMax != -99) ? groupMax : spawnData.m_groupSizeMax); spawnData.m_groupRadius = ((groupRadius != -99) ? ((float)groupRadius) : spawnData.m_groupRadius); return spawnData; } private void generateSapplings(SpawnData spawnData, List znetPrefabs) { //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) string[] array = new string[5] { "FirTree_Sapling", "Oak_Sapling", "PineTree_Sapling", "Beech_Sapling", "Birch_Sapling" }; string[] array2 = array; foreach (string name in array2) { GameObject val = znetPrefabs.Find((GameObject x) => ((Object)x).name == name); if ((Object)(object)val != (Object)null) { SpawnData val2 = spawnData.Clone(); val2.m_name = name; val2.m_spawnInterval = 9000f; val2.m_maxSpawned = 1; val2.m_spawnAtDay = true; val2.m_spawnChance = 3f; val2.m_maxLevel = 0; val2.m_levelUpMinCenterDistance = 9999999f; val2.m_inLava = false; val2.m_canSpawnCloseToPlayer = false; val2.m_huntPlayer = false; val2.m_spawnAtNight = false; val2.m_biome = (Biome)1; if (name == "FirTree_Sapling" || name == "PineTree_Sapling") { val2.m_biome = (Biome)8; } if (name == "Birch_Sapling" || name == "Beech_Sapling" || name == "Oak") { val2.m_biome = (Biome)1; } val2.m_prefab = val; newSpawners.Add(val2); } } } private void editMonsterSpawner(SpawnData spawnData, List znetPrefabs) { //IL_11c1: Unknown result type (might be due to invalid IL or missing references) //IL_1dce: Unknown result type (might be due to invalid IL or missing references) //IL_22fe: Unknown result type (might be due to invalid IL or missing references) //IL_208d: Unknown result type (might be due to invalid IL or missing references) //IL_20f2: Unknown result type (might be due to invalid IL or missing references) //IL_18e7: Unknown result type (might be due to invalid IL or missing references) //IL_0e7c: Unknown result type (might be due to invalid IL or missing references) //IL_23eb: Unknown result type (might be due to invalid IL or missing references) //IL_2568: Unknown result type (might be due to invalid IL or missing references) //IL_2614: Unknown result type (might be due to invalid IL or missing references) //IL_1f31: Unknown result type (might be due to invalid IL or missing references) //IL_1305: Unknown result type (might be due to invalid IL or missing references) //IL_0f0c: Unknown result type (might be due to invalid IL or missing references) //IL_2438: Unknown result type (might be due to invalid IL or missing references) //IL_243f: Unknown result type (might be due to invalid IL or missing references) //IL_1fa8: Unknown result type (might be due to invalid IL or missing references) //IL_1512: Unknown result type (might be due to invalid IL or missing references) //IL_0dcf: Unknown result type (might be due to invalid IL or missing references) //IL_1d93: Unknown result type (might be due to invalid IL or missing references) //IL_0fc8: Unknown result type (might be due to invalid IL or missing references) //IL_1014: Unknown result type (might be due to invalid IL or missing references) //IL_0e50: Unknown result type (might be due to invalid IL or missing references) //IL_1074: Unknown result type (might be due to invalid IL or missing references) //IL_10c0: Unknown result type (might be due to invalid IL or missing references) //IL_1120: Unknown result type (might be due to invalid IL or missing references) spawnData.m_maxLevel = 3; spawnData.m_enabled = true; spawnData.m_levelUpMinCenterDistance = 400f; spawnData.m_groupSizeMin = 1; if ((Object)(object)spawnData.m_prefab == (Object)null) { return; } switch (spawnData.m_name) { case "Fish1": case "Fish2": case "Fish3": case "Fish5": case "Fish6": case "Fish7": case "Fish8": case "Fish9": case "Fish10": case "Fish11": spawnData.m_maxSpawned += 2; spawnData.m_groupSizeMax += 2; break; case "FireFlies": spawnData.m_maxSpawned = 10; break; case "Seeker Brute": spawnData.m_minLevel = 1; spawnData.m_maxLevel = 4; spawnData.m_maxSpawned = 2; spawnData.m_groupSizeMax = 2; spawnData.m_spawnInterval = 2500f; break; case "Seeker": spawnData.m_minLevel = 1; spawnData.m_maxLevel = 6; spawnData.m_maxSpawned = 3; spawnData.m_groupSizeMax = 2; break; case "Gjall": spawnData.m_spawnInterval = 3000f; spawnData.m_minLevel = 1; spawnData.m_maxLevel = 3; break; case "CinderSky CinderRain": case "CinderSky Ashrain": spawnData.m_maxSpawned = 10; break; case "CinderSky Storm": spawnData.m_spawnInterval = 3000f; spawnData.m_maxSpawned = 10; break; case "Volture": spawnData.m_spawnInterval = 150f; spawnData.m_maxLevel = 3; spawnData.m_maxSpawned = 4; break; case "Fallen Valkyrie": spawnData.m_spawnInterval = 3000f; spawnData.m_maxLevel = 3; spawnData.m_maxSpawned = 2; spawnData.m_groupSizeMax = 1; break; case "Morgen [Non-sleeper]": spawnData.m_spawnInterval = 3000f; spawnData.m_maxLevel = 3; break; case "Charred Twitcher [DAY]": spawnData.m_maxSpawned = 3; spawnData.m_groupSizeMax = 2; spawnData.m_spawnInterval = 180f; spawnData.m_maxLevel = 4; break; case "Charred Twitcher [NIGHT]": spawnData.m_maxSpawned = 4; spawnData.m_groupSizeMax = 3; spawnData.m_spawnInterval = 150f; spawnData.m_maxLevel = 3; break; case "Charred Archer": spawnData.m_maxSpawned = 3; spawnData.m_groupSizeMax = 1; spawnData.m_spawnInterval = 260f; spawnData.m_maxLevel = 3; break; case "Charred Melee": { spawnData.m_maxSpawned = 3; spawnData.m_groupSizeMax = 1; spawnData.m_spawnInterval = 270f; spawnData.m_maxLevel = 3; GameObject val42 = znetPrefabs.Find((GameObject x) => ((Object)x).name == "Charred_Mage"); if ((Object)(object)val42 != (Object)null) { SpawnData val43 = spawnData.Clone(); val43.m_name = "Askvin Hatchling"; val43.m_maxSpawned = 2; val43.m_spawnAtDay = false; val43.m_spawnAtNight = true; val43.m_prefab = val42; newSpawners.Add(val43); } break; } case "Asksvin [DAY]": spawnData.m_maxSpawned = 2; spawnData.m_groupSizeMax = 2; spawnData.m_spawnInterval = 360f; spawnData.m_maxLevel = 3; break; case "Asksvin [NIGHT]": { spawnData.m_maxSpawned = 3; spawnData.m_groupSizeMax = 3; spawnData.m_spawnInterval = 280f; spawnData.m_maxLevel = 4; GameObject val40 = znetPrefabs.Find((GameObject x) => ((Object)x).name == "Asksvin_hatchling"); if ((Object)(object)val40 != (Object)null) { SpawnData val41 = spawnData.Clone(); val41.m_name = "Askvin Hatchling"; val41.m_maxSpawned = 2; val41.m_spawnAtDay = false; val41.m_spawnAtNight = true; val41.m_prefab = val40; newSpawners.Add(val41); } break; } case "Blob": { spawnData.m_maxLevel = 4; spawnData.m_spawnAtNight = true; spawnData.m_spawnAtDay = true; GameObject val50 = znetPrefabs.Find((GameObject x) => ((Object)x).name == "BlobFrost"); if ((Object)(object)val50 != (Object)null) { SpawnData val51 = spawnData.Clone(); val51.m_name = "Blob frost"; val51.m_maxSpawned = 2; val51.m_spawnAtDay = true; val51.m_spawnAtNight = true; val51.m_biome = (Biome)68; val51.m_prefab = val50; newSpawners.Add(val51); } GameObject prefab = znetPrefabs.Find((GameObject x) => ((Object)x).name == "BlobTar"); if ((Object)(object)val50 != (Object)null) { SpawnData val52 = spawnData.Clone(); val52.m_name = "Blob tar"; val52.m_maxSpawned = 2; val52.m_spawnAtDay = false; val52.m_spawnAtNight = true; val52.m_biome = (Biome)48; val52.m_prefab = prefab; newSpawners.Add(val52); } break; } case "Troll": { spawnData.m_maxLevel = 4; spawnData.m_biome = (Biome)68; spawnData.m_spawnAtNight = false; spawnData.m_spawnInterval /= 2f; GameObject val46 = znetPrefabs.Find((GameObject x) => ((Object)x).name == "TrollAshlands"); if ((Object)(object)val46 != (Object)null) { SpawnData val47 = spawnData.Clone(); val47.m_name = "TrollAshlands"; val47.m_spawnInterval = 2000f; val47.m_maxSpawned = 2; val47.m_spawnAtDay = true; val47.m_spawnAtNight = true; val47.m_biome = (Biome)32; val47.m_prefab = val46; newSpawners.Add(val47); } break; } case "Boar": { spawnData.m_spawnChance = 66f; spawnData.m_maxSpawned = 4; spawnData.m_maxLevel = 4; spawnData.m_spawnAtNight = false; generateSapplings(spawnData, znetPrefabs); GameObject val28 = znetPrefabs.Find((GameObject x) => ((Object)x).name == "Boar_piggy"); if ((Object)(object)val28 != (Object)null) { SpawnData val29 = spawnData.Clone(); val29.m_name = "Piggy"; val29.m_spawnInterval = 2000f; val29.m_maxSpawned = 2; val29.m_spawnAtDay = true; val29.m_spawnAtNight = false; val29.m_biome = (Biome)1; val29.m_prefab = val28; newSpawners.Add(val29); } GameObject val30 = znetPrefabs.Find((GameObject x) => ((Object)x).name == "Hen"); ((Character)val30.GetComponent()).m_faction = (Faction)7; if ((Object)(object)val30 != (Object)null) { SpawnData val31 = spawnData.Clone(); val31.m_name = "Hen"; val31.m_spawnInterval = 3000f; val31.m_maxSpawned = 3; val31.m_groupSizeMax = 3; val31.m_groupSizeMin = 1; val31.m_spawnAtDay = true; val31.m_spawnAtNight = false; val31.m_biome = (Biome)16; val31.m_prefab = val30; newSpawners.Add(val31); } GameObject val32 = znetPrefabs.Find((GameObject x) => ((Object)x).name == "Hen"); ((Character)val32.GetComponent()).m_faction = (Faction)7; if ((Object)(object)val32 != (Object)null) { SpawnData val33 = spawnData.Clone(); val33.m_name = "Chick"; val33.m_spawnInterval = 4000f; val33.m_maxSpawned = 3; val33.m_groupSizeMax = 3; val33.m_groupSizeMin = 1; val33.m_spawnAtDay = true; val33.m_spawnAtNight = false; val33.m_biome = (Biome)16; val33.m_prefab = val32; newSpawners.Add(val33); } break; } case "Bjorn DAY": { spawnData.m_requiredGlobalKey = "defeated_gdking"; spawnData.m_spawnInterval = 900f; spawnData.m_maxSpawned = 3; spawnData.m_spawnDistance = 150f; SpawnData val27 = spawnData.Clone(); val27.m_name = "Bjorn Meadows"; val27.m_spawnInterval = 1500f; val27.m_maxSpawned = 2; val27.m_groupSizeMax = 1; val27.m_spawnDistance = 100f; val27.m_groupSizeMin = 1; val27.m_spawnAtDay = false; val27.m_spawnAtNight = true; val27.m_biome = (Biome)1; newSpawners.Add(val27); break; } case "Bjorn NIGHT": spawnData.m_requiredGlobalKey = "defeated_gdking"; spawnData.m_spawnInterval = 900f; spawnData.m_maxSpawned = 3; spawnData.m_spawnDistance = 150f; break; case "deer": spawnData.m_spawnChance = 66f; spawnData.m_maxSpawned = 5; spawnData.m_maxLevel = 4; spawnData.m_spawnAtNight = false; spawnData.m_groupSizeMax = spawnData.m_maxSpawned; break; case "Neck lakes": spawnData.m_spawnChance = 66f; spawnData.m_maxSpawned = 5; spawnData.m_maxLevel = 4; spawnData.m_groupSizeMax = spawnData.m_maxSpawned; break; case "Neck IN RAIN": spawnData.m_maxLevel = 5; spawnData.m_spawnChance = 44f; spawnData.m_maxSpawned = 7; spawnData.m_groupSizeMax = spawnData.m_maxSpawned; spawnData.m_requiredEnvironments.Add("Mist"); spawnData.m_requiredEnvironments.Add("DeepForest Mist"); spawnData.m_requiredEnvironments.Add("Mistlands_rain"); spawnData.m_requiredEnvironments.Add("Bonemass"); spawnData.m_groupSizeMax = spawnData.m_maxSpawned; break; case "Greyling": { spawnData.m_maxSpawned = 4; spawnData.m_spawnChance = 33f; spawnData.m_spawnAtDay = true; spawnData.m_spawnAtNight = true; spawnData.m_groupSizeMax = 2; spawnData.m_biome = (Biome)9; SpawnData val12 = spawnData.Clone(); val12.m_name = "Greyling Weather"; val12.m_maxLevel = 5; val12.m_requiredEnvironments.Add("Rain"); val12.m_requiredEnvironments.Add("LightRain"); val12.m_requiredEnvironments.Add("ThunderStorm"); val12.m_requiredEnvironments.Add("Mist"); val12.m_requiredEnvironments.Add("DeepForest Mist"); val12.m_requiredEnvironments.Add("Mistlands_rain"); val12.m_requiredEnvironments.Add("Bonemass"); val12.m_spawnAtDay = true; val12.m_spawnAtNight = false; val12.m_groupSizeMax = val12.m_maxSpawned; newSpawners.Add(val12); SpawnData val13 = spawnData.Clone(); val13.m_name = "Greyling Night"; val13.m_maxLevel = 5; val13.m_spawnAtDay = false; val13.m_spawnAtNight = true; val13.m_groupSizeMax = val13.m_maxSpawned; newSpawners.Add(val13); SpawnData val14 = spawnData.Clone(); val14.m_name = "Greydwarf Spawner after Elder/Weather"; val14.m_maxLevel = 1; val14.m_spawnChance = 5f; val14.m_maxSpawned = 1; val14.m_prefab = znetPrefabs.Find((GameObject x) => ((Object)x).name == "Spawner_GreydwarfNest"); val14.m_requiredGlobalKey = "defeated_gdking"; val14.m_requiredEnvironments.Add("Rain"); val14.m_requiredEnvironments.Add("LightRain"); val14.m_requiredEnvironments.Add("ThunderStorm"); val14.m_requiredEnvironments.Add("Mist"); val14.m_requiredEnvironments.Add("DeepForest Mist"); val14.m_requiredEnvironments.Add("Mistlands_rain"); val14.m_requiredEnvironments.Add("Bonemass"); val14.m_spawnAtDay = false; val14.m_spawnAtNight = true; val14.m_biome = (Biome)9; val14.m_groupSizeMax = val14.m_maxSpawned; newSpawners.Add(val14); break; } case "Greydwarf": spawnData.m_maxSpawned = 2; spawnData.m_spawnChance = 33f; spawnData.m_groupSizeMax = spawnData.m_maxSpawned; break; case "greydwarf DAY": spawnData.m_maxSpawned = 2; spawnData.m_spawnChance = 33f; spawnData.m_groupSizeMax = spawnData.m_maxSpawned; break; case "greydwarf After boss": { spawnData.m_maxSpawned = 2; spawnData.m_spawnChance = 33f; spawnData.m_groupSizeMax = spawnData.m_maxSpawned; spawnData.m_maxLevel = 4; SpawnData val9 = spawnData.Clone(); val9.m_name = "greydwarf Elder"; val9.m_requiredGlobalKey = "defeated_gdking"; val9.m_maxLevel = 5; val9.m_maxSpawned = 1; val9.m_groupSizeMax = val9.m_maxSpawned; newSpawners.Add(val9); break; } case "greydwarf Night": { spawnData.m_spawnAtDay = false; spawnData.m_spawnAtNight = true; spawnData.m_maxSpawned = 4; spawnData.m_spawnChance = 77f; spawnData.m_groupSizeMax = spawnData.m_maxSpawned; spawnData.m_maxLevel = 4; SpawnData val6 = spawnData.Clone(); val6.m_name = "greydwarf Night Elder"; val6.m_requiredGlobalKey = "defeated_gdking"; val6.m_maxLevel = 5; val6.m_maxSpawned = 2; val6.m_groupSizeMax = val6.m_maxSpawned; newSpawners.Add(val6); break; } case "greydwarf ELITE": spawnData.m_maxSpawned = 2; spawnData.m_spawnChance = 44f; spawnData.m_spawnAtDay = false; spawnData.m_spawnAtNight = true; spawnData.m_maxLevel = 4; spawnData.m_levelUpMinCenterDistance = 400f; break; case "Greydwarf Elite": { spawnData.m_spawnChance = 44f; spawnData.m_maxLevel = 5; spawnData.m_spawnAtDay = true; spawnData.m_spawnAtNight = true; spawnData.m_levelUpMinCenterDistance = 1000f; SpawnData val5 = spawnData.Clone(); val5.m_name = "Greydwarf Elite Weather"; val5.m_maxLevel = 5; val5.m_maxSpawned = 2; spawnData.m_groupSizeMax = spawnData.m_maxSpawned; val5.m_requiredEnvironments.Add("Mist"); val5.m_requiredEnvironments.Add("DeepForest Mist"); val5.m_requiredEnvironments.Add("Bonemass"); val5.m_groupSizeMax = val5.m_maxSpawned; newSpawners.Add(val5); break; } case "Greydwarf Shaman": { spawnData.m_spawnChance = 55f; spawnData.m_maxSpawned = 2; spawnData.m_spawnAtDay = false; spawnData.m_spawnAtNight = true; if (spawnData.m_requiredGlobalKey == "defeated_gdking") { spawnData.m_maxLevel = 5; spawnData.m_maxSpawned = 2; spawnData.m_spawnAtDay = true; break; } SpawnData val49 = spawnData.Clone(); val49.m_name = "Greydwarf Shaman Weather"; val49.m_maxLevel = 5; val49.m_maxSpawned = 2; val49.m_spawnAtDay = true; val49.m_requiredEnvironments.Add("Rain"); val49.m_requiredEnvironments.Add("LightRain"); val49.m_requiredEnvironments.Add("ThunderStorm"); val49.m_requiredEnvironments.Add("Mist"); val49.m_requiredEnvironments.Add("DeepForest Mist"); val49.m_requiredEnvironments.Add("Mistlands_rain"); val49.m_requiredEnvironments.Add("Bonemass"); val49.m_groupSizeMax = spawnData.m_maxSpawned; newSpawners.Add(val49); break; } case "Hatchling": { spawnData.m_maxSpawned = 2; spawnData.m_groupSizeMin = 1; spawnData.m_spawnChance = 20f; spawnData.m_levelUpMinCenterDistance = 1500f; spawnData.m_groupSizeMax = spawnData.m_maxSpawned; SpawnData val48 = spawnData.Clone(); val48.m_name = "Hatchling_DeepNorth"; val48.m_minAltitude = 5f; val48.m_maxLevel = 6; val48.m_groundOffset = 30f; val48.m_biome = (Biome)64; val48.m_groupSizeMax = val48.m_maxSpawned; newSpawners.Add(val48); break; } case "Deathsquito": spawnData.m_maxSpawned = 2; spawnData.m_groupSizeMin = 1; spawnData.m_groupSizeMax = spawnData.m_maxSpawned; break; case "Marsh draugr": spawnData.m_maxSpawned = 1; spawnData.m_spawnChance -= 15f; spawnData.m_groupSizeMax = spawnData.m_maxSpawned; break; case "Skeleton": spawnData.m_maxSpawned = 2; spawnData.m_spawnChance -= 15f; spawnData.m_spawnAtNight = false; spawnData.m_groupSizeMax = spawnData.m_maxSpawned; break; case "Draugr Elite": { spawnData.m_spawnChance -= 15f; spawnData.m_spawnAtNight = false; spawnData.m_maxSpawned = 1; GameObject val44 = znetPrefabs.Find((GameObject x) => ((Object)x).name == "Skeleton_Poison"); if ((Object)(object)val44 != (Object)null) { SpawnData val45 = spawnData.Clone(); val45.m_name = "Skeleton_Poison swamps"; val45.m_levelUpMinCenterDistance = 1000f; val45.m_maxSpawned = 1; val45.m_spawnChance = 11f; val45.m_spawnAtDay = true; val45.m_spawnAtNight = false; val45.m_prefab = val44; newSpawners.Add(val45); } break; } case "Wolf": if (spawnData.m_spawnAtNight) { spawnData.m_maxSpawned = 5; spawnData.m_groupSizeMin = 1; spawnData.m_groupSizeMax = 3; spawnData.m_spawnChance = 33f; GameObject val36 = znetPrefabs.Find((GameObject x) => ((Object)x).name == "Ulv"); if ((Object)(object)val36 != (Object)null) { SpawnData val37 = spawnData.Clone(); val37.m_name = "Ulv Night"; val37.m_levelUpMinCenterDistance = 4000f; val37.m_maxLevel = 2; val37.m_spawnInterval = 240f; val37.m_spawnChance = 11f; val37.m_maxSpawned = 3; val37.m_prefab = val36; val37.m_groupSizeMin = 1; val37.m_groupSizeMax = val37.m_maxSpawned; newSpawners.Add(val37); } GameObject val38 = znetPrefabs.Find((GameObject x) => ((Object)x).name == "Wolf_cub"); if ((Object)(object)val38 != (Object)null) { SpawnData val39 = spawnData.Clone(); val39.m_name = "wolf cub"; val39.m_maxLevel = 1; val39.m_spawnChance = 11f; val39.m_maxSpawned = 2; val39.m_prefab = val38; val39.m_groupSizeMin = 1; val39.m_spawnAtNight = false; val39.m_groupSizeMax = val39.m_maxSpawned; newSpawners.Add(val39); } } break; case "Lox": { spawnData.m_maxLevel = 4; spawnData.m_groupSizeMin = 2; spawnData.m_groupSizeMax = 5; spawnData.m_maxSpawned = 4; spawnData.m_spawnInterval = 800f; GameObject val34 = znetPrefabs.Find((GameObject x) => ((Object)x).name == "Lox_Calf"); if ((Object)(object)val34 != (Object)null) { SpawnData val35 = spawnData.Clone(); val35.m_name = "wolf cub"; val35.m_maxLevel = 1; val35.m_spawnChance = 11f; val35.m_maxSpawned = 2; val35.m_prefab = val34; val35.m_spawnAtNight = false; val35.m_groupSizeMin = 1; val35.m_groupSizeMax = val35.m_maxSpawned; newSpawners.Add(val35); } break; } case "Wraith": { spawnData.m_maxLevel = 2; spawnData.m_groupSizeMin = 1; spawnData.m_groupSizeMax = 2; spawnData.m_spawnChance = 15f; spawnData.m_levelUpMinCenterDistance = 3000f; spawnData.m_spawnAtDay = false; GameObject val24 = znetPrefabs.Find((GameObject x) => ((Object)x).name == "Ghost"); if ((Object)(object)val24 != (Object)null) { SpawnData val25 = spawnData.Clone(); val25.m_name = "Ghost swamps"; val25.m_levelUpMinCenterDistance = 1000f; val25.m_maxSpawned = 2; val25.m_spawnInterval = 300f; val25.m_spawnChance = 22f; val25.m_spawnAtDay = true; val25.m_spawnAtNight = true; val25.m_prefab = val24; newSpawners.Add(val25); SpawnData val26 = val25.Clone(); val26.m_name = "Ghost Forest"; val26.m_maxSpawned = 1; val26.m_spawnChance = 11f; val26.m_spawnAtDay = false; val26.m_groupSizeMax = 1; val26.m_biome = (Biome)10; newSpawners.Add(val26); } break; } case "Leech": { spawnData.m_maxLevel = 4; spawnData.m_maxSpawned = 5; spawnData.m_groupSizeMin = 1; spawnData.m_spawnChance = 33f; spawnData.m_biome = (Biome)2; spawnData.m_spawnAtDay = true; spawnData.m_spawnAtNight = false; spawnData.m_groupSizeMax = spawnData.m_maxSpawned; SpawnData val22 = spawnData.Clone(); val22.m_name = "Leech Weather"; val22.m_maxLevel = 5; val22.m_levelUpMinCenterDistance = 1000f; val22.m_maxSpawned = 3; val22.m_groupSizeMax = val22.m_maxSpawned; val22.m_spawnAtDay = true; val22.m_spawnAtNight = true; val22.m_requiredEnvironments.Add("Rain"); val22.m_requiredEnvironments.Add("ThunderStorm"); val22.m_requiredEnvironments.Add("DeepForest Mist"); val22.m_requiredEnvironments.Add("Mistlands_rain"); val22.m_requiredEnvironments.Add("Bonemass"); val22.m_groupSizeMax = val22.m_maxSpawned; newSpawners.Add(val22); SpawnData val23 = spawnData.Clone(); val23.m_name = "Leech Night"; val23.m_levelUpMinCenterDistance = 1000f; val23.m_maxLevel = 5; val23.m_maxSpawned = 3; val23.m_groupSizeMax = val23.m_maxSpawned; val23.m_spawnAtDay = false; val23.m_spawnAtNight = true; val23.m_groupSizeMax = val22.m_maxSpawned; newSpawners.Add(val22); break; } case "Marsh surtling": spawnData.m_maxLevel = 4; spawnData.m_inLava = true; spawnData.m_biome = (Biome)32; spawnData.m_maxSpawned = 3; spawnData.m_spawnInterval = 200f; break; case "Surtling": { spawnData.m_maxLevel = 4; spawnData.m_inLava = true; spawnData.m_maxSpawned = 3; spawnData.m_minAltitude = 1f; spawnData.m_minOceanDepth = 0f; spawnData.m_maxOceanDepth = 0f; spawnData.m_spawnInterval = 500f; spawnData.m_spawnChance = 33f; spawnData.m_groupSizeMax = spawnData.m_maxSpawned; spawnData.m_biome = (Biome)32; GameObject val20 = znetPrefabs.Find((GameObject x) => ((Object)x).name == "SurtlingSpawner_bal"); if ((Object)(object)val20 != (Object)null) { SpawnData val21 = spawnData.Clone(); val21.m_name = "Surtling Spawner"; val21.m_levelUpMinCenterDistance = 100000000f; val21.m_maxLevel = 0; val21.m_canSpawnCloseToPlayer = false; val21.m_spawnInterval = 360f; val21.m_spawnChance = 5f; val21.m_maxSpawned = 1; val21.m_spawnAtDay = false; val21.m_spawnAtNight = true; val21.m_prefab = val20; val21.m_groupSizeMax = val21.m_maxSpawned; newSpawners.Add(val21); } break; } case "StoneGolem": { spawnData.m_maxLevel = 3; spawnData.m_maxSpawned = 1; spawnData.m_spawnChance = 33f; spawnData.m_biome = (Biome)68; spawnData.m_minAltitude = 77f; spawnData.m_levelUpMinCenterDistance = 2500f; spawnData.m_groupSizeMax = 1; SpawnData val19 = spawnData.Clone(); val19.m_name = "Golem Deep North"; val19.m_maxLevel = 5; val19.m_maxSpawned = 1; val19.m_spawnAtDay = true; val19.m_spawnAtNight = true; val19.m_minAltitude = 22f; val19.m_biome = (Biome)4; val19.m_groupSizeMax = val19.m_maxSpawned; newSpawners.Add(val19); break; } case "Serpent": { spawnData.m_maxLevel = 1; spawnData.m_maxSpawned = 1; spawnData.m_spawnChance = 11f; spawnData.m_spawnInterval = 1500f; SpawnData val15 = spawnData.Clone(); val15.m_name = "Serpent after Elder"; val15.m_maxLevel = 2; val15.m_minLevel = 1; val15.m_maxSpawned = 1; val15.m_minDistanceFromCenter = 1500f; val15.m_spawnChance = 22f; val15.m_levelUpMinCenterDistance = 2000f; val15.m_requiredGlobalKey = "defeated_gdking"; newSpawners.Add(val15); SpawnData val16 = spawnData.Clone(); val16.m_name = "Serpent after Bonemass"; val16.m_maxLevel = 3; val16.m_minLevel = 1; val16.m_maxSpawned = 1; val16.m_minDistanceFromCenter = 2000f; val16.m_spawnChance = 22f; val16.m_levelUpMinCenterDistance = 2000f; val16.m_requiredGlobalKey = "defeated_bonemass"; newSpawners.Add(val16); SpawnData val17 = spawnData.Clone(); val17.m_name = "Serpent after Moder"; val17.m_maxLevel = 4; val17.m_minLevel = 2; val17.m_maxSpawned = 1; val17.m_minDistanceFromCenter = 3000f; val17.m_spawnChance = 22f; val17.m_levelUpMinCenterDistance = 4000f; val17.m_requiredGlobalKey = "defeated_dragon"; newSpawners.Add(val17); SpawnData val18 = spawnData.Clone(); val18.m_name = "Serpent after Yagluth"; val18.m_minDistanceFromCenter = 3500f; val18.m_maxLevel = 5; val18.m_minLevel = 2; val18.m_maxSpawned = 1; val18.m_spawnChance = 22f; val18.m_levelUpMinCenterDistance = 4000f; val18.m_requiredGlobalKey = "defeated_goblinking"; newSpawners.Add(val18); break; } case "Fenring": { spawnData.m_maxSpawned = 2; spawnData.m_spawnChance = 11f; spawnData.m_biome = (Biome)68; spawnData.m_minAltitude = 22f; spawnData.m_spawnInterval = 300f; spawnData.m_levelUpMinCenterDistance = 2000f; spawnData.m_groupSizeMax = spawnData.m_maxSpawned; GameObject val10 = znetPrefabs.Find((GameObject x) => ((Object)x).name == "Fenring_Cultist"); if ((Object)(object)val10 != (Object)null) { SpawnData val11 = spawnData.Clone(); val11.m_name = "Fenring Cultist"; val11.m_levelUpMinCenterDistance = 3000f; val11.m_maxLevel = 3; val11.m_maxSpawned = 1; val11.m_spawnInterval = 400f; val11.m_spawnChance = 11f; val11.m_spawnAtDay = false; val11.m_spawnAtNight = true; val11.m_prefab = val10; val11.m_groupSizeMax = val11.m_maxSpawned; newSpawners.Add(val11); } break; } case "Abomination": spawnData.m_biome = (Biome)2; spawnData.m_maxSpawned = 2; spawnData.m_spawnChance = 22f; spawnData.m_maxAltitude = 55f; spawnData.m_groupSizeMax = 1; spawnData.m_requiredGlobalKey = "defeated_gdking"; break; case "SeekerBrood defeated queen other biomes": case "Seeker defeated queen other biomes": { spawnData.m_maxLevel = 3; spawnData.m_maxSpawned = 3; spawnData.m_biome = (Biome)512; spawnData.m_biomeArea = (BiomeArea)3; GameObject val7 = znetPrefabs.Find((GameObject x) => ((Object)x).name == "SeekerEgg_bal"); if ((Object)(object)val7 != (Object)null) { SpawnData val8 = spawnData.Clone(); val8.m_name = "SeekerEgg after queen"; val8.m_maxLevel = 0; val8.m_levelUpMinCenterDistance = 9999999f; val8.m_inLava = false; val8.m_canSpawnCloseToPlayer = false; val8.m_maxSpawned = 10; val8.m_spawnInterval = 400f; val8.m_spawnChance = 11f; val8.m_spawnAtDay = false; val8.m_spawnAtNight = true; val8.m_prefab = val7; val8.m_groupSizeMin = 3; val8.m_groupSizeMax = val8.m_maxSpawned; newSpawners.Add(val8); } break; } case "Meteor": spawnData.m_maxSpawned = 10; spawnData.m_requiredEnvironments.Add("Ashlands_ashrain"); spawnData.m_requiredEnvironments.Add("Ashlands_storm"); spawnData.m_requiredEnvironments.Add("Ashlands_CinderRain"); spawnData.m_requiredEnvironments.Add("GoblinKing"); spawnData.m_biome = (Biome)32; spawnData.m_requiredGlobalKey = "defeated_dragon"; break; case "Bonemaw Serpent": spawnData.m_maxSpawned = 3; spawnData.m_spawnChance = 22f; break; case "Dverger": { spawnData.m_spawnChance = 15f; spawnData.m_spawnInterval = 500f; spawnData.m_maxLevel = 4; SpawnData val = spawnData.Clone(); val.m_requiredGlobalKey = "defeated_qeen"; val.m_requiredEnvironments.Add("Mist"); val.m_requiredEnvironments.Add("DeepForest Mist"); val.m_requiredEnvironments.Add("Mistlands_rain"); val.m_requiredEnvironments.Add("Mistlands_thunder"); val.m_biome = (Biome)543; val.m_name = "Dverger after Queen"; val.m_levelUpMinCenterDistance = 3000f; val.m_maxSpawned = 2; val.m_groupSizeMin = 1; val.m_groupSizeMax = 1; newSpawners.Add(val); GameObject val2 = znetPrefabs.Find((GameObject x) => ((Object)x).name == "DvergerMage"); if ((Object)(object)val2 != (Object)null) { SpawnData val3 = spawnData.Clone(); val3.m_name = "Dverger Mage"; val3.m_levelUpMinCenterDistance = 3000f; val3.m_maxSpawned = 2; val3.m_prefab = val2; val3.m_groupSizeMin = 1; val3.m_groupSizeMax = 1; newSpawners.Add(val3); SpawnData val4 = val.Clone(); val4.m_name = "Dverger Mage after Queen"; val4.m_levelUpMinCenterDistance = 3000f; val4.m_maxSpawned = 2; val4.m_prefab = val2; val4.m_groupSizeMin = 1; val4.m_groupSizeMax = 1; newSpawners.Add(val4); } break; } } } private void setupMonster(GameObject monster, SpawnSystemList spawnSystemList, List znetPrefabs) { //IL_360e: Unknown result type (might be due to invalid IL or missing references) //IL_29c4: Unknown result type (might be due to invalid IL or missing references) //IL_1140: Unknown result type (might be due to invalid IL or missing references) //IL_25f4: Unknown result type (might be due to invalid IL or missing references) //IL_3731: Unknown result type (might be due to invalid IL or missing references) //IL_0e8e: Unknown result type (might be due to invalid IL or missing references) //IL_0e95: Unknown result type (might be due to invalid IL or missing references) //IL_1351: Unknown result type (might be due to invalid IL or missing references) //IL_3ee1: Unknown result type (might be due to invalid IL or missing references) //IL_1605: Unknown result type (might be due to invalid IL or missing references) //IL_167e: Unknown result type (might be due to invalid IL or missing references) //IL_3f68: Unknown result type (might be due to invalid IL or missing references) //IL_355e: Unknown result type (might be due to invalid IL or missing references) //IL_248c: Unknown result type (might be due to invalid IL or missing references) //IL_27ad: Unknown result type (might be due to invalid IL or missing references) //IL_3dac: Unknown result type (might be due to invalid IL or missing references) //IL_0be9: Unknown result type (might be due to invalid IL or missing references) //IL_1a31: Unknown result type (might be due to invalid IL or missing references) //IL_1a9d: Unknown result type (might be due to invalid IL or missing references) //IL_2ef8: Unknown result type (might be due to invalid IL or missing references) //IL_2f43: Unknown result type (might be due to invalid IL or missing references) //IL_1dbb: Unknown result type (might be due to invalid IL or missing references) //IL_0dbc: Unknown result type (might be due to invalid IL or missing references) //IL_1b56: Unknown result type (might be due to invalid IL or missing references) //IL_1ba7: Unknown result type (might be due to invalid IL or missing references) //IL_229d: Unknown result type (might be due to invalid IL or missing references) //IL_0e08: Unknown result type (might be due to invalid IL or missing references) //IL_0e0f: Unknown result type (might be due to invalid IL or missing references) //IL_17d2: Unknown result type (might be due to invalid IL or missing references) //IL_2ff3: Unknown result type (might be due to invalid IL or missing references) //IL_185b: Unknown result type (might be due to invalid IL or missing references) //IL_0cd6: Unknown result type (might be due to invalid IL or missing references) //IL_1e3d: Unknown result type (might be due to invalid IL or missing references) //IL_2bc9: Unknown result type (might be due to invalid IL or missing references) //IL_2c3d: Unknown result type (might be due to invalid IL or missing references) //IL_2b3b: Unknown result type (might be due to invalid IL or missing references) //IL_36a7: Unknown result type (might be due to invalid IL or missing references) //IL_40ed: Unknown result type (might be due to invalid IL or missing references) //IL_10b4: Unknown result type (might be due to invalid IL or missing references) //IL_2108: Unknown result type (might be due to invalid IL or missing references) //IL_2757: Unknown result type (might be due to invalid IL or missing references) //IL_11be: Unknown result type (might be due to invalid IL or missing references) //IL_1c35: Unknown result type (might be due to invalid IL or missing references) //IL_332b: Unknown result type (might be due to invalid IL or missing references) //IL_0c5c: Unknown result type (might be due to invalid IL or missing references) //IL_3193: Unknown result type (might be due to invalid IL or missing references) //IL_322c: Unknown result type (might be due to invalid IL or missing references) //IL_3234: Unknown result type (might be due to invalid IL or missing references) //IL_3445: Unknown result type (might be due to invalid IL or missing references) //IL_0f37: Unknown result type (might be due to invalid IL or missing references) //IL_2243: Unknown result type (might be due to invalid IL or missing references) //IL_3e4c: Unknown result type (might be due to invalid IL or missing references) //IL_3ce1: Unknown result type (might be due to invalid IL or missing references) //IL_3fdf: Unknown result type (might be due to invalid IL or missing references) //IL_4031: Unknown result type (might be due to invalid IL or missing references) //IL_2d09: Unknown result type (might be due to invalid IL or missing references) //IL_3825: Unknown result type (might be due to invalid IL or missing references) //IL_3b14: Unknown result type (might be due to invalid IL or missing references) //IL_1707: Unknown result type (might be due to invalid IL or missing references) //IL_3c33: Unknown result type (might be due to invalid IL or missing references) //IL_13d8: Unknown result type (might be due to invalid IL or missing references) //IL_143d: Unknown result type (might be due to invalid IL or missing references) //IL_1002: Unknown result type (might be due to invalid IL or missing references) //IL_3114: Unknown result type (might be due to invalid IL or missing references) //IL_1ed1: Unknown result type (might be due to invalid IL or missing references) //IL_0f8f: Unknown result type (might be due to invalid IL or missing references) //IL_2362: Unknown result type (might be due to invalid IL or missing references) //IL_396c: Unknown result type (might be due to invalid IL or missing references) //IL_14db: Unknown result type (might be due to invalid IL or missing references) //IL_1567: Unknown result type (might be due to invalid IL or missing references) //IL_0d49: Unknown result type (might be due to invalid IL or missing references) //IL_2e4e: Unknown result type (might be due to invalid IL or missing references) //IL_3a4c: Unknown result type (might be due to invalid IL or missing references) //IL_2da8: Unknown result type (might be due to invalid IL or missing references) //IL_3aac: Unknown result type (might be due to invalid IL or missing references) Debug.Log((object)("Setting up monster: " + ((Object)monster).name)); if ((Object)(object)monster == (Object)null || (Object)(object)spawnSystemList == (Object)null) { return; } SpawnData val = null; switch (((Object)monster).name) { case "GhostYagluth_bal": { SpawnData val65 = FindSpawnData(spawnSystemList, "Ghost", "Ghost"); if (val65 != null) { val = val65.Clone(); val.m_name = "YagGhost"; val.m_spawnInterval = 1700f; val.m_maxSpawned = 2; val.m_groupSizeMax = 1; val.m_spawnAtDay = false; val.m_spawnAtNight = true; val.m_biome = (Biome)16; val.m_prefab = monster; newSpawners.Add(val); } break; } case "Fenring_Brute_bal": { SpawnData val22 = FindSpawnData(spawnSystemList, "Fenring", "Fenring"); if (val22 != null) { val = val22.Clone(); val.m_name = "Fenring Brute"; val.m_spawnInterval = 1700f; val.m_maxSpawned = 1; val.m_spawnAtDay = true; val.m_spawnAtNight = true; val.m_biome = (Biome)4; val.m_prefab = monster; newSpawners.Add(val); } break; } case "TrollOutcast_bal": { SpawnData val51 = FindSpawnData(spawnSystemList, "Troll", "Troll"); if (val51 != null) { val = val51.Clone(); val.m_name = "Troll Outcast"; val.m_spawnAtDay = true; val.m_spawnAtNight = true; SpawnData obj11 = val; obj11.m_spawnInterval *= 0.75f; val.m_maxLevel = 3; val.m_biome = (Biome)8; val.m_prefab = monster; newSpawners.Add(val); } break; } case "TrollBrute_bal": { SpawnData val86 = FindSpawnData(spawnSystemList, "Troll", "Troll"); if (val86 != null) { val = val86.Clone(); val.m_name = "Troll Brute"; val.m_spawnAtDay = false; val.m_maxLevel = 3; val.m_spawnAtNight = true; val.m_requiredGlobalKey = "defeated_gdking"; val.m_biome = (Biome)8; val.m_prefab = monster; newSpawners.Add(val); } break; } case "TrollUndead_bal": { SpawnData val74 = FindSpawnData(spawnSystemList, "Troll", "Troll"); if (val74 != null) { val = val74.Clone(); val.m_name = "Troll Skeleton"; val.m_spawnInterval = 1900f; val.m_maxSpawned = 1; val.m_spawnAtDay = true; val.m_spawnAtNight = true; val.m_biome = (Biome)2; val.m_prefab = monster; newSpawners.Add(val); } break; } case "Goleming_bal": { SpawnData val35 = FindSpawnData(spawnSystemList, "StoneGolem", "StoneGolem"); if (val35 != null) { val = val35.Clone(); val.m_biome = (Biome)512; val.m_biomeArea = (BiomeArea)2; val.m_prefab = monster; val.m_minAltitude = 0f; val.m_maxAltitude = 2500f; val.m_spawnInterval = 800f; val.m_maxSpawned = 2; val.m_spawnAtDay = true; val.m_spawnAtNight = false; newSpawners.Add(val); } break; } case "AshlandsGolem_bal": { SpawnData val7 = FindSpawnData(spawnSystemList, "StoneGolem", "StoneGolem"); if (val7 != null) { val = val7.Clone(); val.m_biome = (Biome)32; val.m_biomeArea = (BiomeArea)2; val.m_prefab = monster; val.m_minAltitude = 0f; val.m_maxAltitude = 2500f; val.m_maxSpawned = 1; val.m_spawnAtDay = true; val.m_spawnAtNight = true; newSpawners.Add(val); } break; } case "Deathsquito_bal": { SpawnData val53 = FindSpawnData(spawnSystemList, "Deathsquito", "Deathsquito"); if (val53 != null) { val = val53.Clone(); val.m_name = "Primal Squito"; val.m_prefab = monster; val.m_maxSpawned = 1; val.m_maxLevel = 3; val.m_spawnAtDay = false; val.m_spawnAtNight = true; val.m_biome = (Biome)16; newSpawners.Add(val); } if (val53 != null) { SpawnData val54 = val.Clone(); val.m_name = "Primal Deathsquito After Queen"; val.m_prefab = monster; val.m_maxSpawned = 1; val.m_maxLevel = 4; val.m_spawnAtDay = false; val.m_spawnAtNight = true; val.m_biome = (Biome)16; val54.m_requiredGlobalKey = "defeated_queen"; newSpawners.Add(val54); } break; } case "Moth_bal": { SpawnData val41 = FindSpawnData(spawnSystemList, "Deathsquito", "Deathsquito"); if (val41 != null) { val = val41.Clone(); editSpawnerData(val, "Moths", 4, 1, 4, 50, spawnDay: false); val.m_requiredGlobalKey = null; val.m_biome = (Biome)512; val.m_prefab = monster; val.m_minAltitude = 0f; val.m_maxAltitude = 2000f; SpawnData obj8 = val; obj8.m_spawnInterval *= 1.25f; newSpawners.Add(val); } break; } case "PolarBear_bal": { SpawnData val27 = FindSpawnData(spawnSystemList, "Bjorn", "Bjorn"); if (val27 != null) { val = val27.Clone(); val.m_spawnChance = 22f; val.m_name = "bear"; val.m_levelUpMinCenterDistance = 5000f; val.m_prefab = monster; val.m_maxSpawned = 2; SpawnData obj2 = val; obj2.m_spawnInterval *= 1.5f; val.m_biome = (Biome)64; val.m_spawnAtDay = true; val.m_spawnAtNight = true; newSpawners.Add(val); } break; } case "Bloodling_bal": { SpawnData val18 = FindSpawnData(spawnSystemList, "Blob"); if (val18 != null) { val = val18.Clone(); val.m_spawnChance = 45f; val.m_name = " base spawn Bloodling"; val.m_prefab = monster; val.m_maxSpawned = 3; val.m_maxLevel = 3; val.m_spawnAtDay = true; val.m_spawnAtNight = false; val.m_biome = (Biome)512; newSpawners.Add(val); } break; } case "Doe_bal": { SpawnData val88 = FindSpawnData(spawnSystemList, "Deer", "deer"); if (val88 != null) { val = val88.Clone(); val.m_spawnChance = 11f; val.m_name = "doe"; val.m_spawnAtDay = true; SpawnData obj26 = val; obj26.m_spawnInterval *= 1.5f; val.m_spawnAtNight = false; val.m_prefab = monster; val.m_biome = (Biome)1; val.m_maxSpawned = 2; val.m_maxLevel = 1; newSpawners.Add(val); } break; } case "CorpseCollector_bal": { SpawnData val83 = FindSpawnData(spawnSystemList, "Abomination", "Abomination"); if (val83 != null) { val = val83.Clone(); val.m_spawnChance = 10f; val.m_name = "Corpse collector"; val.m_spawnAtDay = false; val.m_spawnAtNight = true; val.m_prefab = monster; val.m_maxSpawned = 2; val.m_groupSizeMin = 1; val.m_groupSizeMax = 1; val.m_maxLevel = 3; newSpawners.Add(val); } break; } case "Bunny_bal": { SpawnData val70 = FindSpawnData(spawnSystemList, "Hare", "Hare"); if (val70 != null) { val = val70.Clone(); val.m_spawnChance = 11f; val.m_name = "bunny"; val.m_spawnAtDay = true; SpawnData obj19 = val; obj19.m_spawnInterval *= 1.5f; val.m_spawnAtNight = false; val.m_prefab = monster; val.m_maxSpawned = 2; val.m_maxLevel = 3; newSpawners.Add(val); } break; } case "BlobAcid_bal": { SpawnData val59 = FindSpawnData(spawnSystemList, "Blob", "Blob"); if (val59 != null) { val = val59.Clone(); val.m_spawnChance = 11f; val.m_name = "acid blob"; val.m_spawnAtDay = false; SpawnData obj13 = val; obj13.m_spawnInterval *= 1.5f; val.m_spawnAtNight = true; val.m_prefab = monster; val.m_biome = (Biome)34; val.m_maxSpawned = 1; val.m_maxLevel = 3; newSpawners.Add(val); } break; } case "MossRootStatic_bal": { SpawnData val45 = FindSpawnData(spawnSystemList, "Greydwarf", "greydwarf DAY"); if (val45 != null) { val = val45.Clone(); val.m_maxSpawned = 6; val.m_groupSizeMin = 1; val.m_groupSizeMax = 2; val.m_spawnChance = 22f; val.m_minLevel = 1; val.m_maxLevel = 4; val.m_spawnAtNight = true; val.m_biome = (Biome)8; newSpawners.Add(val); SpawnData val46 = val.Clone(); val46.m_maxSpawned = 6; val46.m_groupSizeMin = 1; val46.m_groupSizeMax = 2; val46.m_spawnChance = 10f; val46.m_minLevel = 2; val46.m_maxLevel = 5; val46.m_spawnAtNight = true; val46.m_requiredGlobalKey = "defeated_gdking"; val46.m_biome = (Biome)8; newSpawners.Add(val46); } break; } case "Greydwarf_Crusher_bal": { SpawnData val42 = FindSpawnData(spawnSystemList, "Greydwarf", "greydwarf DAY"); if (val42 != null) { val = val42.Clone(); val.m_name = "Crusherdwaf"; val.m_maxSpawned = 1; val.m_groupSizeMin = 1; val.m_groupSizeMax = 1; SpawnData obj9 = val; obj9.m_spawnInterval *= 1.75f; val.m_spawnChance = 15f; val.m_prefab = monster; val.m_minLevel = 1; val.m_maxLevel = 4; val.m_spawnAtNight = true; val.m_biome = (Biome)8; newSpawners.Add(val); SpawnData val43 = val42.Clone(); val43.m_name = "Crusherdwaf after Elder"; val43.m_maxSpawned = 2; val43.m_groupSizeMin = 1; val43.m_groupSizeMax = 1; SpawnData obj10 = val; obj10.m_spawnInterval *= 1.75f; val43.m_spawnChance = 11f; val43.m_prefab = monster; val43.m_minLevel = 2; val43.m_maxLevel = 5; val43.m_spawnAtNight = true; val43.m_requiredGlobalKey = "defeated_gdking"; val43.m_biome = (Biome)8; newSpawners.Add(val43); } break; } case "Greydwarf_Moss_bal": { SpawnData val39 = FindSpawnData(spawnSystemList, "Greydwarf", "greydwarf DAY"); if (val39 != null) { val = val39.Clone(); val.m_name = "Mossdwarf"; val.m_maxSpawned = 2; val.m_groupSizeMin = 1; val.m_groupSizeMax = 1; SpawnData obj7 = val; obj7.m_spawnInterval *= 1.5f; val.m_spawnChance = 15f; val.m_prefab = monster; val.m_minLevel = 1; val.m_maxLevel = 4; val.m_spawnAtNight = true; val.m_biome = (Biome)8; newSpawners.Add(val); SpawnData val40 = val.Clone(); val40.m_name = "Mossdwarf after Elder"; val40.m_maxSpawned = 1; val40.m_groupSizeMin = 1; val40.m_groupSizeMax = 1; val40.m_spawnChance = 11f; val40.m_prefab = monster; val40.m_minLevel = 2; val40.m_maxLevel = 5; val40.m_spawnAtNight = true; val40.m_requiredGlobalKey = "defeated_gdking"; val40.m_biome = (Biome)8; newSpawners.Add(val40); } break; } case "Greydwarf_Scorched_bal": { SpawnData val24 = FindSpawnData(spawnSystemList, "Greydwarf", "greydwarf DAY"); if (val24 != null) { val = val24.Clone(); val.m_maxSpawned = 3; val.m_groupSizeMin = 1; val.m_groupSizeMax = 2; val.m_spawnChance = 22f; val.m_minLevel = 1; val.m_prefab = monster; val.m_maxLevel = 4; val.m_spawnAtNight = true; val.m_spawnAtDay = false; val.m_biome = (Biome)32; newSpawners.Add(val); SpawnData val25 = val.Clone(); val25.m_maxSpawned = 2; val25.m_spawnChance = 10f; val25.m_minLevel = 2; val25.m_maxLevel = 5; val25.m_requiredGlobalKey = "defeated_fader"; newSpawners.Add(val25); } break; } case "Greydwarf_Frozen_bal": { SpawnData val20 = FindSpawnData(spawnSystemList, "Greydwarf", "greydwarf DAY"); if (val20 != null) { val = val20.Clone(); val.m_maxSpawned = 3; val.m_groupSizeMin = 1; val.m_groupSizeMax = 3; val.m_spawnChance = 22f; val.m_minLevel = 1; val.m_prefab = monster; val.m_maxLevel = 4; val.m_spawnAtNight = false; val.m_spawnAtDay = true; val.m_biome = (Biome)64; newSpawners.Add(val); } break; } case "GreylingElite_bal": { SpawnData val15 = FindSpawnData(spawnSystemList, "Greyling", "Greyling"); if (val15 != null) { val = val15.Clone(); val.m_levelUpMinCenterDistance = 300f; val.m_spawnChance = 11f; val.m_name = "greylingElite"; val.m_prefab = monster; val.m_maxSpawned = 2; val.m_maxLevel = 3; val.m_spawnAtDay = false; val.m_spawnAtNight = true; val.m_biome = (Biome)9; newSpawners.Add(val); SpawnData val16 = val.Clone(); val16.m_maxSpawned = 2; val16.m_groupSizeMin = 1; val16.m_groupSizeMax = 1; val16.m_spawnChance = 10f; val16.m_minLevel = 2; val16.m_maxLevel = 5; val16.m_spawnAtDay = true; val16.m_spawnAtNight = true; val16.m_requiredGlobalKey = "defeated_gdking"; newSpawners.Add(val16); } break; } case "GreylingBeeKeeper_bal": { SpawnData val12 = FindSpawnData(spawnSystemList, "Greyling", "Greyling"); if (val12 != null) { val = val12.Clone(); val.m_levelUpMinCenterDistance = 300f; val.m_spawnChance = 22f; val.m_name = "greylingBee"; val.m_prefab = monster; val.m_maxSpawned = 2; val.m_requiredGlobalKey = ""; val.m_maxLevel = 3; val.m_spawnAtDay = true; val.m_spawnAtNight = false; newSpawners.Add(val); SpawnData val13 = val.Clone(); val13.m_maxSpawned = 1; val13.m_groupSizeMin = 1; val13.m_groupSizeMax = 1; val13.m_spawnChance = 5f; val13.m_minLevel = 2; val13.m_maxLevel = 5; val13.m_spawnAtDay = true; val13.m_spawnAtNight = true; val13.m_requiredGlobalKey = "defeated_gdking"; newSpawners.Add(val13); } break; } case "goblin_skeleton_bal": { SpawnData val5 = FindSpawnData(spawnSystemList, "Skeleton"); if (val5 != null) { val = val5.Clone(); val.m_maxLevel = 4; val.m_spawnChance = 22f; val.m_name = "goblin skeletons"; val.m_prefab = monster; val.m_maxSpawned = 3; val.m_groupSizeMax = 1; val.m_groupSizeMin = 1; val.m_biome = (Biome)18; val.m_spawnAtDay = false; val.m_spawnAtNight = true; newSpawners.Add(val); SpawnData val6 = val5.Clone(); val6.m_maxLevel = 5; val6.m_levelUpMinCenterDistance = 2000f; val6.m_spawnChance = 22f; val6.m_prefab = monster; val6.m_maxSpawned = 2; val6.m_groupSizeMax = 1; val6.m_groupSizeMin = 1; val.m_biome = (Biome)18; val6.m_spawnAtDay = false; val6.m_spawnAtNight = true; val6.m_name = "goblin skele after moder"; val6.m_requiredGlobalKey = "defeated_dragon"; newSpawners.Add(val6); } break; } case "Habrok_bal": { SpawnData val84 = FindSpawnData(spawnSystemList, "Boar"); if (val84 != null) { val = val84.Clone(); val.m_maxLevel = 5; val.m_spawnChance = 33f; val.m_name = "habrok"; val.m_prefab = monster; SpawnData obj25 = val; obj25.m_spawnInterval *= 1.5f; val.m_maxSpawned = 2; val.m_spawnAtDay = false; val.m_spawnAtNight = true; val.m_biome = (Biome)16; SpawnData val85 = val.Clone(); val85.m_maxLevel = 4; val85.m_spawnChance = 11f; val85.m_name = "habrok"; val85.m_prefab = monster; val85.m_maxSpawned = 2; val85.m_spawnAtDay = false; val85.m_spawnAtNight = true; val85.m_biome = (Biome)16; newSpawners.Add(val85); } break; } case "HabrokBirb_bal": { SpawnData val82 = FindSpawnData(spawnSystemList, "Boar"); if (val82 != null) { val = val82.Clone(); val.m_maxLevel = 3; val.m_spawnChance = 22f; val.m_name = "habrokBirb"; SpawnData obj24 = val; obj24.m_spawnInterval *= 1.75f; val.m_prefab = monster; val.m_maxSpawned = 1; val.m_spawnAtDay = false; val.m_spawnAtNight = true; val.m_biome = (Biome)16; newSpawners.Add(val); } break; } case "Hog_bal": { SpawnData val80 = FindSpawnData(spawnSystemList, "Boar"); if (val80 != null) { val = val80.Clone(); val.m_maxLevel = 4; val.m_spawnChance = 22f; val.m_name = "hog"; val.m_prefab = monster; SpawnData obj23 = val; obj23.m_spawnInterval *= 2f; val.m_maxSpawned = 2; val.m_groupSizeMax = 1; val.m_groupSizeMin = 1; val.m_spawnAtDay = true; val.m_spawnAtNight = true; newSpawners.Add(val); SpawnData val81 = val80.Clone(); val81.m_maxLevel = 6; val81.m_levelUpMinCenterDistance = 1500f; val81.m_spawnChance = 33f; val81.m_prefab = monster; val81.m_maxSpawned = 2; val81.m_spawnAtDay = true; val81.m_groupSizeMax = 1; val81.m_groupSizeMin = 1; val81.m_spawnInterval *= 1.25f; val81.m_spawnAtNight = true; val81.m_name = "hog after moder"; val81.m_requiredGlobalKey = "defeated_dragon"; newSpawners.Add(val81); } break; } case "LostSoul_bal": { SpawnData val72 = FindSpawnData(spawnSystemList, "Surtling", "Surtling"); if (val72 != null) { val = val72.Clone(); val.m_spawnChance = 33f; val.m_name = "lostsoul"; val.m_prefab = monster; val.m_biome = (Biome)2; val.m_maxSpawned = 3; val.m_groupSizeMax = 3; val.m_groupSizeMin = 2; val.m_spawnAtDay = false; val.m_spawnAtNight = true; newSpawners.Add(val); } break; } case "Fox_bal": { SpawnData val68 = FindSpawnData(spawnSystemList, "Wolf", "Wolf"); if (val68 != null) { val = val68.Clone(); val.m_spawnChance = 33f; val.m_name = "fox"; val.m_prefab = monster; val.m_biome = (Biome)16; SpawnData obj17 = val; obj17.m_spawnInterval *= 1.25f; val.m_maxSpawned = 2; val.m_groupSizeMin = 1; val.m_groupSizeMax = 1; val.m_spawnAtDay = true; val.m_spawnAtNight = true; newSpawners.Add(val); } break; } case "Fox_cub_bal": { SpawnData val61 = FindSpawnData(spawnSystemList, "Wolf", "Wolf"); if (val61 != null) { val = val61.Clone(); val.m_spawnChance = 11f; val.m_name = "fox cub"; val.m_prefab = monster; val.m_biome = (Biome)16; SpawnData obj14 = val; obj14.m_spawnInterval *= 1.25f; val.m_maxSpawned = 2; val.m_groupSizeMin = 1; val.m_groupSizeMax = 1; val.m_spawnAtDay = true; val.m_spawnAtNight = true; newSpawners.Add(val); } break; } case "NeckTadpole_bal": { SpawnData val56 = FindSpawnData(spawnSystemList, "Neck", "Neck lakes"); if (val56 != null) { val = val56.Clone(); val.m_spawnChance = 22f; val.m_name = "neck tadpole"; val.m_prefab = monster; SpawnData obj12 = val; obj12.m_spawnInterval *= 1.5f; val.m_maxSpawned = 1; val.m_maxLevel = 2; newSpawners.Add(val); } break; } case "NeckBrute_bal": { SpawnData val36 = FindSpawnData(spawnSystemList, "Neck", "Neck lakes"); if (val36 != null) { val = val36.Clone(); val.m_spawnChance = 22f; val.m_name = "neck brute"; val.m_prefab = monster; SpawnData obj5 = val; obj5.m_spawnInterval *= 1.25f; val.m_maxSpawned = 1; val.m_maxLevel = 4; newSpawners.Add(val); } SpawnData val37 = spawnSystemList.m_spawners.Find((SpawnData x) => x.m_name == "Neck IN RAIN"); if (val37 != null) { SpawnData val38 = val37.Clone(); val38.m_spawnChance = 33f; val38.m_maxSpawned = 2; val38.m_maxLevel = 6; SpawnData obj6 = val; obj6.m_spawnInterval *= 1.25f; val38.m_name = "neck brute in rain"; val38.m_prefab = monster; newSpawners.Add(val38); } break; } case "Stag_bal": { SpawnData val33 = FindSpawnData(spawnSystemList, "Deer", "deer"); if (val33 != null) { val = val33.Clone(); val.m_spawnChance = 33f; val.m_name = "stag"; val.m_spawnAtDay = true; val.m_spawnAtNight = true; SpawnData obj4 = val; obj4.m_spawnInterval *= 1.25f; val.m_prefab = monster; val.m_biome = (Biome)9; val.m_maxSpawned = 1; newSpawners.Add(val); SpawnData val34 = val.Clone(); val34.m_maxLevel = 6; val34.m_levelUpMinCenterDistance = 1500f; val34.m_spawnChance = 33f; val34.m_prefab = monster; val34.m_maxSpawned = 1; val34.m_spawnAtDay = true; val34.m_spawnAtNight = true; val34.m_name = "stag after ektir"; val.m_requiredGlobalKey = "defeated_eikthyr"; newSpawners.Add(val34); } break; } case "StagGhost_bal": { SpawnData val32 = FindSpawnData(spawnSystemList, "Deer", "deer"); if (val32 != null) { val = val32.Clone(); val.m_spawnChance = 22f; val.m_name = "stag_ghost"; val.m_prefab = monster; val.m_spawnAtDay = false; val.m_spawnAtNight = true; SpawnData obj3 = val; obj3.m_spawnInterval *= 1.5f; val.m_maxLevel = 4; val.m_requiredEnvironments.Add("Misty"); val.m_requiredEnvironments.Add("Darklands_dark"); val.m_requiredEnvironments.Add("DeepForest Mist"); val.m_requiredGlobalKey = "defeated_eikthyr"; val.m_biome = (Biome)9; val.m_maxSpawned = 1; newSpawners.Add(val); } break; } case "Varsvin_bal": case "Varsvin_Brute_bal": case "Varsvin_Hunter_bal": { SpawnData val9 = FindSpawnData(spawnSystemList, "Goblin"); if (val9 != null) { SpawnData val10 = val9.Clone(); val10.m_requiredGlobalKey = "defeated_bonemass"; val10.m_biome = (Biome)31; val10.m_maxLevel = 1; val10.m_maxSpawned = 1; val10.m_spawnChance = 5f; val10.m_prefab = monster; if (((Object)monster).name == "Varsvin") { val10.m_spawnAtDay = true; val10.m_spawnAtNight = false; } if (((Object)monster).name == "Varsvin_Hunter") { val10.m_spawnAtDay = true; val10.m_spawnAtNight = true; } if (((Object)monster).name == "Varsvin_Brute") { val10.m_spawnAtDay = false; val10.m_spawnAtNight = true; } newSpawners.Add(val10); val = val10.Clone(); val.m_requiredGlobalKey = "defeated_goblinking"; val.m_biome = (Biome)16; val.m_maxLevel = 4; val.m_maxSpawned = 1; val.m_spawnChance = 55f; newSpawners.Add(val); } break; } case "GiantCrow_bal": { SpawnData val3 = FindSpawnData(spawnSystemList, "Wraith", "Wraith"); if (val3 != null) { val = val3.Clone(); val.m_spawnChance = 55f; val.m_maxSpawned = 2; val.m_groupSizeMax = 2; val.m_groupSizeMin = 1; val.m_spawnInterval = 500f; val.m_name = "Giant crow feast"; val.m_prefab = monster; val.m_spawnAtDay = true; val.m_spawnAtNight = false; val.m_requiredEnvironments.Add("Misty"); val.m_requiredEnvironments.Add("Mistlands_rain"); val.m_requiredEnvironments.Add("Mistlands_thunder"); val.m_requiredEnvironments.Add("Darklands_dark"); val.m_requiredEnvironments.Add("DeepForest Mist"); val.m_requiredEnvironments.Add("SunkenCrypt"); val.m_requiredEnvironments.Add("Crypt"); val.m_requiredGlobalKey = "defeated_eikthyr"; val.m_biome = (Biome)8; newSpawners.Add(val); SpawnData val4 = val.Clone(); val4.m_spawnChance = 33f; val4.m_maxSpawned = 2; val4.m_groupSizeMax = 2; val4.m_groupSizeMin = 1; val4.m_prefab = monster; val4.m_spawnAtNight = true; val4.m_spawnAtDay = false; val4.m_name = "Giant crow night"; val4.m_requiredEnvironments.Clear(); val4.m_requiredGlobalKey = null; newSpawners.Add(val4); } break; } case "DarkBat_bal": { SpawnData val89 = FindSpawnData(spawnSystemList, "Deathsquito", "Deathsquito"); if (val89 != null) { val = val89.Clone(); val.m_spawnChance = 88f; val.m_maxSpawned = 4; val.m_groupSizeMax = 4; val.m_groupSizeMin = 2; val.m_name = "dark bat feast"; val.m_prefab = monster; val.m_spawnAtDay = false; val.m_spawnAtNight = true; val.m_requiredEnvironments.Add("Misty"); val.m_requiredEnvironments.Add("Darklands_dark"); val.m_requiredEnvironments.Add("DeepForest Mist"); val.m_requiredEnvironments.Add("SunkenCrypt"); val.m_requiredEnvironments.Add("Crypt"); val.m_requiredEnvironments.Add("Bonemass"); val.m_requiredGlobalKey = "defeated_eikthyr"; val.m_biome = (Biome)2; val.m_maxSpawned = 4; newSpawners.Add(val); SpawnData val90 = val.Clone(); val90.m_spawnChance = 44f; val90.m_maxSpawned = 3; val90.m_groupSizeMax = 2; val90.m_groupSizeMin = 1; val90.m_prefab = monster; val90.m_name = "dark bat normal"; val90.m_requiredEnvironments.Clear(); val90.m_requiredGlobalKey = null; newSpawners.Add(val90); } break; } case "WildWisp_bal": { SpawnData val87 = FindSpawnData(spawnSystemList, "Deathsquito", "Deathsquito"); if (val87 != null) { val = val87.Clone(); val.m_spawnChance = 44f; val.m_maxSpawned = 2; val.m_groupSizeMax = 2; val.m_groupSizeMin = 1; val.m_name = "wild wisps"; val.m_prefab = monster; val.m_spawnAtDay = false; val.m_spawnAtNight = true; val.m_requiredEnvironments.Add("Misty"); val.m_requiredEnvironments.Add("Darklands_dark"); val.m_requiredEnvironments.Add("DeepForest Mist"); val.m_requiredEnvironments.Add("SunkenCrypt"); val.m_requiredEnvironments.Add("Crypt"); val.m_requiredEnvironments.Add("Bonemass"); val.m_requiredGlobalKey = "defeated_eikthyr"; val.m_biome = (Biome)512; val.m_maxSpawned = 2; newSpawners.Add(val); } break; } case "Greydwarf_Watcher_bal": case "Greydwarf_Mystic_bal": { SpawnData val79 = FindSpawnData(spawnSystemList, "Goblin"); if (val79 != null) { val = val79.Clone(); val.m_requiredGlobalKey = "defeated_gdking"; val.m_biome = (Biome)8; val.m_spawnChance = 33f; val.m_maxLevel = 5; val.m_maxSpawned = 2; val.m_groupSizeMax = 2; val.m_groupSizeMin = 1; val.m_prefab = monster; if (((Object)monster).name == "Greydwarf_Watcher") { val.m_name = "gwatcher"; val.m_spawnAtDay = true; val.m_spawnAtNight = false; } if (((Object)monster).name == "Greydwarf_Mystic") { val.m_name = "gmystic"; val.m_spawnAtDay = false; val.m_spawnAtNight = true; } newSpawners.Add(val); } break; } case "FrostDrake_bal": { SpawnData val78 = FindSpawnData(spawnSystemList, "Wraith", "Wraith"); val = val78.Clone(); val.m_requiredEnvironments.Clear(); val.m_requiredEnvironments.Add("Thunderstorm"); val.m_requiredEnvironments.Add("Rain"); val.m_requiredEnvironments.Add("Misty"); val.m_requiredEnvironments.Add("DeepForest Mist"); val.m_requiredEnvironments.Add("Twilight_Snow"); val.m_requiredEnvironments.Add("Snow"); val.m_requiredEnvironments.Add("SnowStorm"); val.m_requiredEnvironments.Add("Mistlands_rain"); val.m_requiredEnvironments.Add("Mistlands_thunder"); val.m_requiredEnvironments.Add("Twilight_SnowStorm"); val.m_requiredGlobalKey = "defeated_gdking"; val.m_minAltitude = -1000f; val.m_prefab = monster; val.m_spawnAtDay = true; val.m_spawnAtNight = false; val.m_name = "elder drakes"; val.m_maxAltitude = 1000f; SpawnData obj22 = val; obj22.m_spawnInterval *= 2f; val.m_minOceanDepth = 0f; val.m_maxOceanDepth = 0f; val.m_groupSizeMin = 1; val.m_groupSizeMax = 1; val.m_maxLevel = 4; val.m_maxSpawned = 1; val.m_spawnChance = 22f; val.m_levelUpMinCenterDistance = 2000f; val.m_biome = (Biome)68; newSpawners.Add(val); break; } case "Stormdrake_bal": { SpawnData val77 = FindSpawnData(spawnSystemList, "Wraith", "Wraith"); val = val77.Clone(); val.m_requiredEnvironments.Clear(); val.m_requiredEnvironments.Add("Thunderstorm"); val.m_requiredEnvironments.Add("Rain"); val.m_requiredEnvironments.Add("Misty"); val.m_requiredEnvironments.Add("DeepForest Mist"); val.m_requiredEnvironments.Add("Twilight_Snow"); val.m_requiredEnvironments.Add("Snow"); val.m_requiredEnvironments.Add("SnowStorm"); val.m_requiredEnvironments.Add("Mistlands_rain"); val.m_requiredEnvironments.Add("Mistlands_thunder"); val.m_requiredEnvironments.Add("Twilight_SnowStorm"); val.m_requiredGlobalKey = "defeated_gdking"; val.m_minAltitude = -1000f; val.m_prefab = monster; val.m_spawnAtDay = true; val.m_spawnAtNight = true; val.m_name = "stormdrakes"; val.m_maxAltitude = 1000f; val.m_minOceanDepth = 0f; val.m_maxOceanDepth = 0f; val.m_groupSizeMin = 1; val.m_groupSizeMax = 1; val.m_maxLevel = 4; val.m_maxSpawned = 2; val.m_spawnChance = 55f; val.m_levelUpMinCenterDistance = 3500f; val.m_biome = (Biome)832; newSpawners.Add(val); break; } case "Shark_bal": { SpawnData val75 = FindSpawnData(spawnSystemList, "Serpent", "Serpent"); val = val75.Clone(); val.m_prefab = monster; val.m_minLevel = 1; val.m_maxLevel = 2; SpawnData obj21 = val; obj21.m_spawnInterval *= 0.75f; val.m_spawnAtDay = true; val.m_spawnAtNight = false; val.m_requiredGlobalKey = "defeated_gdking"; val.m_spawnChance = 11f; val.m_name = "sharks"; val.m_biome = (Biome)256; val.m_maxSpawned = 1; newSpawners.Add(val); SpawnData val76 = val.Clone(); val76.m_spawnChance = 22f; val76.m_name = "wild sharks"; val76.m_maxSpawned = 1; val76.m_requiredGlobalKey = "defeated_dragon"; val76.m_minLevel = 2; val76.m_maxLevel = 4; val76.m_spawnAtDay = true; val76.m_spawnAtNight = true; val76.m_biome = (Biome)256; newSpawners.Add(val76); break; } case "Ashdrake_bal": { SpawnData val73 = FindSpawnData(spawnSystemList, "Deathsquito", "Deathsquito"); if (val73 != null) { val = val73.Clone(); val.m_requiredEnvironments.Clear(); val.m_spawnChance = 66f; val.m_requiredGlobalKey = ""; val.m_name = "Ashdrakes"; val.m_minAltitude = 0f; val.m_maxSpawned = 1; val.m_maxAltitude = 1000f; val.m_minOceanDepth = 0f; val.m_maxOceanDepth = 0f; val.m_maxLevel = 5; val.m_prefab = monster; val.m_spawnAtDay = true; val.m_spawnAtNight = true; val.m_levelUpMinCenterDistance = 100f; val.m_biome = (Biome)32; newSpawners.Add(val); } break; } case "LeechPrimal_bal": { SpawnData val71 = FindSpawnData(spawnSystemList, "Leech", "Leech"); if (val71 != null) { val = val71.Clone(); val.m_spawnChance = 33f; val.m_name = "Leech Primal"; val.m_minAltitude = -1000f; val.m_maxAltitude = 1000f; val.m_minOceanDepth = 5f; SpawnData obj20 = val; obj20.m_spawnInterval *= 1.5f; val.m_maxOceanDepth = 1000f; val.m_prefab = monster; val.m_biome = (Biome)2; val.m_maxSpawned = 2; newSpawners.Add(val); } break; } case "LeechLarva_bal": { SpawnData val69 = FindSpawnData(spawnSystemList, "Leech", "Leech"); if (val69 != null) { val = val69.Clone(); val.m_spawnChance = 22f; val.m_name = "Leech Larva"; val.m_minAltitude = -1000f; val.m_maxAltitude = 1000f; val.m_minOceanDepth = 5f; SpawnData obj18 = val; obj18.m_spawnInterval *= 1.5f; val.m_maxOceanDepth = 1000f; val.m_prefab = monster; val.m_biome = (Biome)2; val.m_maxSpawned = 2; newSpawners.Add(val); } break; } case "Ell_bal": { SpawnData val66 = FindSpawnData(spawnSystemList, "Leech", "Leech"); if (val66 != null) { val = val66.Clone(); val.m_spawnChance = 33f; val.m_name = "ells"; val.m_minAltitude = -1000f; val.m_maxAltitude = 1000f; val.m_minOceanDepth = 5f; val.m_maxOceanDepth = 1000f; SpawnData obj16 = val; obj16.m_spawnInterval *= 1.5f; val.m_prefab = monster; val.m_biome = (Biome)512; val.m_maxSpawned = 2; val.m_maxLevel = 3; newSpawners.Add(val); SpawnData val67 = val.Clone(); val67.m_name = "ells after Yagluth"; val67.m_maxSpawned = 1; val67.m_maxLevel = 1; val67.m_biome = (Biome)256; val67.m_requiredGlobalKey = "defeated_goblinking"; newSpawners.Add(val67); } break; } case "Serpentling_bal": { SpawnData val62 = FindSpawnData(spawnSystemList, "Leech", "Leech"); if (val62 != null) { val = val62.Clone(); val.m_spawnChance = 33f; val.m_name = "serpentlings after moder"; val.m_minAltitude = -1000f; val.m_maxAltitude = 1000f; val.m_minOceanDepth = 5f; SpawnData obj15 = val; obj15.m_spawnInterval *= 1.5f; val.m_maxOceanDepth = 1000f; val.m_prefab = monster; val.m_biome = (Biome)256; val.m_maxSpawned = 1; val.m_requiredGlobalKey = "defeated_dragon"; newSpawners.Add(val); SpawnData val63 = val.Clone(); val63.m_spawnChance = 22f; val63.m_name = "serpentlings after bonemass"; val63.m_maxSpawned = 1; val63.m_requiredGlobalKey = "defeated_bonemass"; newSpawners.Add(val63); SpawnData val64 = val.Clone(); val64.m_spawnChance = 11f; val64.m_name = "serpentlings after elder"; val64.m_maxSpawned = 1; val64.m_requiredGlobalKey = "defeated_gdking"; newSpawners.Add(val64); } break; } case "Kelpie_bal": { SpawnData val60 = FindSpawnData(spawnSystemList, "Leech"); if (val60 != null) { val = val60.Clone(); val.m_spawnChance = 33f; val.m_name = "kelpie"; val.m_minAltitude = -1000f; val.m_maxAltitude = 1000f; val.m_minOceanDepth = 5f; val.m_maxOceanDepth = 1000f; val.m_prefab = monster; val.m_biome = (Biome)64; val.m_maxSpawned = 5; newSpawners.Add(val); } break; } case "Penguin_bal": { SpawnData val57 = FindSpawnData(spawnSystemList, "Deer"); if (val57 != null) { val = val57.Clone(); val.m_spawnChance = 77f; val.m_name = "penguins"; val.m_prefab = monster; val.m_maxAltitude = 2000f; val.m_minAltitude = -50f; val.m_biome = (Biome)64; val.m_maxSpawned = 12; val.m_groupSizeMax = 4; val.m_groupSizeMin = 2; newSpawners.Add(val); SpawnData val58 = val.Clone(); val58.m_spawnChance = 11f; val58.m_name = "lost penguins"; val58.m_maxSpawned = 1; val.m_groupSizeMax = 1; val.m_groupSizeMin = 1; val58.m_minLevel = 1; val58.m_maxLevel = 4; val58.m_maxAltitude = 15f; val58.m_minAltitude = -15f; val58.m_spawnAtDay = true; val58.m_spawnAtNight = false; val58.m_biome = (Biome)4; val58.m_biomeArea = (BiomeArea)3; newSpawners.Add(val58); } break; } case "YotunWarrior_bal": { SpawnData val55 = FindSpawnData(spawnSystemList, "Troll"); if (val55 != null) { val = val55.Clone(); val.m_spawnChance = 80f; val.m_name = "yotun warriors"; val.m_requiredEnvironments.Clear(); val.m_requiredEnvironments.Add("Thunderstorm"); val.m_requiredEnvironments.Add("Rain"); val.m_requiredEnvironments.Add("LightRain"); val.m_requiredEnvironments.Add("Twilight_Snow"); val.m_requiredEnvironments.Add("Snow"); val.m_requiredEnvironments.Add("SnowStorm"); val.m_requiredEnvironments.Add("Twilight_Snow"); val.m_requiredEnvironments.Add("Twilight_SnowStorm"); val.m_prefab = monster; val.m_biome = (Biome)64; val.m_maxSpawned = 2; val.m_maxLevel = 3; val.m_maxAltitude = 2000f; val.m_minAltitude = 0f; newSpawners.Add(val); } break; } case "Yotun": { SpawnData val52 = FindSpawnData(spawnSystemList, "Troll"); if (val52 != null) { val = val52.Clone(); val.m_spawnChance = 80f; val.m_name = "yotuns"; val.m_requiredEnvironments.Clear(); val.m_requiredEnvironments.Add("Thunderstorm"); val.m_requiredEnvironments.Add("Rain"); val.m_requiredEnvironments.Add("LightRain"); val.m_requiredEnvironments.Add("Twilight_Snow"); val.m_requiredEnvironments.Add("Snow"); val.m_requiredEnvironments.Add("SnowStorm"); val.m_requiredEnvironments.Add("Twilight_Snow"); val.m_requiredEnvironments.Add("Twilight_SnowStorm"); val.m_prefab = monster; val.m_biome = (Biome)64; val.m_maxSpawned = 2; val.m_maxLevel = 3; val.m_maxAltitude = 2000f; val.m_minAltitude = 0f; newSpawners.Add(val); } break; } case "MossGolem": { SpawnData val50 = FindSpawnData(spawnSystemList, "Troll"); if (val50 != null) { val = val50.Clone(); val.m_spawnChance = 80f; val.m_name = "moss golems"; val.m_requiredEnvironments.Clear(); val.m_requiredEnvironments.Add("Thunderstorm"); val.m_requiredEnvironments.Add("Rain"); val.m_requiredEnvironments.Add("LightRain"); val.m_requiredEnvironments.Add("Darklands_dark"); val.m_requiredEnvironments.Add("Misty"); val.m_requiredEnvironments.Add("DeepForest Mist"); val.m_requiredEnvironments.Add("SunkenCrypt"); val.m_requiredEnvironments.Add("Crypt"); val.m_prefab = monster; val.m_biome = (Biome)8; val.m_maxSpawned = 2; val.m_spawnAtDay = true; val.m_maxLevel = 3; val.m_maxAltitude = 2000f; val.m_minAltitude = 0f; newSpawners.Add(val); } break; } case "Goat_bal": { SpawnData val49 = FindSpawnData(spawnSystemList, "Deer"); val = val49.Clone(); val.m_spawnChance = 44f; val.m_name = " the goats"; val.m_prefab = monster; val.m_maxAltitude = 2000f; val.m_minAltitude = 50f; val.m_spawnAtDay = true; val.m_spawnAtNight = false; val.m_groupSizeMin = 2; val.m_groupSizeMax = 6; val.m_biome = (Biome)68; val.m_maxSpawned = 5; newSpawners.Add(val); break; } case "GoatKid_bal": { SpawnData val47 = FindSpawnData(spawnSystemList, "Deer"); SpawnData val48 = val47.Clone(); val48.m_spawnChance = 11f; val48.m_name = " the goat kid"; val48.m_prefab = monster; val48.m_maxAltitude = 2000f; val48.m_spawnInterval *= 1.5f; val48.m_spawnAtDay = true; val48.m_spawnAtNight = false; val48.m_minAltitude = 50f; val48.m_biome = (Biome)68; val48.m_maxSpawned = 2; val48.m_groupSizeMin = 2; val48.m_groupSizeMax = 6; newSpawners.Add(val48); break; } case "Disir": { SpawnData val44 = FindSpawnData(spawnSystemList, "Wraith"); if (val44 != null) { val44.m_maxLevel = 3; val44.m_maxSpawned = 1; val44.m_groupRadius *= 1.5f; val = val44.Clone(); val.m_requiredGlobalKey = "defeated_bonemass"; val.m_biome = (Biome)2; val.m_spawnChance = 20f; val.m_requiredEnvironments.Clear(); val.m_requiredEnvironments.Add("Darklands_dark"); val.m_requiredEnvironments.Add("Misty"); val.m_requiredEnvironments.Add("DeepForest Mist"); val.m_requiredEnvironments.Add("SunkenCrypt"); val.m_requiredEnvironments.Add("Crypt"); val.m_spawnAtDay = false; val.m_spawnAtNight = true; val.m_name = "Disir"; val.m_prefab = monster; val.m_maxAltitude = 2000f; val.m_minAltitude = 0f; val.m_maxSpawned = 1; val.m_maxLevel = 4; newSpawners.Add(val); } break; } case "Haugbui": { SpawnData val28 = FindSpawnData(spawnSystemList, "Wraith"); if (val28 != null) { val = val28.Clone(); val.m_biome = (Biome)2; val.m_spawnChance = 33f; val.m_requiredEnvironments.Clear(); val.m_requiredEnvironments.Add("Darklands_dark"); val.m_requiredEnvironments.Add("Misty"); val.m_requiredEnvironments.Add("DeepForest Mist"); val.m_requiredEnvironments.Add("SunkenCrypt"); val.m_requiredEnvironments.Add("Crypt"); val.m_spawnAtDay = true; val.m_spawnAtNight = true; val.m_name = "Haugbui"; val.m_prefab = monster; val.m_maxAltitude = 2000f; val.m_minAltitude = 0f; val.m_maxSpawned = 1; val.m_maxLevel = 4; newSpawners.Add(val); SpawnData val29 = val28.Clone(); val29.m_maxSpawned = 1; val29.m_groupSizeMin = 1; val29.m_groupSizeMin = 1; val29.m_spawnChance = 5f; val29.m_maxAltitude = 2000f; val29.m_minAltitude = 0f; val29.m_prefab = znetPrefabs.Find((GameObject x) => ((Object)x).name == "BonePileSpawner"); val29.m_spawnAtNight = true; val29.m_spawnAtDay = false; val29.m_biome = (Biome)11; val29.m_name = "Skeleton Bonemass spawners"; val29.m_requiredGlobalKey = "defeated_gdking"; val29.m_maxLevel = 1; val29.m_requiredEnvironments.Add("DeepForest Mist"); val29.m_requiredEnvironments.Add("DeepForest Dark"); val29.m_requiredEnvironments.Add("Bonemass"); val29.m_requiredEnvironments.Add("SunkenCrypt"); val29.m_requiredEnvironments.Add("Darklands_dark"); val29.m_requiredEnvironments.Add("Crypt"); newSpawners.Add(val29); SpawnData val30 = val29.Clone(); val30.m_prefab = znetPrefabs.Find((GameObject x) => ((Object)x).name == "Spawner_DraugrPile"); val30.m_spawnAtNight = true; val30.m_biome = (Biome)11; val30.m_name = "Draugur Bonemass spawners"; newSpawners.Add(val30); SpawnData val31 = val29.Clone(); val31.m_prefab = znetPrefabs.Find((GameObject x) => ((Object)x).name == "BonePileSpawner"); val31.m_spawnAtDay = true; val31.m_biome = (Biome)63; val31.m_name = "Skeleton Goblin King spawners"; val31.m_requiredGlobalKey = "defeated_moder"; newSpawners.Add(val31); } break; } case "Spectre": { SpawnData val26 = FindSpawnData(spawnSystemList, "Wraith"); if (val26 != null) { val = val26.Clone(); val.m_requiredGlobalKey = "defeated_bonemass"; val.m_biome = (Biome)2; val.m_spawnChance = 33f; val.m_spawnAtDay = true; val.m_spawnAtNight = false; val.m_requiredEnvironments.Clear(); val.m_requiredEnvironments.Add("Darklands_dark"); val.m_requiredEnvironments.Add("Misty"); val.m_requiredEnvironments.Add("DeepForest Mist"); val.m_requiredEnvironments.Add("SunkenCrypt"); val.m_requiredEnvironments.Add("Crypt"); val.m_name = "Spectre"; val.m_prefab = monster; val.m_maxAltitude = 2000f; val.m_minAltitude = 0f; val.m_maxSpawned = 1; val.m_maxLevel = 4; newSpawners.Add(val); } break; } case "FrostbjornBrown_bal": { SpawnData val23 = FindSpawnData(spawnSystemList, "Troll"); if (val23 != null) { val = val23.Clone(); val.m_groupSizeMin = 1; val.m_groupSizeMax = 2; val.m_spawnChance = 77f; val.m_name = "ForestBjorn"; val.m_prefab = monster; val.m_biome = (Biome)8; val.m_maxSpawned = 2; val.m_maxAltitude = 2000f; val.m_spawnDistance = 8000f; val.m_minAltitude = 10f; val.m_minLevel = 2; val.m_maxLevel = 5; val.m_requiredGlobalKey = "defeated_fader"; newSpawners.Add(val); } break; } case "Frostbjorn_bal": { SpawnData val21 = FindSpawnData(spawnSystemList, "Troll"); if (val21 != null) { val = val21.Clone(); val.m_groupSizeMin = 1; val.m_groupSizeMax = 3; val.m_spawnChance = 77f; val.m_name = "Frostbjorns"; val.m_prefab = monster; val.m_biome = (Biome)64; val.m_maxSpawned = 3; val.m_maxAltitude = 2000f; val.m_spawnDistance = 200f; val.m_minAltitude = 10f; val.m_maxLevel = 3; newSpawners.Add(val); } break; } case "CrabForest_bal": { SpawnData val19 = FindSpawnData(spawnSystemList, "Neck"); if (val19 != null) { val = val19.Clone(); val.m_spawnChance = 33f; val.m_name = "crab forest"; val.m_minAltitude = -50f; val.m_minOceanDepth = 1f; val.m_maxAltitude = 50f; val.m_maxOceanDepth = 200f; val.m_requiredGlobalKey = "defeated_gdking"; val.m_prefab = monster; val.m_maxSpawned = 4; val.m_biome = (Biome)8; newSpawners.Add(val); } break; } case "CrabSea_bal": { SpawnData val17 = FindSpawnData(spawnSystemList, "Neck"); if (val17 != null) { val = val17.Clone(); val.m_spawnChance = 33f; val.m_name = "crab sea"; val.m_minAltitude = -50f; val.m_maxAltitude = 150f; val.m_minOceanDepth = 1f; val.m_maxOceanDepth = 200f; val.m_requiredGlobalKey = "defeated_gdking"; val.m_prefab = monster; val.m_maxSpawned = 3; val.m_biome = (Biome)272; newSpawners.Add(val); } break; } case "CrabStone_bal": { SpawnData val14 = FindSpawnData(spawnSystemList, "Boar"); if (val14 != null) { val = val14.Clone(); val.m_spawnChance = 44f; val.m_requiredGlobalKey = "killedStoneGolem"; val.m_name = "stone crabs"; val.m_prefab = monster; val.m_maxAltitude = 2000f; val.m_minAltitude = 0f; val.m_maxOceanDepth = 0f; val.m_minOceanDepth = 0f; val.m_biome = (Biome)4; val.m_maxSpawned = 2; newSpawners.Add(val); } break; } case "BlobLava": { SpawnData val11 = FindSpawnData(spawnSystemList, "Blob"); if (val11 != null) { val = val11.Clone(); val.m_spawnChance = 33f; val.m_name = " base spawn Bloblava"; val.m_prefab = monster; val.m_maxSpawned = 3; val.m_maxLevel = 3; val.m_spawnAtDay = true; val.m_spawnAtNight = false; val.m_biome = (Biome)32; newSpawners.Add(val); } break; } case "TrollDraugr": { SpawnData val8 = FindSpawnData(spawnSystemList, "Abomination"); if (val8 != null) { val = val8.Clone(); val.m_name = " Undead Troll"; val.m_prefab = monster; val.m_maxSpawned = 1; val.m_maxLevel = 3; val.m_spawnAtDay = true; val.m_spawnAtNight = false; val.m_biome = (Biome)2; newSpawners.Add(val); val = val8.Clone(); val.m_name = " Abomination after Bonemass"; val.m_maxSpawned = 1; SpawnData obj = val; obj.m_spawnChance *= 1.1f; val.m_maxLevel = 4; val.m_requiredGlobalKey = "defeated_bonemass"; val.m_biome = (Biome)2; newSpawners.Add(val); } break; } case "Forsaken": { SpawnData val2 = spawnSystemList.m_spawners.Find((SpawnData x) => ((Object)x.m_prefab).name == "Boar"); if (val2 != null) { val = val2.Clone(); val.m_spawnChance = 44f; val.m_requiredGlobalKey = null; val.m_name = "Forsaken"; val.m_prefab = monster; val.m_maxAltitude = 2000f; val.m_spawnAtDay = false; val.m_spawnAtNight = true; val.m_minAltitude = 0f; val.m_maxOceanDepth = 0f; val.m_minOceanDepth = 0f; val.m_biome = (Biome)32; val.m_maxSpawned = 2; newSpawners.Add(val); } break; } } if (val != null) { } } } public class DatabaseAddMethods { public void AddItems(List items) { foreach (GameObject item in items) { AddItem(item); } } public void AddRecipes(List recipes) { foreach (Recipe recipe in recipes) { AddRecipe(recipe); } } public void AddStatuseffects(List statusEffects) { foreach (StatusEffect statusEffect in statusEffects) { AddStatus(statusEffect); } } private bool IsObjectDBValid() { return (Object)(object)ObjectDB.instance != (Object)null && ObjectDB.instance.m_items.Count != 0 && ObjectDB.instance.m_recipes.Count != 0 && (Object)(object)ObjectDB.instance.GetItemPrefab("Amber") != (Object)null; } private void AddStatus(StatusEffect status) { if (!IsObjectDBValid()) { return; } if ((Object)(object)status != (Object)null) { if ((Object)(object)ObjectDB.instance.GetStatusEffect(status.m_nameHash) == (Object)null) { ObjectDB.instance.m_StatusEffects.Add(status); } } else { Debug.LogError((object)(Launch.projectName + ": " + ((Object)status).name + " - Status not found")); } } private void AddRecipe(Recipe recipe) { if (!IsObjectDBValid()) { return; } if ((Object)(object)recipe != (Object)null) { if ((Object)(object)ObjectDB.instance.m_recipes.Find((Recipe x) => ((Object)x).name == ((Object)recipe).name) == (Object)null && (Object)(object)recipe.m_item != (Object)null) { ObjectDB.instance.m_recipes.Add(recipe); } } else { Debug.LogError((object)(Launch.projectName + ": " + ((Object)recipe).name + " - Recipe not found")); } } private void AddItem(GameObject newPrefab) { if (!IsObjectDBValid() || (Object)(object)newPrefab == (Object)null) { return; } ItemDrop component = newPrefab.GetComponent(); if ((Object)(object)component == (Object)null) { Debug.LogError((object)(Launch.projectName + ": " + ((Object)newPrefab).name + " - ItemDrop not found on prefab")); return; } if (component.m_itemData == null || component.m_itemData.m_shared == null) { Debug.LogError((object)(Launch.projectName + ": " + ((Object)newPrefab).name + " - ItemData or SharedData is null")); return; } ObjectDB instance = ObjectDB.instance; if (!instance.m_items.Contains(newPrefab)) { instance.m_items.Add(newPrefab); } instance.m_itemByHash[BalrondHashCompat.StableHash(((Object)newPrefab).name)] = newPrefab; instance.m_itemByData[component.m_itemData.m_shared] = newPrefab; } } public class FxReplacment { private List allPrefabs; private string projectName = "[BalrondExtendedAnimals]"; public void setInstance(List gameObjects) { allPrefabs = gameObjects; } public void ReplaceOnObject(GameObject gameObject) { if ((Object)(object)gameObject == (Object)null) { return; } SpawnArea component = gameObject.GetComponent(); if ((Object)(object)component != (Object)null) { EffectList spawnEffects = component.m_spawnEffects; if (spawnEffects != null) { findEffectsAndChange(spawnEffects.m_effectPrefabs); } } Destructible component2 = gameObject.GetComponent(); if ((Object)(object)component2 != (Object)null) { EffectList hitEffect = component2.m_hitEffect; if (hitEffect != null) { findEffectsAndChange(hitEffect.m_effectPrefabs); } EffectList destroyedEffect = component2.m_destroyedEffect; if (destroyedEffect != null) { findEffectsAndChange(destroyedEffect.m_effectPrefabs); } } Projectile component3 = gameObject.GetComponent(); if ((Object)(object)component3 != (Object)null) { EffectList hitEffects = component3.m_hitEffects; if (hitEffects != null) { findEffectsAndChange(hitEffects.m_effectPrefabs); } EffectList hitWaterEffects = component3.m_hitWaterEffects; if (hitWaterEffects != null) { findEffectsAndChange(hitWaterEffects.m_effectPrefabs); } EffectList spawnOnHitEffects = component3.m_spawnOnHitEffects; if (spawnOnHitEffects != null) { findEffectsAndChange(spawnOnHitEffects.m_effectPrefabs); } } } public void ReplaceOnVegetation(GameObject gameObject) { Pickable component = gameObject.GetComponent(); if ((Object)(object)component != (Object)null) { fixPlant(component); } Destructible component2 = gameObject.GetComponent(); if ((Object)(object)component2 != (Object)null) { fixPDestructable(component2); } MineRock5 component3 = gameObject.GetComponent(); if ((Object)(object)component3 != (Object)null) { fixMineRock5(component3); } MineRock component4 = gameObject.GetComponent(); if ((Object)(object)component4 != (Object)null) { fixMineRock(component4); } } private void fixPlant(Pickable pickable) { EffectList pickEffector = pickable.m_pickEffector; if (pickEffector != null) { findEffectsAndChange(pickEffector.m_effectPrefabs); } } private void fixPDestructable(Destructible minerock5) { EffectList hitEffect = minerock5.m_hitEffect; if (hitEffect != null) { findEffectsAndChange(hitEffect.m_effectPrefabs); } EffectList destroyedEffect = minerock5.m_destroyedEffect; if (destroyedEffect != null) { findEffectsAndChange(destroyedEffect.m_effectPrefabs); } } private void fixMineRock5(MineRock5 minerock5) { EffectList hitEffect = minerock5.m_hitEffect; if (hitEffect != null) { findEffectsAndChange(hitEffect.m_effectPrefabs); } EffectList destroyedEffect = minerock5.m_destroyedEffect; if (destroyedEffect != null) { findEffectsAndChange(destroyedEffect.m_effectPrefabs); } } private void fixMineRock(MineRock minerock5) { EffectList hitEffect = minerock5.m_hitEffect; if (hitEffect != null) { findEffectsAndChange(hitEffect.m_effectPrefabs); } EffectList destroyedEffect = minerock5.m_destroyedEffect; if (destroyedEffect != null) { findEffectsAndChange(destroyedEffect.m_effectPrefabs); } } public void ReplaceOnMonster(GameObject gameObject) { if ((Object)(object)gameObject == (Object)null) { Debug.LogWarning((object)(projectName + ":: GameObject not found")); return; } Humanoid component = gameObject.GetComponent(); if ((Object)(object)component == (Object)null) { Debug.LogWarning((object)(projectName + ":: GameObject not found")); return; } EffectList dropEffects = component.m_dropEffects; if (dropEffects != null) { findEffectsAndChange(dropEffects.m_effectPrefabs); } EffectList backstabHitEffects = ((Character)component).m_backstabHitEffects; if (backstabHitEffects != null) { findEffectsAndChange(backstabHitEffects.m_effectPrefabs); } EffectList consumeItemEffects = component.m_consumeItemEffects; if (consumeItemEffects != null) { findEffectsAndChange(consumeItemEffects.m_effectPrefabs); } EffectList critHitEffects = ((Character)component).m_critHitEffects; if (critHitEffects != null) { findEffectsAndChange(critHitEffects.m_effectPrefabs); } EffectList deathEffects = ((Character)component).m_deathEffects; if (deathEffects != null) { findEffectsAndChange(deathEffects.m_effectPrefabs); } EffectList hitEffects = ((Character)component).m_hitEffects; if (hitEffects != null) { findEffectsAndChange(hitEffects.m_effectPrefabs); } EffectList jumpEffects = ((Character)component).m_jumpEffects; if (jumpEffects != null) { findEffectsAndChange(jumpEffects.m_effectPrefabs); } EffectList perfectBlockEffect = component.m_perfectBlockEffect; if (perfectBlockEffect != null) { findEffectsAndChange(perfectBlockEffect.m_effectPrefabs); } EffectList pickupEffects = component.m_pickupEffects; if (pickupEffects != null) { findEffectsAndChange(pickupEffects.m_effectPrefabs); } EffectList slideEffects = ((Character)component).m_slideEffects; if (slideEffects != null) { findEffectsAndChange(slideEffects.m_effectPrefabs); } EffectList tarEffects = ((Character)component).m_tarEffects; if (tarEffects != null) { findEffectsAndChange(tarEffects.m_effectPrefabs); } EffectList waterEffects = ((Character)component).m_waterEffects; if (waterEffects != null) { findEffectsAndChange(waterEffects.m_effectPrefabs); } FootStep component2 = gameObject.GetComponent(); if (!((Object)(object)component2 != (Object)null)) { return; } List effects = component2.m_effects; foreach (StepEffect item in effects) { GameObject[] effectPrefabs = item.m_effectPrefabs; List list = new List(); list.AddRange(effectPrefabs); for (int i = 0; i < list.Count; i++) { if ((Object)(object)list[i] != (Object)null) { string name = ((Object)list[i]).name; GameObject val = allPrefabs.Find((GameObject x) => ((Object)x).name == name); if (!((Object)(object)val == (Object)null)) { list[i] = val; } } } } } public void ReplaceOnItem(GameObject gameObject) { if ((Object)(object)gameObject == (Object)null) { return; } ItemDrop component = gameObject.GetComponent(); if (!((Object)(object)component == (Object)null)) { EffectList hitEffect = component.m_itemData.m_shared.m_hitEffect; if (hitEffect != null) { findEffectsAndChange(hitEffect.m_effectPrefabs); } EffectList hitTerrainEffect = component.m_itemData.m_shared.m_hitTerrainEffect; if (hitTerrainEffect != null) { findEffectsAndChange(hitTerrainEffect.m_effectPrefabs); } EffectList holdStartEffect = component.m_itemData.m_shared.m_holdStartEffect; if (holdStartEffect != null) { findEffectsAndChange(holdStartEffect.m_effectPrefabs); } EffectList trailStartEffect = component.m_itemData.m_shared.m_trailStartEffect; if (trailStartEffect != null) { findEffectsAndChange(trailStartEffect.m_effectPrefabs); } EffectList blockEffect = component.m_itemData.m_shared.m_blockEffect; if (blockEffect != null) { findEffectsAndChange(blockEffect.m_effectPrefabs); } } } public void ReplaceFxOnPiece(GameObject gameObject) { if ((Object)(object)gameObject == (Object)null) { return; } Piece component = gameObject.GetComponent(); if ((Object)(object)component != (Object)null) { EffectList placeEffect = component.m_placeEffect; if (placeEffect != null) { findEffectsAndChange(placeEffect.m_effectPrefabs); } } WearNTear component2 = gameObject.GetComponent(); if ((Object)(object)component2 != (Object)null) { EffectList hitEffect = component2.m_hitEffect; if (hitEffect != null) { findEffectsAndChange(hitEffect.m_effectPrefabs); } } } private void findEffectsAndChange(EffectData[] effects) { if (effects == null || effects.Length == 0) { return; } foreach (EffectData val in effects) { if ((Object)(object)val.m_prefab != (Object)null) { string name = ((Object)val.m_prefab).name; GameObject val2 = allPrefabs.Find((GameObject x) => ((Object)x).name == name); if (!((Object)(object)val2 == (Object)null)) { val.m_prefab = val2; } } } } } public class JsonLoader { public string defaultPath = string.Empty; public void loadJson() { LoadTranslations(); justDefaultPath(); } public void justDefaultPath() { string configPath = Paths.ConfigPath; string text = Path.Combine(configPath, "BalrondMonsterMayhem-translation/"); defaultPath = text; } public void createDefaultPath() { string configPath = Paths.ConfigPath; string text = Path.Combine(configPath, "BalrondMonsterMayhem-translation/"); if (!Directory.Exists(text)) { CreateFolder(text); } else { Debug.Log((object)("BalrondMonsterMayhem: Folder already exists: " + text)); } defaultPath = text; } private string[] jsonFilePath(string folderName, string extension) { string configPath = Paths.ConfigPath; string text = Path.Combine(configPath, "BalrondMonsterMayhem-translation/"); if (!Directory.Exists(text)) { CreateFolder(text); } else { Debug.Log((object)("BalrondMonsterMayhem: Folder already exists: " + text)); } string[] files = Directory.GetFiles(text, extension); Debug.Log((object)("BalrondMonsterMayhem:" + folderName + " Json Files Found: " + files.Length)); return files; } private static void CreateFolder(string path) { try { Directory.CreateDirectory(path); Debug.Log((object)"BalrondMonsterMayhem: Folder created successfully."); } catch (Exception ex) { Debug.Log((object)("BalrondMonsterMayhem: Error creating folder: " + ex.Message)); } } private void LoadTranslations() { int num = 0; string[] array = jsonFilePath("Translation", "*.json"); foreach (string text in array) { string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(text); string json = File.ReadAllText(text); JsonData jsonData = JsonMapper.ToObject(json); Dictionary dictionary = new Dictionary(); foreach (string key in jsonData.Keys) { dictionary[key] = jsonData[key].ToString(); } if (dictionary != null) { BalrondTranslator.translations.Add(fileNameWithoutExtension, dictionary); Debug.Log((object)("BalrondMonsterMayhem: Json Files Language: " + fileNameWithoutExtension)); num++; } else { Debug.LogError((object)("BalrondMonsterMayhem: Loading FAILED file: " + text)); } } Debug.Log((object)("BalrondMonsterMayhem: Translation JsonFiles Loaded: " + num)); } } public class ModResourceLoader { public AssetBundle assetBundle; public List buildPrefabs = new List(); public List plantPrefabs = new List(); public List itemPrefabs = new List(); public List monsterPrefabs = new List(); public List vegetationPrefabs = new List(); public List clutterPrefabs = new List(); public List locationPrefabs = new List(); public List roomPrefabs = new List(); public List vfxPrefabs = new List(); public FxReplacment fxReplacment = null; public List recipes = new List(); public List statusEffects = new List(); public StatusEffect newBarleyStatus = null; public ShaderReplacment shaderReplacment = new ShaderReplacment(); public Sprite newLogo = null; public Sprite spiritBurnIcon = null; public static Sprite betrayermark_ico; public GameObject lvl4; public GameObject lvl5; public GameObject lvl6; public GameObject lvl7; public GameObject lvl2boss; public GameObject lvl3boss; public GameObject lvl4boss; public GameObject lvl5boss; public GameObject lvl6boss; public GameObject lvl7boss; public string mainPath = "Assets/Custom/BalrondMonsters/"; public void loadAssets() { assetBundle = GetAssetBundleFromResources("balrondmonsters"); betrayermark_ico = assetBundle.LoadAsset(mainPath + "UI/betrayermark_ico.png"); LoadNewStars(); loadItems(mainPath); loadMonsters(mainPath); loadOther(mainPath); } public void AddPrefabsToZnetScene(ZNetScene zNetScene) { zNetScene.m_prefabs.AddRange(itemPrefabs); zNetScene.m_prefabs.AddRange(vfxPrefabs); zNetScene.m_prefabs.AddRange(monsterPrefabs); zNetScene.m_prefabs.RemoveAll((GameObject x) => (Object)(object)x == (Object)null); } public void LoadNewStars() { if ((Object)(object)lvl4 != (Object)null) { Debug.LogWarning((object)"Stars already loaded"); return; } lvl4 = LoadStar("level_4.prefab"); lvl5 = LoadStar("level_5.prefab"); lvl6 = LoadStar("level_6.prefab"); lvl7 = LoadStar("level_7.prefab"); if ((Object)(object)lvl4 == (Object)null) { Debug.LogError((object)"lvl4 failed to load!"); } } public void LoadNewBossStars() { if ((Object)(object)lvl2boss != (Object)null) { Debug.LogWarning((object)"Boss Stars already loaded"); return; } lvl2boss = LoadStar("level_2_boss.prefab"); lvl3boss = LoadStar("level_3_boss.prefab"); lvl4boss = LoadStar("level_4_boss.prefab"); lvl5boss = LoadStar("level_5_boss.prefab"); lvl6boss = LoadStar("level_6_boss.prefab"); lvl7boss = LoadStar("level_7_boss.prefab"); if ((Object)(object)lvl2boss == (Object)null) { Debug.LogError((object)"lvl2boss failed to load!"); } } private GameObject LoadStar(string prefabPath) { string text = mainPath + "UI/" + prefabPath; GameObject val = assetBundle.LoadAsset(text); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Prefab not found at path: " + text)); return null; } GameObject val2 = Launch.cloneMe(val, ((Object)val).name); if ((Object)(object)val2 != (Object)null) { val2.SetActive(false); } return val2; } public void FixAllFx(FxReplacment fxReplacment) { this.fxReplacment = fxReplacment; fixBuildPiecesFX(); fixVegetationFX(); fixItemFX(); fixMonsterFX(); fixOtherFX(); } private void fixVegetationFX() { foreach (GameObject vegetationPrefab in vegetationPrefabs) { fxReplacment.ReplaceOnVegetation(vegetationPrefab); } } private void fixBuildPiecesFX() { foreach (GameObject buildPrefab in buildPrefabs) { fxReplacment.ReplaceFxOnPiece(buildPrefab); } } private void fixItemFX() { foreach (GameObject itemPrefab in itemPrefabs) { fxReplacment.ReplaceOnItem(itemPrefab); } } private void fixMonsterFX() { foreach (GameObject monsterPrefab in monsterPrefabs) { fxReplacment.ReplaceOnMonster(monsterPrefab); } } private void fixOtherFX() { foreach (GameObject vfxPrefab in vfxPrefabs) { fxReplacment.ReplaceOnObject(vfxPrefab); } } private AssetBundle GetAssetBundleFromResources(string filename) { Assembly executingAssembly = Assembly.GetExecutingAssembly(); string name = executingAssembly.GetManifestResourceNames().Single((string str) => str.EndsWith(filename)); using Stream stream = executingAssembly.GetManifestResourceStream(name); return AssetBundle.LoadFromStream(stream); } private void loadItems(string basePath) { string text = basePath + "Items/"; string[] items = ItemList.items; string[] array = items; foreach (string text2 in array) { GameObject val = assetBundle.LoadAsset(text + text2 + ".prefab"); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Could not find item with name: " + text2)); continue; } ShaderReplacment.Replace(val); itemPrefabs.Add(val); } text = basePath + "MonsterAttacks/"; string[] attacks = AttackList.attacks; string[] array2 = attacks; foreach (string text3 in array2) { GameObject val2 = assetBundle.LoadAsset(text + text3 + ".prefab"); if ((Object)(object)val2 == (Object)null) { Debug.LogWarning((object)("Could not find attackFile with name: " + text3)); continue; } ShaderReplacment.Replace(val2); itemPrefabs.Add(val2); } } private void loadMonsters(string basePath) { string text = basePath + "Monster/"; string[] monsters = MonsterList.monsters; string[] array = monsters; foreach (string text2 in array) { GameObject val = assetBundle.LoadAsset(text + text2 + ".prefab"); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Could not find monster with name: " + text2)); continue; } ShaderReplacment.Replace(val); monsterPrefabs.Add(val); } } private void loadOther(string basePath) { string text = basePath + "Other/"; string[] other = OtherObjectList.other; string[] array = other; foreach (string text2 in array) { GameObject val = assetBundle.LoadAsset(text + text2 + ".prefab"); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Could not find object with name: " + text2)); continue; } ShaderReplacment.Replace(val); vfxPrefabs.Add(val); } } } public sealed class MonsterFeeding { private const float ConsumeRange = 10f; private const float ConsumeSearchInterval = 5f; private const float ConsumeSearchRange = 25f; private static readonly string[] BloodyItems = new string[9] { "Bloodbag", "SmallBloodSack_bal", "GiantBloodSack", "Bloodshard_bal", "BloodyBearJerky_bal", "BloodfruitSoup_bal", "BloodyVial_bal", "BloodyCreamPie_bal", "Bloodfruit_bal" }; private static readonly string[] GraydwarfItems = new string[14] { "Wood", "Flint", "Resin", "Root", "Moss_bal", "YewBark_bal", "WillowBark_bal", "AncientBark", "Straw_bal", "EnrichedSoil_bal", "Stone", "RoundLog", "FineWood", "HardWood_bal" }; private static readonly string[] Gold = new string[2] { "Coins", "Peningar_bal" }; private static readonly string[] GolemItems = new string[14] { "Stone", "Flint", "LimeStone_bal", "Gabro_bal", "CopperOre", "IronOre", "NickelOre_bal", "CobaltOre_bal", "TinOre", "SilverOre", "Crystal", "GemChunks_bal", "FlametalOre", "FlametalOreNew" }; private static readonly string[] PlantItems = new string[25] { "Carrot", "Mint_bal", "Sage_bal", "Seaberries_bal", "Garlic_bal", "GrayMushroom_bal", "Cloudberry", "Turnip", "Cabbage_bal", "Darkbul_bal", "Lavender_bal", "Blackberries_bal", "RedKelp_bal", "Thistle", "Dandelion", "Apple_bal", "MushroomBlueNew_bal", "MushroomBlue", "Mushroom", "MushroomYellow", "Honey", "Raspberry", "Blueberries", "StrawBundle_bal", "RottenVegetable_bal" }; private static readonly string[] SeedItems = new string[19] { "BirdFeed_bal", "BeechSeeds", "BirchSeeds", "AppleSeeds_bal", "OnionSeeds", "TurnipSeeds", "CarrotSeeds", "GarlicSeeds_bal", "BasicSeed_bal", "AcaiSeeds_bal", "CabbageSeeds_bal", "CypressSeeds_bal", "MapleSeeds_bal", "PoplarSeeds_bal", "Acorn", "StrawSeeds_bal", "RedwoodSeeds_bal", "WaterLilySeeds_bal", "WillowSeeds_bal" }; private static readonly string[] MeatItems = new string[28] { "MeatScrap_bal", "BearMeat_bal", "RawSteak_bal", "HareMeat", "ChickenMeat", "LoxMeat", "RawMeat", "DeerMeat", "RottenMeat", "HabrokLiver_bal", "WolfMeat", "Entrails", "FishRaw", "CookedCrowMeat_bal", "ClamMeat_bal", "DrakeMeatCooked_bal", "DrakeMeat_bal", "FenringMeatCooked_bal", "FenringMeat_bal", "GoatMeatCooked_bal", "GoatMeat_bal", "MincedMeat_bal", "RawCrowMeat_bal", "SharkMeatCooked_bal", "SharkMeat_bal", "TrollMeatCooked_bal", "TrollMeat_bal", "CookedMeatScrap_bal" }; private static readonly string[] SerpentMeat = new string[1] { "SerpentMeat" }; private static readonly string[] CrabExtras = new string[3] { "ClamMeat_bal", "FishRaw", "FishingBait" }; private static readonly HashSet Seekers = new HashSet(StringComparer.Ordinal) { "Seeker", "SeekerBrute", "SeekerBrood", "Moth_bal" }; private static readonly HashSet Birds = new HashSet(StringComparer.Ordinal) { "GiantCrow_bal", "Penguin_bal", "Chicken", "Hen", "CrowNestling_bal" }; private static readonly HashSet DeerLike = new HashSet(StringComparer.Ordinal) { "Deer", "Stag_bal", "Goat_bal", "GoatKid_bal", "Hare", "Bunny_bal", "Doe_bal" }; private static readonly HashSet CrabLike = new HashSet(StringComparer.Ordinal) { "CrabSea_bal", "Neck", "NeckBrute_bal", "CrabLeaf_bal", "CrabStone_bal", "NeckTadpole_bal", "Ell_bal" }; private static readonly HashSet BloodDrinkers = new HashSet(StringComparer.Ordinal) { "Blob", "BlobElite", "DarkBat_bal", "Bat", "Bloodling_bal", "Deathsquito", "Deathsquito_bal", "Leech", "LeechPrimal_bal", "Tick", "LeechLarva_bal" }; private static readonly HashSet HabrokSerpentFenring = new HashSet(StringComparer.Ordinal) { "Habrok_bal", "HabrokBirb_bal", "Serpentling_bal", "Serpent", "Shark_bal", "Fenring", "FenringCultist", "FrostDrake_bal" }; private static readonly HashSet OmnivoreBoarLox = new HashSet(StringComparer.Ordinal) { "Boar", "Lox", "Hog_bal", "BattleHog_bal", "Piggy" }; private static readonly HashSet Bears = new HashSet(StringComparer.Ordinal) { "PolarBear_bal", "Bjorn", "BjornCub_bal", "Frostbjorn_bal", "FrostbjornBrown_bal" }; private static readonly HashSet Carnivores = new HashSet(StringComparer.Ordinal) { "TrollOutcast_bal", "TrollBrute_bal", "Fox_bal", "Wolf", "Ulv", "Troll", "Troll_ru", "Yotun_bal", "VoltureNestling_bal", "Wyvern_bal" }; public void SetMonsters(List prefabList) { if (prefabList == null || prefabList.Count == 0) { return; } Dictionary itemLookup = BuildItemLookup(prefabList); foreach (GameObject prefab in prefabList) { if (Object.op_Implicit((Object)(object)prefab)) { ApplyDietToPrefab(prefab, itemLookup); } } } public static Dictionary BuildItemLookup(List prefabs) { Dictionary dictionary = new Dictionary(StringComparer.Ordinal); if (prefabs == null) { return dictionary; } for (int i = 0; i < prefabs.Count; i++) { GameObject val = prefabs[i]; if (Object.op_Implicit((Object)(object)val)) { ItemDrop component = val.GetComponent(); if (Object.op_Implicit((Object)(object)component)) { dictionary[((Object)val).name] = component; } } } return dictionary; } public static bool TryBuildDietList(string name, Dictionary items, out List diet) { diet = null; if (string.IsNullOrEmpty(name) || items == null) { return false; } diet = BuildDietList(name, items); return diet != null && diet.Count > 0; } public static bool ApplyDietToPrefab(GameObject prefab, Dictionary itemLookup) { if (!Object.op_Implicit((Object)(object)prefab) || itemLookup == null) { return false; } if (!TryBuildDietList(((Object)prefab).name, itemLookup, out var diet)) { return false; } MonsterAI component = prefab.GetComponent(); if ((Object)(object)component != (Object)null) { ApplyDefaultConsumeConfig(component); component.m_consumeItems = diet; } AnimalAITamable component2 = prefab.GetComponent(); if ((Object)(object)component2 != (Object)null) { ApplyDefaultConsumeConfig(component2); component2.m_consumeItems = new List(diet); } return (Object)(object)component != (Object)null || (Object)(object)component2 != (Object)null; } private static void ApplyDefaultConsumeConfig(MonsterAI ai) { ai.m_consumeRange = 10f; ai.m_consumeSearchInterval = 5f; ai.m_consumeSearchRange = 25f; } private static void ApplyDefaultConsumeConfig(AnimalAITamable tame) { tame.m_consumeRange = 10f; tame.m_consumeSearchInterval = 5f; tame.m_consumeSearchRange = 25f; } private static void ConfigureDiet(string name, MonsterAI ai, Dictionary items) { List list = BuildDietList(name, items); if (list != null) { ai.m_consumeItems = list; } } private static void ConfigureDiet(string name, AnimalAITamable tame, Dictionary items) { List list = BuildDietList(name, items); if (list != null) { tame.m_consumeItems = list; } } private static List BuildDietList(string name, Dictionary items) { if ((name.IndexOf("Draugr", StringComparison.OrdinalIgnoreCase) >= 0 || name == "CorpseCollector_bal") && name != "EnemyShip") { List list = new List(16); AddItems(list, items, MeatItems); return list; } if (IsGraydwarfish(name)) { if (name == "Greyling") { List list2 = new List(32); AddItems(list2, items, Gold); return list2; } List list3 = new List(32); AddItems(list3, items, GraydwarfItems); AddItems(list3, items, SeedItems); return list3; } if (name.IndexOf("golem", StringComparison.OrdinalIgnoreCase) >= 0 || name == "IcePanther") { List list4 = new List(16); AddItems(list4, items, GolemItems); return list4; } if (Seekers.Contains(name)) { List list5 = new List(32); AddItems(list5, items, PlantItems); AddItems(list5, items, SeedItems); AddItems(list5, items, MeatItems); return list5; } if (Birds.Contains(name)) { List list6 = new List(24); AddItems(list6, items, PlantItems); AddItems(list6, items, SeedItems); return list6; } if (DeerLike.Contains(name)) { List list7 = new List(16); AddItems(list7, items, PlantItems); return list7; } if (CrabLike.Contains(name)) { List list8 = new List(20); AddItems(list8, items, PlantItems); AddItems(list8, items, CrabExtras); return list8; } if (BloodDrinkers.Contains(name)) { List list9 = new List(16); AddItems(list9, items, BloodyItems); return list9; } if (HabrokSerpentFenring.Contains(name)) { List list10 = new List(32); AddItems(list10, items, MeatItems); AddItems(list10, items, BloodyItems); AddItems(list10, items, SerpentMeat); return list10; } if (OmnivoreBoarLox.Contains(name)) { List list11 = new List(32); AddItems(list11, items, PlantItems); AddItems(list11, items, MeatItems); return list11; } if (Bears.Contains(name)) { List list12 = new List(32); AddItems(list12, items, PlantItems); AddItems(list12, items, MeatItems); AddItems(list12, items, SerpentMeat); return list12; } if (Carnivores.Contains(name)) { List list13 = new List(24); AddItems(list13, items, MeatItems); AddItems(list13, items, SerpentMeat); return list13; } return null; } private static void AddItems(List target, Dictionary items, string[] names) { for (int i = 0; i < names.Length; i++) { if (items.TryGetValue(names[i], out var value) && (Object)(object)value != (Object)null) { target.Add(value); } } } private static bool IsGraydwarfish(string name) { return name.IndexOf("Greyling", StringComparison.OrdinalIgnoreCase) >= 0 || name.IndexOf("Greyd", StringComparison.OrdinalIgnoreCase) >= 0 || name == "Abomination"; } } public class MonsterManager { private readonly LevelEffectGenerator levelEffectGenerator = new LevelEffectGenerator(); private readonly Dictionary lootAliases = new Dictionary(); private GameObject levelEffects; private GameObject stealEffect; private List list; private List monsterList; private static readonly string[] thiefNames = new string[14] { "Greyling", "Greydwarf", "Greydwarf_Elite", "Draugr", "Draugr_Elite", "Draugr_Ranged", "Skeleton", "Skeleton_NoArcher", "Skeleton_Poison", "Forsaken", "GoblinBrute", "GoblinArcher", "Goblin", "GoblinShaman" }; private static readonly string[] specialVisualNames = new string[12] { "Lox", "Wraith", "TentaRoot", "TheHive", "Hatchling", "GoblinKing", "Eikthyr", "Bonemass", "Varsvin", "Varsvin_Brute", "Varsvin_Hunter", "SeekerQueen" }; private static readonly string[] excludeVisualNames = new string[3] { "TheHive", "Haugbui", "Greydwarf_Mystic" }; private readonly Dictionary itemCache = new Dictionary(); private GameObject woodPrefab; public void RegisterLootAliases(Dictionary aliases) { lootAliases.Clear(); if (aliases == null) { return; } foreach (KeyValuePair alias in aliases) { if (!string.IsNullOrEmpty(alias.Key) && !string.IsNullOrEmpty(alias.Value)) { lootAliases[alias.Key] = alias.Value; } } } public string ResolveLootSourceName(string monsterName) { if (string.IsNullOrEmpty(monsterName)) { return monsterName; } string value; return lootAliases.TryGetValue(monsterName, out value) ? value : monsterName; } public void SetVfx(GameObject levelEffects, GameObject stealEffect) { this.levelEffects = levelEffects; this.stealEffect = stealEffect; } public void SetupMonsterList(List list) { if (list == null) { Debug.LogWarning((object)"Prefab list not found!"); return; } monsterList = list.FindAll((GameObject x) => Object.op_Implicit((Object)(object)x.GetComponent()) || Object.op_Implicit((Object)(object)x.GetComponent()) || Object.op_Implicit((Object)(object)x.GetComponent())); this.list = list; } public void EditMonsters() { if (list == null) { Debug.LogWarning((object)"No list found!"); return; } foreach (GameObject monster in monsterList) { SetupLevelVisual(monster); Humanoid component = monster.GetComponent(); if ((Object)(object)component != (Object)null) { EditMonsterResistances(monster, ResolveLootSourceName(((Object)monster).name)); } } ChangeMonsterDrops(); } private void TransferAnimalAIToMonsterAI(GameObject monster) { GameObject sourcePrefab = list.Find((GameObject x) => ((Object)x).name == "Boar"); AnimalAITamable animalAITamable = monster.AddComponent(); animalAITamable.CopyValuesFrom(sourcePrefab); animalAITamable.m_disableFleeWhenTamed = true; animalAITamable.m_clearTargetWhenTamed = true; animalAITamable.m_clearAlertedWhenTamed = true; animalAITamable.m_allowRename = true; animalAITamable.m_maxNameLength = 32; animalAITamable.SetProcreationEnabled(enabled: true); if (((Object)monster).name == "Deer") { animalAITamable.m_offspring = list.Find((GameObject x) => ((Object)x).name == "Doe_bal"); animalAITamable.m_tamingTime = 3000f; } if (((Object)monster).name == "Hare") { animalAITamable.m_offspring = list.Find((GameObject x) => ((Object)x).name == "Bunny_bal"); animalAITamable.m_tamingTime = 3000f; } animalAITamable.CacheComponents(); } private void EditMonsterResistances(GameObject monster, string monsterName) { if (!((Object)(object)monster == (Object)null) && !string.IsNullOrEmpty(monsterName) && MonsterResistanceManager.TryApply(monster, monsterName)) { } } private void SetupLevelVisual(GameObject monster) { if (excludeVisualNames.Contains(((Object)monster).name)) { return; } Transform val = monster.transform.Find("Visual"); if ((Object)(object)val == (Object)null) { return; } LevelEffects val2 = monster.GetComponentInChildren(); bool flag = (Object)(object)val2 == (Object)null; if (specialVisualNames.Contains(((Object)monster).name)) { SkinnedMeshRenderer val3 = FindSpecificVisualRenderer(((Object)monster).name, monster); if ((Object)(object)val3 != (Object)null) { val2 = levelEffectGenerator.CreateLevelEffectAt(val, val3); flag = false; } } if (flag) { val2 = levelEffectGenerator.CreateLevelEffectComponent(val); } if ((Object)(object)val2 != (Object)null) { levelEffectGenerator.CreateVisuals(val2); } } private SkinnedMeshRenderer FindSpecificVisualRenderer(string name, GameObject obj) { string text = null; switch (name) { case "Lox": text = "Visual/offset/Body"; break; case "Wraith": text = "Visual/wraith/wraith"; break; default: if (!(name == "tentacle_plant_bal")) { switch (name) { case "Hatchling": text = "Visual/Hatchling_mountain/Hatchling"; break; case "GoblinKing": text = "Visual/Yagluth"; break; case "Eikthyr": text = "Visual/Deer"; break; case "Bonemass": text = "Visual/model/bonemass"; break; default: if (!(name == "Varsvin_Hunter")) { if (name == "Frog" || name == "Haugbui" || name == "Greydwarf_Mystic") { text = "Visual/Frog2_mesh"; } else if (name == "SeekerQueen") { text = "Visual/Cube"; } break; } goto case "Varsvin"; case "Varsvin": case "Varsvin_Brute": text = "Visual/Body"; break; } break; } goto case "TentaRoot"; case "TentaRoot": case "MossRoot_bal": text = "Visual/Tentaroots/Cube.001"; break; } if (string.IsNullOrEmpty(text)) { return null; } Transform val = obj.transform.Find(text); return ((Object)(object)val != (Object)null) ? ((Component)val).GetComponent() : null; } private void ChangeMonsterDrops() { string[] array = new string[77] { "Bjorn", "Goleming_bal", "CrabForest_bal", "Ashdrake_bal", "AshlandsGolem_bal", "Forsaken_bal", "Spectre_bal", "BlobLava_bal", "Haugbui_bal", "Kelpie_bal", "DragonLord_bal", "Herald_bal", "Frostbjorn_bal", "FrostbjornBrown_bal", "Yotun_bal", "Varsvin_bal", "Varsvin_Brute_bal", "Varsvin_Hunter_bal", "Disir_bal", "AshboneGiant_bal", "YotunWarrior_bal", "MossGolem_bal", "Jormund_bal", "Boar_piggy", "LeechLarva_bal", "Doe_bal", "NeckTadpole_bal", "PolarBear_bal", "Fenring_Brute_bal", "Fox_bal", "Penguin_bal", "CorpseCollector_bal", "Ell_bal", "LostSoul_bal", "Bloodling_bal", "CrabSea_bal", "CrabStone_bal", "DarkBat_bal", "VoltureNestling_bal", "GiantCrow_bal", "GoatKid_bal", "Goat_bal", "goblin_skeleton_bal", "Greydwarf_Crusher_bal", "Greydwarf_Frozen_bal", "Greydwarf_Moss_bal", "Greydwarf_Scorched_bal", "GreylingBeeKeeper_bal", "GreylingElite_bal", "Hog_bal", "LeechPrimal_bal", "MossRoot_bal", "Moth_bal", "NeckBrute_bal", "Serpentling_bal", "Shark_bal", "StagGhost_bal", "Stag_bal", "Stormdrake_bal", "TrollUndead_bal", "HabrokBirb_bal", "Habrok_bal", "Troll_ru", "Troll", "TrollOutcast_bal", "TrollBrute_bal", "FrostDrake_bal", "MossRootStatic_bal", "WildWisp_bal", "GoblinCheftain_bal", "Bunny_bal", "BjornCub_bal", "CrowNestling_bal", "Deathsquito_bal", "GhostYagluth_bal", "Fox_cub_bal", "Wyvern_bal" }; string[] array2 = array; foreach (string name in array2) { GameObject val = list.Find((GameObject x) => ((Object)x).name == name); if ((Object)(object)val != (Object)null) { monsterLootChange(val); } } foreach (string aliasName in lootAliases.Keys) { GameObject val2 = list.Find((GameObject x) => ((Object)x).name == aliasName); if ((Object)(object)val2 != (Object)null) { monsterLootChange(val2); } } } private void monsterLootChange(GameObject monster) { CharacterDrop val = monster.GetComponent(); if ((Object)(object)val == (Object)null) { Debug.Log((object)(Launch.projectName + " No Drop Component on:" + ((Object)monster).name)); val = monster.AddComponent(); } switch (ResolveLootSourceName(((Object)monster).name)) { case "Bjorn": editMonsterHealth(monster, 500); editBjornResists(monster); addItemToLootTable(val, "LeatherScraps", 3, 5, 0.6f); addItemToLootTable(val, "BoneFragments", 2, 4, 0.5f); addItemToLootTable(val, "RottenMeat", 1, 2, 0.6f); addItemToLootTable(val, "MeatScrap_bal", 3, 5, 0.6f); break; case "Fox_bal": addItemToLootTable(val, "SmallBloodSack_bal", 1, 1, 0.1f); addItemToLootTable(val, "LeatherScraps", 2, 3, 0.99f); addItemToLootTable(val, "BoneFragments", 1, 2, 0.95f); addItemToLootTable(val, "FoxFur_bal", 1, 1, 0.8f); addItemToLootTable(val, "WolfMeat", 1, 1, 0.5f); addItemToLootTable(val, "RottenMeat", 1, 1, 0.8f); addItemToLootTable(val, "MeatScrap_bal", 1, 2, 0.9f); addItemToLootTable(val, "AppleSeeds_bal", 1, 1, 0.5f); addItemToLootTable(val, "BasicSeed_bal", 1, 1, 0.77f); addItemToLootTable(val, "TrophyFox_bal", 1, 1, 0.1f, multiplier: false); break; case "LostSoul_bal": addItemToLootTable(val, "Ectoplasm", 1, 1, 0.75f); addItemToLootTable(val, "Coal", 1, 1, 0.5f); addItemToLootTable(val, "BoneFragments", 1, 1, 0.8f); addItemToLootTable(val, "Peningar_bal", 2, 4, 1f); addItemToLootTable(val, "CorruptedEitr_bal", 1, 1, 0.05f); addItemToLootTable(val, "TrophySouling_bal", 1, 1, 0.1f, multiplier: false); break; case "FrostDrake_bal": addItemToLootTable(val, "TrophyElderDrake_bal", 1, 1, 0.3f, multiplier: false); addItemToLootTable(val, "FreezeGland", 1, 2, 0.8f); addItemToLootTable(val, "CorruptedEitr_bal", 1, 1, 0.05f); addItemToLootTable(val, "DrakeSkin_bal", 1, 2, 0.15f); addItemToLootTable(val, "LeatherScraps", 2, 3, 0.5f); addItemToLootTable(val, "BoneFragments", 2, 3, 0.1f); addItemToLootTable(val, "DrakeMeat_bal", 1, 2, 0.55f); addItemToLootTable(val, "RottenMeat", 1, 1, 0.8f); addItemToLootTable(val, "MeatScrap_bal", 1, 2, 0.9f); addItemToLootTable(val, "Crystal", 1, 1, 0.9f); break; case "Wyvern_bal": break; case "WildWisp_bal": addItemToLootTable(val, "Eitr", 1, 1, 0.25f); addItemToLootTable(val, "Crystal", 1, 1, 0.25f); addItemToLootTable(val, "Ectoplasm", 1, 1, 0.25f); break; case "Shark_bal": addItemToLootTable(val, "TrophyShark_bal", 1, 1, 0.3f, multiplier: false); addItemToLootTable(val, "SeaPearl_bal", 1, 1, 0.15f); addItemToLootTable(val, "FreshSeaweed", 1, 2, 0.25f); addItemToLootTable(val, "LeatherScraps", 2, 3, 0.45f); addItemToLootTable(val, "BoneFragments", 2, 3, 0.5f); addItemToLootTable(val, "RottenMeat", 1, 1, 0.7f); addItemToLootTable(val, "Entrails", 1, 1, 0.7f); addItemToLootTable(val, "Bloodbag", 1, 1, 0.8f); addItemToLootTable(val, "FishRaw", 1, 2, 0.9f); addItemToLootTable(val, "SharkMeat_bal", 2, 3, 1f); break; case "LeechPrimal_bal": addItemToLootTable(val, "SmallBloodSack_bal", 1, 1, 0.5f); addItemToLootTable(val, "LeechEgg_bal", 1, 1, 0.1f); addItemToLootTable(val, "Bloodbag", 1, 1, 0.75f); addItemToLootTable(val, "MeatScrap_bal", 1, 2, 0.9f); addItemToLootTable(val, "LeatherScraps", 1, 2, 1f); addItemToLootTable(val, "TrophyLeech", 1, 1, 0.1f, multiplier: false); addItemToLootTable(val, "SwampTreeSeeds_bal", 1, 1, 0.1f); addItemToLootTable(val, "RottenMeat", 1, 1, 0.4f); break; case "Troll_ru": case "Troll": editDrop(val, "TrollHide", 3, 4, 1f); editDrop(val, "Coins", 10, 20, 0.5f); editMonsterHealth(monster, 900); editTrollResists(monster); break; case "TrollOutcast_bal": addItemToLootTable(val, "Coins", 10, 20, 0.5f); addItemToLootTable(val, "TrollHide", 2, 4, 1f); addItemToLootTable(val, "TrollMeat_bal", 1, 1, 0.75f); addItemToLootTable(val, "LeatherScraps", 1, 3, 0.5f); addItemToLootTable(val, "Clay_bal", 1, 3, 0.3f); addItemToLootTable(val, "RottenMeat", 1, 1, 0.4f); addItemToLootTable(val, "RustyBrokenSword_bal", 1, 1, 0.02f, multiplier: false); addItemToLootTable(val, "Peningar_bal", 40, 50, 0.5f); addItemToLootTable(val, "RustedScrap_bal", 1, 2, 0.1f, multiplier: false); addItemToLootTable(val, "GemChunks_bal", 1, 1, 0.1f); addItemToLootTable(val, "TrophyForestTroll_bal", 1, 1, 0.3f, multiplier: false); break; case "TrollBrute_bal": addItemToLootTable(val, "Coins", 10, 20, 0.5f); addItemToLootTable(val, "TrollHide", 2, 4, 1f); addItemToLootTable(val, "TrollMeat_bal", 1, 1, 0.75f); addItemToLootTable(val, "LeatherScraps", 1, 3, 0.5f); addItemToLootTable(val, "Clay_bal", 1, 3, 0.3f); addItemToLootTable(val, "RottenMeat", 1, 1, 0.4f); addItemToLootTable(val, "RustyBrokenSword_bal", 1, 1, 0.02f, multiplier: false); addItemToLootTable(val, "Peningar_bal", 40, 50, 0.5f); addItemToLootTable(val, "RustedScrap_bal", 1, 2, 0.1f, multiplier: false); addItemToLootTable(val, "GemChunks_bal", 1, 1, 0.1f); addItemToLootTable(val, "TrophyBruteTroll_bal", 1, 1, 0.3f, multiplier: false); break; case "TrollUndead_bal": addItemToLootTable(val, "Coins", 15, 30, 0.5f); addItemToLootTable(val, "RottenMeat", 1, 1, 0.75f); addItemToLootTable(val, "Entrails", 1, 1, 0.75f); addItemToLootTable(val, "MeatScrap_bal", 1, 3, 0.75f); addItemToLootTable(val, "LeatherScraps", 1, 3, 0.5f); addItemToLootTable(val, "BoneFragments", 2, 4, 0.5f); addItemToLootTable(val, "Clay_bal", 1, 3, 0.3f); addItemToLootTable(val, "Amber", 1, 1, 0.1f, multiplier: false); addItemToLootTable(val, "VikingTalisman_bal", 1, 1, 0.1f, multiplier: false); addItemToLootTable(val, "RustyBrokenSword_bal", 1, 1, 0.02f, multiplier: false); addItemToLootTable(val, "Peningar_bal", 40, 50, 0.5f); addItemToLootTable(val, "CorruptedEitr_bal", 1, 1, 0.05f); addItemToLootTable(val, "CultInsignia_bal", 1, 1, 0.1f, multiplier: false); addItemToLootTable(val, "CursedBone_bal", 1, 1, 0.1f); addItemToLootTable(val, "CryptKey", 1, 1, 0.01f, multiplier: false); addItemToLootTable(val, "RustedScrap_bal", 1, 1, 0.25f); addItemToLootTable(val, "BronzeScrap", 1, 1, 0.05f, multiplier: false); addItemToLootTable(val, "CopperScrap", 1, 1, 0.1f, multiplier: false); addItemToLootTable(val, "IronScrap", 1, 1, 0.001f, multiplier: false); addItemToLootTable(val, "GemChunks_bal", 1, 1, 0.1f); addItemToLootTable(val, "SilverNecklace", 1, 1, 0.05f, multiplier: false); addItemToLootTable(val, "Ectoplasm", 1, 1, 0.75f); addItemToLootTable(val, "TrophyTrollSkeleton_bal", 1, 1, 0.1f, multiplier: false); break; case "TrollAshlands": addItemToLootTable(val, "Coins", 15, 30, 0.5f); addItemToLootTable(val, "CharredBone", 2, 4, 1f); addItemToLootTable(val, "VikingTalisman_bal", 1, 1, 0.1f, multiplier: false); addItemToLootTable(val, "RustyBrokenSword_bal", 1, 1, 0.02f, multiplier: false); addItemToLootTable(val, "Peningar_bal", 40, 50, 0.9f); addItemToLootTable(val, "CorruptedEitr_bal", 1, 2, 0.05f); addItemToLootTable(val, "CultInsignia_bal", 1, 1, 0.1f, multiplier: false); addItemToLootTable(val, "CursedBone_bal", 1, 1, 0.5f); addItemToLootTable(val, "RustedScrap_bal", 1, 3, 0.25f, multiplier: false); addItemToLootTable(val, "FlametalScrap_bal", 1, 1, 0.01f, multiplier: false); addItemToLootTable(val, "FerroboronScrap_bal", 1, 1, 0.02f, multiplier: false); addItemToLootTable(val, "DarksteelScrap_bal", 1, 1, 0.03f, multiplier: false); addItemToLootTable(val, "IronScrap", 1, 1, 0.001f, multiplier: false); addItemToLootTable(val, "GemChunks_bal", 1, 1, 0.1f); addItemToLootTable(val, "SilverNecklace", 1, 1, 0.05f, multiplier: false); addItemToLootTable(val, "TrophyTrollAshlands_bal", 1, 1, 0.1f, multiplier: false); break; case "Fenring_Brute_bal": addItemToLootTable(val, "FenringMeat_bal", 1, 1, 0.33f); addItemToLootTable(val, "RottenMeat", 1, 1, 0.75f); addItemToLootTable(val, "Coins", 15, 30, 0.5f); addItemToLootTable(val, "SilverScrap_bal", 1, 1, 0.3f, multiplier: false); addItemToLootTable(val, "LeatherScraps", 1, 2, 0.5f); addItemToLootTable(val, "IronScrap", 1, 1, 0.15f, multiplier: false); addItemToLootTable(val, "BronzeScrap", 1, 1, 0.25f, multiplier: false); addItemToLootTable(val, "CorruptedEitr_bal", 1, 2, 0.3f); addItemToLootTable(val, "RustedScrap_bal", 1, 1, 0.33f, multiplier: false); addItemToLootTable(val, "FenringInsygnia_bal", 1, 1, 0.05f, multiplier: false); addItemToLootTable(val, "WolfHairBundle", 1, 1, 0.2f); addItemToLootTable(val, "WolfClaw", 1, 1, 0.2f); addItemToLootTable(val, "SilverNecklace", 1, 1, 0.05f, multiplier: false); addItemToLootTable(val, "CultInsignia_bal", 1, 1, 0.1f, multiplier: false); addItemToLootTable(val, "VikingTalisman_bal", 1, 1, 0.1f, multiplier: false); addItemToLootTable(val, "RustyBrokenSword_bal", 1, 1, 0.02f, multiplier: false); break; case "Greydwarf_Frozen_bal": addItemToLootTable(val, "Blackwood", 1, 2, 1f); addItemToLootTable(val, "GreydwarfEye", 1, 2, 0.9f); addItemToLootTable(val, "FreezeGland", 1, 3, 0.1f); addItemToLootTable(val, "IceShard_bal", 1, 2, 0.8f); addItemToLootTable(val, "Crystal", 1, 1, 0.1f); addItemToLootTable(val, "Sapphire_bal", 0, 1, 0.01f, multiplier: false); break; case "Greydwarf_Scorched_bal": addItemToLootTable(val, "Blackwood", 1, 3, 1f); addItemToLootTable(val, "Grausten", 1, 2, 0.75f); addItemToLootTable(val, "GreydwarfEye", 1, 1, 0.65f); addItemToLootTable(val, "CharcoalResin", 1, 1, 0.55f); addItemToLootTable(val, "SurtlingCore", 1, 1, 0.01f); addItemToLootTable(val, "Ruby", 0, 1, 0.05f, multiplier: false); break; case "goblin_skeleton_bal": addItemToLootTable(val, "BoneFragments", 1, 2, 0.9f); addItemToLootTable(val, "LeatherScraps", 1, 3, 0.1f); addItemToLootTable(val, "CorruptedEitr_bal", 1, 1, 0.05f); addItemToLootTable(val, "RustyBrokenSword_bal", 1, 1, 0.05f, multiplier: false); addItemToLootTable(val, "CursedBone_bal", 1, 1, 0.1f); addItemToLootTable(val, "RustedScrap_bal", 1, 1, 0.25f, multiplier: false); addItemToLootTable(val, "BronzeScrap", 1, 1, 0.05f, multiplier: false); addItemToLootTable(val, "CopperScrap", 1, 1, 0.1f, multiplier: false); addItemToLootTable(val, "IronScrap", 1, 1, 0.001f, multiplier: false); addItemToLootTable(val, "GemChunks_bal", 1, 1, 0.1f); break; case "MossRoot_bal": addItemToLootTable(val, "Wood", 1, 2, 1f); addItemToLootTable(val, "RoundLog", 1, 1, 0.33f); addItemToLootTable(val, "FineWood", 1, 1, 0.15f); addItemToLootTable(val, "Resin", 1, 1, 0.44f); addItemToLootTable(val, "Stone", 1, 1, 0.25f); addItemToLootTable(val, "Flint", 1, 1, 0.16f); addItemToLootTable(val, "Root", 1, 1, 0.01f); addItemToLootTable(val, "Thistle", 1, 1, 0.1f); addItemToLootTable(val, "Dandelion", 1, 1, 0.2f); addItemToLootTable(val, "Moss_bal", 1, 1, 0.8f); break; case "Greydwarf_Crusher_bal": case "Greydwarf_Moss_bal": addItemToLootTable(val, "GreydwarfEye", 1, 1, 1f); addItemToLootTable(val, "Wood", 1, 3, 1f); addItemToLootTable(val, "RoundLog", 1, 2, 0.65f); addItemToLootTable(val, "FineWood", 1, 1, 0.65f); addItemToLootTable(val, "Resin", 1, 1, 0.65f); addItemToLootTable(val, "Stone", 1, 1, 0.65f); addItemToLootTable(val, "Flint", 1, 1, 0.65f); addItemToLootTable(val, "Root", 1, 1, 0.01f); addItemToLootTable(val, "CorruptedEitr_bal", 1, 1, 0.02f); addItemToLootTable(val, "StrawSeeds_bal", 1, 1, 0.5f); addItemToLootTable(val, "Straw_bal", 2, 3, 0.9f); addItemToLootTable(val, "AppleSeeds_bal", 1, 1, 0.5f); addItemToLootTable(val, "Thistle", 1, 1, 0.5f); addItemToLootTable(val, "Dandelion", 1, 1, 0.5f); addItemToLootTable(val, "Moss_bal", 1, 1, 0.5f); addItemToLootTable(val, "CopperScrap", 1, 1, 0.01f); addItemToLootTable(val, "RustedScrap_bal", 1, 1, 0.01f); addItemToLootTable(val, "AncientSeed", 1, 1, 0.25f); break; case "GreylingBeeKeeper_bal": addItemToLootTable(val, "QueenBee", 1, 1, 0.2f, multiplier: false); addItemToLootTable(val, "GreydwarfEye", 1, 1, 0.5f); addItemToLootTable(val, "Wood", 1, 2, 1f); addItemToLootTable(val, "RoundLog", 1, 1, 0.15f); addItemToLootTable(val, "FineWood", 1, 1, 0.01f); addItemToLootTable(val, "Resin", 1, 1, 0.8f); addItemToLootTable(val, "Stone", 1, 1, 0.9f); addItemToLootTable(val, "Flint", 1, 1, 0.65f); addItemToLootTable(val, "StrawSeeds_bal", 1, 1, 0.15f); addItemToLootTable(val, "Straw_bal", 2, 3, 0.9f); addItemToLootTable(val, "Dandelion", 1, 1, 0.05f); addItemToLootTable(val, "Moss_bal", 1, 1, 0.5f); break; case "GreylingElite_bal": addItemToLootTable(val, "GreydwarfEye", 1, 1, 0.5f); addItemToLootTable(val, "Wood", 1, 2, 1f); addItemToLootTable(val, "RoundLog", 1, 1, 0.15f); addItemToLootTable(val, "FineWood", 1, 1, 0.01f); addItemToLootTable(val, "Resin", 1, 1, 0.8f); addItemToLootTable(val, "Stone", 1, 1, 0.9f); addItemToLootTable(val, "Flint", 1, 1, 0.65f); addItemToLootTable(val, "StrawSeeds_bal", 1, 1, 0.15f); addItemToLootTable(val, "Straw_bal", 2, 3, 0.9f); addItemToLootTable(val, "Dandelion", 1, 1, 0.05f); addItemToLootTable(val, "Moss_bal", 1, 1, 0.5f); break; case "Stag_bal": addItemToLootTable(val, "DeerHide", 1, 2, 0.9f); addItemToLootTable(val, "DeerMeat", 1, 2, 0.9f); addItemToLootTable(val, "TrophyStag_bal", 1, 1, 0.2f, multiplier: false); addItemToLootTable(val, "LeatherScraps", 1, 3, 0.1f); break; case "StagGhost_bal": addItemToLootTable(val, "Ectoplasm", 0, 1, 0.01f); addItemToLootTable(val, "TrophyStagGhost_bal", 1, 1, 0.2f, multiplier: false); addItemToLootTable(val, "LeatherScraps", 1, 2, 0.1f); addItemToLootTable(val, "BoneFragments", 1, 2, 0.2f); break; case "Habrok_bal": addItemToLootTable(val, "LeatherScraps", 2, 4, 0.5f); addItemToLootTable(val, "MeatScrap_bal", 2, 4, 0.5f); addItemToLootTable(val, "BoneFragments", 2, 4, 0.5f); addItemToLootTable(val, "CorruptedEitr_bal", 1, 1, 0.02f); addItemToLootTable(val, "TrophyHabrok_bal", 1, 1, 0.5f, multiplier: false); addItemToLootTable(val, "HabrokLiver_bal", 1, 1, 0.5f); addItemToLootTable(val, "RottenMeat", 1, 1, 0.75f); addItemToLootTable(val, "Entrails", 1, 1, 0.75f); break; case "HabrokBirb_bal": addItemToLootTable(val, "LeatherScraps", 1, 3, 0.5f); addItemToLootTable(val, "MeatScrap_bal", 1, 3, 0.5f); addItemToLootTable(val, "BoneFragments", 1, 3, 0.5f); addItemToLootTable(val, "HabrokLiver_bal", 1, 1, 0.25f); addItemToLootTable(val, "CorruptedEitr_bal", 1, 1, 0.02f); addItemToLootTable(val, "TrophyHabrokBirb_bal", 1, 1, 0.5f, multiplier: false); addItemToLootTable(val, "RottenMeat", 1, 1, 0.75f); addItemToLootTable(val, "Entrails", 1, 1, 0.75f); break; case "BattleHog_bal": addItemToLootTable(val, "LeatherScraps", 3, 5, 0.5f); addItemToLootTable(val, "RawMeat", 2, 3, 0.5f); addItemToLootTable(val, "TrophyBattleHog_bal", 1, 1, 0.5f, multiplier: false); addItemToLootTable(val, "BoarHide_bal", 1, 2, 1f); addItemToLootTable(val, "StrawSeeds_bal", 1, 1, 0.15f); addItemToLootTable(val, "Straw_bal", 1, 3, 0.9f); addItemToLootTable(val, "Dandelion", 1, 1, 0.05f); addItemToLootTable(val, "Moss_bal", 1, 1, 0.5f); addItemToLootTable(val, "RottenMeat", 1, 1, 0.75f); addItemToLootTable(val, "Entrails", 1, 1, 0.75f); break; case "Hog_bal": addItemToLootTable(val, "LeatherScraps", 2, 4, 0.5f); addItemToLootTable(val, "RawMeat", 1, 2, 0.5f); addItemToLootTable(val, "TrophyBoar", 1, 1, 0.5f, multiplier: false); addItemToLootTable(val, "BoarHide_bal", 1, 2, 0.5f); break; case "PolarBear_bal": addItemToLootTable(val, "RottenMeat", 1, 1, 0.25f); addItemToLootTable(val, "BoneFragments", 1, 2, 0.5f); addItemToLootTable(val, "MeatScrap_bal", 1, 2, 0.5f); addItemToLootTable(val, "LeatherScraps", 1, 2, 0.5f); addItemToLootTable(val, "BjornHide", 1, 1, 0.75f); addItemToLootTable(val, "BjornMeat", 1, 1, 1f); addItemToLootTable(val, "BjornPaw", 1, 1, 1f); addItemToLootTable(val, "TrophyPolarBear_bal", 1, 1, 0.2f, multiplier: false); break; case "LeechLarva_bal": case "Boar_piggy": case "GoatKid_bal": case "BjornCub_bal": case "Bunny_bal": case "VoltureNestling_bal": case "CrowNestling_bal": case "NeckTadpole_bal": case "Doe_bal": addItemToLootTable(val, "MeatScrap_bal", 1, 1, 1f); addItemToLootTable(val, "LeatherScraps", 1, 1, 0.5f); break; case "NeckBrute_bal": addItemToLootTable(val, "BoneFragments", 1, 1, 0.1f); addItemToLootTable(val, "NeckTail", 1, 1, 0.9f); addItemToLootTable(val, "LeatherScraps", 1, 2, 0.5f); addItemToLootTable(val, "TrophyNeckBrute_bal", 1, 1, 0.2f, multiplier: false); break; case "AshlandsGolem_bal": addItemToLootTable(val, "FlametalOreNew", 1, 1, 0.1f); addItemToLootTable(val, "DarkIron_bal", 1, 1, 0.1f); addItemToLootTable(val, "BlackMetalOre_bal", 1, 1, 0.1f); addItemToLootTable(val, "Grausten", 2, 4, 0.9f); addItemToLootTable(val, "Stone", 2, 4, 1f); addItemToLootTable(val, "Gabro_bal", 2, 4, 0.8f); addItemToLootTable(val, "LeadOre_bal", 1, 1, 0.1f); addItemToLootTable(val, "CopperOre", 1, 1, 0.15f); addItemToLootTable(val, "IronOre", 1, 1, 0.1f); addItemToLootTable(val, "Ruby", 0, 1, 0.05f); addItemToLootTable(val, "Amethyst_bal", 0, 1, 0.05f); addItemToLootTable(val, "Opal_bal", 0, 1, 0.05f); addItemToLootTable(val, "Onyx_bal", 0, 1, 0.05f); addItemToLootTable(val, "GemChunks_bal", 1, 1, 0.1f); addItemToLootTable(val, "TrophyAshlandsGolem_bal", 1, 1, 0.33f, multiplier: false); addGlobalKey(monster, "killedStoneGolem"); break; case "Goleming_bal": addItemToLootTable(val, "FineWood", 0, 1, 0.1f); addItemToLootTable(val, "HardWood_bal", 0, 1, 0.1f); addItemToLootTable(val, "Stone", 0, 1, 0.9f); addItemToLootTable(val, "Flint", 0, 1, 0.9f); addItemToLootTable(val, "Crystal", 0, 1, 0.9f); addItemToLootTable(val, "YggdrasilWood", 0, 1, 0.9f); addItemToLootTable(val, "Eitr", 0, 1, 0.9f); addItemToLootTable(val, "Obsidian", 1, 3, 0.33f); addItemToLootTable(val, "LeadOre_bal", 1, 1, 0.1f); addItemToLootTable(val, "CopperOre", 1, 1, 0.15f); addItemToLootTable(val, "TinOre", 1, 1, 0.2f); addItemToLootTable(val, "IronOre", 1, 1, 0.1f); addItemToLootTable(val, "SilverOre", 1, 1, 0.05f); addItemToLootTable(val, "Sapphire_bal", 0, 1, 0.05f); addItemToLootTable(val, "LimeStone_bal", 1, 3, 0.45f); addItemToLootTable(val, "GemChunks_bal", 1, 1, 0.1f); addItemToLootTable(val, "TrophyGoleming_bal", 1, 1, 0.33f, multiplier: false); break; case "CrabSea_bal": addItemToLootTable(val, "Chitin", 1, 2, 0.33f); addItemToLootTable(val, "CrabLegs_bal", 1, 1, 0.6f); addItemToLootTable(val, "RedKelp_bal", 0, 1, 0.1f); addItemToLootTable(val, "SeaPearl_bal", 0, 1, 0.2f); addItemToLootTable(val, "BoneFragments", 1, 1, 0.1f); addItemToLootTable(val, "MeatScrap_bal", 1, 1, 0.9f); addItemToLootTable(val, "LeatherScraps", 1, 2, 0.5f); break; case "CrabForest_bal": addItemToLootTable(val, "Chitin", 0, 2, 0.13f); addItemToLootTable(val, "CrabLegs_bal", 1, 1, 0.6f); addItemToLootTable(val, "Dandelion", 0, 1, 0.33f); addItemToLootTable(val, "Straw_bal", 1, 4, 0.33f); addItemToLootTable(val, "Thistle", 0, 1, 0.2f); break; case "CrabStone_bal": addItemToLootTable(val, "Chitin", 1, 2, 0.33f); addItemToLootTable(val, "CrabLegs_bal", 1, 1, 0.6f); addItemToLootTable(val, "Obsidian", 1, 3, 0.33f); addItemToLootTable(val, "Onyx_bal", 0, 1, 0.2f); addItemToLootTable(val, "TrophyObsidianCrab_bal", 1, 1, 0.33f, multiplier: false); break; case "Ashdrake_bal": addItemToLootTable(val, "DrakeMeat_bal", 1, 1, 0.33f); addItemToLootTable(val, "LeatherScraps", 0, 2, 0.7f); addItemToLootTable(val, "DragonScale_bal", 1, 3, 0.1f); addItemToLootTable(val, "FireGland_bal", 0, 1, 0.2f); break; case "Stormdrake_bal": addItemToLootTable(val, "DrakeMeat_bal", 1, 1, 0.55f); addItemToLootTable(val, "LeatherScraps", 1, 2, 0.7f); addItemToLootTable(val, "DrakeSkin_bal", 1, 1, 0.6f); addItemToLootTable(val, "StormScale_bal", 1, 3, 1f); addItemToLootTable(val, "ThunderGland_bal", 0, 1, 0.5f); addItemToLootTable(val, "BoneFragments", 1, 3, 0.8f); addItemToLootTable(val, "TrophyStormdrake_bal", 1, 1, 0.33f, multiplier: false); break; case "GiantCrow_bal": addItemToLootTable(val, "BoneFragments", 1, 1, 0.75f); addItemToLootTable(val, "Feathers", 1, 3, 1f); addItemToLootTable(val, "Ruby", 0, 1, 0.01f); addItemToLootTable(val, "Coins", 1, 2, 0.1f); addItemToLootTable(val, "CrowEgg_bal", 1, 1, 0.2f); addItemToLootTable(val, "RawCrowMeat_bal", 1, 1, 1f); addItemToLootTable(val, "TrophyCrow_bal", 1, 1, 0.2f, multiplier: false); break; case "Forsaken_bal": addItemToLootTable(val, "BoneFragments", 1, 3, 0.33f); addItemToLootTable(val, "LeatherScraps", 0, 2, 0.7f); addItemToLootTable(val, "CorruptedEitr_bal", 1, 3, 0.1f); addItemToLootTable(val, "ForsakenHeart_bal", 0, 1, 0.2f); addItemToLootTable(val, "TrophyForsaken_bal", 1, 1, 0.33f, multiplier: false); break; case "Serpentling_bal": addItemToLootTable(val, "BoneFragments", 1, 3, 0.33f); addItemToLootTable(val, "LeatherScraps", 1, 2, 0.7f); addItemToLootTable(val, "SerpentMeat", 1, 1, 0.02f); addItemToLootTable(val, "SerpentScale", 1, 2, 0.2f); break; case "Penguin_bal": addItemToLootTable(val, "BoneFragments", 1, 3, 0.33f); addItemToLootTable(val, "LeatherScraps", 1, 2, 0.7f); addItemToLootTable(val, "Feathers", 1, 3, 0.4f); addItemToLootTable(val, "ChickenMeat", 1, 1, 0.2f); addItemToLootTable(val, "Stone", 1, 1, 1f); addItemToLootTable(val, "Flint", 1, 1, 0.9f); addItemToLootTable(val, "LimeStone_bal", 1, 1, 0.2f); addItemToLootTable(val, "Onyx_bal", 1, 1, 0.005f); break; case "Goat_bal": addItemToLootTable(val, "BoneFragments", 1, 3, 0.33f); addItemToLootTable(val, "LeatherScraps", 0, 2, 0.7f); addItemToLootTable(val, "Milk_bal", 1, 3, 0.5f); addItemToLootTable(val, "TrophyGoat_bal", 1, 1, 0.33f); addItemToLootTable(val, "GoatMeat_bal", 1, 1, 0.55f); break; case "Moth_bal": addItemToLootTable(val, "BugMeat", 0, 1, 0.05f); addItemToLootTable(val, "Chitin", 1, 3, 0.44f); addItemToLootTable(val, "LeatherScraps", 0, 2, 0.5f); addItemToLootTable(val, "RawSilk_bal", 1, 2, 0.33f); break; case "DarkBat_bal": addItemToLootTable(val, "BoneFragments", 1, 2, 0.2f); addItemToLootTable(val, "LeatherScraps", 1, 2, 0.5f); addItemToLootTable(val, "BatWing_bal", 1, 2, 0.1f); break; case "Spectre_bal": addItemToLootTable(val, "Chain", 1, 3, 0.33f); addItemToLootTable(val, "Ectoplasm", 0, 2, 0.7f); addItemToLootTable(val, "IronScrap", 1, 3, 0.1f); addItemToLootTable(val, "TrophySpectre_bal", 1, 1, 0.33f, multiplier: false); addItemToLootTable(val, "Ruby", 0, 1, 0.05f); addItemToLootTable(val, "Amethyst_bal", 0, 1, 0.05f); addItemToLootTable(val, "Emerald_bal", 0, 1, 0.05f); addItemToLootTable(val, "Opal_bal", 0, 1, 0.05f); addItemToLootTable(val, "Onyx_bal", 0, 1, 0.05f); addItemToLootTable(val, "Sapphire_bal", 0, 1, 0.05f); addItemToLootTable(val, "CorruptedEitr_bal", 1, 3, 0.1f); break; case "CorpseCollector_bal": addItemToLootTable(val, "GemChunks_bal", 1, 1, 0.1f); addItemToLootTable(val, "Chain", 1, 1, 0.33f); addItemToLootTable(val, "Ectoplasm", 0, 2, 0.6f); addItemToLootTable(val, "CorruptedEitr_bal", 1, 3, 0.1f); addItemToLootTable(val, "BoneFragments", 3, 5, 1f); addItemToLootTable(val, "Entrails", 2, 3, 0.5f); addItemToLootTable(val, "RottenMeat", 1, 1, 0.9f); addItemToLootTable(val, "RustedScrap_bal", 1, 2, 0.1f, multiplier: false); addItemToLootTable(val, "LeatherScraps", 2, 4, 0.7f); addItemToLootTable(val, "TrophyCorpseCollector_bal", 1, 1, 0.33f, multiplier: false); break; case "Haugbui_bal": addItemToLootTable(val, "Chain", 1, 2, 0.55f); addItemToLootTable(val, "Ectoplasm", 0, 2, 0.7f); addItemToLootTable(val, "IronScrap", 1, 3, 0.1f); addItemToLootTable(val, "Ruby", 0, 1, 0.05f); addItemToLootTable(val, "Amethyst_bal", 0, 1, 0.05f); addItemToLootTable(val, "Emerald_bal", 0, 1, 0.05f); addItemToLootTable(val, "Opal_bal", 0, 1, 0.05f); addItemToLootTable(val, "Onyx_bal", 0, 1, 0.05f); addItemToLootTable(val, "Sapphire_bal", 0, 1, 0.05f); addItemToLootTable(val, "TrophyHaugbui_bal", 1, 1, 0.2f, multiplier: false); addItemToLootTable(val, "CorruptedEitr_bal", 1, 3, 0.1f); break; case "BlobAcid_bal": addItemToLootTable(val, "Tar", 1, 1, 0.3f); addItemToLootTable(val, "Ooze", 1, 1, 1f); addItemToLootTable(val, "Guck", 1, 1, 0.7f); addItemToLootTable(val, "Coal", 1, 1, 0.6f); addItemToLootTable(val, "RustedScrap_bal", 1, 1, 0.1f); break; case "BlobLava_bal": addItemToLootTable(val, "Tar", 1, 1, 0.4f); addItemToLootTable(val, "MagmaStone_bal", 1, 1, 0.3f); addItemToLootTable(val, "Obsidian", 1, 1, 0.1f); addItemToLootTable(val, "Coal", 1, 1, 0.7f); addItemToLootTable(val, "SulfurStone", 1, 1, 0.3f); break; case "AshboneGiant_bal": addItemToLootTable(val, "BoneFragments", 5, 10, 0.4f); addItemToLootTable(val, "Tar", 1, 3, 0.4f); addItemToLootTable(val, "MagmaStone_bal", 1, 3, 0.3f); addItemToLootTable(val, "Obsidian", 1, 3, 0.1f); addItemToLootTable(val, "Coal", 1, 3, 0.7f); addItemToLootTable(val, "Sulfur", 1, 2, 0.3f); addItemToLootTable(val, "TrophyAshbone_bal", 1, 1, 0.3f, multiplier: false); break; case "Ell_bal": addItemToLootTable(val, "ThunderGland_bal", 1, 1, 0.7f); addItemToLootTable(val, "SmallBloodSack_bal", 1, 1, 0.5f); addItemToLootTable(val, "LeatherScraps", 1, 3, 1f); addItemToLootTable(val, "BoneFragments", 1, 3, 0.6f); addItemToLootTable(val, "FishRaw", 1, 2, 0.25f); addItemToLootTable(val, "BugMeat", 0, 1, 0.3f); addItemToLootTable(val, "MeatScrap_bal", 1, 1, 0.8f); addItemToLootTable(val, "Ooze", 1, 1, 0.4f); addGlobalKey(monster, "killedMjolfisk"); break; case "MossGolem_bal": addItemToLootTable(val, "CopperOre", 1, 1, 0.15f); addItemToLootTable(val, "TinOre", 1, 1, 0.2f); addItemToLootTable(val, "Moss_bal", 1, 1, 0.1f); addItemToLootTable(val, "Stone", 1, 1, 0.05f); addItemToLootTable(val, "Ruby", 0, 1, 0.05f); addItemToLootTable(val, "Amethyst_bal", 0, 1, 0.05f); addItemToLootTable(val, "Emerald_bal", 0, 1, 0.05f); addItemToLootTable(val, "Opal_bal", 0, 1, 0.05f); addItemToLootTable(val, "Onyx_bal", 0, 1, 0.05f); addItemToLootTable(val, "Sapphire_bal", 0, 1, 0.05f); addItemToLootTable(val, "Clay_bal", 1, 1, 0.2f); addGlobalKey(monster, "killedMossGolem"); break; case "Bloodling_bal": addItemToLootTable(val, "Bloodbag", 1, 1, 0.15f); addItemToLootTable(val, "Ooze", 1, 1, 0.15f); addItemToLootTable(val, "Bloodshard_bal", 1, 1, 0.15f); addItemToLootTable(val, "GiantBloodSack", 1, 1, 0.15f); addItemToLootTable(val, "SmallBloodSack_bal", 1, 1, 0.15f); addItemToLootTable(val, "CorruptedEitr_bal", 2, 4, 0.02f); break; case "Yotun_bal": case "YotunWarrior_bal": addItemToLootTable(val, "YmirRemains", 1, 1, 0.15f); addItemToLootTable(val, "JotunFinger_bal", 1, 1, 0.15f); addItemToLootTable(val, "RawDragonRibs_bal", 1, 1, 0.15f); addGlobalKey(monster, "killedYotun"); break; case "Kelpie_bal": addItemToLootTable(val, "Ectoplasm", 1, 1, 0.15f); addItemToLootTable(val, "DeerMeat", 1, 1, 0.15f); addItemToLootTable(val, "FreezeGland", 1, 1, 0.15f); addItemToLootTable(val, "RedKelp_bal", 1, 1, 0.15f); addItemToLootTable(val, "TrophyKelpie_bal", 1, 1, 0.15f); addGlobalKey(monster, "killedKelpie"); break; } } private void addAttack(GameObject gameObject, string name) { Humanoid component = gameObject.GetComponent(); List list = new List(); list.AddRange(component.m_defaultItems); list.Add(FindItem(name)); component.m_defaultItems = list.ToArray(); } private void editMonsterHealth(GameObject gameObject, int health) { Humanoid component = gameObject.GetComponent(); ((Character)component).m_health = health; } private void editTrollResists(GameObject gameObject) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0033: 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_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) Humanoid component = gameObject.GetComponent(); ((Character)component).m_damageModifiers.m_frost = (DamageModifier)5; ((Character)component).m_damageModifiers.m_blunt = (DamageModifier)1; ((Character)component).m_damageModifiers.m_poison = (DamageModifier)1; ((Character)component).m_damageModifiers.m_spirit = (DamageModifier)1; ((Character)component).m_damageModifiers.m_fire = (DamageModifier)1; ((Character)component).m_damageModifiers.m_lightning = (DamageModifier)1; ((Character)component).m_damageModifiers.m_pierce = (DamageModifier)0; ((Character)component).m_faction = (Faction)5; } private void editBjornResists(GameObject gameObject) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0033: 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_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) Humanoid component = gameObject.GetComponent(); ((Character)component).m_damageModifiers.m_frost = (DamageModifier)1; ((Character)component).m_damageModifiers.m_blunt = (DamageModifier)1; ((Character)component).m_damageModifiers.m_spirit = (DamageModifier)1; ((Character)component).m_damageModifiers.m_pierce = (DamageModifier)0; ((Character)component).m_damageModifiers.m_slash = (DamageModifier)0; ((Character)component).m_damageModifiers.m_poison = (DamageModifier)2; ((Character)component).m_damageModifiers.m_fire = (DamageModifier)2; ((Character)component).m_damageModifiers.m_lightning = (DamageModifier)2; ((Character)component).m_faction = (Faction)2; } private void editDrop(CharacterDrop drops, string itemName, int amountMin, int amountMax, float chance, bool multiplier = true) { foreach (Drop drop in drops.m_drops) { if (((Object)drop.m_prefab).name == itemName) { drop.m_amountMin = amountMin; drop.m_amountMax = amountMax; drop.m_chance = chance; drop.m_levelMultiplier = multiplier; } } } private void addItemToLootTable(CharacterDrop drops, string itemName, int amountMin, int amountMax, float chance, bool multiplier = true, bool perPlayer = false) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown GameObject val = FindItem(itemName); if ((Object)(object)val != (Object)null) { Drop val2 = new Drop(); val2.m_amountMin = amountMin; val2.m_amountMax = amountMax; val2.m_chance = chance; val2.m_levelMultiplier = multiplier; val2.m_prefab = val; val2.m_onePerPlayer = perPlayer; drops.m_drops.Add(val2); } } private void addGlobalKey(GameObject monster, string key) { Humanoid component = monster.GetComponent(); ((Character)component).m_defeatSetGlobalKey = key; } private GameObject FindItem(string name) { if (string.IsNullOrEmpty(name)) { return GetWood(); } if (itemCache.TryGetValue(name, out var value)) { return value; } GameObject val = list.Find((GameObject x) => (Object)(object)x != (Object)null && ((Object)x).name == name); if ((Object)(object)val != (Object)null) { itemCache[name] = val; return val; } Debug.LogWarning((object)("Item Not Found - " + name + ", Replaced With Wood")); GameObject wood = GetWood(); itemCache[name] = wood; return wood; } private GameObject GetWood() { if ((Object)(object)woodPrefab != (Object)null) { return woodPrefab; } woodPrefab = list.Find((GameObject x) => (Object)(object)x != (Object)null && ((Object)x).name == "Wood"); if ((Object)(object)woodPrefab == (Object)null) { Debug.LogError((object)"Fallback item 'Wood' not found!"); } return woodPrefab; } } public class Resource { public int amount = 1; public int amountPerLevel = 0; public bool recovery = true; public ItemDrop itemDrop; public Requirement pieceConfig; public string item = "Wood"; public Resource() { } public Resource(string item, int amount, int amountPerLevel = 0, bool recovery = true) { this.item = item; this.amount = amount; this.amountPerLevel = amountPerLevel; this.recovery = recovery; } public void setItemDrop(GameObject prefab) { if ((Object)(object)prefab.GetComponent() != (Object)null) { itemDrop = prefab.GetComponent(); } else { Debug.LogWarning((object)("DVERGER FURNITURE: NO ITEM DROP FOUND on prefab name: " + ((Object)prefab).name)); } } public Requirement getPieceConfig() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0013: 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_002b: 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_0039: Expected O, but got Unknown //IL_003e: Expected O, but got Unknown Requirement val = new Requirement { m_resItem = itemDrop, m_amount = amount, m_amountPerLevel = amountPerLevel, m_recover = recovery }; Requirement result = val; pieceConfig = val; return result; } } public class ShaderReplacment { public static List prefabsToReplaceShader = new List(); public static List materialsInPrefabs = new List(); public string[] shaderlist = new string[49] { "Custom/AlphaParticle", "Custom/Blob", "Custom/Bonemass", "Custom/Clouds", "Custom/Creature", "Custom/Decal", "Custom/Distortion", "Custom/Flow", "Custom/FlowOpaque", "Custom/Grass", "Custom/GuiScroll", "Custom/Heightmap", "Custom/icon", "Custom/InteriorSide", "Custom/LitGui", "Custom/LitParticles", "Custom/mapshader", "Custom/ParticleDecal", "Custom/Piece", "Custom/Player", "Custom/Rug", "Custom/ShadowBlob", "Custom/SkyboxProcedural", "Custom/SkyObject", "Custom/StaticRock", "Custom/Tar", "Custom/Trilinearmap", "Custom/UI/BGBlur", "Custom/Vegetation", "Custom/Water", "Custom/WaterBottom", "Custom/WaterMask", "Custom/Yggdrasil", "Custom/Yggdrasil/root", "Hidden/BlitCopyHDRTonemap", "Hidden/Dof/DepthOfFieldHdr", "Hidden/Dof/DX11Dof", "Hidden/Internal-Loading", "Hidden/Internal-UIRDefaultWorld", "Hidden/SimpleClear", "Hidden/SunShaftsComposite", "Lux Lit Particles/ Bumped", "Lux Lit Particles/ Tess Bumped", "Particles/Standard Surface2", "Particles/Standard Unlit2", "Standard TwoSided", "ToonDeferredShading2017", "Unlit/DepthWrite", "Unlit/Lighting" }; public static List shaders = new List(); private static readonly HashSet CachedShaders = new HashSet(); public static bool debug = true; public static Shader findShader(string name) { Shader[] array = Resources.FindObjectsOfTypeAll(); if (array.Length == 0) { Debug.LogWarning((object)"SHADER LIST IS EMPTY!"); return null; } if (debug) { } return shaders.Find((Shader x) => ((Object)x).name == name); } public static Shader GetShaderByName(string name) { return shaders.Find((Shader x) => ((Object)x).name == name.Trim()); } public static void debugShaderList(List shadersRes) { foreach (Shader shadersRe in shadersRes) { Debug.LogWarning((object)("SHADER NAME IS: " + ((Object)shadersRe).name)); } debug = false; } public static void Replace(GameObject gameObject) { prefabsToReplaceShader.Add(gameObject); GetMaterialsInPrefab(gameObject); } public static void GetMaterialsInPrefab(GameObject gameObject) { Renderer[] componentsInChildren = gameObject.GetComponentsInChildren(true); Renderer[] array = componentsInChildren; foreach (Renderer val in array) { Material[] sharedMaterials = val.sharedMaterials; if (sharedMaterials == null || sharedMaterials.Length == 0) { continue; } Material[] array2 = sharedMaterials; foreach (Material val2 in array2) { if ((Object)(object)val2 != (Object)null) { materialsInPrefabs.Add(val2); } } } } public static void getMeShaders() { AssetBundle[] array = Resources.FindObjectsOfTypeAll(); AssetBundle[] array2 = array; foreach (AssetBundle val in array2) { IEnumerable enumerable3; try { IEnumerable enumerable2; if (!val.isStreamedSceneAssetBundle || !Object.op_Implicit((Object)(object)val)) { IEnumerable enumerable = val.LoadAllAssets(); enumerable2 = enumerable; } else { enumerable2 = from shader in ((IEnumerable)val.GetAllAssetNames()).Select((Func)val.LoadAsset) where (Object)(object)shader != (Object)null select shader; } enumerable3 = enumerable2; } catch (Exception) { continue; } if (enumerable3 == null) { continue; } foreach (Shader item in enumerable3) { CachedShaders.Add(item); } } } public static void runMaterialFix() { getMeShaders(); shaders.AddRange(CachedShaders); foreach (Material materialsInPrefab in materialsInPrefabs) { Shader shader = materialsInPrefab.shader; if (!((Object)(object)shader == (Object)null)) { string name = ((Object)shader).name; if (!(name == "Standard") && !name.Contains("ScrollingTex") && name.Contains("Balrond")) { setProperValue(materialsInPrefab, name); } } } } private static void setProperValue(Material material, string shaderName) { string name = shaderName.Replace("Balrond", "Custom"); name = checkNaming(name); Shader shaderByName = GetShaderByName(name); if ((Object)(object)shaderByName == (Object)null) { Debug.LogWarning((object)("Shader not found " + name)); } else { material.shader = shaderByName; } } private static string checkNaming(string name) { string result = name; if (name.Contains("Bumped")) { result = name.Replace("Custom", "Lux Lit Particles"); } if (name.Contains("Tess Bumped")) { result = name.Replace("Custom", "Lux Lit Particles"); } if (name.Contains("Standard Surface")) { result = name.Replace("Custom", "Particles"); result = result.Replace("Standard Surface2", "Standard Surface"); } if (name.Contains("Standard Unlit")) { result = name.Replace("Custom", "Particles"); result = result.Replace("Standard Unlit", "Standard Unlit2"); result = result.Replace("Standard Unlit22", "Standard Unlit2"); } return result; } } public class SpawnObject { public string name; public bool enabled = true; public bool snapToWater = false; public bool inForest = true; public bool foldout = true; public bool blockCheck = true; public bool force = true; public float scaleMin = 1f; public float scaleMax = 1f; public string biome; public string prefabName = null; public string biomeArea = null; public int min = 1; public int max = 1; public int minOceanDepth; public int maxOceanDepth; public int minAlt; public int maxAlt; public int randTilt; public int minTilt; public int maxTilt; public int chanceToUseGroundTilt; public int terrainDeltaRadius = 0; public int minTerrainDelta = 0; public int groundRadius; public int groundOffset; public int groundSizeMin = 1; public int groundSizeMax = 1; public int forestMin = 0; public int forestMax = 1; } } namespace BalrondExtendedAnimals.Patches { [HarmonyPatch(typeof(AudioMan), "Awake")] public static class AudioMan_Awake_Patch { private static void Postfix(AudioMan __instance) { try { if ((Object)(object)__instance == (Object)null || (Object)(object)__instance.m_masterMixer == (Object)null || (Object)(object)__instance.m_masterMixer.outputAudioMixerGroup == (Object)null) { Debug.LogWarning((object)"AudioMan or mixer group is null."); return; } AudioMixerGroup outputAudioMixerGroup = __instance.m_masterMixer.outputAudioMixerGroup; ApplyMixerToPrefabs(Launch.modResourceLoader.itemPrefabs, outputAudioMixerGroup); ApplyMixerToPrefabs(Launch.modResourceLoader.buildPrefabs, outputAudioMixerGroup); ApplyMixerToPrefabs(Launch.modResourceLoader.monsterPrefabs, outputAudioMixerGroup); ApplyMixerToPrefabs(Launch.modResourceLoader.vfxPrefabs, outputAudioMixerGroup); ApplyMixerToPrefabs(Launch.modResourceLoader.vegetationPrefabs, outputAudioMixerGroup); } catch (Exception ex) { Debug.LogError((object)("[BalrondMonsterMayhem] AudioMan_Awake_Patch.Postfix failed: " + ex)); } } private static void ApplyMixerToPrefabs(IEnumerable prefabs, AudioMixerGroup mixerGroup) { if (prefabs == null || (Object)(object)mixerGroup == (Object)null) { return; } foreach (GameObject prefab in prefabs) { if ((Object)(object)prefab == (Object)null) { continue; } try { AudioSource[] componentsInChildren = prefab.GetComponentsInChildren(true); foreach (AudioSource val in componentsInChildren) { if ((Object)(object)val != (Object)null) { val.outputAudioMixerGroup = mixerGroup; } } } catch (Exception ex) { Debug.LogError((object)("[BalrondMonsterMayhem] ApplyMixerToPrefabs failed for " + ((Object)prefab).name + ": " + ex)); } } } } public static class LocalizationPatchHelpers { public static Dictionary GetTranslations(string language) { try { Dictionary result = BalrondTranslator.getLanguage("English"); if (!string.Equals(language, "English", StringComparison.OrdinalIgnoreCase)) { Dictionary language2 = BalrondTranslator.getLanguage(language); if (language2 != null) { result = language2; } else { Debug.Log((object)("[BalrondMonsterMayhem] Did not find translation file for '" + language + "', loading English")); } } return result; } catch (Exception ex) { Debug.LogError((object)("[BalrondMonsterMayhem] GetTranslations failed: " + ex)); return null; } } public static void AddTranslations(Dictionary translations, Localization localizationInstance = null) { if (translations == null) { Debug.LogWarning((object)"[BalrondMonsterMayhem] No translation file found!"); return; } Localization val = localizationInstance ?? Localization.instance; if (val == null) { return; } foreach (KeyValuePair translation in translations) { try { val.AddWord(translation.Key, translation.Value); } catch (Exception ex) { Debug.LogError((object)("[BalrondMonsterMayhem] AddTranslations failed for " + translation.Key + ": " + ex)); } } } } [HarmonyPatch(typeof(FejdStartup), "SetupGui")] public static class FejdStartup_SetupGUI { private static void Postfix() { try { if (Localization.instance != null) { string selectedLanguage = Localization.instance.GetSelectedLanguage(); Dictionary translations = LocalizationPatchHelpers.GetTranslations(selectedLanguage); LocalizationPatchHelpers.AddTranslations(translations); } } catch (Exception ex) { Debug.LogError((object)("[BalrondMonsterMayhem] FejdStartup_SetupGUI.Postfix failed: " + ex)); } } } [HarmonyPriority(800)] [HarmonyPatch(typeof(Localization), "SetupLanguage")] public static class Translation_SetupLanguage { private static void Prefix(Localization __instance, string language) { try { Dictionary translations = LocalizationPatchHelpers.GetTranslations(language); LocalizationPatchHelpers.AddTranslations(translations, __instance); } catch (Exception ex) { Debug.LogError((object)("[BalrondMonsterMayhem] Translation_SetupLanguage.Prefix failed: " + ex)); } } } [HarmonyPriority(800)] [HarmonyPatch(typeof(Localization), "LoadCSV")] public static class Translation_LoadCSV { private static void Prefix(Localization __instance, string language) { try { Dictionary translations = LocalizationPatchHelpers.GetTranslations(language); LocalizationPatchHelpers.AddTranslations(translations, __instance); } catch (Exception ex) { Debug.LogError((object)("[BalrondMonsterMayhem] Translation_LoadCSV.Prefix failed: " + ex)); } } } [HarmonyPatch(typeof(ObjectDB), "CopyOtherDB")] public static class Object_CopyOtherDB_Path { public static void Postfix() { try { if (Launch.IsObjectDBValid()) { Launch.databaseAddMethods.AddItems(Launch.modResourceLoader.itemPrefabs); } } catch (Exception ex) { Debug.LogError((object)("[BalrondMonsterMayhem] Object_CopyOtherDB_Path.Postfix failed: " + ex)); } } } [HarmonyPatch(typeof(ObjectDB), "Awake")] public static class ObjectDB_Awake_Path { public static void Postfix() { try { if (Launch.IsObjectDBValid()) { Launch.databaseAddMethods.AddItems(Launch.modResourceLoader.itemPrefabs); Launch.databaseAddMethods.AddStatuseffects(Launch.modResourceLoader.statusEffects); Launch.itemEdits.editItems(ObjectDB.instance.m_items); } } catch (Exception ex) { Debug.LogError((object)("[BalrondMonsterMayhem] ObjectDB_Awake_Path.Postfix failed: " + ex)); } } } } namespace LitJson2 { internal enum JsonType { None, Object, Array, String, Int, Long, Double, Boolean } internal interface IJsonWrapper : IList, IOrderedDictionary, IDictionary, ICollection, IEnumerable { bool IsArray { get; } bool IsBoolean { get; } bool IsDouble { get; } bool IsInt { get; } bool IsLong { get; } bool IsObject { get; } bool IsString { get; } bool GetBoolean(); double GetDouble(); int GetInt(); JsonType GetJsonType(); long GetLong(); string GetString(); void SetBoolean(bool val); void SetDouble(double val); void SetInt(int val); void SetJsonType(JsonType type); void SetLong(long val); void SetString(string val); string ToJson(); void ToJson(JsonWriter writer); } internal class JsonData : IJsonWrapper, IList, IOrderedDictionary, IDictionary, ICollection, IEnumerable, IEquatable { private IList inst_array; private bool inst_boolean; private double inst_double; private int inst_int; private long inst_long; private IDictionary inst_object; private string inst_string; private string json; private JsonType type; private IList> object_list; public int Count => EnsureCollection().Count; public bool IsArray => type == JsonType.Array; public bool IsBoolean => type == JsonType.Boolean; public bool IsDouble => type == JsonType.Double; public bool IsInt => type == JsonType.Int; public bool IsLong => type == JsonType.Long; public bool IsObject => type == JsonType.Object; public bool IsString => type == JsonType.String; public ICollection Keys { get { EnsureDictionary(); return inst_object.Keys; } } int ICollection.Count => Count; bool ICollection.IsSynchronized => EnsureCollection().IsSynchronized; object ICollection.SyncRoot => EnsureCollection().SyncRoot; bool IDictionary.IsFixedSize => EnsureDictionary().IsFixedSize; bool IDictionary.IsReadOnly => EnsureDictionary().IsReadOnly; ICollection IDictionary.Keys { get { EnsureDictionary(); IList list = new List(); foreach (KeyValuePair item in object_list) { list.Add(item.Key); } return (ICollection)list; } } ICollection IDictionary.Values { get { EnsureDictionary(); IList list = new List(); foreach (KeyValuePair item in object_list) { list.Add(item.Value); } return (ICollection)list; } } bool IJsonWrapper.IsArray => IsArray; bool IJsonWrapper.IsBoolean => IsBoolean; bool IJsonWrapper.IsDouble => IsDouble; bool IJsonWrapper.IsInt => IsInt; bool IJsonWrapper.IsLong => IsLong; bool IJsonWrapper.IsObject => IsObject; bool IJsonWrapper.IsString => IsString; bool IList.IsFixedSize => EnsureList().IsFixedSize; bool IList.IsReadOnly => EnsureList().IsReadOnly; object IDictionary.this[object key] { get { return EnsureDictionary()[key]; } set { if (!(key is string)) { throw new ArgumentException("The key has to be a string"); } JsonData value2 = ToJsonData(value); this[(string)key] = value2; } } object IOrderedDictionary.this[int idx] { get { EnsureDictionary(); return object_list[idx].Value; } set { EnsureDictionary(); JsonData value2 = ToJsonData(value); KeyValuePair keyValuePair = object_list[idx]; inst_object[keyValuePair.Key] = value2; KeyValuePair value3 = new KeyValuePair(keyValuePair.Key, value2); object_list[idx] = value3; } } object IList.this[int index] { get { return EnsureList()[index]; } set { EnsureList(); JsonData value2 = ToJsonData(value); this[index] = value2; } } public JsonData this[string prop_name] { get { EnsureDictionary(); return inst_object[prop_name]; } set { EnsureDictionary(); KeyValuePair keyValuePair = new KeyValuePair(prop_name, value); if (inst_object.ContainsKey(prop_name)) { for (int i = 0; i < object_list.Count; i++) { if (object_list[i].Key == prop_name) { object_list[i] = keyValuePair; break; } } } else { object_list.Add(keyValuePair); } inst_object[prop_name] = value; json = null; } } public JsonData this[int index] { get { EnsureCollection(); if (type == JsonType.Array) { return inst_array[index]; } return object_list[index].Value; } set { EnsureCollection(); if (type == JsonType.Array) { inst_array[index] = value; } else { KeyValuePair keyValuePair = object_list[index]; KeyValuePair value2 = new KeyValuePair(keyValuePair.Key, value); object_list[index] = value2; inst_object[keyValuePair.Key] = value; } json = null; } } public JsonData() { } public JsonData(bool boolean) { type = JsonType.Boolean; inst_boolean = boolean; } public JsonData(double number) { type = JsonType.Double; inst_double = number; } public JsonData(int number) { type = JsonType.Int; inst_int = number; } public JsonData(long number) { type = JsonType.Long; inst_long = number; } public JsonData(object obj) { if (obj is bool) { type = JsonType.Boolean; inst_boolean = (bool)obj; return; } if (obj is double) { type = JsonType.Double; inst_double = (double)obj; return; } if (obj is int) { type = JsonType.Int; inst_int = (int)obj; return; } if (obj is long) { type = JsonType.Long; inst_long = (long)obj; return; } if (obj is string) { type = JsonType.String; inst_string = (string)obj; return; } throw new ArgumentException("Unable to wrap the given object with JsonData"); } public JsonData(string str) { type = JsonType.String; inst_string = str; } public static implicit operator JsonData(bool data) { return new JsonData(data); } public static implicit operator JsonData(double data) { return new JsonData(data); } public static implicit operator JsonData(int data) { return new JsonData(data); } public static implicit operator JsonData(long data) { return new JsonData(data); } public static implicit operator JsonData(string data) { return new JsonData(data); } public static explicit operator bool(JsonData data) { if (data.type != JsonType.Boolean) { throw new InvalidCastException("Instance of JsonData doesn't hold a double"); } return data.inst_boolean; } public static explicit operator double(JsonData data) { if (data.type != JsonType.Double) { throw new InvalidCastException("Instance of JsonData doesn't hold a double"); } return data.inst_double; } public static explicit operator int(JsonData data) { if (data.type != JsonType.Int) { throw new InvalidCastException("Instance of JsonData doesn't hold an int"); } return data.inst_int; } public static explicit operator long(JsonData data) { if (data.type != JsonType.Long) { throw new InvalidCastException("Instance of JsonData doesn't hold an int"); } return data.inst_long; } public static explicit operator string(JsonData data) { if (data.type != JsonType.String) { throw new InvalidCastException("Instance of JsonData doesn't hold a string"); } return data.inst_string; } void ICollection.CopyTo(Array array, int index) { EnsureCollection().CopyTo(array, index); } void IDictionary.Add(object key, object value) { JsonData value2 = ToJsonData(value); EnsureDictionary().Add(key, value2); KeyValuePair item = new KeyValuePair((string)key, value2); object_list.Add(item); json = null; } void IDictionary.Clear() { EnsureDictionary().Clear(); object_list.Clear(); json = null; } bool IDictionary.Contains(object key) { return EnsureDictionary().Contains(key); } IDictionaryEnumerator IDictionary.GetEnumerator() { return ((IOrderedDictionary)this).GetEnumerator(); } void IDictionary.Remove(object key) { EnsureDictionary().Remove(key); for (int i = 0; i < object_list.Count; i++) { if (object_list[i].Key == (string)key) { object_list.RemoveAt(i); break; } } json = null; } IEnumerator IEnumerable.GetEnumerator() { return EnsureCollection().GetEnumerator(); } bool IJsonWrapper.GetBoolean() { if (type != JsonType.Boolean) { throw new InvalidOperationException("JsonData instance doesn't hold a boolean"); } return inst_boolean; } double IJsonWrapper.GetDouble() { if (type != JsonType.Double) { throw new InvalidOperationException("JsonData instance doesn't hold a double"); } return inst_double; } int IJsonWrapper.GetInt() { if (type != JsonType.Int) { throw new InvalidOperationException("JsonData instance doesn't hold an int"); } return inst_int; } long IJsonWrapper.GetLong() { if (type != JsonType.Long) { throw new InvalidOperationException("JsonData instance doesn't hold a long"); } return inst_long; } string IJsonWrapper.GetString() { if (type != JsonType.String) { throw new InvalidOperationException("JsonData instance doesn't hold a string"); } return inst_string; } void IJsonWrapper.SetBoolean(bool val) { type = JsonType.Boolean; inst_boolean = val; json = null; } void IJsonWrapper.SetDouble(double val) { type = JsonType.Double; inst_double = val; json = null; } void IJsonWrapper.SetInt(int val) { type = JsonType.Int; inst_int = val; json = null; } void IJsonWrapper.SetLong(long val) { type = JsonType.Long; inst_long = val; json = null; } void IJsonWrapper.SetString(string val) { type = JsonType.String; inst_string = val; json = null; } string IJsonWrapper.ToJson() { return ToJson(); } void IJsonWrapper.ToJson(JsonWriter writer) { ToJson(writer); } int IList.Add(object value) { return Add(value); } void IList.Clear() { EnsureList().Clear(); json = null; } bool IList.Contains(object value) { return EnsureList().Contains(value); } int IList.IndexOf(object value) { return EnsureList().IndexOf(value); } void IList.Insert(int index, object value) { EnsureList().Insert(index, value); json = null; } void IList.Remove(object value) { EnsureList().Remove(value); json = null; } void IList.RemoveAt(int index) { EnsureList().RemoveAt(index); json = null; } IDictionaryEnumerator IOrderedDictionary.GetEnumerator() { EnsureDictionary(); return new OrderedDictionaryEnumerator(object_list.GetEnumerator()); } void IOrderedDictionary.Insert(int idx, object key, object value) { string text = (string)key; JsonData value2 = (this[text] = ToJsonData(value)); KeyValuePair item = new KeyValuePair(text, value2); object_list.Insert(idx, item); } void IOrderedDictionary.RemoveAt(int idx) { EnsureDictionary(); inst_object.Remove(object_list[idx].Key); object_list.RemoveAt(idx); } private ICollection EnsureCollection() { if (type == JsonType.Array) { return (ICollection)inst_array; } if (type == JsonType.Object) { return (ICollection)inst_object; } throw new InvalidOperationException("The JsonData instance has to be initialized first"); } private IDictionary EnsureDictionary() { if (type == JsonType.Object) { return (IDictionary)inst_object; } if (type != JsonType.None) { throw new InvalidOperationException("Instance of JsonData is not a dictionary"); } type = JsonType.Object; inst_object = new Dictionary(); object_list = new List>(); return (IDictionary)inst_object; } private IList EnsureList() { if (type == JsonType.Array) { return (IList)inst_array; } if (type != JsonType.None) { throw new InvalidOperationException("Instance of JsonData is not a list"); } type = JsonType.Array; inst_array = new List(); return (IList)inst_array; } private JsonData ToJsonData(object obj) { if (obj == null) { return null; } if (obj is JsonData) { return (JsonData)obj; } return new JsonData(obj); } private static void WriteJson(IJsonWrapper obj, JsonWriter writer) { if (obj == null) { writer.Write(null); } else if (obj.IsString) { writer.Write(obj.GetString()); } else if (obj.IsBoolean) { writer.Write(obj.GetBoolean()); } else if (obj.IsDouble) { writer.Write(obj.GetDouble()); } else if (obj.IsInt) { writer.Write(obj.GetInt()); } else if (obj.IsLong) { writer.Write(obj.GetLong()); } else if (obj.IsArray) { writer.WriteArrayStart(); foreach (object item in (IEnumerable)obj) { WriteJson((JsonData)item, writer); } writer.WriteArrayEnd(); } else { if (!obj.IsObject) { return; } writer.WriteObjectStart(); foreach (DictionaryEntry item2 in (IDictionary)obj) { writer.WritePropertyName((string)item2.Key); WriteJson((JsonData)item2.Value, writer); } writer.WriteObjectEnd(); } } public int Add(object value) { JsonData value2 = ToJsonData(value); json = null; return EnsureList().Add(value2); } public void Clear() { if (IsObject) { ((IDictionary)this).Clear(); } else if (IsArray) { ((IList)this).Clear(); } } public bool Equals(JsonData x) { if (x == null) { return false; } if (x.type != type) { return false; } return type switch { JsonType.None => true, JsonType.Object => inst_object.Equals(x.inst_object), JsonType.Array => inst_array.Equals(x.inst_array), JsonType.String => inst_string.Equals(x.inst_string), JsonType.Int => inst_int.Equals(x.inst_int), JsonType.Long => inst_long.Equals(x.inst_long), JsonType.Double => inst_double.Equals(x.inst_double), JsonType.Boolean => inst_boolean.Equals(x.inst_boolean), _ => false, }; } public JsonType GetJsonType() { return type; } public void SetJsonType(JsonType type) { if (this.type != type) { switch (type) { case JsonType.Object: inst_object = new Dictionary(); object_list = new List>(); break; case JsonType.Array: inst_array = new List(); break; case JsonType.String: inst_string = null; break; case JsonType.Int: inst_int = 0; break; case JsonType.Long: inst_long = 0L; break; case JsonType.Double: inst_double = 0.0; break; case JsonType.Boolean: inst_boolean = false; break; } this.type = type; } } public string ToJson() { if (json != null) { return json; } StringWriter stringWriter = new StringWriter(); JsonWriter jsonWriter = new JsonWriter(stringWriter); jsonWriter.Validate = false; WriteJson(this, jsonWriter); json = stringWriter.ToString(); return json; } public void ToJson(JsonWriter writer) { bool validate = writer.Validate; writer.Validate = false; WriteJson(this, writer); writer.Validate = validate; } public override string ToString() { return type switch { JsonType.Array => "JsonData array", JsonType.Boolean => inst_boolean.ToString(), JsonType.Double => inst_double.ToString(), JsonType.Int => inst_int.ToString(), JsonType.Long => inst_long.ToString(), JsonType.Object => "JsonData object", JsonType.String => inst_string, _ => "Uninitialized JsonData", }; } } internal class OrderedDictionaryEnumerator : IDictionaryEnumerator, IEnumerator { private IEnumerator> list_enumerator; public object Current => Entry; public DictionaryEntry Entry { get { KeyValuePair current = list_enumerator.Current; return new DictionaryEntry(current.Key, current.Value); } } public object Key => list_enumerator.Current.Key; public object Value => list_enumerator.Current.Value; public OrderedDictionaryEnumerator(IEnumerator> enumerator) { list_enumerator = enumerator; } public bool MoveNext() { return list_enumerator.MoveNext(); } public void Reset() { list_enumerator.Reset(); } } internal class JsonException : ApplicationException { public JsonException() { } internal JsonException(ParserToken token) : base($"Invalid token '{token}' in input string") { } internal JsonException(ParserToken token, Exception inner_exception) : base($"Invalid token '{token}' in input string", inner_exception) { } internal JsonException(int c) : base($"Invalid character '{(char)c}' in input string") { } internal JsonException(int c, Exception inner_exception) : base($"Invalid character '{(char)c}' in input string", inner_exception) { } public JsonException(string message) : base(message) { } public JsonException(string message, Exception inner_exception) : base(message, inner_exception) { } } internal struct PropertyMetadata { public MemberInfo Info; public bool IsField; public Type Type; } internal struct ArrayMetadata { private Type element_type; private bool is_array; private bool is_list; public Type ElementType { get { if (element_type == null) { return typeof(JsonData); } return element_type; } set { element_type = value; } } public bool IsArray { get { return is_array; } set { is_array = value; } } public bool IsList { get { return is_list; } set { is_list = value; } } } internal struct ObjectMetadata { private Type element_type; private bool is_dictionary; private IDictionary properties; public Type ElementType { get { if (element_type == null) { return typeof(JsonData); } return element_type; } set { element_type = value; } } public bool IsDictionary { get { return is_dictionary; } set { is_dictionary = value; } } public IDictionary Properties { get { return properties; } set { properties = value; } } } internal delegate void ExporterFunc(object obj, JsonWriter writer); internal delegate void ExporterFunc(T obj, JsonWriter writer); internal delegate object ImporterFunc(object input); internal delegate TValue ImporterFunc(TJson input); internal delegate IJsonWrapper WrapperFactory(); internal class JsonMapper { private static int max_nesting_depth; private static IFormatProvider datetime_format; private static IDictionary base_exporters_table; private static IDictionary custom_exporters_table; private static IDictionary> base_importers_table; private static IDictionary> custom_importers_table; private static IDictionary array_metadata; private static readonly object array_metadata_lock; private static IDictionary> conv_ops; private static readonly object conv_ops_lock; private static IDictionary object_metadata; private static readonly object object_metadata_lock; private static IDictionary> type_properties; private static readonly object type_properties_lock; private static JsonWriter static_writer; private static readonly object static_writer_lock; static JsonMapper() { array_metadata_lock = new object(); conv_ops_lock = new object(); object_metadata_lock = new object(); type_properties_lock = new object(); static_writer_lock = new object(); max_nesting_depth = 100; array_metadata = new Dictionary(); conv_ops = new Dictionary>(); object_metadata = new Dictionary(); type_properties = new Dictionary>(); static_writer = new JsonWriter(); datetime_format = DateTimeFormatInfo.InvariantInfo; base_exporters_table = new Dictionary(); custom_exporters_table = new Dictionary(); base_importers_table = new Dictionary>(); custom_importers_table = new Dictionary>(); RegisterBaseExporters(); RegisterBaseImporters(); } private static void AddArrayMetadata(Type type) { if (array_metadata.ContainsKey(type)) { return; } ArrayMetadata value = new ArrayMetadata { IsArray = type.IsArray }; if (type.GetInterface("System.Collections.IList") != null) { value.IsList = true; } PropertyInfo[] properties = type.GetProperties(); foreach (PropertyInfo propertyInfo in properties) { if (!(propertyInfo.Name != "Item")) { ParameterInfo[] indexParameters = propertyInfo.GetIndexParameters(); if (indexParameters.Length == 1 && indexParameters[0].ParameterType == typeof(int)) { value.ElementType = propertyInfo.PropertyType; } } } lock (array_metadata_lock) { try { array_metadata.Add(type, value); } catch (ArgumentException) { } } } private static void AddObjectMetadata(Type type) { if (object_metadata.ContainsKey(type)) { return; } ObjectMetadata value = default(ObjectMetadata); if (type.GetInterface("System.Collections.IDictionary") != null) { value.IsDictionary = true; } value.Properties = new Dictionary(); PropertyInfo[] properties = type.GetProperties(); foreach (PropertyInfo propertyInfo in properties) { if (propertyInfo.Name == "Item") { ParameterInfo[] indexParameters = propertyInfo.GetIndexParameters(); if (indexParameters.Length == 1 && indexParameters[0].ParameterType == typeof(string)) { value.ElementType = propertyInfo.PropertyType; } } else { PropertyMetadata value2 = new PropertyMetadata { Info = propertyInfo, Type = propertyInfo.PropertyType }; value.Properties.Add(propertyInfo.Name, value2); } } FieldInfo[] fields = type.GetFields(); foreach (FieldInfo fieldInfo in fields) { PropertyMetadata value3 = new PropertyMetadata { Info = fieldInfo, IsField = true, Type = fieldInfo.FieldType }; value.Properties.Add(fieldInfo.Name, value3); } lock (object_metadata_lock) { try { object_metadata.Add(type, value); } catch (ArgumentException) { } } } private static void AddTypeProperties(Type type) { if (type_properties.ContainsKey(type)) { return; } IList list = new List(); PropertyInfo[] properties = type.GetProperties(); foreach (PropertyInfo propertyInfo in properties) { if (!(propertyInfo.Name == "Item")) { list.Add(new PropertyMetadata { Info = propertyInfo, IsField = false }); } } FieldInfo[] fields = type.GetFields(); foreach (FieldInfo info in fields) { list.Add(new PropertyMetadata { Info = info, IsField = true }); } lock (type_properties_lock) { try { type_properties.Add(type, list); } catch (ArgumentException) { } } } private static MethodInfo GetConvOp(Type t1, Type t2) { lock (conv_ops_lock) { if (!conv_ops.ContainsKey(t1)) { conv_ops.Add(t1, new Dictionary()); } } if (conv_ops[t1].ContainsKey(t2)) { return conv_ops[t1][t2]; } MethodInfo method = t1.GetMethod("op_Implicit", new Type[1] { t2 }); lock (conv_ops_lock) { try { conv_ops[t1].Add(t2, method); return method; } catch (ArgumentException) { return conv_ops[t1][t2]; } } } private static object ReadValue(Type inst_type, JsonReader reader) { reader.Read(); if (reader.Token == JsonToken.ArrayEnd) { return null; } Type underlyingType = Nullable.GetUnderlyingType(inst_type); Type type = underlyingType ?? inst_type; if (reader.Token == JsonToken.Null) { if (inst_type.IsClass || underlyingType != null) { return null; } throw new JsonException($"Can't assign null to an instance of type {inst_type}"); } if (reader.Token == JsonToken.Double || reader.Token == JsonToken.Int || reader.Token == JsonToken.Long || reader.Token == JsonToken.String || reader.Token == JsonToken.Boolean) { Type type2 = reader.Value.GetType(); if (type.IsAssignableFrom(type2)) { return reader.Value; } if (custom_importers_table.ContainsKey(type2) && custom_importers_table[type2].ContainsKey(type)) { ImporterFunc importerFunc = custom_importers_table[type2][type]; return importerFunc(reader.Value); } if (base_importers_table.ContainsKey(type2) && base_importers_table[type2].ContainsKey(type)) { ImporterFunc importerFunc2 = base_importers_table[type2][type]; return importerFunc2(reader.Value); } if (type.IsEnum) { return Enum.ToObject(type, reader.Value); } MethodInfo convOp = GetConvOp(type, type2); if (convOp != null) { return convOp.Invoke(null, new object[1] { reader.Value }); } throw new JsonException($"Can't assign value '{reader.Value}' (type {type2}) to type {inst_type}"); } object obj = null; if (reader.Token == JsonToken.ArrayStart) { AddArrayMetadata(inst_type); ArrayMetadata arrayMetadata = array_metadata[inst_type]; if (!arrayMetadata.IsArray && !arrayMetadata.IsList) { throw new JsonException($"Type {inst_type} can't act as an array"); } IList list; Type elementType; if (!arrayMetadata.IsArray) { list = (IList)Activator.CreateInstance(inst_type); elementType = arrayMetadata.ElementType; } else { list = new ArrayList(); elementType = inst_type.GetElementType(); } while (true) { object obj2 = ReadValue(elementType, reader); if (obj2 == null && reader.Token == JsonToken.ArrayEnd) { break; } list.Add(obj2); } if (arrayMetadata.IsArray) { int count = list.Count; obj = Array.CreateInstance(elementType, count); for (int i = 0; i < count; i++) { ((Array)obj).SetValue(list[i], i); } } else { obj = list; } } else if (reader.Token == JsonToken.ObjectStart) { AddObjectMetadata(type); ObjectMetadata objectMetadata = object_metadata[type]; obj = Activator.CreateInstance(type); while (true) { reader.Read(); if (reader.Token == JsonToken.ObjectEnd) { break; } string text = (string)reader.Value; if (objectMetadata.Properties.ContainsKey(text)) { PropertyMetadata propertyMetadata = objectMetadata.Properties[text]; if (propertyMetadata.IsField) { ((FieldInfo)propertyMetadata.Info).SetValue(obj, ReadValue(propertyMetadata.Type, reader)); continue; } PropertyInfo propertyInfo = (PropertyInfo)propertyMetadata.Info; if (propertyInfo.CanWrite) { propertyInfo.SetValue(obj, ReadValue(propertyMetadata.Type, reader), null); } else { ReadValue(propertyMetadata.Type, reader); } } else if (!objectMetadata.IsDictionary) { if (!reader.SkipNonMembers) { throw new JsonException($"The type {inst_type} doesn't have the property '{text}'"); } ReadSkip(reader); } else { ((IDictionary)obj).Add(text, ReadValue(objectMetadata.ElementType, reader)); } } } return obj; } private static IJsonWrapper ReadValue(WrapperFactory factory, JsonReader reader) { reader.Read(); if (reader.Token == JsonToken.ArrayEnd || reader.Token == JsonToken.Null) { return null; } IJsonWrapper jsonWrapper = factory(); if (reader.Token == JsonToken.String) { jsonWrapper.SetString((string)reader.Value); return jsonWrapper; } if (reader.Token == JsonToken.Double) { jsonWrapper.SetDouble((double)reader.Value); return jsonWrapper; } if (reader.Token == JsonToken.Int) { jsonWrapper.SetInt((int)reader.Value); return jsonWrapper; } if (reader.Token == JsonToken.Long) { jsonWrapper.SetLong((long)reader.Value); return jsonWrapper; } if (reader.Token == JsonToken.Boolean) { jsonWrapper.SetBoolean((bool)reader.Value); return jsonWrapper; } if (reader.Token == JsonToken.ArrayStart) { jsonWrapper.SetJsonType(JsonType.Array); while (true) { IJsonWrapper jsonWrapper2 = ReadValue(factory, reader); if (jsonWrapper2 == null && reader.Token == JsonToken.ArrayEnd) { break; } jsonWrapper.Add(jsonWrapper2); } } else if (reader.Token == JsonToken.ObjectStart) { jsonWrapper.SetJsonType(JsonType.Object); while (true) { reader.Read(); if (reader.Token == JsonToken.ObjectEnd) { break; } string key = (string)reader.Value; jsonWrapper[key] = ReadValue(factory, reader); } } return jsonWrapper; } private static void ReadSkip(JsonReader reader) { ToWrapper(() => new JsonMockWrapper(), reader); } private static void RegisterBaseExporters() { base_exporters_table[typeof(byte)] = delegate(object obj, JsonWriter writer) { writer.Write(Convert.ToInt32((byte)obj)); }; base_exporters_table[typeof(char)] = delegate(object obj, JsonWriter writer) { writer.Write(Convert.ToString((char)obj)); }; base_exporters_table[typeof(DateTime)] = delegate(object obj, JsonWriter writer) { writer.Write(Convert.ToString((DateTime)obj, datetime_format)); }; base_exporters_table[typeof(decimal)] = delegate(object obj, JsonWriter writer) { writer.Write((decimal)obj); }; base_exporters_table[typeof(sbyte)] = delegate(object obj, JsonWriter writer) { writer.Write(Convert.ToInt32((sbyte)obj)); }; base_exporters_table[typeof(short)] = delegate(object obj, JsonWriter writer) { writer.Write(Convert.ToInt32((short)obj)); }; base_exporters_table[typeof(ushort)] = delegate(object obj, JsonWriter writer) { writer.Write(Convert.ToInt32((ushort)obj)); }; base_exporters_table[typeof(uint)] = delegate(object obj, JsonWriter writer) { writer.Write(Convert.ToUInt64((uint)obj)); }; base_exporters_table[typeof(ulong)] = delegate(object obj, JsonWriter writer) { writer.Write((ulong)obj); }; } private static void RegisterBaseImporters() { ImporterFunc importer = (object input) => Convert.ToByte((int)input); RegisterImporter(base_importers_table, typeof(int), typeof(byte), importer); importer = (object input) => Convert.ToUInt64((int)input); RegisterImporter(base_importers_table, typeof(int), typeof(ulong), importer); importer = (object input) => Convert.ToSByte((int)input); RegisterImporter(base_importers_table, typeof(int), typeof(sbyte), importer); importer = (object input) => Convert.ToInt16((int)input); RegisterImporter(base_importers_table, typeof(int), typeof(short), importer); importer = (object input) => Convert.ToUInt16((int)input); RegisterImporter(base_importers_table, typeof(int), typeof(ushort), importer); importer = (object input) => Convert.ToUInt32((int)input); RegisterImporter(base_importers_table, typeof(int), typeof(uint), importer); importer = (object input) => Convert.ToSingle((int)input); RegisterImporter(base_importers_table, typeof(int), typeof(float), importer); importer = (object input) => Convert.ToDouble((int)input); RegisterImporter(base_importers_table, typeof(int), typeof(double), importer); importer = (object input) => Convert.ToDecimal((double)input); RegisterImporter(base_importers_table, typeof(double), typeof(decimal), importer); importer = (object input) => Convert.ToUInt32((long)input); RegisterImporter(base_importers_table, typeof(long), typeof(uint), importer); importer = (object input) => Convert.ToChar((string)input); RegisterImporter(base_importers_table, typeof(string), typeof(char), importer); importer = (object input) => Convert.ToDateTime((string)input, datetime_format); RegisterImporter(base_importers_table, typeof(string), typeof(DateTime), importer); } private static void RegisterImporter(IDictionary> table, Type json_type, Type value_type, ImporterFunc importer) { if (!table.ContainsKey(json_type)) { table.Add(json_type, new Dictionary()); } table[json_type][value_type] = importer; } private static void WriteValue(object obj, JsonWriter writer, bool writer_is_private, int depth) { if (depth > max_nesting_depth) { throw new JsonException($"Max allowed object depth reached while trying to export from type {obj.GetType()}"); } if (obj == null) { writer.Write(null); return; } if (obj is IJsonWrapper) { if (writer_is_private) { writer.TextWriter.Write(((IJsonWrapper)obj).ToJson()); } else { ((IJsonWrapper)obj).ToJson(writer); } return; } if (obj is string) { writer.Write((string)obj); return; } if (obj is double) { writer.Write((double)obj); return; } if (obj is int) { writer.Write((int)obj); return; } if (obj is bool) { writer.Write((bool)obj); return; } if (obj is long) { writer.Write((long)obj); return; } if (obj is Array) { writer.WriteArrayStart(); foreach (object item in (Array)obj) { WriteValue(item, writer, writer_is_private, depth + 1); } writer.WriteArrayEnd(); return; } if (obj is IList) { writer.WriteArrayStart(); foreach (object item2 in (IList)obj) { WriteValue(item2, writer, writer_is_private, depth + 1); } writer.WriteArrayEnd(); return; } if (obj is IDictionary) { writer.WriteObjectStart(); foreach (DictionaryEntry item3 in (IDictionary)obj) { writer.WritePropertyName((string)item3.Key); WriteValue(item3.Value, writer, writer_is_private, depth + 1); } writer.WriteObjectEnd(); return; } Type type = obj.GetType(); if (custom_exporters_table.ContainsKey(type)) { ExporterFunc exporterFunc = custom_exporters_table[type]; exporterFunc(obj, writer); return; } if (base_exporters_table.ContainsKey(type)) { ExporterFunc exporterFunc2 = base_exporters_table[type]; exporterFunc2(obj, writer); return; } if (obj is Enum) { Type underlyingType = Enum.GetUnderlyingType(type); if (underlyingType == typeof(long) || underlyingType == typeof(uint) || underlyingType == typeof(ulong)) { writer.Write((ulong)obj); } else { writer.Write((int)obj); } return; } AddTypeProperties(type); IList list = type_properties[type]; writer.WriteObjectStart(); foreach (PropertyMetadata item4 in list) { if (item4.IsField) { writer.WritePropertyName(item4.Info.Name); WriteValue(((FieldInfo)item4.Info).GetValue(obj), writer, writer_is_private, depth + 1); continue; } PropertyInfo propertyInfo = (PropertyInfo)item4.Info; if (propertyInfo.CanRead) { writer.WritePropertyName(item4.Info.Name); WriteValue(propertyInfo.GetValue(obj, null), writer, writer_is_private, depth + 1); } } writer.WriteObjectEnd(); } public static string ToJson(object obj) { lock (static_writer_lock) { static_writer.Reset(); WriteValue(obj, static_writer, writer_is_private: true, 0); return static_writer.ToString(); } } public static void ToJson(object obj, JsonWriter writer) { WriteValue(obj, writer, writer_is_private: false, 0); } public static JsonData ToObject(JsonReader reader) { return (JsonData)ToWrapper(() => new JsonData(), reader); } public static JsonData ToObject(TextReader reader) { JsonReader reader2 = new JsonReader(reader); return (JsonData)ToWrapper(() => new JsonData(), reader2); } public static JsonData ToObject(string json) { return (JsonData)ToWrapper(() => new JsonData(), json); } public static T ToObject(JsonReader reader) { return (T)ReadValue(typeof(T), reader); } public static T ToObject(TextReader reader) { JsonReader reader2 = new JsonReader(reader); return (T)ReadValue(typeof(T), reader2); } public static T ToObject(string json) { JsonReader reader = new JsonReader(json); return (T)ReadValue(typeof(T), reader); } public static IJsonWrapper ToWrapper(WrapperFactory factory, JsonReader reader) { return ReadValue(factory, reader); } public static IJsonWrapper ToWrapper(WrapperFactory factory, string json) { JsonReader reader = new JsonReader(json); return ReadValue(factory, reader); } public static void RegisterExporter(ExporterFunc exporter) { ExporterFunc value = delegate(object obj, JsonWriter writer) { exporter((T)obj, writer); }; custom_exporters_table[typeof(T)] = value; } public static void RegisterImporter(ImporterFunc importer) { ImporterFunc importer2 = (object input) => importer((TJson)input); RegisterImporter(custom_importers_table, typeof(TJson), typeof(TValue), importer2); } public static void UnregisterExporters() { custom_exporters_table.Clear(); } public static void UnregisterImporters() { custom_importers_table.Clear(); } } internal class JsonMockWrapper : IJsonWrapper, IList, IOrderedDictionary, IDictionary, ICollection, IEnumerable { public bool IsArray => false; public bool IsBoolean => false; public bool IsDouble => false; public bool IsInt => false; public bool IsLong => false; public bool IsObject => false; public bool IsString => false; bool IList.IsFixedSize => true; bool IList.IsReadOnly => true; object IList.this[int index] { get { return null; } set { } } int ICollection.Count => 0; bool ICollection.IsSynchronized => false; object ICollection.SyncRoot => null; bool IDictionary.IsFixedSize => true; bool IDictionary.IsReadOnly => true; ICollection IDictionary.Keys => null; ICollection IDictionary.Values => null; object IDictionary.this[object key] { get { return null; } set { } } object IOrderedDictionary.this[int idx] { get { return null; } set { } } public bool GetBoolean() { return false; } public double GetDouble() { return 0.0; } public int GetInt() { return 0; } public JsonType GetJsonType() { return JsonType.None; } public long GetLong() { return 0L; } public string GetString() { return ""; } public void SetBoolean(bool val) { } public void SetDouble(double val) { } public void SetInt(int val) { } public void SetJsonType(JsonType type) { } public void SetLong(long val) { } public void SetString(string val) { } public string ToJson() { return ""; } public void ToJson(JsonWriter writer) { } int IList.Add(object value) { return 0; } void IList.Clear() { } bool IList.Contains(object value) { return false; } int IList.IndexOf(object value) { return -1; } void IList.Insert(int i, object v) { } void IList.Remove(object value) { } void IList.RemoveAt(int index) { } void ICollection.CopyTo(Array array, int index) { } IEnumerator IEnumerable.GetEnumerator() { return null; } void IDictionary.Add(object k, object v) { } void IDictionary.Clear() { } bool IDictionary.Contains(object key) { return false; } void IDictionary.Remove(object key) { } IDictionaryEnumerator IDictionary.GetEnumerator() { return null; } IDictionaryEnumerator IOrderedDictionary.GetEnumerator() { return null; } void IOrderedDictionary.Insert(int i, object k, object v) { } void IOrderedDictionary.RemoveAt(int i) { } } internal enum JsonToken { None, ObjectStart, PropertyName, ObjectEnd, ArrayStart, ArrayEnd, Int, Long, Double, String, Boolean, Null } internal class JsonReader { private static IDictionary> parse_table; private Stack automaton_stack; private int current_input; private int current_symbol; private bool end_of_json; private bool end_of_input; private Lexer lexer; private bool parser_in_string; private bool parser_return; private bool read_started; private TextReader reader; private bool reader_is_owned; private bool skip_non_members; private object token_value; private JsonToken token; public bool AllowComments { get { return lexer.AllowComments; } set { lexer.AllowComments = value; } } public bool AllowSingleQuotedStrings { get { return lexer.AllowSingleQuotedStrings; } set { lexer.AllowSingleQuotedStrings = value; } } public bool SkipNonMembers { get { return skip_non_members; } set { skip_non_members = value; } } public bool EndOfInput => end_of_input; public bool EndOfJson => end_of_json; public JsonToken Token => token; public object Value => token_value; static JsonReader() { PopulateParseTable(); } public JsonReader(string json_text) : this(new StringReader(json_text), owned: true) { } public JsonReader(TextReader reader) : this(reader, owned: false) { } private JsonReader(TextReader reader, bool owned) { if (reader == null) { throw new ArgumentNullException("reader"); } parser_in_string = false; parser_return = false; read_started = false; automaton_stack = new Stack(); automaton_stack.Push(65553); automaton_stack.Push(65543); lexer = new Lexer(reader); end_of_input = false; end_of_json = false; skip_non_members = true; this.reader = reader; reader_is_owned = owned; } private static void PopulateParseTable() { parse_table = new Dictionary>(); TableAddRow(ParserToken.Array); TableAddCol(ParserToken.Array, 91, 91, 65549); TableAddRow(ParserToken.ArrayPrime); TableAddCol(ParserToken.ArrayPrime, 34, 65550, 65551, 93); TableAddCol(ParserToken.ArrayPrime, 91, 65550, 65551, 93); TableAddCol(ParserToken.ArrayPrime, 93, 93); TableAddCol(ParserToken.ArrayPrime, 123, 65550, 65551, 93); TableAddCol(ParserToken.ArrayPrime, 65537, 65550, 65551, 93); TableAddCol(ParserToken.ArrayPrime, 65538, 65550, 65551, 93); TableAddCol(ParserToken.ArrayPrime, 65539, 65550, 65551, 93); TableAddCol(ParserToken.ArrayPrime, 65540, 65550, 65551, 93); TableAddRow(ParserToken.Object); TableAddCol(ParserToken.Object, 123, 123, 65545); TableAddRow(ParserToken.ObjectPrime); TableAddCol(ParserToken.ObjectPrime, 34, 65546, 65547, 125); TableAddCol(ParserToken.ObjectPrime, 125, 125); TableAddRow(ParserToken.Pair); TableAddCol(ParserToken.Pair, 34, 65552, 58, 65550); TableAddRow(ParserToken.PairRest); TableAddCol(ParserToken.PairRest, 44, 44, 65546, 65547); TableAddCol(ParserToken.PairRest, 125, 65554); TableAddRow(ParserToken.String); TableAddCol(ParserToken.String, 34, 34, 65541, 34); TableAddRow(ParserToken.Text); TableAddCol(ParserToken.Text, 91, 65548); TableAddCol(ParserToken.Text, 123, 65544); TableAddRow(ParserToken.Value); TableAddCol(ParserToken.Value, 34, 65552); TableAddCol(ParserToken.Value, 91, 65548); TableAddCol(ParserToken.Value, 123, 65544); TableAddCol(ParserToken.Value, 65537, 65537); TableAddCol(ParserToken.Value, 65538, 65538); TableAddCol(ParserToken.Value, 65539, 65539); TableAddCol(ParserToken.Value, 65540, 65540); TableAddRow(ParserToken.ValueRest); TableAddCol(ParserToken.ValueRest, 44, 44, 65550, 65551); TableAddCol(ParserToken.ValueRest, 93, 65554); } private static void TableAddCol(ParserToken row, int col, params int[] symbols) { parse_table[(int)row].Add(col, symbols); } private static void TableAddRow(ParserToken rule) { parse_table.Add((int)rule, new Dictionary()); } private void ProcessNumber(string number) { int result2; long result3; ulong result4; if ((number.IndexOf('.') != -1 || number.IndexOf('e') != -1 || number.IndexOf('E') != -1) && double.TryParse(number, out var result)) { token = JsonToken.Double; token_value = result; } else if (int.TryParse(number, out result2)) { token = JsonToken.Int; token_value = result2; } else if (long.TryParse(number, out result3)) { token = JsonToken.Long; token_value = result3; } else if (ulong.TryParse(number, out result4)) { token = JsonToken.Long; token_value = result4; } else { token = JsonToken.Int; token_value = 0; } } private void ProcessSymbol() { if (current_symbol == 91) { token = JsonToken.ArrayStart; parser_return = true; } else if (current_symbol == 93) { token = JsonToken.ArrayEnd; parser_return = true; } else if (current_symbol == 123) { token = JsonToken.ObjectStart; parser_return = true; } else if (current_symbol == 125) { token = JsonToken.ObjectEnd; parser_return = true; } else if (current_symbol == 34) { if (parser_in_string) { parser_in_string = false; parser_return = true; return; } if (token == JsonToken.None) { token = JsonToken.String; } parser_in_string = true; } else if (current_symbol == 65541) { token_value = lexer.StringValue; } else if (current_symbol == 65539) { token = JsonToken.Boolean; token_value = false; parser_return = true; } else if (current_symbol == 65540) { token = JsonToken.Null; parser_return = true; } else if (current_symbol == 65537) { ProcessNumber(lexer.StringValue); parser_return = true; } else if (current_symbol == 65546) { token = JsonToken.PropertyName; } else if (current_symbol == 65538) { token = JsonToken.Boolean; token_value = true; parser_return = true; } } private bool ReadToken() { if (end_of_input) { return false; } lexer.NextToken(); if (lexer.EndOfInput) { Close(); return false; } current_input = lexer.Token; return true; } public void Close() { if (!end_of_input) { end_of_input = true; end_of_json = true; if (reader_is_owned) { reader.Close(); } reader = null; } } public bool Read() { if (end_of_input) { return false; } if (end_of_json) { end_of_json = false; automaton_stack.Clear(); automaton_stack.Push(65553); automaton_stack.Push(65543); } parser_in_string = false; parser_return = false; token = JsonToken.None; token_value = null; if (!read_started) { read_started = true; if (!ReadToken()) { return false; } } while (true) { if (parser_return) { if (automaton_stack.Peek() == 65553) { end_of_json = true; } return true; } current_symbol = automaton_stack.Pop(); ProcessSymbol(); if (current_symbol == current_input) { if (!ReadToken()) { break; } continue; } int[] array; try { array = parse_table[current_symbol][current_input]; } catch (KeyNotFoundException inner_exception) { throw new JsonException((ParserToken)current_input, inner_exception); } if (array[0] != 65554) { for (int num = array.Length - 1; num >= 0; num--) { automaton_stack.Push(array[num]); } } } if (automaton_stack.Peek() != 65553) { throw new JsonException("Input doesn't evaluate to proper JSON text"); } if (parser_return) { return true; } return false; } } internal enum Condition { InArray, InObject, NotAProperty, Property, Value } internal class WriterContext { public int Count; public bool InArray; public bool InObject; public bool ExpectingValue; public int Padding; } internal class JsonWriter { private static NumberFormatInfo number_format; private WriterContext context; private Stack ctx_stack; private bool has_reached_end; private char[] hex_seq; private int indentation; private int indent_value; private StringBuilder inst_string_builder; private bool pretty_print; private bool validate; private TextWriter writer; public int IndentValue { get { return indent_value; } set { indentation = indentation / indent_value * value; indent_value = value; } } public bool PrettyPrint { get { return pretty_print; } set { pretty_print = value; } } public TextWriter TextWriter => writer; public bool Validate { get { return validate; } set { validate = value; } } static JsonWriter() { number_format = NumberFormatInfo.InvariantInfo; } public JsonWriter() { inst_string_builder = new StringBuilder(); writer = new StringWriter(inst_string_builder); Init(); } public JsonWriter(StringBuilder sb) : this(new StringWriter(sb)) { } public JsonWriter(TextWriter writer) { if (writer == null) { throw new ArgumentNullException("writer"); } this.writer = writer; Init(); } private void DoValidation(Condition cond) { if (!context.ExpectingValue) { context.Count++; } if (!validate) { return; } if (has_reached_end) { throw new JsonException("A complete JSON symbol has already been written"); } switch (cond) { case Condition.InArray: if (!context.InArray) { throw new JsonException("Can't close an array here"); } break; case Condition.InObject: if (!context.InObject || context.ExpectingValue) { throw new JsonException("Can't close an object here"); } break; case Condition.NotAProperty: if (context.InObject && !context.ExpectingValue) { throw new JsonException("Expected a property"); } break; case Condition.Property: if (!context.InObject || context.ExpectingValue) { throw new JsonException("Can't add a property here"); } break; case Condition.Value: if (!context.InArray && (!context.InObject || !context.ExpectingValue)) { throw new JsonException("Can't add a value here"); } break; } } private void Init() { has_reached_end = false; hex_seq = new char[4]; indentation = 0; indent_value = 4; pretty_print = false; validate = true; ctx_stack = new Stack(); context = new WriterContext(); ctx_stack.Push(context); } private static void IntToHex(int n, char[] hex) { for (int i = 0; i < 4; i++) { int num = n % 16; if (num < 10) { hex[3 - i] = (char)(48 + num); } else { hex[3 - i] = (char)(65 + (num - 10)); } n >>= 4; } } private void Indent() { if (pretty_print) { indentation += indent_value; } } private void Put(string str) { if (pretty_print && !context.ExpectingValue) { for (int i = 0; i < indentation; i++) { writer.Write(' '); } } writer.Write(str); } private void PutNewline() { PutNewline(add_comma: true); } private void PutNewline(bool add_comma) { if (add_comma && !context.ExpectingValue && context.Count > 1) { writer.Write(','); } if (pretty_print && !context.ExpectingValue) { writer.Write('\n'); } } private void PutString(string str) { Put(string.Empty); writer.Write('"'); int length = str.Length; for (int i = 0; i < length; i++) { switch (str[i]) { case '\n': writer.Write("\\n"); continue; case '\r': writer.Write("\\r"); continue; case '\t': writer.Write("\\t"); continue; case '"': case '\\': writer.Write('\\'); writer.Write(str[i]); continue; case '\f': writer.Write("\\f"); continue; case '\b': writer.Write("\\b"); continue; } if (str[i] >= ' ' && str[i] <= '~') { writer.Write(str[i]); continue; } IntToHex(str[i], hex_seq); writer.Write("\\u"); writer.Write(hex_seq); } writer.Write('"'); } private void Unindent() { if (pretty_print) { indentation -= indent_value; } } public override string ToString() { if (inst_string_builder == null) { return string.Empty; } return inst_string_builder.ToString(); } public void Reset() { has_reached_end = false; ctx_stack.Clear(); context = new WriterContext(); ctx_stack.Push(context); if (inst_string_builder != null) { inst_string_builder.Remove(0, inst_string_builder.Length); } } public void Write(bool boolean) { DoValidation(Condition.Value); PutNewline(); Put(boolean ? "true" : "false"); context.ExpectingValue = false; } public void Write(decimal number) { DoValidation(Condition.Value); PutNewline(); Put(Convert.ToString(number, number_format)); context.ExpectingValue = false; } public void Write(double number) { DoValidation(Condition.Value); PutNewline(); string text = Convert.ToString(number, number_format); Put(text); if (text.IndexOf('.') == -1 && text.IndexOf('E') == -1) { writer.Write(".0"); } context.ExpectingValue = false; } public void Write(int number) { DoValidation(Condition.Value); PutNewline(); Put(Convert.ToString(number, number_format)); context.ExpectingValue = false; } public void Write(long number) { DoValidation(Condition.Value); PutNewline(); Put(Convert.ToString(number, number_format)); context.ExpectingValue = false; } public void Write(string str) { DoValidation(Condition.Value); PutNewline(); if (str == null) { Put("null"); } else { PutString(str); } context.ExpectingValue = false; } [CLSCompliant(false)] public void Write(ulong number) { DoValidation(Condition.Value); PutNewline(); Put(Convert.ToString(number, number_format)); context.ExpectingValue = false; } public void WriteArrayEnd() { DoValidation(Condition.InArray); PutNewline(add_comma: false); ctx_stack.Pop(); if (ctx_stack.Count == 1) { has_reached_end = true; } else { context = ctx_stack.Peek(); context.ExpectingValue = false; } Unindent(); Put("]"); } public void WriteArrayStart() { DoValidation(Condition.NotAProperty); PutNewline(); Put("["); context = new WriterContext(); context.InArray = true; ctx_stack.Push(context); Indent(); } public void WriteObjectEnd() { DoValidation(Condition.InObject); PutNewline(add_comma: false); ctx_stack.Pop(); if (ctx_stack.Count == 1) { has_reached_end = true; } else { context = ctx_stack.Peek(); context.ExpectingValue = false; } Unindent(); Put("}"); } public void WriteObjectStart() { DoValidation(Condition.NotAProperty); PutNewline(); Put("{"); context = new WriterContext(); context.InObject = true; ctx_stack.Push(context); Indent(); } public void WritePropertyName(string property_name) { DoValidation(Condition.Property); PutNewline(); PutString(property_name); if (pretty_print) { if (property_name.Length > context.Padding) { context.Padding = property_name.Length; } for (int num = context.Padding - property_name.Length; num >= 0; num--) { writer.Write(' '); } writer.Write(": "); } else { writer.Write(':'); } context.ExpectingValue = true; } } internal class FsmContext { public bool Return; public int NextState; public Lexer L; public int StateStack; } internal class Lexer { private delegate bool StateHandler(FsmContext ctx); private static int[] fsm_return_table; private static StateHandler[] fsm_handler_table; private bool allow_comments; private bool allow_single_quoted_strings; private bool end_of_input; private FsmContext fsm_context; private int input_buffer; private int input_char; private TextReader reader; private int state; private StringBuilder string_buffer; private string string_value; private int token; private int unichar; public bool AllowComments { get { return allow_comments; } set { allow_comments = value; } } public bool AllowSingleQuotedStrings { get { return allow_single_quoted_strings; } set { allow_single_quoted_strings = value; } } public bool EndOfInput => end_of_input; public int Token => token; public string StringValue => string_value; static Lexer() { PopulateFsmTables(); } public Lexer(TextReader reader) { allow_comments = true; allow_single_quoted_strings = true; input_buffer = 0; string_buffer = new StringBuilder(128); state = 1; end_of_input = false; this.reader = reader; fsm_context = new FsmContext(); fsm_context.L = this; } private static int HexValue(int digit) { switch (digit) { case 65: case 97: return 10; case 66: case 98: return 11; case 67: case 99: return 12; case 68: case 100: return 13; case 69: case 101: return 14; case 70: case 102: return 15; default: return digit - 48; } } private static void PopulateFsmTables() { fsm_handler_table = new StateHandler[28] { State1, State2, State3, State4, State5, State6, State7, State8, State9, State10, State11, State12, State13, State14, State15, State16, State17, State18, State19, State20, State21, State22, State23, State24, State25, State26, State27, State28 }; fsm_return_table = new int[28] { 65542, 0, 65537, 65537, 0, 65537, 0, 65537, 0, 0, 65538, 0, 0, 0, 65539, 0, 0, 65540, 65541, 65542, 0, 0, 65541, 65542, 0, 0, 0, 0 }; } private static char ProcessEscChar(int esc_char) { switch (esc_char) { case 34: case 39: case 47: case 92: return Convert.ToChar(esc_char); case 110: return '\n'; case 116: return '\t'; case 114: return '\r'; case 98: return '\b'; case 102: return '\f'; default: return '?'; } } private static bool State1(FsmContext ctx) { while (ctx.L.GetChar()) { if (ctx.L.input_char == 32 || (ctx.L.input_char >= 9 && ctx.L.input_char <= 13)) { continue; } if (ctx.L.input_char >= 49 && ctx.L.input_char <= 57) { ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 3; return true; } switch (ctx.L.input_char) { case 34: ctx.NextState = 19; ctx.Return = true; return true; case 44: case 58: case 91: case 93: case 123: case 125: ctx.NextState = 1; ctx.Return = true; return true; case 45: ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 2; return true; case 48: ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 4; return true; case 102: ctx.NextState = 12; return true; case 110: ctx.NextState = 16; return true; case 116: ctx.NextState = 9; return true; case 39: if (!ctx.L.allow_single_quoted_strings) { return false; } ctx.L.input_char = 34; ctx.NextState = 23; ctx.Return = true; return true; case 47: if (!ctx.L.allow_comments) { return false; } ctx.NextState = 25; return true; default: return false; } } return true; } private static bool State2(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char >= 49 && ctx.L.input_char <= 57) { ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 3; return true; } int num = ctx.L.input_char; if (num == 48) { ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 4; return true; } return false; } private static bool State3(FsmContext ctx) { while (ctx.L.GetChar()) { if (ctx.L.input_char >= 48 && ctx.L.input_char <= 57) { ctx.L.string_buffer.Append((char)ctx.L.input_char); continue; } if (ctx.L.input_char == 32 || (ctx.L.input_char >= 9 && ctx.L.input_char <= 13)) { ctx.Return = true; ctx.NextState = 1; return true; } switch (ctx.L.input_char) { case 44: case 93: case 125: ctx.L.UngetChar(); ctx.Return = true; ctx.NextState = 1; return true; case 46: ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 5; return true; case 69: case 101: ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 7; return true; default: return false; } } return true; } private static bool State4(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char == 32 || (ctx.L.input_char >= 9 && ctx.L.input_char <= 13)) { ctx.Return = true; ctx.NextState = 1; return true; } switch (ctx.L.input_char) { case 44: case 93: case 125: ctx.L.UngetChar(); ctx.Return = true; ctx.NextState = 1; return true; case 46: ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 5; return true; case 69: case 101: ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 7; return true; default: return false; } } private static bool State5(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char >= 48 && ctx.L.input_char <= 57) { ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 6; return true; } return false; } private static bool State6(FsmContext ctx) { while (ctx.L.GetChar()) { if (ctx.L.input_char >= 48 && ctx.L.input_char <= 57) { ctx.L.string_buffer.Append((char)ctx.L.input_char); continue; } if (ctx.L.input_char == 32 || (ctx.L.input_char >= 9 && ctx.L.input_char <= 13)) { ctx.Return = true; ctx.NextState = 1; return true; } switch (ctx.L.input_char) { case 44: case 93: case 125: ctx.L.UngetChar(); ctx.Return = true; ctx.NextState = 1; return true; case 69: case 101: ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 7; return true; default: return false; } } return true; } private static bool State7(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char >= 48 && ctx.L.input_char <= 57) { ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 8; return true; } switch (ctx.L.input_char) { case 43: case 45: ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 8; return true; default: return false; } } private static bool State8(FsmContext ctx) { while (ctx.L.GetChar()) { if (ctx.L.input_char >= 48 && ctx.L.input_char <= 57) { ctx.L.string_buffer.Append((char)ctx.L.input_char); continue; } if (ctx.L.input_char == 32 || (ctx.L.input_char >= 9 && ctx.L.input_char <= 13)) { ctx.Return = true; ctx.NextState = 1; return true; } int num = ctx.L.input_char; if (num == 44 || num == 93 || num == 125) { ctx.L.UngetChar(); ctx.Return = true; ctx.NextState = 1; return true; } return false; } return true; } private static bool State9(FsmContext ctx) { ctx.L.GetChar(); int num = ctx.L.input_char; if (num == 114) { ctx.NextState = 10; return true; } return false; } private static bool State10(FsmContext ctx) { ctx.L.GetChar(); int num = ctx.L.input_char; if (num == 117) { ctx.NextState = 11; return true; } return false; } private static bool State11(FsmContext ctx) { ctx.L.GetChar(); int num = ctx.L.input_char; if (num == 101) { ctx.Return = true; ctx.NextState = 1; return true; } return false; } private static bool State12(FsmContext ctx) { ctx.L.GetChar(); int num = ctx.L.input_char; if (num == 97) { ctx.NextState = 13; return true; } return false; } private static bool State13(FsmContext ctx) { ctx.L.GetChar(); int num = ctx.L.input_char; if (num == 108) { ctx.NextState = 14; return true; } return false; } private static bool State14(FsmContext ctx) { ctx.L.GetChar(); int num = ctx.L.input_char; if (num == 115) { ctx.NextState = 15; return true; } return false; } private static bool State15(FsmContext ctx) { ctx.L.GetChar(); int num = ctx.L.input_char; if (num == 101) { ctx.Return = true; ctx.NextState = 1; return true; } return false; } private static bool State16(FsmContext ctx) { ctx.L.GetChar(); int num = ctx.L.input_char; if (num == 117) { ctx.NextState = 17; return true; } return false; } private static bool State17(FsmContext ctx) { ctx.L.GetChar(); int num = ctx.L.input_char; if (num == 108) { ctx.NextState = 18; return true; } return false; } private static bool State18(FsmContext ctx) { ctx.L.GetChar(); int num = ctx.L.input_char; if (num == 108) { ctx.Return = true; ctx.NextState = 1; return true; } return false; } private static bool State19(FsmContext ctx) { while (ctx.L.GetChar()) { switch (ctx.L.input_char) { case 34: ctx.L.UngetChar(); ctx.Return = true; ctx.NextState = 20; return true; case 92: ctx.StateStack = 19; ctx.NextState = 21; return true; } ctx.L.string_buffer.Append((char)ctx.L.input_char); } return true; } private static bool State20(FsmContext ctx) { ctx.L.GetChar(); int num = ctx.L.input_char; if (num == 34) { ctx.Return = true; ctx.NextState = 1; return true; } return false; } private static bool State21(FsmContext ctx) { ctx.L.GetChar(); switch (ctx.L.input_char) { case 117: ctx.NextState = 22; return true; case 34: case 39: case 47: case 92: case 98: case 102: case 110: case 114: case 116: ctx.L.string_buffer.Append(ProcessEscChar(ctx.L.input_char)); ctx.NextState = ctx.StateStack; return true; default: return false; } } private static bool State22(FsmContext ctx) { int num = 0; int num2 = 4096; ctx.L.unichar = 0; while (ctx.L.GetChar()) { if ((ctx.L.input_char >= 48 && ctx.L.input_char <= 57) || (ctx.L.input_char >= 65 && ctx.L.input_char <= 70) || (ctx.L.input_char >= 97 && ctx.L.input_char <= 102)) { ctx.L.unichar += HexValue(ctx.L.input_char) * num2; num++; num2 /= 16; if (num == 4) { ctx.L.string_buffer.Append(Convert.ToChar(ctx.L.unichar)); ctx.NextState = ctx.StateStack; return true; } continue; } return false; } return true; } private static bool State23(FsmContext ctx) { while (ctx.L.GetChar()) { switch (ctx.L.input_char) { case 39: ctx.L.UngetChar(); ctx.Return = true; ctx.NextState = 24; return true; case 92: ctx.StateStack = 23; ctx.NextState = 21; return true; } ctx.L.string_buffer.Append((char)ctx.L.input_char); } return true; } private static bool State24(FsmContext ctx) { ctx.L.GetChar(); int num = ctx.L.input_char; if (num == 39) { ctx.L.input_char = 34; ctx.Return = true; ctx.NextState = 1; return true; } return false; } private static bool State25(FsmContext ctx) { ctx.L.GetChar(); switch (ctx.L.input_char) { case 42: ctx.NextState = 27; return true; case 47: ctx.NextState = 26; return true; default: return false; } } private static bool State26(FsmContext ctx) { while (ctx.L.GetChar()) { if (ctx.L.input_char == 10) { ctx.NextState = 1; return true; } } return true; } private static bool State27(FsmContext ctx) { while (ctx.L.GetChar()) { if (ctx.L.input_char == 42) { ctx.NextState = 28; return true; } } return true; } private static bool State28(FsmContext ctx) { while (ctx.L.GetChar()) { if (ctx.L.input_char != 42) { if (ctx.L.input_char == 47) { ctx.NextState = 1; return true; } ctx.NextState = 27; return true; } } return true; } private bool GetChar() { if ((input_char = NextChar()) != -1) { return true; } end_of_input = true; return false; } private int NextChar() { if (input_buffer != 0) { int result = input_buffer; input_buffer = 0; return result; } return reader.Read(); } public bool NextToken() { fsm_context.Return = false; while (true) { StateHandler stateHandler = fsm_handler_table[state - 1]; if (!stateHandler(fsm_context)) { throw new JsonException(input_char); } if (end_of_input) { return false; } if (fsm_context.Return) { break; } state = fsm_context.NextState; } string_value = string_buffer.ToString(); string_buffer.Remove(0, string_buffer.Length); token = fsm_return_table[state - 1]; if (token == 65542) { token = input_char; } state = fsm_context.NextState; return true; } private void UngetChar() { input_buffer = input_char; } } internal enum ParserToken { None = 65536, Number, True, False, Null, CharSeq, Char, Text, Object, ObjectPrime, Pair, PairRest, Array, ArrayPrime, Value, ValueRest, String, End, Epsilon } }