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 HarmonyLib; using LitJson2; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("BalrondIdleActors")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("BalrondIdleActors")] [assembly: AssemblyCopyright("Copyright © 2022")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("cde312a0-cf19-4264-8616-e1c74774beed")] [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 class ArchetypeDialoguePresets { public static List greeting_generic = new List { "$tag_greeting_generic_1", "$tag_greeting_generic_2", "$tag_greeting_generic_3", "$tag_greeting_generic_4", "$tag_greeting_generic_5" }; public static List greeting_human = new List { "$tag_greeting_human_1", "$tag_greeting_human_2", "$tag_greeting_human_3", "$tag_greeting_human_4", "$tag_greeting_human_5" }; public static List greeting_dverger = new List { "$tag_greeting_dverger_1", "$tag_greeting_dverger_2", "$tag_greeting_dverger_3", "$tag_greeting_dverger_4", "$tag_greeting_dverger_5" }; public static List greeting_goblin = new List { "$tag_greeting_goblin_1", "$tag_greeting_goblin_2", "$tag_greeting_goblin_3", "$tag_greeting_goblin_4", "$tag_greeting_goblin_5" }; public static List greeting_priest = new List { "$tag_greeting_priest_1", "$tag_greeting_priest_2", "$tag_greeting_priest_3", "$tag_greeting_priest_4", "$tag_greeting_priest_5" }; public static List greeting_farmer = new List { "$tag_greeting_farmer_1", "$tag_greeting_farmer_2", "$tag_greeting_farmer_3", "$tag_greeting_farmer_4", "$tag_greeting_farmer_5" }; public static List greeting_blacksmith = new List { "$tag_greeting_blacksmith_1", "$tag_greeting_blacksmith_2", "$tag_greeting_blacksmith_3", "$tag_greeting_blacksmith_4", "$tag_greeting_blacksmith_5" }; public static List greeting_hunter = new List { "$tag_greeting_hunter_1", "$tag_greeting_hunter_2", "$tag_greeting_hunter_3", "$tag_greeting_hunter_4", "$tag_greeting_hunter_5" }; public static List greeting_guard = new List { "$tag_greeting_guard_1", "$tag_greeting_guard_2", "$tag_greeting_guard_3", "$tag_greeting_guard_4", "$tag_greeting_guard_5" }; public static List greeting_defender = new List { "$tag_greeting_guard_1", "$tag_greeting_guard_2", "$tag_greeting_guard_3", "$tag_greeting_guard_4", "$tag_greeting_guard_5" }; public static List greeting_villager = new List { "$tag_greeting_villager_1", "$tag_greeting_villager_2", "$tag_greeting_villager_3", "$tag_greeting_villager_4", "$tag_greeting_villager_5" }; public static List greeting_beggar = new List { "$tag_greeting_beggar_1", "$tag_greeting_beggar_2", "$tag_greeting_beggar_3", "$tag_greeting_beggar_4", "$tag_greeting_beggar_5" }; public static List greeting_merchant = new List { "$tag_greeting_merchant_1", "$tag_greeting_merchant_2", "$tag_greeting_merchant_3", "$tag_greeting_merchant_4", "$tag_greeting_merchant_5" }; public static List goodbye_generic = new List { "$tag_goodbye_generic_1", "$tag_goodbye_generic_2", "$tag_goodbye_generic_3", "$tag_goodbye_generic_4", "$tag_goodbye_generic_5" }; public static List goodbye_human = new List { "$tag_goodbye_human_1", "$tag_goodbye_human_2", "$tag_goodbye_human_3", "$tag_goodbye_human_4", "$tag_goodbye_human_5" }; public static List goodbye_dverger = new List { "$tag_goodbye_dverger_1", "$tag_goodbye_dverger_2", "$tag_goodbye_dverger_3", "$tag_goodbye_dverger_4", "$tag_goodbye_dverger_5" }; public static List goodbye_goblin = new List { "$tag_goodbye_goblin_1", "$tag_goodbye_goblin_2", "$tag_goodbye_goblin_3", "$tag_goodbye_goblin_4", "$tag_goodbye_goblin_5" }; public static List goodbye_priest = new List { "$tag_goodbye_priest_1", "$tag_goodbye_priest_2", "$tag_goodbye_priest_3", "$tag_goodbye_priest_4", "$tag_goodbye_priest_5" }; public static List goodbye_farmer = new List { "$tag_goodbye_farmer_1", "$tag_goodbye_farmer_2", "$tag_goodbye_farmer_3", "$tag_goodbye_farmer_4", "$tag_goodbye_farmer_5" }; public static List goodbye_blacksmith = new List { "$tag_goodbye_blacksmith_1", "$tag_goodbye_blacksmith_2", "$tag_goodbye_blacksmith_3", "$tag_goodbye_blacksmith_4", "$tag_goodbye_blacksmith_5" }; public static List goodbye_hunter = new List { "$tag_goodbye_hunter_1", "$tag_goodbye_hunter_2", "$tag_goodbye_hunter_3", "$tag_goodbye_hunter_4", "$tag_goodbye_hunter_5" }; public static List goodbye_guard = new List { "$tag_goodbye_guard_1", "$tag_goodbye_guard_2", "$tag_goodbye_guard_3", "$tag_goodbye_guard_4", "$tag_goodbye_guard_5" }; public static List goodbye_villager = new List { "$tag_goodbye_villager_1", "$tag_goodbye_villager_2", "$tag_goodbye_villager_3", "$tag_goodbye_villager_4", "$tag_goodbye_villager_5" }; public static List goodbye_beggar = new List { "$tag_goodbye_beggar_1", "$tag_goodbye_beggar_2", "$tag_goodbye_beggar_3", "$tag_goodbye_beggar_4", "$tag_goodbye_beggar_5" }; public static List goodbye_merchant = new List { "$tag_goodbye_merchant_1", "$tag_goodbye_merchant_2", "$tag_goodbye_merchant_3", "$tag_goodbye_merchant_4", "$tag_goodbye_merchant_5" }; public static List random_generic = new List { "$tag_random_generic_1", "$tag_random_generic_2", "$tag_random_generic_3", "$tag_random_generic_4", "$tag_random_generic_5" }; public static List random_human = new List { "$tag_random_human_1", "$tag_random_human_2", "$tag_random_human_3", "$tag_random_human_4", "$tag_random_human_5" }; public static List random_dverger = new List { "$tag_random_dverger_1", "$tag_random_dverger_2", "$tag_random_dverger_3", "$tag_random_dverger_4", "$tag_random_dverger_5" }; public static List random_goblin = new List { "$tag_random_goblin_1", "$tag_random_goblin_2", "$tag_random_goblin_3", "$tag_random_goblin_4", "$tag_random_goblin_5" }; public static List random_priest = new List { "$tag_random_priest_1", "$tag_random_priest_2", "$tag_random_priest_3", "$tag_random_priest_4", "$tag_random_priest_5" }; public static List random_farmer = new List { "$tag_random_farmer_1", "$tag_random_farmer_2", "$tag_random_farmer_3", "$tag_random_farmer_4", "$tag_random_farmer_5" }; public static List random_blacksmith = new List { "$tag_random_blacksmith_1", "$tag_random_blacksmith_2", "$tag_random_blacksmith_3", "$tag_random_blacksmith_4", "$tag_random_blacksmith_5" }; public static List random_hunter = new List { "$tag_random_hunter_1", "$tag_random_hunter_2", "$tag_random_hunter_3", "$tag_random_hunter_4", "$tag_random_hunter_5" }; public static List random_guard = new List { "$tag_random_guard_1", "$tag_random_guard_2", "$tag_random_guard_3", "$tag_random_guard_4", "$tag_random_guard_5" }; public static List random_villager = new List { "$tag_random_villager_1", "$tag_random_villager_2", "$tag_random_villager_3", "$tag_random_villager_4", "$tag_random_villager_5" }; public static List random_beggar = new List { "$tag_random_beggar_1", "$tag_random_beggar_2", "$tag_random_beggar_3", "$tag_random_beggar_4", "$tag_random_beggar_5" }; public static List random_merchant = new List { "$tag_random_merchant_1", "$tag_random_merchant_2", "$tag_random_merchant_3", "$tag_random_merchant_4", "$tag_random_merchant_5" }; public static List randomtalk_generic = new List { "$tag_randomtalk_generic_1", "$tag_randomtalk_generic_2", "$tag_randomtalk_generic_3", "$tag_randomtalk_generic_4", "$tag_randomtalk_generic_5" }; public static List randomtalk_human = new List { "$tag_randomtalk_human_1", "$tag_randomtalk_human_2", "$tag_randomtalk_human_3", "$tag_randomtalk_human_4", "$tag_randomtalk_human_5" }; public static List randomtalk_dverger = new List { "$tag_randomtalk_dverger_1", "$tag_randomtalk_dverger_2", "$tag_randomtalk_dverger_3", "$tag_randomtalk_dverger_4", "$tag_randomtalk_dverger_5" }; public static List randomtalk_goblin = new List { "$tag_randomtalk_goblin_1", "$tag_randomtalk_goblin_2", "$tag_randomtalk_goblin_3", "$tag_randomtalk_goblin_4", "$tag_randomtalk_goblin_5" }; public static List randomtalk_priest = new List { "$tag_randomtalk_priest_1", "$tag_randomtalk_priest_2", "$tag_randomtalk_priest_3", "$tag_randomtalk_priest_4", "$tag_randomtalk_priest_5" }; public static List randomtalk_farmer = new List { "$tag_randomtalk_farmer_1", "$tag_randomtalk_farmer_2", "$tag_randomtalk_farmer_3", "$tag_randomtalk_farmer_4", "$tag_randomtalk_farmer_5" }; public static List randomtalk_blacksmith = new List { "$tag_randomtalk_blacksmith_1", "$tag_randomtalk_blacksmith_2", "$tag_randomtalk_blacksmith_3", "$tag_randomtalk_blacksmith_4", "$tag_randomtalk_blacksmith_5" }; public static List randomtalk_hunter = new List { "$tag_randomtalk_hunter_1", "$tag_randomtalk_hunter_2", "$tag_randomtalk_hunter_3", "$tag_randomtalk_hunter_4", "$tag_randomtalk_hunter_5" }; public static List randomtalk_guard = new List { "$tag_randomtalk_guard_1", "$tag_randomtalk_guard_2", "$tag_randomtalk_guard_3", "$tag_randomtalk_guard_4", "$tag_randomtalk_guard_5" }; public static List randomtalk_villager = new List { "$tag_randomtalk_villager_1", "$tag_randomtalk_villager_2", "$tag_randomtalk_villager_3", "$tag_randomtalk_villager_4", "$tag_randomtalk_villager_5" }; public static List randomtalk_beggar = new List { "$tag_randomtalk_beggar_1", "$tag_randomtalk_beggar_2", "$tag_randomtalk_beggar_3", "$tag_randomtalk_beggar_4", "$tag_randomtalk_beggar_5" }; public static List randomtalk_merchant = new List { "$tag_randomtalk_merchant_1", "$tag_randomtalk_merchant_2", "$tag_randomtalk_merchant_3", "$tag_randomtalk_merchant_4", "$tag_randomtalk_merchant_5" }; public static List randomtalkinfaction_generic = new List { "$tag_randomtalkinfaction_generic_1", "$tag_randomtalkinfaction_generic_2", "$tag_randomtalkinfaction_generic_3", "$tag_randomtalkinfaction_generic_4", "$tag_randomtalkinfaction_generic_5" }; public static List randomtalkinfaction_human = new List { "$tag_randomtalkinfaction_human_1", "$tag_randomtalkinfaction_human_2", "$tag_randomtalkinfaction_human_3", "$tag_randomtalkinfaction_human_4", "$tag_randomtalkinfaction_human_5" }; public static List randomtalkinfaction_dverger = new List { "$tag_randomtalkinfaction_dverger_1", "$tag_randomtalkinfaction_dverger_2", "$tag_randomtalkinfaction_dverger_3", "$tag_randomtalkinfaction_dverger_4", "$tag_randomtalkinfaction_dverger_5" }; public static List randomtalkinfaction_goblin = new List { "$tag_randomtalkinfaction_goblin_1", "$tag_randomtalkinfaction_goblin_2", "$tag_randomtalkinfaction_goblin_3", "$tag_randomtalkinfaction_goblin_4", "$tag_randomtalkinfaction_goblin_5" }; public static List randomtalkinfaction_priest = new List { "$tag_randomtalkinfaction_priest_1", "$tag_randomtalkinfaction_priest_2", "$tag_randomtalkinfaction_priest_3", "$tag_randomtalkinfaction_priest_4", "$tag_randomtalkinfaction_priest_5" }; public static List randomtalkinfaction_farmer = new List { "$tag_randomtalkinfaction_farmer_1", "$tag_randomtalkinfaction_farmer_2", "$tag_randomtalkinfaction_farmer_3", "$tag_randomtalkinfaction_farmer_4", "$tag_randomtalkinfaction_farmer_5" }; public static List randomtalkinfaction_blacksmith = new List { "$tag_randomtalkinfaction_blacksmith_1", "$tag_randomtalkinfaction_blacksmith_2", "$tag_randomtalkinfaction_blacksmith_3", "$tag_randomtalkinfaction_blacksmith_4", "$tag_randomtalkinfaction_blacksmith_5" }; public static List randomtalkinfaction_hunter = new List { "$tag_randomtalkinfaction_hunter_1", "$tag_randomtalkinfaction_hunter_2", "$tag_randomtalkinfaction_hunter_3", "$tag_randomtalkinfaction_hunter_4", "$tag_randomtalkinfaction_hunter_5" }; public static List randomtalkinfaction_guard = new List { "$tag_randomtalkinfaction_guard_1", "$tag_randomtalkinfaction_guard_2", "$tag_randomtalkinfaction_guard_3", "$tag_randomtalkinfaction_guard_4", "$tag_randomtalkinfaction_guard_5" }; public static List randomtalkinfaction_villager = new List { "$tag_randomtalkinfaction_villager_1", "$tag_randomtalkinfaction_villager_2", "$tag_randomtalkinfaction_villager_3", "$tag_randomtalkinfaction_villager_4", "$tag_randomtalkinfaction_villager_5" }; public static List randomtalkinfaction_beggar = new List { "$tag_randomtalkinfaction_beggar_1", "$tag_randomtalkinfaction_beggar_2", "$tag_randomtalkinfaction_beggar_3", "$tag_randomtalkinfaction_beggar_4", "$tag_randomtalkinfaction_beggar_5" }; public static List randomtalkinfaction_merchant = new List { "$tag_randomtalkinfaction_merchant_1", "$tag_randomtalkinfaction_merchant_2", "$tag_randomtalkinfaction_merchant_3", "$tag_randomtalkinfaction_merchant_4", "$tag_randomtalkinfaction_merchant_5" }; public static List privatealarm_generic = new List { "$tag_privatealarm_generic_1", "$tag_privatealarm_generic_2", "$tag_privatealarm_generic_3", "$tag_privatealarm_generic_4", "$tag_privatealarm_generic_5" }; public static List privatealarm_human = new List { "$tag_privatealarm_human_1", "$tag_privatealarm_human_2", "$tag_privatealarm_human_3", "$tag_privatealarm_human_4", "$tag_privatealarm_human_5" }; public static List privatealarm_dverger = new List { "$tag_privatealarm_dverger_1", "$tag_privatealarm_dverger_2", "$tag_privatealarm_dverger_3", "$tag_privatealarm_dverger_4", "$tag_privatealarm_dverger_5" }; public static List privatealarm_goblin = new List { "$tag_privatealarm_goblin_1", "$tag_privatealarm_goblin_2", "$tag_privatealarm_goblin_3", "$tag_privatealarm_goblin_4", "$tag_privatealarm_goblin_5" }; public static List privatealarm_priest = new List { "$tag_privatealarm_priest_1", "$tag_privatealarm_priest_2", "$tag_privatealarm_priest_3", "$tag_privatealarm_priest_4", "$tag_privatealarm_priest_5" }; public static List privatealarm_farmer = new List { "$tag_privatealarm_farmer_1", "$tag_privatealarm_farmer_2", "$tag_privatealarm_farmer_3", "$tag_privatealarm_farmer_4", "$tag_privatealarm_farmer_5" }; public static List privatealarm_blacksmith = new List { "$tag_privatealarm_blacksmith_1", "$tag_privatealarm_blacksmith_2", "$tag_privatealarm_blacksmith_3", "$tag_privatealarm_blacksmith_4", "$tag_privatealarm_blacksmith_5" }; public static List privatealarm_hunter = new List { "$tag_privatealarm_hunter_1", "$tag_privatealarm_hunter_2", "$tag_privatealarm_hunter_3", "$tag_privatealarm_hunter_4", "$tag_privatealarm_hunter_5" }; public static List privatealarm_guard = new List { "$tag_privatealarm_guard_1", "$tag_privatealarm_guard_2", "$tag_privatealarm_guard_3", "$tag_privatealarm_guard_4", "$tag_privatealarm_guard_5" }; public static List privatealarm_villager = new List { "$tag_privatealarm_villager_1", "$tag_privatealarm_villager_2", "$tag_privatealarm_villager_3", "$tag_privatealarm_villager_4", "$tag_privatealarm_villager_5" }; public static List privatealarm_beggar = new List { "$tag_privatealarm_beggar_1", "$tag_privatealarm_beggar_2", "$tag_privatealarm_beggar_3", "$tag_privatealarm_beggar_4", "$tag_privatealarm_beggar_5" }; public static List privatealarm_merchant = new List { "$tag_privatealarm_merchant_1", "$tag_privatealarm_merchant_2", "$tag_privatealarm_merchant_3", "$tag_privatealarm_merchant_4", "$tag_privatealarm_merchant_5" }; public static List aggravated_generic = new List { "$tag_aggravated_generic_1", "$tag_aggravated_generic_2", "$tag_aggravated_generic_3", "$tag_aggravated_generic_4", "$tag_aggravated_generic_5" }; public static List aggravated_human = new List { "$tag_aggravated_human_1", "$tag_aggravated_human_2", "$tag_aggravated_human_3", "$tag_aggravated_human_4", "$tag_aggravated_human_5" }; public static List aggravated_dverger = new List { "$tag_aggravated_dverger_1", "$tag_aggravated_dverger_2", "$tag_aggravated_dverger_3", "$tag_aggravated_dverger_4", "$tag_aggravated_dverger_5" }; public static List aggravated_goblin = new List { "$tag_aggravated_goblin_1", "$tag_aggravated_goblin_2", "$tag_aggravated_goblin_3", "$tag_aggravated_goblin_4", "$tag_aggravated_goblin_5" }; public static List aggravated_priest = new List { "$tag_aggravated_priest_1", "$tag_aggravated_priest_2", "$tag_aggravated_priest_3", "$tag_aggravated_priest_4", "$tag_aggravated_priest_5" }; public static List aggravated_farmer = new List { "$tag_aggravated_farmer_1", "$tag_aggravated_farmer_2", "$tag_aggravated_farmer_3", "$tag_aggravated_farmer_4", "$tag_aggravated_farmer_5" }; public static List aggravated_blacksmith = new List { "$tag_aggravated_blacksmith_1", "$tag_aggravated_blacksmith_2", "$tag_aggravated_blacksmith_3", "$tag_aggravated_blacksmith_4", "$tag_aggravated_blacksmith_5" }; public static List aggravated_hunter = new List { "$tag_aggravated_hunter_1", "$tag_aggravated_hunter_2", "$tag_aggravated_hunter_3", "$tag_aggravated_hunter_4", "$tag_aggravated_hunter_5" }; public static List aggravated_guard = new List { "$tag_aggravated_guard_1", "$tag_aggravated_guard_2", "$tag_aggravated_guard_3", "$tag_aggravated_guard_4", "$tag_aggravated_guard_5" }; public static List aggravated_villager = new List { "$tag_aggravated_villager_1", "$tag_aggravated_villager_2", "$tag_aggravated_villager_3", "$tag_aggravated_villager_4", "$tag_aggravated_villager_5" }; public static List aggravated_beggar = new List { "$tag_aggravated_beggar_1", "$tag_aggravated_beggar_2", "$tag_aggravated_beggar_3", "$tag_aggravated_beggar_4", "$tag_aggravated_beggar_5" }; public static List aggravated_merchant = new List { "$tag_aggravated_merchant_1", "$tag_aggravated_merchant_2", "$tag_aggravated_merchant_3", "$tag_aggravated_merchant_4", "$tag_aggravated_merchant_5" }; public static List starttrade_generic = new List { "$tag_starttrade_generic_1", "$tag_starttrade_generic_2", "$tag_starttrade_generic_3", "$tag_starttrade_generic_4", "$tag_starttrade_generic_5" }; public static List starttrade_human = new List { "$tag_starttrade_human_1", "$tag_starttrade_human_2", "$tag_starttrade_human_3", "$tag_starttrade_human_4", "$tag_starttrade_human_5" }; public static List starttrade_dverger = new List { "$tag_starttrade_dverger_1", "$tag_starttrade_dverger_2", "$tag_starttrade_dverger_3", "$tag_starttrade_dverger_4", "$tag_starttrade_dverger_5" }; public static List starttrade_goblin = new List { "$tag_starttrade_goblin_1", "$tag_starttrade_goblin_2", "$tag_starttrade_goblin_3", "$tag_starttrade_goblin_4", "$tag_starttrade_goblin_5" }; public static List starttrade_priest = new List { "$tag_starttrade_priest_1", "$tag_starttrade_priest_2", "$tag_starttrade_priest_3", "$tag_starttrade_priest_4", "$tag_starttrade_priest_5" }; public static List starttrade_farmer = new List { "$tag_starttrade_farmer_1", "$tag_starttrade_farmer_2", "$tag_starttrade_farmer_3", "$tag_starttrade_farmer_4", "$tag_starttrade_farmer_5" }; public static List starttrade_blacksmith = new List { "$tag_starttrade_blacksmith_1", "$tag_starttrade_blacksmith_2", "$tag_starttrade_blacksmith_3", "$tag_starttrade_blacksmith_4", "$tag_starttrade_blacksmith_5" }; public static List starttrade_hunter = new List { "$tag_starttrade_hunter_1", "$tag_starttrade_hunter_2", "$tag_starttrade_hunter_3", "$tag_starttrade_hunter_4", "$tag_starttrade_hunter_5" }; public static List starttrade_guard = new List { "$tag_starttrade_guard_1", "$tag_starttrade_guard_2", "$tag_starttrade_guard_3", "$tag_starttrade_guard_4", "$tag_starttrade_guard_5" }; public static List starttrade_villager = new List { "$tag_starttrade_villager_1", "$tag_starttrade_villager_2", "$tag_starttrade_villager_3", "$tag_starttrade_villager_4", "$tag_starttrade_villager_5" }; public static List starttrade_beggar = new List { "$tag_starttrade_beggar_1", "$tag_starttrade_beggar_2", "$tag_starttrade_beggar_3", "$tag_starttrade_beggar_4", "$tag_starttrade_beggar_5" }; public static List starttrade_merchant = new List { "$tag_starttrade_merchant_1", "$tag_starttrade_merchant_2", "$tag_starttrade_merchant_3", "$tag_starttrade_merchant_4", "$tag_starttrade_merchant_5" }; public static List buy_generic = new List { "$tag_buy_generic_1", "$tag_buy_generic_2", "$tag_buy_generic_3", "$tag_buy_generic_4", "$tag_buy_generic_5" }; public static List buy_human = new List { "$tag_buy_human_1", "$tag_buy_human_2", "$tag_buy_human_3", "$tag_buy_human_4", "$tag_buy_human_5" }; public static List buy_dverger = new List { "$tag_buy_dverger_1", "$tag_buy_dverger_2", "$tag_buy_dverger_3", "$tag_buy_dverger_4", "$tag_buy_dverger_5" }; public static List buy_goblin = new List { "$tag_buy_goblin_1", "$tag_buy_goblin_2", "$tag_buy_goblin_3", "$tag_buy_goblin_4", "$tag_buy_goblin_5" }; public static List buy_priest = new List { "$tag_buy_priest_1", "$tag_buy_priest_2", "$tag_buy_priest_3", "$tag_buy_priest_4", "$tag_buy_priest_5" }; public static List buy_farmer = new List { "$tag_buy_farmer_1", "$tag_buy_farmer_2", "$tag_buy_farmer_3", "$tag_buy_farmer_4", "$tag_buy_farmer_5" }; public static List buy_blacksmith = new List { "$tag_buy_blacksmith_1", "$tag_buy_blacksmith_2", "$tag_buy_blacksmith_3", "$tag_buy_blacksmith_4", "$tag_buy_blacksmith_5" }; public static List buy_hunter = new List { "$tag_buy_hunter_1", "$tag_buy_hunter_2", "$tag_buy_hunter_3", "$tag_buy_hunter_4", "$tag_buy_hunter_5" }; public static List buy_guard = new List { "$tag_buy_guard_1", "$tag_buy_guard_2", "$tag_buy_guard_3", "$tag_buy_guard_4", "$tag_buy_guard_5" }; public static List buy_villager = new List { "$tag_buy_villager_1", "$tag_buy_villager_2", "$tag_buy_villager_3", "$tag_buy_villager_4", "$tag_buy_villager_5" }; public static List buy_beggar = new List { "$tag_buy_beggar_1", "$tag_buy_beggar_2", "$tag_buy_beggar_3", "$tag_buy_beggar_4", "$tag_buy_beggar_5" }; public static List buy_merchant = new List { "$tag_buy_merchant_1", "$tag_buy_merchant_2", "$tag_buy_merchant_3", "$tag_buy_merchant_4", "$tag_buy_merchant_5" }; public static List sell_generic = new List { "$tag_sell_generic_1", "$tag_sell_generic_2", "$tag_sell_generic_3", "$tag_sell_generic_4", "$tag_sell_generic_5" }; public static List sell_human = new List { "$tag_sell_human_1", "$tag_sell_human_2", "$tag_sell_human_3", "$tag_sell_human_4", "$tag_sell_human_5" }; public static List sell_dverger = new List { "$tag_sell_dverger_1", "$tag_sell_dverger_2", "$tag_sell_dverger_3", "$tag_sell_dverger_4", "$tag_sell_dverger_5" }; public static List sell_goblin = new List { "$tag_sell_goblin_1", "$tag_sell_goblin_2", "$tag_sell_goblin_3", "$tag_sell_goblin_4", "$tag_sell_goblin_5" }; public static List sell_priest = new List { "$tag_sell_priest_1", "$tag_sell_priest_2", "$tag_sell_priest_3", "$tag_sell_priest_4", "$tag_sell_priest_5" }; public static List sell_farmer = new List { "$tag_sell_farmer_1", "$tag_sell_farmer_2", "$tag_sell_farmer_3", "$tag_sell_farmer_4", "$tag_sell_farmer_5" }; public static List sell_blacksmith = new List { "$tag_sell_blacksmith_1", "$tag_sell_blacksmith_2", "$tag_sell_blacksmith_3", "$tag_sell_blacksmith_4", "$tag_sell_blacksmith_5" }; public static List sell_hunter = new List { "$tag_sell_hunter_1", "$tag_sell_hunter_2", "$tag_sell_hunter_3", "$tag_sell_hunter_4", "$tag_sell_hunter_5" }; public static List sell_guard = new List { "$tag_sell_guard_1", "$tag_sell_guard_2", "$tag_sell_guard_3", "$tag_sell_guard_4", "$tag_sell_guard_5" }; public static List sell_villager = new List { "$tag_sell_villager_1", "$tag_sell_villager_2", "$tag_sell_villager_3", "$tag_sell_villager_4", "$tag_sell_villager_5" }; public static List sell_beggar = new List { "$tag_sell_beggar_1", "$tag_sell_beggar_2", "$tag_sell_beggar_3", "$tag_sell_beggar_4", "$tag_sell_beggar_5" }; public static List sell_merchant = new List { "$tag_sell_merchant_1", "$tag_sell_merchant_2", "$tag_sell_merchant_3", "$tag_sell_merchant_4", "$tag_sell_merchant_5" }; public static List greeting_lumberjack = new List { "$tag_greeting_lumberjack_1", "$tag_greeting_lumberjack_2", "$tag_greeting_lumberjack_3", "$tag_greeting_lumberjack_4", "$tag_greeting_lumberjack_5" }; public static List goodbye_lumberjack = new List { "$tag_goodbye_lumberjack_1", "$tag_goodbye_lumberjack_2", "$tag_goodbye_lumberjack_3", "$tag_goodbye_lumberjack_4", "$tag_goodbye_lumberjack_5" }; public static List randomtalk_lumberjack = new List { "$tag_randomtalk_lumberjack_1", "$tag_randomtalk_lumberjack_2", "$tag_randomtalk_lumberjack_3", "$tag_randomtalk_lumberjack_4", "$tag_randomtalk_lumberjack_5" }; public static List randomtalkinfaction_lumberjack = new List { "$tag_randomtalkinfaction_lumberjack_1", "$tag_randomtalkinfaction_lumberjack_2", "$tag_randomtalkinfaction_lumberjack_3", "$tag_randomtalkinfaction_lumberjack_4", "$tag_randomtalkinfaction_lumberjack_5" }; public static List privatealarm_lumberjack = new List { "$tag_privatealarm_lumberjack_1", "$tag_privatealarm_lumberjack_2", "$tag_privatealarm_lumberjack_3", "$tag_privatealarm_lumberjack_4", "$tag_privatealarm_lumberjack_5" }; public static List aggravated_lumberjack = new List { "$tag_aggravated_lumberjack_1", "$tag_aggravated_lumberjack_2", "$tag_aggravated_lumberjack_3", "$tag_aggravated_lumberjack_4", "$tag_aggravated_lumberjack_5" }; public static List starttrade_lumberjack = new List { "$tag_starttrade_lumberjack_1", "$tag_starttrade_lumberjack_2", "$tag_starttrade_lumberjack_3", "$tag_starttrade_lumberjack_4", "$tag_starttrade_lumberjack_5" }; public static List buy_lumberjack = new List { "$tag_buy_lumberjack_1", "$tag_buy_lumberjack_2", "$tag_buy_lumberjack_3", "$tag_buy_lumberjack_4", "$tag_buy_lumberjack_5" }; public static List sell_lumberjack = new List { "$tag_sell_lumberjack_1", "$tag_sell_lumberjack_2", "$tag_sell_lumberjack_3", "$tag_sell_lumberjack_4", "$tag_sell_lumberjack_5" }; public static List greeting_miner = new List { "$tag_greeting_miner_1", "$tag_greeting_miner_2", "$tag_greeting_miner_3", "$tag_greeting_miner_4", "$tag_greeting_miner_5" }; public static List goodbye_miner = new List { "$tag_goodbye_miner_1", "$tag_goodbye_miner_2", "$tag_goodbye_miner_3", "$tag_goodbye_miner_4", "$tag_goodbye_miner_5" }; public static List randomtalk_miner = new List { "$tag_randomtalk_miner_1", "$tag_randomtalk_miner_2", "$tag_randomtalk_miner_3", "$tag_randomtalk_miner_4", "$tag_randomtalk_miner_5" }; public static List randomtalkinfaction_miner = new List { "$tag_randomtalkinfaction_miner_1", "$tag_randomtalkinfaction_miner_2", "$tag_randomtalkinfaction_miner_3", "$tag_randomtalkinfaction_miner_4", "$tag_randomtalkinfaction_miner_5" }; public static List privatealarm_miner = new List { "$tag_privatealarm_miner_1", "$tag_privatealarm_miner_2", "$tag_privatealarm_miner_3", "$tag_privatealarm_miner_4", "$tag_privatealarm_miner_5" }; public static List aggravated_miner = new List { "$tag_aggravated_miner_1", "$tag_aggravated_miner_2", "$tag_aggravated_miner_3", "$tag_aggravated_miner_4", "$tag_aggravated_miner_5" }; public static List starttrade_miner = new List { "$tag_starttrade_miner_1", "$tag_starttrade_miner_2", "$tag_starttrade_miner_3", "$tag_starttrade_miner_4", "$tag_starttrade_miner_5" }; public static List buy_miner = new List { "$tag_buy_miner_1", "$tag_buy_miner_2", "$tag_buy_miner_3", "$tag_buy_miner_4", "$tag_buy_miner_5" }; public static List sell_miner = new List { "$tag_sell_miner_1", "$tag_sell_miner_2", "$tag_sell_miner_3", "$tag_sell_miner_4", "$tag_sell_miner_5" }; public static List randomtalkinfaction_innkeeper = new List { "$tag_randomtalkinfaction_innkeeper_1", "$tag_randomtalkinfaction_innkeeper_2", "$tag_randomtalkinfaction_innkeeper_3", "$tag_randomtalkinfaction_innkeeper_4", "$tag_randomtalkinfaction_innkeeper_5" }; public static List privatealarm_innkeeper = new List { "$tag_privatealarm_innkeeper_1", "$tag_privatealarm_innkeeper_2", "$tag_privatealarm_innkeeper_3", "$tag_privatealarm_innkeeper_4", "$tag_privatealarm_innkeeper_5" }; public static List aggravated_innkeeper = new List { "$tag_aggravated_innkeeper_1", "$tag_aggravated_innkeeper_2", "$tag_aggravated_innkeeper_3", "$tag_aggravated_innkeeper_4", "$tag_aggravated_innkeeper_5" }; public static List starttrade_innkeeper = new List { "$tag_starttrade_innkeeper_1", "$tag_starttrade_innkeeper_2", "$tag_starttrade_innkeeper_3", "$tag_starttrade_innkeeper_4", "$tag_starttrade_innkeeper_5" }; public static List buy_innkeeper = new List { "$tag_buy_innkeeper_1", "$tag_buy_innkeeper_2", "$tag_buy_innkeeper_3", "$tag_buy_innkeeper_4", "$tag_buy_innkeeper_5" }; public static List sell_innkeeper = new List { "$tag_sell_innkeeper_1", "$tag_sell_innkeeper_2", "$tag_sell_innkeeper_3", "$tag_sell_innkeeper_4", "$tag_sell_innkeeper_5" }; public static List greeting_barpatron = new List { "$tag_greeting_barpatron_1", "$tag_greeting_barpatron_2", "$tag_greeting_barpatron_3", "$tag_greeting_barpatron_4", "$tag_greeting_barpatron_5" }; public static List goodbye_barpatron = new List { "$tag_goodbye_barpatron_1", "$tag_goodbye_barpatron_2", "$tag_goodbye_barpatron_3", "$tag_goodbye_barpatron_4", "$tag_goodbye_barpatron_5" }; public static List randomtalk_barpatron = new List { "$tag_randomtalk_barpatron_1", "$tag_randomtalk_barpatron_2", "$tag_randomtalk_barpatron_3", "$tag_randomtalk_barpatron_4", "$tag_randomtalk_barpatron_5" }; public static List randomtalkinfaction_barpatron = new List { "$tag_randomtalkinfaction_barpatron_1", "$tag_randomtalkinfaction_barpatron_2", "$tag_randomtalkinfaction_barpatron_3", "$tag_randomtalkinfaction_barpatron_4", "$tag_randomtalkinfaction_barpatron_5" }; public static List privatealarm_barpatron = new List { "$tag_privatealarm_barpatron_1", "$tag_privatealarm_barpatron_2", "$tag_privatealarm_barpatron_3", "$tag_privatealarm_barpatron_4", "$tag_privatealarm_barpatron_5" }; public static List aggravated_barpatron = new List { "$tag_aggravated_barpatron_1", "$tag_aggravated_barpatron_2", "$tag_aggravated_barpatron_3", "$tag_aggravated_barpatron_4", "$tag_aggravated_barpatron_5" }; public static List starttrade_fisherman = new List { "$tag_starttrade_fisherman_1", "$tag_starttrade_fisherman_2", "$tag_starttrade_fisherman_3", "$tag_starttrade_fisherman_4", "$tag_starttrade_fisherman_5" }; public static List buy_fisherman = new List { "$tag_buy_fisherman_1", "$tag_buy_fisherman_2", "$tag_buy_fisherman_3", "$tag_buy_fisherman_4", "$tag_buy_fisherman_5" }; public static List sell_fisherman = new List { "$tag_sell_fisherman_1", "$tag_sell_fisherman_2", "$tag_sell_fisherman_3", "$tag_sell_fisherman_4", "$tag_sell_fisherman_5" }; public static List starttrade_butcher = new List { "$tag_starttrade_butcher_1", "$tag_starttrade_butcher_2", "$tag_starttrade_butcher_3", "$tag_starttrade_butcher_4", "$tag_starttrade_butcher_5" }; public static List buy_butcher = new List { "$tag_buy_butcher_1", "$tag_buy_butcher_2", "$tag_buy_butcher_3", "$tag_buy_butcher_4", "$tag_buy_butcher_5" }; public static List sell_butcher = new List { "$tag_sell_butcher_1", "$tag_sell_butcher_2", "$tag_sell_butcher_3", "$tag_sell_butcher_4", "$tag_sell_butcher_5" }; public static List starttrade_forager = new List { "$tag_starttrade_forager_1", "$tag_starttrade_forager_2", "$tag_starttrade_forager_3", "$tag_starttrade_forager_4", "$tag_starttrade_forager_5" }; public static List buy_forager = new List { "$tag_buy_forager_1", "$tag_buy_forager_2", "$tag_buy_forager_3", "$tag_buy_forager_4", "$tag_buy_forager_5" }; public static List sell_forager = new List { "$tag_sell_forager_1", "$tag_sell_forager_2", "$tag_sell_forager_3", "$tag_sell_forager_4", "$tag_sell_forager_5" }; public static List greeting_fisherman = new List { "$tag_greeting_fisherman_1", "$tag_greeting_fisherman_2", "$tag_greeting_fisherman_3", "$tag_greeting_fisherman_4", "$tag_greeting_fisherman_5" }; public static List goodbye_fisherman = new List { "$tag_goodbye_fisherman_1", "$tag_goodbye_fisherman_2", "$tag_goodbye_fisherman_3", "$tag_goodbye_fisherman_4", "$tag_goodbye_fisherman_5" }; public static List randomtalk_fisherman = new List { "$tag_randomtalk_fisherman_1", "$tag_randomtalk_fisherman_2", "$tag_randomtalk_fisherman_3", "$tag_randomtalk_fisherman_4", "$tag_randomtalk_fisherman_5" }; public static List randomtalkinfaction_fisherman = new List { "$tag_randomtalkinfaction_fisherman_1", "$tag_randomtalkinfaction_fisherman_2", "$tag_randomtalkinfaction_fisherman_3", "$tag_randomtalkinfaction_fisherman_4", "$tag_randomtalkinfaction_fisherman_5" }; public static List aggravated_fisherman = new List { "$tag_aggravated_fisherman_1", "$tag_aggravated_fisherman_2", "$tag_aggravated_fisherman_3", "$tag_aggravated_fisherman_4", "$tag_aggravated_fisherman_5" }; public static List greeting_butcher = new List { "$tag_greeting_butcher_1", "$tag_greeting_butcher_2", "$tag_greeting_butcher_3", "$tag_greeting_butcher_4", "$tag_greeting_butcher_5" }; public static List goodbye_butcher = new List { "$tag_goodbye_butcher_1", "$tag_goodbye_butcher_2", "$tag_goodbye_butcher_3", "$tag_goodbye_butcher_4", "$tag_goodbye_butcher_5" }; public static List randomtalk_butcher = new List { "$tag_randomtalk_butcher_1", "$tag_randomtalk_butcher_2", "$tag_randomtalk_butcher_3", "$tag_randomtalk_butcher_4", "$tag_randomtalk_butcher_5" }; public static List randomtalkinfaction_butcher = new List { "$tag_randomtalkinfaction_butcher_1", "$tag_randomtalkinfaction_butcher_2", "$tag_randomtalkinfaction_butcher_3", "$tag_randomtalkinfaction_butcher_4", "$tag_randomtalkinfaction_butcher_5" }; public static List aggravated_butcher = new List { "$tag_aggravated_butcher_1", "$tag_aggravated_butcher_2", "$tag_aggravated_butcher_3", "$tag_aggravated_butcher_4", "$tag_aggravated_butcher_5" }; public static List greeting_forager = new List { "$tag_greeting_forager_1", "$tag_greeting_forager_2", "$tag_greeting_forager_3", "$tag_greeting_forager_4", "$tag_greeting_forager_5" }; public static List goodbye_forager = new List { "$tag_goodbye_forager_1", "$tag_goodbye_forager_2", "$tag_goodbye_forager_3", "$tag_goodbye_forager_4", "$tag_goodbye_forager_5" }; public static List randomtalk_forager = new List { "$tag_randomtalk_forager_1", "$tag_randomtalk_forager_2", "$tag_randomtalk_forager_3", "$tag_randomtalk_forager_4", "$tag_randomtalk_forager_5" }; public static List randomtalkinfaction_forager = new List { "$tag_randomtalkinfaction_forager_1", "$tag_randomtalkinfaction_forager_2", "$tag_randomtalkinfaction_forager_3", "$tag_randomtalkinfaction_forager_4", "$tag_randomtalkinfaction_forager_5" }; public static List aggravated_forager = new List { "$tag_aggravated_forager_1", "$tag_aggravated_forager_2", "$tag_aggravated_forager_3", "$tag_aggravated_forager_4", "$tag_aggravated_forager_5" }; private static Dictionary> allDialogLists = new Dictionary> { { "randomtalkinfaction_innkeeper", randomtalkinfaction_innkeeper }, { "privatealarm_innkeeper", privatealarm_innkeeper }, { "aggravated_innkeeper", aggravated_innkeeper }, { "starttrade_innkeeper", starttrade_innkeeper }, { "buy_innkeeper", buy_innkeeper }, { "sell_innkeeper", sell_innkeeper }, { "greeting_barpatron", greeting_barpatron }, { "goodbye_barpatron", goodbye_barpatron }, { "randomtalk_barpatron", randomtalk_barpatron }, { "randomtalkinfaction_barpatron", randomtalkinfaction_barpatron }, { "privatealarm_barpatron", privatealarm_barpatron }, { "aggravated_barpatron", aggravated_barpatron }, { "starttrade_barpatron", new List() }, { "buy_barpatron", new List() }, { "sell_barpatron", new List() }, { "starttrade_fisherman", starttrade_fisherman }, { "buy_fisherman", buy_fisherman }, { "sell_fisherman", sell_fisherman }, { "starttrade_butcher", starttrade_butcher }, { "buy_butcher", buy_butcher }, { "sell_butcher", sell_butcher }, { "starttrade_forager", starttrade_forager }, { "buy_forager", buy_forager }, { "sell_forager", sell_forager }, { "greeting_fisherman", greeting_fisherman }, { "goodbye_fisherman", goodbye_fisherman }, { "randomtalk_fisherman", randomtalk_fisherman }, { "randomtalkinfaction_fisherman", randomtalkinfaction_fisherman }, { "aggravated_fisherman", aggravated_fisherman }, { "greeting_butcher", greeting_butcher }, { "goodbye_butcher", goodbye_butcher }, { "randomtalk_butcher", randomtalk_butcher }, { "randomtalkinfaction_butcher", randomtalkinfaction_butcher }, { "aggravated_butcher", aggravated_butcher }, { "greeting_forager", greeting_forager }, { "goodbye_forager", goodbye_forager }, { "randomtalk_forager", randomtalk_forager }, { "randomtalkinfaction_forager", randomtalkinfaction_forager }, { "aggravated_forager", aggravated_forager }, { "greeting_generic", greeting_generic }, { "greeting_human", greeting_human }, { "greeting_dverger", greeting_dverger }, { "greeting_goblin", greeting_goblin }, { "greeting_priest", greeting_priest }, { "greeting_farmer", greeting_farmer }, { "greeting_blacksmith", greeting_blacksmith }, { "greeting_hunter", greeting_hunter }, { "greeting_guard", greeting_guard }, { "greeting_villager", greeting_villager }, { "greeting_beggar", greeting_beggar }, { "greeting_merchant", greeting_merchant }, { "greeting_lumberjack", greeting_lumberjack }, { "greeting_miner", greeting_miner }, { "goodbye_generic", goodbye_generic }, { "goodbye_human", goodbye_human }, { "goodbye_dverger", goodbye_dverger }, { "goodbye_goblin", goodbye_goblin }, { "goodbye_priest", goodbye_priest }, { "goodbye_farmer", goodbye_farmer }, { "goodbye_blacksmith", goodbye_blacksmith }, { "goodbye_hunter", goodbye_hunter }, { "goodbye_guard", goodbye_guard }, { "goodbye_villager", goodbye_villager }, { "goodbye_beggar", goodbye_beggar }, { "goodbye_merchant", goodbye_merchant }, { "goodbye_lumberjack", goodbye_lumberjack }, { "goodbye_miner", goodbye_miner }, { "random_generic", random_generic }, { "random_human", random_human }, { "random_dverger", random_dverger }, { "random_goblin", random_goblin }, { "random_priest", random_priest }, { "random_farmer", random_farmer }, { "random_blacksmith", random_blacksmith }, { "random_hunter", random_hunter }, { "random_guard", random_guard }, { "random_villager", random_villager }, { "random_beggar", random_beggar }, { "random_merchant", random_merchant }, { "randomtalk_lumberjack", randomtalk_lumberjack }, { "randomtalk_miner", randomtalk_miner }, { "randomtalk_generic", randomtalk_generic }, { "randomtalk_human", randomtalk_human }, { "randomtalk_dverger", randomtalk_dverger }, { "randomtalk_goblin", randomtalk_goblin }, { "randomtalk_priest", randomtalk_priest }, { "randomtalk_farmer", randomtalk_farmer }, { "randomtalk_blacksmith", randomtalk_blacksmith }, { "randomtalk_hunter", randomtalk_hunter }, { "randomtalk_guard", randomtalk_guard }, { "randomtalk_villager", randomtalk_villager }, { "randomtalk_beggar", randomtalk_beggar }, { "randomtalk_merchant", randomtalk_merchant }, { "randomtalkinfaction_lumberjack", randomtalkinfaction_lumberjack }, { "randomtalkinfaction_miner", randomtalkinfaction_miner }, { "randomtalkinfaction_generic", randomtalkinfaction_generic }, { "randomtalkinfaction_human", randomtalkinfaction_human }, { "randomtalkinfaction_dverger", randomtalkinfaction_dverger }, { "randomtalkinfaction_goblin", randomtalkinfaction_goblin }, { "randomtalkinfaction_priest", randomtalkinfaction_priest }, { "randomtalkinfaction_farmer", randomtalkinfaction_farmer }, { "randomtalkinfaction_blacksmith", randomtalkinfaction_blacksmith }, { "randomtalkinfaction_hunter", randomtalkinfaction_hunter }, { "randomtalkinfaction_guard", randomtalkinfaction_guard }, { "randomtalkinfaction_villager", randomtalkinfaction_villager }, { "randomtalkinfaction_beggar", randomtalkinfaction_beggar }, { "randomtalkinfaction_merchant", randomtalkinfaction_merchant }, { "privatealarm_generic", privatealarm_generic }, { "privatealarm_human", privatealarm_human }, { "privatealarm_dverger", privatealarm_dverger }, { "privatealarm_goblin", privatealarm_goblin }, { "privatealarm_priest", privatealarm_priest }, { "privatealarm_farmer", privatealarm_farmer }, { "privatealarm_blacksmith", privatealarm_blacksmith }, { "privatealarm_hunter", privatealarm_hunter }, { "privatealarm_guard", privatealarm_guard }, { "privatealarm_villager", privatealarm_villager }, { "privatealarm_beggar", privatealarm_beggar }, { "privatealarm_merchant", privatealarm_merchant }, { "privatealarm_lumberjack", privatealarm_lumberjack }, { "privatealarm_miner", privatealarm_miner }, { "aggravated_generic", aggravated_generic }, { "aggravated_human", aggravated_human }, { "aggravated_dverger", aggravated_dverger }, { "aggravated_goblin", aggravated_goblin }, { "aggravated_priest", aggravated_priest }, { "aggravated_farmer", aggravated_farmer }, { "aggravated_blacksmith", aggravated_blacksmith }, { "aggravated_hunter", aggravated_hunter }, { "aggravated_guard", aggravated_guard }, { "aggravated_villager", aggravated_villager }, { "aggravated_beggar", aggravated_beggar }, { "aggravated_merchant", aggravated_merchant }, { "aggravated_lumberjack", aggravated_lumberjack }, { "aggravated_miner", aggravated_miner }, { "starttrade_generic", starttrade_generic }, { "starttrade_human", starttrade_human }, { "starttrade_dverger", starttrade_dverger }, { "starttrade_goblin", starttrade_goblin }, { "starttrade_priest", starttrade_priest }, { "starttrade_farmer", starttrade_farmer }, { "starttrade_blacksmith", starttrade_blacksmith }, { "starttrade_hunter", starttrade_hunter }, { "starttrade_guard", starttrade_guard }, { "starttrade_villager", starttrade_villager }, { "starttrade_beggar", starttrade_beggar }, { "starttrade_merchant", starttrade_merchant }, { "starttrade_lumberjack", starttrade_lumberjack }, { "starttrade_miner", starttrade_miner }, { "buy_generic", buy_generic }, { "buy_human", buy_human }, { "buy_dverger", buy_dverger }, { "buy_goblin", buy_goblin }, { "buy_priest", buy_priest }, { "buy_farmer", buy_farmer }, { "buy_blacksmith", buy_blacksmith }, { "buy_hunter", buy_hunter }, { "buy_guard", buy_guard }, { "buy_villager", buy_villager }, { "buy_beggar", buy_beggar }, { "buy_merchant", buy_merchant }, { "buy_lumberjack", buy_lumberjack }, { "buy_miner", buy_miner }, { "sell_generic", sell_generic }, { "sell_human", sell_human }, { "sell_dverger", sell_dverger }, { "sell_goblin", sell_goblin }, { "sell_priest", sell_priest }, { "sell_farmer", sell_farmer }, { "sell_blacksmith", sell_blacksmith }, { "sell_hunter", sell_hunter }, { "sell_guard", sell_guard }, { "sell_villager", sell_villager }, { "sell_beggar", sell_beggar }, { "sell_merchant", sell_merchant }, { "sell_lumberjack", sell_lumberjack }, { "sell_miner", sell_miner } }; public static List createDialogList(string archetype, string race, string category) { List list = new List(); string key = category.ToLower() + "_generic"; string key2 = category.ToLower() + "_" + race.ToLower(); string key3 = category.ToLower() + "_" + archetype.ToLower(); Dictionary> dictionary = allDialogLists; if (dictionary.ContainsKey(key)) { list.AddRange(dictionary[key]); } if (dictionary.ContainsKey(key2)) { list.AddRange(dictionary[key2]); } if (dictionary.ContainsKey(key3)) { list.AddRange(dictionary[key3]); } return list; } } 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; } } namespace BalrondIdleActors { internal class BalrondActor : MonoBehaviour { public string m_beardItem = ""; public string m_hairItem = ""; public string m_helmet = ""; public string m_chest = ""; public string m_legs = ""; public string m_back = ""; public int m_backVariant = 0; public string m_right = ""; public int m_rightVariant = 0; public string m_left = ""; public int m_leftVariant = 0; public string m_leftBack; public int m_leftBackVariant = 0; public string m_rightBack; public int m_rightBackVariant = 0; public string m_tool = ""; public int m_toolVariant = 0; public bool m_isFemale = false; public bool m_shouldHaveBeard = true; public bool m_shouldHaveHair = true; public string m_archetype = "Villager"; public string m_race = "human"; public Transform m_leftShoulder; public Transform m_rightShoulder; public float m_femaleOffset = 0.0004f; public float m_maleOffset = 0.0007651657f; public string m_name = "Bjorn Bjernsen"; public RuntimeAnimatorController animatorController; public Animator m_animator; private bool m_hasSetup = false; public bool m_useLoadout = false; public BalrondActorLoadout m_loudout; public bool isTrader = false; public bool isTalker = false; public int randomHairMax = 31; public int randomBeardMax = 21; public Vector3 m_skinColor = new Vector3(0.92f, 0.86f, 0.7f); public Vector3 m_hairColor = new Vector3(0.6f, 0.55f, 0.5f); public VisEquipment m_visEquipment; public ZNetView m_nview; public Trader m_trader; public BalrondActorTalker m_talker; private void Awake() { m_nview = ((Component)this).gameObject.GetComponent(); m_visEquipment = ((Component)this).gameObject.GetComponent(); m_animator = ((Component)((Component)this).transform.Find("Visual")).GetComponent(); m_visEquipment.m_modelIndex = (m_isFemale ? 1 : 0); GetHasSetup(); m_visEquipment.SetModel(m_isFemale ? 1 : 0); m_leftShoulder = FindDeepChild(((Component)this).transform, "LeftSholder"); m_rightShoulder = FindDeepChild(((Component)this).transform, "RightSholder"); m_trader = ((Component)this).gameObject.GetComponent(); m_talker = ((Component)this).gameObject.GetComponent(); } private void Start() { //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)animatorController != (Object)null) { m_animator.runtimeAnimatorController = animatorController; } if (m_useLoadout && !m_hasSetup) { GetNewLoadOut(); SetLoadOut(); } SetVoiceLines(); if (m_archetype == "Villager") { GetArchetypeSetup(); } if (!m_hasSetup) { setHairAndBeard(); SetSkinColor(BalrondActorLoadoutFactory.SkinTones[Random.Range(0, BalrondActorLoadoutFactory.SkinTones.Length)]); SetHairColor(BalrondActorLoadoutFactory.HairColors[Random.Range(0, BalrondActorLoadoutFactory.HairColors.Length)]); setEquipeFromString(); setHasSetup(); } } private void GetHasSetup() { if (m_nview.IsValid()) { m_hasSetup = m_nview.GetZDO().GetBool("BalrondActorHasSetup", false); } } private void SetArchetypeSetup() { m_hasSetup = true; if (m_nview.GetZDO() != null && m_nview.IsOwner()) { m_nview.GetZDO().Set("BalrondActorArchetype", m_archetype); } } private void GetArchetypeSetup() { if (m_nview.IsValid()) { m_archetype = m_nview.GetZDO().GetString("BalrondActorHasSetup", "Villager"); } } private void setHasSetup() { m_hasSetup = true; if (m_nview.GetZDO() != null && m_nview.IsOwner()) { m_nview.GetZDO().Set("BalrondActorHasSetup", m_hasSetup); } } private void GetNewLoadOut() { m_loudout = BalrondActorLoadoutFactory.GetLoadout(m_archetype, m_isFemale, m_race); } private void SetVoiceLines() { NpcDialogue npcDialogue = NpcDialogue.GetNpcDialogue(m_archetype, m_race); BalrondActorTalker component = ((Component)this).GetComponent(); if ((Object)(object)component != (Object)null) { component.m_archetype = m_archetype; component.m_randomTalk = npcDialogue.m_randomTalk; component.m_randomTalkInFactionBase = npcDialogue.m_randomTalkInFactionBase; component.m_randomGreets = npcDialogue.m_randomGreets; component.m_randomGoodbye = npcDialogue.m_randomGoodbye; component.m_privateAreaAlarm = npcDialogue.m_privateAreaAlarm; } Trader component2 = ((Component)this).GetComponent(); if ((Object)(object)component2 != (Object)null) { component2.m_randomTalk = npcDialogue.m_randomTalk; component2.m_randomGreets = npcDialogue.m_randomGreets; component2.m_randomGoodbye = npcDialogue.m_randomGoodbye; component2.m_randomStartTrade = npcDialogue.m_randomGoodbye; component2.m_randomBuy = npcDialogue.m_randomGoodbye; component2.m_randomSell = npcDialogue.m_randomGoodbye; component2.m_items = BalrondActorTraderPresets.GetItemsForArchetype(m_archetype); } } private void SetLoadOut() { m_helmet = ((m_helmet == "") ? m_loudout.m_helmet : m_helmet); m_chest = ((m_chest == "") ? m_loudout.m_chest : m_chest); m_legs = ((m_legs == "") ? m_loudout.m_legs : m_legs); m_back = ((m_back == "") ? m_loudout.m_back : m_back); m_right = ((m_right == "") ? m_loudout.m_right : m_right); m_left = ((m_left == "") ? m_loudout.m_left : m_left); m_leftBack = ((m_leftBack == "") ? m_loudout.m_leftBack : m_leftBack); m_rightBack = ((m_rightBack == "") ? m_loudout.m_rightBack : m_rightBack); m_tool = ((m_tool == "") ? m_loudout.m_tool : m_tool); m_backVariant = ((m_backVariant == 0) ? m_loudout.m_backVariant : m_backVariant); m_rightVariant = ((m_rightVariant == 0) ? m_loudout.m_rightVariant : m_rightVariant); m_leftVariant = ((m_leftVariant == 0) ? m_loudout.m_leftVariant : m_leftVariant); m_leftBackVariant = ((m_leftBackVariant == 0) ? m_loudout.m_leftBackVariant : m_leftBackVariant); m_rightBackVariant = ((m_rightBackVariant == 0) ? m_loudout.m_rightBackVariant : m_rightBackVariant); m_toolVariant = ((m_toolVariant == 0) ? m_loudout.m_toolVariant : m_toolVariant); } public void SetSkinColor(Vector3 color) { //IL_0001: 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) //IL_0014: 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_0021: Unknown result type (might be due to invalid IL or missing references) if (!(color == m_skinColor)) { m_skinColor = color; m_visEquipment.SetSkinColor(m_skinColor); } } public void SetHairColor(Vector3 color) { //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_0014: 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_0021: Unknown result type (might be due to invalid IL or missing references) if (!(m_hairColor == color)) { m_hairColor = color; m_visEquipment.SetHairColor(m_hairColor); } } public void setHairAndBeard() { if (m_beardItem == "" && m_shouldHaveBeard) { m_beardItem = GetRandomBeard(); } if (m_hairItem == "" && m_shouldHaveHair) { m_hairItem = GetRandomHair(); } } public void setEquipeFromString() { m_visEquipment.SetBeardItem(m_beardItem); m_visEquipment.SetHairItem(m_hairItem); m_visEquipment.SetLeftItem(m_left, m_leftVariant); m_visEquipment.SetRightItem(m_right); m_visEquipment.SetLeftBackItem(m_leftBack, m_leftBackVariant); m_visEquipment.SetRightBackItem(m_rightBack); m_visEquipment.SetChestItem(m_chest); m_visEquipment.SetLegItem(m_legs); m_visEquipment.SetHelmetItem(m_helmet); m_visEquipment.SetShoulderItem(m_back, m_backVariant); m_visEquipment.SetUtilityItem(m_tool); } private string GetRandomHair() { int num = Random.Range(0, randomHairMax); if (num == 0) { return "HairNone"; } return "Hair" + num; } private string GetRandomBeard() { int num = Random.Range(0, randomBeardMax); if (num == 0) { return "BeardNone"; } return "Beard" + num; } public void OnDamaged(HitData hitData) { //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: 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) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) float num = 0f; float num2 = 0f; LookAt val = null; if (Object.op_Implicit((Object)(object)m_trader)) { num = m_trader.m_byeRange; num2 = m_trader.m_standRange; val = m_trader.m_lookAt; } else { num = m_talker.m_byeRange; num2 = m_talker.m_standRange; val = m_talker.m_lookAt; } Player closestPlayer = Player.GetClosestPlayer(((Component)this).transform.position, Mathf.Max(num + 3f, num2)); if (Object.op_Implicit((Object)(object)closestPlayer)) { float num3 = Vector3.Distance(((Component)closestPlayer).transform.position, ((Component)this).transform.position); if ((double)num3 < (double)num2) { val.SetLoockAtTarget(((Character)closestPlayer).GetHeadPoint()); } if ((Object)(object)m_talker != (Object)null && (!m_talker.m_didAnger || m_talker.TalkTimer())) { m_talker.m_didAnger = true; string text = m_talker.m_aggravated[Random.Range(0, m_talker.m_aggravated.Count)]; m_talker.Say(text, "Aggravated", "", 0f); } else if ((Object)(object)m_trader != (Object)null) { string text2 = ArchetypeDialoguePresets.aggravated_generic[Random.Range(0, 5)]; m_trader.Say(text2, "Aggravated"); } } } private Transform FindDeepChild(Transform parent, string name) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown 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 class BalrondActorFactoryPresets { public class LoadoutPreset { public string LeftHand; public int LeftVariant = 0; public string RightHand = ""; public int RightVariant = 0; public int LeftBackVariant = 0; public int RightBackVariant = 0; public string[] MaleChests; public string[] FemaleChests; public string[] LegsOptions; public string[] HelmetOptions; public string[] BackOptions; public int BackVariant; public string[] MaleWeapons; public string[] FemaleWeapons; public string[] RightBackOptions; public string[] LeftBackOptions; public string Tool; public bool CanTakeOffHelmet = true; public bool CanHideWeapons = true; } public static string[] dvergerHairMale = new string[18] { "DvergerHairGray2_bal", "DvergerHairGray3_bal", "DvergerHairGray4_bal", "DvergerHairGray5_bal", "DvergerHairGray6_bal", "DvergerHairGray7_bal", "DvergerHairOrange2_bal", "DvergerHairOrange3_bal", "DvergerHairOrange4_bal", "DvergerHairOrange5_bal", "DvergerHairOrange6_bal", "DvergerHairOrange7_bal", "DvergerHairBlue2_bal", "DvergerHairBlue3_bal", "DvergerHairBlue4_bal", "DvergerHairBlue5_bal", "DvergerHairBlue6_bal", "DvergerHairBlue7_bal" }; public static string[] dvergerHairFemale = new string[6] { "DvergerHairGray1_bal", "DvergerHairOrange1_bal", "DvergerHairBlue1_bal", "DvergerFemaleBlue1_bal", "DvergerFemaleGray1_bal", "DvergerFemaleOrange1_bal" }; public static string[] dvergerDresses = new string[9] { "DvergerFemaleDress1_bal", "DvergerFemaleDress2_bal", "DvergerFemaleDress3_bal", "DvergerFemaleDress4_bal", "DvergerFemaleDress5_bal", "DvergerFemaleDress6_bal", "DvergerFemaleDress7_bal", "DvergerFemaleDress8_bal", "DvergerFemaleDress9_bal" }; public static string[] dvergerarmors = new string[10] { "DvergerSuitArbalest", "DvergerSuitArbalest_Ashlands", "DvergerSuitFire", "DvergerSuitIce", "DvergerSuitSupport", "DvergerSuitDarkHat_bal", "DvergerSuitRed_bal", "DvergerSuitRedHood_bal", "DvergerSuitYellowHood_bal", "DvergerSuitGreenCap_bal" }; public static Dictionary GetVillagerPresets() { Dictionary dictionary = new Dictionary(); dictionary["human"] = new LoadoutPreset { MaleChests = new string[10] { "ArmorTunic9", "ArmorTunic8", "ArmorTunic7", "ArmorTunic6", "ArmorTunic5", "ArmorTunic4", "ArmorTunic3", "ArmorTunic2", "ArmorTunic1", "ArmorTrollLeatherChest" }, FemaleChests = new string[9] { "ArmorDress9", "ArmorDress8", "ArmorDress7", "ArmorDress6", "ArmorDress5", "ArmorDress4", "ArmorDress3", "ArmorDress2", "ArmorDress1" }, LegsOptions = new string[2] { "ArmorLeatherLegs", "ArmorTrollLeatherLegs" }, HelmetOptions = new string[12] { "HelmetHat3", "", "HelmetHat2", "", "HelmetHat5", "", "HelmetHat6", "", "HelmetHat7", "", "HelmetHat10", "" }, BackOptions = new string[1] { "" }, BackVariant = 0, RightBackOptions = new string[1] { "" }, MaleWeapons = new string[1] { "" }, LeftBackOptions = new string[1] { "" }, Tool = "", CanTakeOffHelmet = true, CanHideWeapons = true }; dictionary["dverger"] = new LoadoutPreset { MaleChests = new string[3] { "DvergerSuitDarkHat_bal", "DvergerSuitGreenCap_bal", "DvergerSuitYellowHood_bal" }, FemaleChests = new string[3] { "DvergerFemaleDress1_bal", "DvergerFemaleDress4_bal", "DvergerFemaleDress9_bal" }, LegsOptions = new string[1] { "" }, HelmetOptions = dvergerHairMale, BackOptions = new string[1] { "" }, BackVariant = 0, RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" }, Tool = "", CanTakeOffHelmet = true, CanHideWeapons = true }; dictionary["goblin"] = new LoadoutPreset { MaleChests = new string[1] { "GoblinTunic1" }, FemaleChests = new string[1] { "GoblinDress1" }, LegsOptions = new string[1] { "GoblinLegs" }, HelmetOptions = new string[2] { "GoblinCap1", "" }, BackOptions = new string[1] { "" }, BackVariant = 0, RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" }, Tool = "", CanTakeOffHelmet = true, CanHideWeapons = true }; return dictionary; } public static Dictionary GetPatronPresets() { Dictionary dictionary = new Dictionary(); dictionary["human"] = new LoadoutPreset { MaleChests = new string[10] { "ArmorTunic9", "ArmorTunic8", "ArmorTunic7", "ArmorTunic6", "ArmorTunic5", "ArmorTunic4", "ArmorTunic3", "ArmorTunic2", "ArmorTunic1", "ArmorTrollLeatherChest" }, FemaleChests = new string[9] { "ArmorDress9", "ArmorDress8", "ArmorDress7", "ArmorDress6", "ArmorDress5", "ArmorDress4", "ArmorDress3", "ArmorDress2", "ArmorDress1" }, LegsOptions = new string[2] { "ArmorLeatherLegs", "ArmorTrollLeatherLegs" }, HelmetOptions = new string[12] { "HelmetHat3", "", "HelmetHat2", "", "HelmetHat5", "", "HelmetHat6", "", "HelmetHat7", "", "HelmetHat10", "" }, BackOptions = new string[1] { "" }, BackVariant = 0, RightBackOptions = new string[1] { "" }, MaleWeapons = new string[7] { "", "Tankard_dvergrTankard_dvergr", "", "Tankard", "TankardAnniversary", "", "TankardOdin" }, FemaleWeapons = new string[7] { "", "Tankard_dvergrTankard_dvergr", "", "Tankard", "TankardAnniversary", "", "TankardOdin" }, LeftBackOptions = new string[1] { "" }, Tool = "", CanTakeOffHelmet = true, CanHideWeapons = true }; dictionary["dverger"] = new LoadoutPreset { MaleChests = new string[3] { "DvergerSuitDarkHat_bal", "DvergerSuitGreenCap_bal", "DvergerSuitYellowHood_bal" }, FemaleChests = new string[3] { "DvergerFemaleDress1_bal", "DvergerFemaleDress4_bal", "DvergerFemaleDress9_bal" }, LegsOptions = new string[1] { "" }, HelmetOptions = dvergerHairMale, BackOptions = new string[1] { "" }, BackVariant = 0, RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" }, Tool = "", CanTakeOffHelmet = true, CanHideWeapons = true }; dictionary["goblin"] = new LoadoutPreset { MaleChests = new string[1] { "GoblinTunic1" }, FemaleChests = new string[1] { "GoblinDress1" }, LegsOptions = new string[1] { "GoblinLegs" }, HelmetOptions = new string[2] { "GoblinCap1", "" }, BackOptions = new string[1] { "" }, BackVariant = 0, RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" }, Tool = "", CanTakeOffHelmet = true, CanHideWeapons = true }; return dictionary; } public static Dictionary GetBeggarPresets() { Dictionary dictionary = new Dictionary(); dictionary["human"] = new LoadoutPreset { MaleChests = new string[2] { "ArmorRagsChest", "" }, FemaleChests = new string[1] { "ArmorRagsChest" }, LegsOptions = new string[2] { "ArmorRagsLegs", "" }, HelmetOptions = new string[5] { "", "HelmetFishingHat", "", "HelmetStrawHat", "" }, BackOptions = new string[1] { "" }, BackVariant = 0, Tool = "", RightBackOptions = new string[5] { "", "Club", "", "Torch", "" }, LeftBackOptions = new string[1] { "" }, CanTakeOffHelmet = true, CanHideWeapons = true }; dictionary["dverger"] = new LoadoutPreset { MaleChests = new string[3] { "DvergerSuitDark_bal", "DvergerSuitArbalest", "DvergerSuitArbalest_Ashlands" }, FemaleChests = new string[2] { "DvergerFemaleDress3_bal", "DvergerFemaleDress5_bal" }, LegsOptions = new string[1] { "" }, HelmetOptions = dvergerHairMale, BackOptions = new string[1] { "" }, BackVariant = 0, Tool = "", RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" }, CanTakeOffHelmet = true, CanHideWeapons = true }; dictionary["goblin"] = new LoadoutPreset { MaleChests = new string[2] { "GoblinTunic1", "" }, FemaleChests = new string[2] { "GoblinDress1", "" }, LegsOptions = new string[2] { "GoblinLegs", "" }, HelmetOptions = new string[2] { "GoblinCap1", "" }, BackOptions = new string[1] { "" }, BackVariant = 0, Tool = "", RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" }, CanTakeOffHelmet = true, CanHideWeapons = true }; return dictionary; } public static Dictionary GetInnkepperPresets() { Dictionary dictionary = new Dictionary(); dictionary["human"] = new LoadoutPreset { MaleChests = GetTunicList(), FemaleChests = GetDressList(), LegsOptions = new string[4] { "ArmorLeatherLegs", "ArmorTrollLeatherLegs", "ArmorWolfLegs", "ArmorAshlandsMediumlegs" }, HelmetOptions = new string[1] { "" }, BackOptions = new string[1] { "" }, BackVariant = 0, MaleWeapons = new string[7] { "", "Tankard_dvergrTankard_dvergr", "", "Tankard", "TankardAnniversary", "", "TankardOdin" }, FemaleWeapons = new string[7] { "", "Tankard_dvergrTankard_dvergr", "", "Tankard", "TankardAnniversary", "", "TankardOdin" }, Tool = "BeltStrength", RightBackOptions = new string[1] { "" }, LeftBackOptions = new string[1] { "" }, CanTakeOffHelmet = true, CanHideWeapons = true }; dictionary["dverger"] = new LoadoutPreset { MaleChests = new string[3] { "DvergerSuitRed_bal", "DvergerSuitRedHood_bal", "DvergerSuitFire" }, FemaleChests = new string[4] { "DvergerFemaleDress2_bal", "DvergerFemaleDress6_bal", "DvergerFemaleDress7_bal", "DvergerFemaleDress8_bal" }, LegsOptions = new string[1] { "" }, HelmetOptions = dvergerHairMale, BackOptions = new string[1] { "" }, BackVariant = 0, Tool = "", RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" }, CanTakeOffHelmet = true, CanHideWeapons = true }; dictionary["goblin"] = new LoadoutPreset { MaleChests = new string[2] { "GoblinTunic1", "GoblinArmor2" }, FemaleChests = new string[1] { "GoblinDress1" }, LegsOptions = new string[1] { "GoblinLegs" }, HelmetOptions = new string[2] { "GoblinCap1", "" }, BackOptions = new string[2] { "", "CapeDeerHide" }, BackVariant = 0, Tool = "", RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" }, CanTakeOffHelmet = true, CanHideWeapons = true }; return dictionary; } public static Dictionary GetMerchantPresets() { Dictionary dictionary = new Dictionary(); dictionary["human"] = new LoadoutPreset { MaleChests = GetTunicList(), FemaleChests = GetDressList(), LegsOptions = new string[2] { "ArmorLeatherLegs", "ArmorTrollLeatherLegs" }, HelmetOptions = new string[9] { "", "HelmetPointyHat", "", "HelmetHat8", "", "HelmetHat9", "", "HelmetHat4", "" }, BackOptions = new string[7] { "NpcCapeFox_bal", "", "CapeWolf", "NpcCapeBlackWolf_bal", "NpcCapeBear_bal", "", "NpcCapeSwamp_bal" }, BackVariant = 0, Tool = "BeltStrength", RightBackOptions = new string[1] { "" }, LeftBackOptions = new string[1] { "" }, CanTakeOffHelmet = true, CanHideWeapons = true }; dictionary["dverger"] = new LoadoutPreset { MaleChests = new string[3] { "DvergerSuitRed_bal", "DvergerSuitRedHood_bal", "DvergerSuitFire" }, FemaleChests = new string[4] { "DvergerFemaleDress2_bal", "DvergerFemaleDress6_bal", "DvergerFemaleDress7_bal", "DvergerFemaleDress8_bal" }, LegsOptions = new string[1] { "" }, HelmetOptions = dvergerHairMale, BackOptions = new string[1] { "" }, BackVariant = 0, Tool = "", RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" }, CanTakeOffHelmet = true, CanHideWeapons = true }; dictionary["goblin"] = new LoadoutPreset { MaleChests = new string[2] { "GoblinTunic1", "GoblinArmor2" }, FemaleChests = new string[1] { "GoblinDress1" }, LegsOptions = new string[1] { "GoblinLegs" }, HelmetOptions = new string[2] { "GoblinCap1", "" }, BackOptions = new string[2] { "", "CapeDeerHide" }, BackVariant = 0, Tool = "", RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" }, CanTakeOffHelmet = true, CanHideWeapons = true }; return dictionary; } public static Dictionary GetPriestPresets() { Dictionary dictionary = new Dictionary(); dictionary["human"] = new LoadoutPreset { MaleChests = new string[1] { "ArmorPriest_bal" }, FemaleChests = new string[1] { "ArmorPriest_bal" }, LegsOptions = new string[1] { "ArmorLeatherLegs" }, HelmetOptions = new string[3] { "HelmetOdin", "", "HelmetFenring" }, BackOptions = new string[3] { "CapeOdin", "CapeFeather", "CapeLox" }, BackVariant = 0, RightBackOptions = new string[4] { "StaffPriest_bal", "StaffFireball", "StaffIceShards", "" }, LeftBackOptions = new string[1] { "ShieldBronzeBuckler" }, Tool = "", CanTakeOffHelmet = false, CanHideWeapons = true }; dictionary["dverger"] = new LoadoutPreset { MaleChests = new string[2] { "DvergerSuitFire", "DvergerSuitIce" }, FemaleChests = new string[2] { "DvergerFemaleDress2_bal", "DvergerFemaleDress7_bal" }, LegsOptions = new string[1] { "" }, HelmetOptions = dvergerHairMale, BackOptions = new string[1] { "" }, BackVariant = 0, MaleWeapons = new string[2] { "DvergerStaffHeal_bal", "DvergerStaffSupport_bal" }, FemaleWeapons = new string[2] { "DvergerStaffHeal_bal", "DvergerStaffSupport_bal" }, LeftHand = "Torch", RightBackOptions = new string[1] { "ShieldBronzeBuckler" }, LeftBackOptions = new string[1] { "AxeJotunBane" }, Tool = "", CanTakeOffHelmet = true, CanHideWeapons = true }; dictionary["goblin"] = new LoadoutPreset { MaleChests = new string[1] { "GoblinShamanRobe" }, FemaleChests = new string[1] { "GoblinShamanRobe" }, LegsOptions = new string[1] { "GoblinLegs" }, HelmetOptions = new string[2] { "GoblinMaskShaman", "" }, BackOptions = new string[2] { "CapeDeerHide", "" }, BackVariant = 0, RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" }, Tool = "", CanTakeOffHelmet = true, CanHideWeapons = true }; return dictionary; } public static Dictionary GetGuardPresets() { Dictionary dictionary = new Dictionary(); dictionary["human"] = new LoadoutPreset[4] { new LoadoutPreset { LeftVariant = 0, MaleChests = new string[1] { "ArmorBronzeChest" }, FemaleChests = new string[1] { "ArmorBronzeChest" }, LegsOptions = new string[1] { "ArmorBronzeLegs" }, HelmetOptions = new string[3] { "HelmetBronze", "", "HelmetLeather" }, BackOptions = new string[4] { "CapeDeerHide", "NpcCapeBear_bal", "CapeTrollHide", "NpcCapeSwamp_bal" }, BackVariant = 0, MaleWeapons = new string[1] { "Torch" }, FemaleWeapons = new string[1] { "Torch" }, RightBackOptions = new string[4] { "AxeBronze", "MaceBronze", "SpearBronze", "SwordBronze" }, LeftBackOptions = new string[1] { "ShieldBronzeBuckler" } }, new LoadoutPreset { LeftVariant = 0, MaleChests = new string[1] { "ArmorIronChest" }, FemaleChests = new string[1] { "ArmorIronChest" }, LegsOptions = new string[1] { "ArmorIronLegs" }, HelmetOptions = new string[2] { "HelmetIron", "" }, BackOptions = new string[6] { "CapeLox", "", "CapeWolf", "CapeTrollHide", "NpcCapeSwamp_bal", "NpcCapeBear_bal" }, BackVariant = 0, MaleWeapons = new string[1] { "Torch" }, FemaleWeapons = new string[1] { "Torch" }, RightBackOptions = new string[4] { "AxeIron", "MaceIron", "SpearElderbark", "SwordIron" }, LeftBackOptions = new string[1] { "ShieldBanded" }, LeftBackVariant = Random.Range(0, 3) }, new LoadoutPreset { LeftHand = "", LeftVariant = 0, MaleChests = new string[1] { "ArmorWolfChest" }, FemaleChests = new string[1] { "ArmorWolfChest" }, LegsOptions = new string[1] { "ArmorWolfLegs" }, HelmetOptions = new string[2] { "HelmetDrake", "" }, BackOptions = new string[5] { "NpcCapeFox_bal", "", "CapeWolf", "NpcCapeSwamp_bal", "NpcCapeBear_bal" }, BackVariant = 0, MaleWeapons = new string[1] { "Torch" }, FemaleWeapons = new string[1] { "Torch" }, RightBackOptions = new string[4] { "AxeIron", "MaceSilver", "SpearElderbark", "SwordSilver" }, LeftBackOptions = new string[1] { "ShieldSilver" }, LeftBackVariant = Random.Range(0, 7) }, new LoadoutPreset { LeftVariant = 0, MaleChests = new string[1] { "ArmorPaddedCuirass" }, FemaleChests = new string[1] { "ArmorPaddedCuirass" }, LegsOptions = new string[1] { "ArmorPaddedGreaves" }, HelmetOptions = new string[2] { "HelmetPadded", "" }, BackOptions = new string[6] { "CapeFeather", "", "NpcCapeBlackWolf_bal", "NpcCapeBear_bal", "NpcCapeFox_bal", "NpcCapeSwamp_bal" }, BackVariant = 0, MaleWeapons = new string[1] { "Torch" }, FemaleWeapons = new string[1] { "Torch" }, RightBackOptions = new string[4] { "AxeIron", "MaceSilver", "SpearElderbark", "SwordSilver" }, LeftBackOptions = new string[1] { "ShieldSilver" }, LeftBackVariant = Random.Range(0, 7) } }; dictionary["dverger"] = new LoadoutPreset[1] { new LoadoutPreset { LeftHand = "", LeftVariant = 7, MaleChests = new string[5] { "DvergerSuitGreenCap_bal", "DvergerSuitIce", "DvergerSuitArbalest_Ashlands", "DvergerSuitSupport", "DvergerSuitFire" }, FemaleChests = new string[2] { "DvergerFemaleDress2_bal", "DvergerFemaleDress7_bal" }, LegsOptions = new string[1] { "" }, HelmetOptions = dvergerHairMale, BackOptions = new string[1] { "" }, BackVariant = 0, MaleWeapons = new string[3] { "DvergerStaffIce_bal", "DvergerStaffFire_bal", "SwordIron_bal" }, FemaleWeapons = new string[2] { "StaffFireball", "SpearElderbark" }, RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" } } }; dictionary["goblin"] = new LoadoutPreset[1] { new LoadoutPreset { LeftHand = "", LeftVariant = 2, MaleChests = new string[1] { "GoblinArmor1" }, FemaleChests = new string[1] { "GoblinArmor1" }, LegsOptions = new string[1] { "GoblinLegs" }, HelmetOptions = new string[2] { "GoblinCap1", "" }, BackOptions = new string[2] { "CapeDeerHide", "" }, BackVariant = 0, MaleWeapons = new string[2] { "ClubGoblin", "KnifeFlint" }, FemaleWeapons = new string[2] { "KnifeFlint", "BowCrude" }, RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" } } }; return dictionary; } public static Dictionary GetDefenderPresets() { Dictionary dictionary = new Dictionary(); dictionary["human"] = new LoadoutPreset[4] { new LoadoutPreset { LeftHand = "ShieldBronzeBuckler", LeftVariant = 0, MaleChests = new string[1] { "ArmorBronzeChest" }, FemaleChests = new string[1] { "ArmorBronzeChest" }, LegsOptions = new string[1] { "ArmorBronzeLegs" }, HelmetOptions = new string[3] { "HelmetBronze", "", "HelmetLeather" }, BackOptions = new string[3] { "CapeDeerHide", "", "CapeTrollHide" }, BackVariant = 0, MaleWeapons = new string[3] { "AxeBronze", "MaceBronze", "SwordBronze" }, FemaleWeapons = new string[3] { "AxeBronze", "MaceBronze", "SwordBronze" }, RightBackOptions = new string[4] { "AxeBronze", "MaceBronze", "SpearBronze", "SwordBronze" }, LeftBackOptions = new string[1] { "" } }, new LoadoutPreset { LeftHand = "ShieldBanded", LeftVariant = Random.Range(0, 3), MaleChests = new string[1] { "ArmorIronChest" }, FemaleChests = new string[1] { "ArmorIronChest" }, LegsOptions = new string[1] { "ArmorIronLegs" }, HelmetOptions = new string[2] { "HelmetIron", "" }, BackOptions = new string[4] { "CapeLox", "", "CapeWolf", "CapeTrollHide" }, BackVariant = 0, MaleWeapons = new string[3] { "AxeIron", "MaceIron", "SwordIron" }, FemaleWeapons = new string[3] { "AxeIron", "MaceIron", "SwordIron" }, RightBackOptions = new string[4] { "AxeIron", "MaceIron", "SpearElderbark", "SwordIron" }, LeftBackOptions = new string[1] { "" }, LeftBackVariant = 3 }, new LoadoutPreset { LeftHand = "ShieldSilver", LeftVariant = Random.Range(0, 7), MaleChests = new string[1] { "ArmorWolfChest" }, FemaleChests = new string[1] { "ArmorWolfChest" }, LegsOptions = new string[1] { "ArmorWolfLegs" }, HelmetOptions = new string[2] { "HelmetDrake", "" }, BackOptions = new string[4] { "NpcCapeFox_bal", "", "CapeWolf", "NpcCapeBlackWolf_bal" }, BackVariant = 0, MaleWeapons = new string[3] { "AxeIron", "MaceSilver", "SwordSilver" }, FemaleWeapons = new string[4] { "AxeIron", "MaceSilver", "SpearElderbark", "SwordSilver" }, RightBackOptions = new string[4] { "AxeIron", "MaceSilver", "SpearElderbark", "SwordSilver" }, LeftBackOptions = new string[1] { "" }, LeftBackVariant = 7 }, new LoadoutPreset { LeftHand = "ShieldSilver", LeftVariant = Random.Range(0, 7), MaleChests = new string[1] { "ArmorPaddedCuirass" }, FemaleChests = new string[1] { "ArmorPaddedCuirass" }, LegsOptions = new string[1] { "ArmorPaddedGreaves" }, HelmetOptions = new string[2] { "HelmetPadded", "" }, BackOptions = new string[3] { "CapeFeather", "", "NpcCapeBlackWolf_bal" }, BackVariant = 0, MaleWeapons = new string[3] { "AxeIron", "MaceSilver", "SwordSilver" }, FemaleWeapons = new string[3] { "AxeIron", "MaceSilver", "SwordSilver" }, RightBackOptions = new string[4] { "AxeIron", "MaceSilver", "SpearElderbark", "SwordSilver" }, LeftBackOptions = new string[1] { "" }, LeftBackVariant = 7 } }; dictionary["dverger"] = new LoadoutPreset[1] { new LoadoutPreset { LeftHand = "ShieldIronBuckler", LeftVariant = 0, MaleChests = new string[5] { "DvergerSuitGreenCap_bal", "DvergerSuitIce", "DvergerSuitArbalest_Ashlands", "DvergerSuitSupport", "DvergerSuitFire" }, FemaleChests = new string[2] { "DvergerFemaleDress2_bal", "DvergerFemaleDress7_bal" }, LegsOptions = new string[1] { "" }, HelmetOptions = dvergerHairMale, BackOptions = new string[1] { "" }, BackVariant = 0, MaleWeapons = new string[3] { "DvergerStaffIce_bal", "DvergerStaffFire_bal", "SwordIron_bal" }, FemaleWeapons = new string[2] { "StaffFireball", "SpearElderbark" }, RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" } } }; dictionary["goblin"] = new LoadoutPreset[1] { new LoadoutPreset { LeftHand = "ShieldBanded", LeftVariant = 2, MaleChests = new string[1] { "GoblinArmor1" }, FemaleChests = new string[1] { "GoblinArmor1" }, LegsOptions = new string[1] { "GoblinLegs" }, HelmetOptions = new string[2] { "GoblinCap1", "" }, BackOptions = new string[2] { "CapeDeerHide", "" }, BackVariant = 0, MaleWeapons = new string[2] { "ClubGoblin", "KnifeFlint" }, FemaleWeapons = new string[2] { "KnifeFlint", "BowCrude" }, RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" } } }; return dictionary; } public static Dictionary GetFisherPresets() { Dictionary dictionary = new Dictionary(); dictionary["human"] = new LoadoutPreset { MaleChests = new string[5] { "ArmorRags", "ArmorLeatherChest", "ArmorTrollLeatherChest", "NpcArmorForagerChest_bal", "" }, FemaleChests = new string[4] { "ArmorRags", "ArmorLeatherChest", "ArmorTrollLeatherChest", "NpcArmorForagerChest_bal" }, LegsOptions = new string[4] { "ArmorLeatherLegs", "NpcArmorTornLegs_bal", "ArmorTrollLeatherLegs", "ArmorAshlandsMediumlegs" }, HelmetOptions = new string[5] { "HelmetStrawHat", "HelmetFishingHat", "NpcHelmetBandana_bal", "HelmetTrollLeather", "" }, BackOptions = new string[2] { "NpcCapeRags_bal", "" }, FemaleWeapons = new string[5] { "KnifeFlint", "KnifeCopper", "NpcSickle_bal", "KnifeChitin", "" }, MaleWeapons = new string[5] { "KnifeFlint", "KnifeCopper", "", "NpcSickle_bal", "KnifeChitin" }, RightBackOptions = new string[4] { "NpcFishingRod_bal", "KnifeSilver", "SpearChitin", "KnifeChitin" }, LeftBackOptions = new string[1] { "" } }; dictionary["dverger"] = new LoadoutPreset { MaleChests = new string[6] { "DvergerSuitDark_bal", "DvergerSuitArbalest_Ashlands", "DvergerSuitDarkHat_bal", "DvergerSuitGreenCap_bal", "DvergerSuitYellowHood_bal", "DvergerSuitArbalest" }, FemaleChests = new string[2] { "DvergerFemaleDress3_bal", "DvergerFemaleDress5_bal" }, LegsOptions = new string[1] { "" }, HelmetOptions = dvergerHairMale, BackOptions = new string[1] { "" }, FemaleWeapons = new string[5] { "DvergerCultivator_bal", "DvergerHoe_bal", "DvergerKnife_bal", "Scythe", "" }, MaleWeapons = new string[5] { "DvergerCultivator_bal", "DvergerHoe_bal", "DvergerKnife_bal", "Scythe", "" }, RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" } }; dictionary["goblin"] = new LoadoutPreset { MaleChests = new string[1] { "GoblinTunic1" }, FemaleChests = new string[1] { "GoblinDress1" }, LegsOptions = new string[1] { "GoblinLegs" }, HelmetOptions = new string[2] { "GoblinCap1", "" }, BackOptions = new string[1] { "" }, FemaleWeapons = new string[2] { "DvergerHoe_bal", "KnifeCopper" }, MaleWeapons = new string[2] { "DvergerHoe_bal", "KnifeCopper" }, RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" } }; return dictionary; } public static Dictionary GetForagerPresets() { Dictionary dictionary = new Dictionary(); dictionary["human"] = new LoadoutPreset { MaleChests = new string[3] { "NpcArmorForagerChest_bal", "ArmorHarvester1", "ArmorHarvester2" }, FemaleChests = new string[3] { "NpcArmorForagerChest_bal", "ArmorHarvester1", "ArmorHarvester2" }, LegsOptions = new string[4] { "ArmorLeatherLegs", "NpcArmorTornLegs_bal", "ArmorTrollLeatherLegs", "ArmorAshlandsMediumlegs" }, HelmetOptions = new string[5] { "HelmetStrawHat", "NpcHelmetChitin_bal", "NpcHelmetFabric_bal", "HelmetAshlandsMediumHood", "" }, BackOptions = new string[4] { "", "NpcCapeHeavyStraw_bal", "NpcCapeRags_bal", "" }, FemaleWeapons = new string[2] { "NpcSickle_bal", "KnifeCopper" }, MaleWeapons = new string[2] { "NpcSickle_bal", "KnifeCopper" }, RightBackOptions = new string[2] { "Cultivator", "" }, LeftBackOptions = new string[1] { "" } }; dictionary["dverger"] = new LoadoutPreset { MaleChests = new string[6] { "DvergerSuitDark_bal", "DvergerSuitArbalest_Ashlands", "DvergerSuitDarkHat_bal", "DvergerSuitGreenCap_bal", "DvergerSuitYellowHood_bal", "DvergerSuitArbalest" }, FemaleChests = new string[2] { "DvergerFemaleDress3_bal", "DvergerFemaleDress5_bal" }, LegsOptions = new string[1] { "" }, HelmetOptions = dvergerHairMale, BackOptions = new string[1] { "" }, FemaleWeapons = new string[5] { "DvergerCultivator_bal", "DvergerHoe_bal", "DvergerKnife_bal", "Scythe", "" }, MaleWeapons = new string[5] { "DvergerCultivator_bal", "DvergerHoe_bal", "DvergerKnife_bal", "Scythe", "" }, RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" } }; dictionary["goblin"] = new LoadoutPreset { MaleChests = new string[1] { "GoblinTunic1" }, FemaleChests = new string[1] { "GoblinDress1" }, LegsOptions = new string[1] { "GoblinLegs" }, HelmetOptions = new string[2] { "GoblinCap1", "" }, BackOptions = new string[1] { "" }, FemaleWeapons = new string[2] { "DvergerHoe_bal", "KnifeCopper" }, MaleWeapons = new string[2] { "DvergerHoe_bal", "KnifeCopper" }, RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" } }; return dictionary; } public static Dictionary GetFarmerPresets() { Dictionary dictionary = new Dictionary(); dictionary["human"] = new LoadoutPreset { MaleChests = new string[3] { "ArmorRagsChest", "", "ArmorTunic10" }, FemaleChests = new string[3] { "ArmorRagsChest", "ArmorHarvester2", "ArmorDress10" }, LegsOptions = new string[2] { "ArmorLeatherLegs", "ArmorRagsLegs" }, HelmetOptions = new string[9] { "HelmetStrawHat", "", "HelmetHat3", "NpcHelmetRags_bal", "HelmetHat2", "", "", "HelmetFishingHat", "" }, BackOptions = new string[2] { "", "NpcCapeHeavyStraw_bal" }, FemaleWeapons = new string[1] { "" }, MaleWeapons = new string[1] { "" }, RightBackOptions = new string[4] { "Cultivator", "Hoe", "Scythe", "" }, LeftBackOptions = new string[1] { "" } }; dictionary["dverger"] = new LoadoutPreset { MaleChests = new string[6] { "DvergerSuitDark_bal", "DvergerSuitArbalest_Ashlands", "DvergerSuitDarkHat_bal", "DvergerSuitGreenCap_bal", "DvergerSuitYellowHood_bal", "DvergerSuitArbalest" }, FemaleChests = new string[2] { "DvergerFemaleDress3_bal", "DvergerFemaleDress5_bal" }, LegsOptions = new string[1] { "" }, HelmetOptions = dvergerHairMale, BackOptions = new string[1] { "" }, FemaleWeapons = new string[5] { "DvergerCultivator_bal", "DvergerHoe_bal", "DvergerKnife_bal", "Scythe", "" }, MaleWeapons = new string[5] { "DvergerCultivator_bal", "DvergerHoe_bal", "DvergerKnife_bal", "Scythe", "" }, RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" } }; dictionary["goblin"] = new LoadoutPreset { MaleChests = new string[1] { "GoblinTunic1" }, FemaleChests = new string[1] { "GoblinDress1" }, LegsOptions = new string[1] { "GoblinLegs" }, HelmetOptions = new string[2] { "GoblinCap1", "" }, BackOptions = new string[1] { "" }, FemaleWeapons = new string[2] { "DvergerHoe_bal", "KnifeCopper" }, MaleWeapons = new string[2] { "DvergerHoe_bal", "KnifeCopper" }, RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" } }; return dictionary; } public static Dictionary GetBlacksmithPresets() { Dictionary dictionary = new Dictionary(); dictionary["human"] = new LoadoutPreset { FemaleChests = new string[2] { "ArmorLeatherChest", "" }, MaleChests = new string[2] { "ArmorLeatherChest", "" }, LegsOptions = new string[3] { "ArmorWolfLegs", "ArmorIronLegs", "ArmorMageLegs_Ashlands" }, HelmetOptions = new string[3] { "HelmetHat1", "NpcHelmetBandana_bal", "" }, BackOptions = new string[1] { "" }, Tool = "BeltStrength", RightHand = "NpcToolHammer_bal", RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "MaceIron" } }; dictionary["dverger"] = new LoadoutPreset { LeftHand = "ShieldIronBuckler", FemaleChests = new string[2] { "DvergerFemaleDress3_bal", "DvergerFemaleDress5_bal" }, MaleChests = new string[3] { "DvergerSuitDark_bal", "DvergerSuitDarkHat_bal", "DvergerSuitArbalest_Ashlands" }, LegsOptions = new string[1] { "" }, HelmetOptions = dvergerHairMale, BackOptions = new string[1] { "" }, Tool = "", RightHand = "DvergerHammer_bal", RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" } }; dictionary["goblin"] = new LoadoutPreset { FemaleChests = new string[2] { "GoblinArmor1", "GoblinArmor2" }, MaleChests = new string[2] { "GoblinArmor1", "GoblinArmor2" }, LegsOptions = new string[1] { "GoblinLegs" }, HelmetOptions = new string[2] { "GoblinCap1", "" }, BackOptions = new string[1] { "" }, Tool = "", RightHand = "NpcToolHammer_bal", RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" } }; return dictionary; } public static Dictionary GetLumberjackPresets() { Dictionary dictionary = new Dictionary(); dictionary["human"] = new LoadoutPreset { FemaleChests = new string[2] { "ArmorLeatherChest", "ArmorRagsChest" }, MaleChests = new string[3] { "ArmorLeatherChest", "ArmorRagsChest", "" }, LegsOptions = new string[5] { "ArmorWolfLegs", "ArmorLeatherLegs", "ArmorTrollLeatherLegs", "NpcArmorTornLegs_bal", "ArmorAshlandsMediumlegs" }, HelmetOptions = new string[4] { "HelmetHat7", "", "NpcHelmetBandana_bal", "NpcHelmetRags_bal" }, BackOptions = new string[2] { "NpcCapeRags_bal", "" }, Tool = "BeltStrength", FemaleWeapons = new string[3] { "AxeBronze", "AxeIron", "" }, MaleWeapons = new string[3] { "AxeBronze", "AxeIron", "" }, RightBackOptions = new string[2] { "Battleaxe", "" }, LeftBackOptions = new string[1] { "" } }; dictionary["dverger"] = new LoadoutPreset { LeftHand = "", FemaleChests = new string[2] { "DvergerFemaleDress3_bal", "DvergerFemaleDress5_bal" }, MaleChests = new string[3] { "DvergerSuitDark_bal", "DvergerSuitDarkHat_bal", "DvergerSuitArbalest_Ashlands" }, LegsOptions = new string[1] { "" }, HelmetOptions = dvergerHairMale, BackOptions = new string[1] { "" }, Tool = "", RightHand = "DvergerHammer_bal", RightBackOptions = new string[1] { "" }, LeftBackOptions = new string[1] { "" } }; dictionary["goblin"] = new LoadoutPreset { FemaleChests = new string[2] { "GoblinArmor1", "GoblinArmor2" }, MaleChests = new string[2] { "GoblinArmor1", "GoblinArmor2" }, LegsOptions = new string[1] { "GoblinLegs" }, HelmetOptions = new string[2] { "GoblinCap1", "" }, BackOptions = new string[1] { "" }, Tool = "", RightHand = "NpcToolHammer_bal", RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" } }; return dictionary; } public static Dictionary GetButcherPresets() { Dictionary dictionary = new Dictionary(); dictionary["human"] = new LoadoutPreset { FemaleChests = new string[4] { "ArmorLeatherChest", "ArmorRagsChest", "ArmorTrollLeatherChest", "AmorTunic10" }, MaleChests = new string[5] { "ArmorLeatherChest", "ArmorRagsChest", "ArmorTrollLeatherChest", "", "AmorTunic10" }, LegsOptions = new string[4] { "ArmorLeatherLegs", "ArmorTrollLeatherLegs", "NpcArmorTornLegs_bal", "ArmorAshlandsChestlegs" }, HelmetOptions = new string[12] { "HelmetHat3", "", "HelmetHat2", "", "HelmetHat5", "", "HelmetHat6", "", "HelmetHat7", "", "HelmetHat10", "" }, BackOptions = new string[3] { "", "NpcCapeRags_bal", "" }, Tool = "BeltStrength", FemaleWeapons = new string[3] { "KnifeButcher", "KnifeSilver", "NpcButcher_bal" }, MaleWeapons = new string[3] { "KnifeButcher", "KnifeSilver", "NpcButcher_bal" }, RightBackOptions = new string[5] { "KnifeCopper", "KnifeFlint", "KnifeButcher", "KnifeSilver", "NpcButcher_bal" }, LeftBackOptions = new string[1] { "" } }; dictionary["dverger"] = new LoadoutPreset { LeftHand = "", FemaleChests = new string[2] { "DvergerFemaleDress3_bal", "DvergerFemaleDress5_bal" }, MaleChests = new string[3] { "DvergerSuitDark_bal", "DvergerSuitDarkHat_bal", "DvergerSuitArbalest_Ashlands" }, LegsOptions = new string[1] { "" }, HelmetOptions = dvergerHairMale, BackOptions = new string[1] { "" }, Tool = "", RightHand = "DvergerHammer_bal", RightBackOptions = new string[1] { "" }, LeftBackOptions = new string[1] { "" } }; dictionary["goblin"] = new LoadoutPreset { FemaleChests = new string[2] { "GoblinArmor1", "GoblinArmor2" }, MaleChests = new string[2] { "GoblinArmor1", "GoblinArmor2" }, LegsOptions = new string[1] { "GoblinLegs" }, HelmetOptions = new string[2] { "GoblinCap1", "" }, BackOptions = new string[1] { "" }, Tool = "", RightHand = "NpcToolHammer_bal", RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" } }; return dictionary; } public static Dictionary GetMinerPresets() { Dictionary dictionary = new Dictionary(); dictionary["human"] = new LoadoutPreset { FemaleChests = new string[2] { "ArmorLeatherChest", "ArmorRagsChest" }, MaleChests = new string[3] { "ArmorLeatherChest", "ArmorRagsChest", "" }, LegsOptions = new string[3] { "ArmorWolfLegs", "ArmorLeatherLegs", "ArmorRagsLegs" }, HelmetOptions = new string[3] { "HelmetHat7", "NpcHelmetMiner_bal", "" }, BackOptions = new string[2] { "NpcCapeRags_bal", "" }, Tool = "BeltStrength", FemaleWeapons = new string[4] { "PickaxeBronze", "PickaxeStone", "PickaxeIron", "" }, MaleWeapons = new string[4] { "PickaxeBronze", "PickaxeStone", "PickaxeIron", "" }, RightBackOptions = new string[1] { "" }, LeftBackOptions = new string[1] { "ShieldIronBuckler" } }; dictionary["dverger"] = new LoadoutPreset { LeftHand = "", FemaleChests = new string[2] { "DvergerFemaleDress3_bal", "DvergerFemaleDress5_bal" }, MaleChests = new string[3] { "DvergerSuitDark_bal", "DvergerSuitDarkHat_bal", "DvergerSuitArbalest_Ashlands" }, LegsOptions = new string[1] { "" }, HelmetOptions = dvergerHairMale, BackOptions = new string[1] { "" }, Tool = "", RightHand = "DvergerHammer_bal", RightBackOptions = new string[1] { "" }, LeftBackOptions = new string[1] { "" } }; dictionary["goblin"] = new LoadoutPreset { FemaleChests = new string[2] { "GoblinArmor1", "GoblinArmor2" }, MaleChests = new string[2] { "GoblinArmor1", "GoblinArmor2" }, LegsOptions = new string[1] { "GoblinLegs" }, HelmetOptions = new string[2] { "GoblinCap1", "" }, BackOptions = new string[1] { "" }, Tool = "", RightHand = "NpcToolHammer_bal", RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" } }; return dictionary; } public static object[] GetHunterPresets(string race) { return race switch { "dverger" => new object[1] { new LoadoutPreset { LeftHand = "DvergerKnife_bal", MaleChests = new string[3] { "DvergerSuitYellowHood_bal", "DvergerSuitArbalest", "DvergerSuitSupport" }, FemaleChests = new string[2] { "DvergerFemaleDress3_bal", "DvergerFemaleDress5_bal" }, LegsOptions = new string[1] { "" }, HelmetOptions = dvergerHairMale, BackOptions = new string[1] { "" }, FemaleWeapons = new string[3] { "BowFineWood", "SwordBronze", "DvergerKnife_bal" }, MaleWeapons = new string[3] { "BowFineWood", "SwordBronze", "DvergerKnife_bal" }, RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" } } }, "goblin" => new object[1] { new LoadoutPreset { MaleChests = new string[1] { "ArmorGoblinHunter_bal" }, FemaleChests = new string[1] { "ArmorGoblinHunter_bal" }, LegsOptions = new string[1] { "ArmorGoblinLegs_bal" }, HelmetOptions = new string[1] { "" }, BackOptions = new string[2] { "", "CapeDeerHide" }, FemaleWeapons = new string[2] { "BowCrude", "KnifeFlint" }, MaleWeapons = new string[2] { "BowCrude", "KnifeFlint" }, RightBackOptions = new string[1] { "MaceBronze" }, LeftBackOptions = new string[1] { "ShieldWood" } } }, _ => new object[3] { new LoadoutPreset { MaleChests = new string[1] { "NpcArmorBearChest_bal" }, FemaleChests = new string[1] { "NpcArmorBearChest_bal" }, LegsOptions = new string[1] { "ArmorLeatherLegs" }, HelmetOptions = new string[2] { "HelmetLeather", "" }, BackOptions = new string[4] { "", "CapeDeerHide", "CapeTrollHide", "" }, FemaleWeapons = new string[1] { "" }, MaleWeapons = new string[1] { "" }, RightBackOptions = new string[6] { "MaceBronze", "KnifeCopper", "KnifeFlint", "AxeBronze", "SwordBronze", "SpearBronze" }, LeftBackOptions = new string[1] { "BowFineWood" } }, new LoadoutPreset { MaleChests = new string[1] { "ArmorMageChest_Ashlands" }, FemaleChests = new string[1] { "ArmorMageChest_Ashlands" }, LegsOptions = new string[1] { "ArmorMageLegs_Ashlands" }, HelmetOptions = new string[2] { "HelmetMage_Ashlands", "" }, BackOptions = new string[3] { "CapeWolf", "CapeTrollHide", "CapeFeathers" }, FemaleWeapons = new string[1] { "" }, MaleWeapons = new string[1] { "" }, RightBackOptions = new string[6] { "MaceBronze", "KnifeCopper", "KnifeFlint", "AxeBronze", "SwordBronze", "SpearBronze" }, LeftBackOptions = new string[1] { "BowHuntsman" } }, new LoadoutPreset { MaleChests = new string[1] { "ArmorFenringChest" }, FemaleChests = new string[1] { "ArmorFenringChest" }, LegsOptions = new string[1] { "ArmorFenringLegs" }, HelmetOptions = new string[2] { "HelmetFenring", "" }, BackOptions = new string[4] { "CapeWolf", "CapeLox", "NpcCapeBlackWolf_bal", "" }, FemaleWeapons = new string[1] { "" }, MaleWeapons = new string[1] { "" }, RightBackOptions = new string[4] { "SwordSilver", "AxeIron", "MaceIron", "SpearElderbark" }, LeftBackOptions = new string[1] { "BowHuntsman" } } }, }; } private static string[] GetDressList() { return new string[8] { "ArmorDress9", "ArmorDress8", "ArmorDress7", "ArmorDress6", "ArmorDress5", "ArmorDress4", "ArmorDress3", "ArmorDress2" }; } private static string[] GetTunicList() { return new string[9] { "ArmorTunic9", "ArmorTunic8", "ArmorTunic7", "ArmorTunic6", "ArmorTunic5", "ArmorTunic4", "ArmorTunic3", "ArmorTunic2", "ArmorTrollLeatherChest" }; } private static string GetSomePants() { string[] array = new string[4] { "ArmorTrollLeatherLegs", "ArmorLeatherLegs", "ArmorWolfLegs", "ArmorMageLegs" }; return array[Random.Range(0, array.Length)]; } public static string GetFemaleDvergerHair() { return dvergerHairFemale[Random.Range(0, dvergerHairFemale.Length)]; } } public class BalrondActorLoadout { public string m_race = "human"; public string m_name = "Example Name"; public string m_type = "trader"; public string archetype = "Villager"; public bool m_bearedPicked = false; public string m_beardItem = ""; public bool m_hairPicked = false; public string m_hairItem = ""; public string m_helmet = ""; public bool m_canTakeOffHelmet = false; public bool m_canHideWeapons = false; public string m_chest = ""; public string m_legs = ""; public string m_back = ""; public int m_backVariant = 0; public string m_right = ""; public int m_rightVariant = 0; public string m_left = ""; public int m_leftVariant = 0; public int m_leftMaxVariant = 0; public string m_leftBack; public int m_leftBackVariant = 0; public string m_rightBack; public int m_rightBackVariant = 0; public string m_tool; public int m_toolVariant = 0; public bool m_genderPicked = false; public bool m_isFemale = false; public Dictionary m_soldItems = new Dictionary(); public NpcDialogue m_dialogue = new NpcDialogue(); public List m_traderitems = new List(); } public class BalrondActorLoadoutFactory { public static readonly Vector3[] HairColors = (Vector3[])(object)new Vector3[18] { new Vector3(0.32f, 0.2f, 0.11f), new Vector3(0.8f, 0.7f, 0.5f), new Vector3(0.1f, 0.1f, 0.1f), new Vector3(0.7f, 0.2f, 0.1f), new Vector3(0.8f, 0.3f, 0.1f), new Vector3(0.5f, 0.4f, 0.3f), new Vector3(0.6f, 0.55f, 0.5f), new Vector3(0.4f, 0.25f, 0.15f), new Vector3(0.3f, 0.2f, 0.1f), new Vector3(0.25f, 0.15f, 0.05f), new Vector3(0.7f, 0.5f, 0.35f), new Vector3(0.15f, 0.1f, 0.05f), new Vector3(0.55f, 0.5f, 0.4f), new Vector3(0.75f, 0.25f, 0.15f), new Vector3(0.85f, 0.35f, 0.2f), new Vector3(0.65f, 0.15f, 0.05f), new Vector3(0.9f, 0.4f, 0.25f), new Vector3(0.7f, 0.3f, 0.1f) }; public static readonly Vector3[] SkinTones = (Vector3[])(object)new Vector3[13] { new Vector3(0.99f, 0.95f, 0.91f), new Vector3(0.97f, 0.92f, 0.85f), new Vector3(0.95f, 0.9f, 0.8f), new Vector3(0.94f, 0.88f, 0.75f), new Vector3(0.92f, 0.86f, 0.7f), new Vector3(0.91f, 0.82f, 0.7f), new Vector3(0.88f, 0.79f, 0.65f), new Vector3(0.86f, 0.78f, 0.62f), new Vector3(0.97f, 0.87f, 0.8f), new Vector3(0.91f, 0.75f, 0.6f), new Vector3(0.78f, 0.59f, 0.44f), new Vector3(0.6f, 0.45f, 0.3f), new Vector3(0.45f, 0.3f, 0.18f) }; public static readonly string[] Archetypes = new string[16] { "Priest", "Farmer", "Blacksmith", "Hunter", "Guard", "Defender", "Villager", "Begger", "Merchant", "Miner", "Lumberjack", "Fisherman", "Inkeeper", "Patron", "Forager", "Butcher" }; public static BalrondActorLoadout GetLoadout(string archetype, bool isFemale = false, string race = "human") { if (string.IsNullOrEmpty(archetype)) { archetype = "Villager"; } race = ((race != null) ? race.ToLowerInvariant() : "human"); BalrondActorLoadout loadout; if (archetype.StartsWith("Hunter")) { int tier = ((!(race == "human")) ? 1 : Random.Range(1, 3)); loadout = GetHunter(tier, isFemale, race); } else if (archetype.StartsWith("Guard")) { int tier2 = ((!(race == "human")) ? 1 : Random.Range(1, 4)); loadout = GetGuard(tier2, isFemale, race); } else if (!archetype.StartsWith("Defender")) { loadout = archetype switch { "Farmer" => GetFarmer(isFemale, race), "Blacksmith" => GetBlacksmith(isFemale, race), "Villager" => GetVillager(isFemale, race), "Begger" => GetBegger(isFemale, race), "Merchant" => GetMerchant(isFemale, race), "Priest" => GetPriest(isFemale, race), "Lumberjack" => GetLumberjack(isFemale, race), "Miner" => GetMiner(isFemale, race), "Butcher" => GetButcher(isFemale, race), "Patron" => GetPatron(isFemale, race), "Innkeeper" => GetInnkeeper(isFemale, race), "Forager" => GetForager(isFemale, race), "Fisherman" => GetFisher(isFemale, race), _ => GetVillager(isFemale, race), }; } else { int tier3 = ((!(race == "human")) ? 1 : Random.Range(1, 4)); loadout = GetDefender(tier3, isFemale, race); } loadout = ReplaceFemaleDvergerHair(loadout, isFemale, race); loadout.archetype = archetype; loadout.m_isFemale = isFemale; return loadout; } private static int ParseSuffix(string input, string prefix, int min, int max) { string s = input.Substring(prefix.Length); if (!int.TryParse(s, out var result)) { result = min; } return Mathf.Clamp(result, min, max); } private static BalrondActorLoadout ReplaceFemaleDvergerHair(BalrondActorLoadout loadout, bool isFemale, string race) { if (isFemale && race == "dverger") { loadout.m_helmet = BalrondActorFactoryPresets.GetFemaleDvergerHair(); } return loadout; } private static string GetRandom(string[] options) { return (options != null && options.Length != 0) ? options[Random.Range(0, options.Length)] : ""; } private static BalrondActorLoadout GetFarmer(bool isFemale, string race) { Dictionary farmerPresets = BalrondActorFactoryPresets.GetFarmerPresets(); BalrondActorFactoryPresets.LoadoutPreset value; BalrondActorFactoryPresets.LoadoutPreset loadoutPreset = (farmerPresets.TryGetValue(race, out value) ? value : farmerPresets["human"]); return new BalrondActorLoadout { m_left = "", m_leftMaxVariant = 0, m_chest = GetRandom(isFemale ? loadoutPreset.FemaleChests : loadoutPreset.MaleChests), m_legs = GetRandom(loadoutPreset.LegsOptions), m_helmet = GetRandom(loadoutPreset.HelmetOptions), m_back = GetRandom(loadoutPreset.BackOptions), m_backVariant = 0, m_right = ((loadoutPreset.RightHand == "") ? GetRandom(isFemale ? loadoutPreset.FemaleWeapons : loadoutPreset.MaleWeapons) : loadoutPreset.RightHand), m_rightBack = GetRandom(loadoutPreset.RightBackOptions), m_leftBack = GetRandom(loadoutPreset.LeftBackOptions), m_tool = loadoutPreset.Tool, m_leftBackVariant = loadoutPreset.LeftBackVariant, m_rightBackVariant = loadoutPreset.RightBackVariant, m_canTakeOffHelmet = (race == "human" && loadoutPreset.CanTakeOffHelmet), m_canHideWeapons = true }; } private static BalrondActorLoadout GetForager(bool isFemale, string race) { Dictionary foragerPresets = BalrondActorFactoryPresets.GetForagerPresets(); BalrondActorFactoryPresets.LoadoutPreset value; BalrondActorFactoryPresets.LoadoutPreset loadoutPreset = (foragerPresets.TryGetValue(race, out value) ? value : foragerPresets["human"]); return new BalrondActorLoadout { m_left = "", m_leftMaxVariant = 0, m_chest = GetRandom(isFemale ? loadoutPreset.FemaleChests : loadoutPreset.MaleChests), m_legs = GetRandom(loadoutPreset.LegsOptions), m_helmet = GetRandom(loadoutPreset.HelmetOptions), m_back = GetRandom(loadoutPreset.BackOptions), m_backVariant = 0, m_right = ((loadoutPreset.RightHand == "") ? GetRandom(isFemale ? loadoutPreset.FemaleWeapons : loadoutPreset.MaleWeapons) : loadoutPreset.RightHand), m_rightBack = GetRandom(loadoutPreset.RightBackOptions), m_leftBack = GetRandom(loadoutPreset.LeftBackOptions), m_tool = loadoutPreset.Tool, m_leftBackVariant = loadoutPreset.LeftBackVariant, m_rightBackVariant = loadoutPreset.RightBackVariant, m_canTakeOffHelmet = (race == "human" && loadoutPreset.CanTakeOffHelmet), m_canHideWeapons = true }; } private static BalrondActorLoadout GetFisher(bool isFemale, string race) { Dictionary fisherPresets = BalrondActorFactoryPresets.GetFisherPresets(); BalrondActorFactoryPresets.LoadoutPreset value; BalrondActorFactoryPresets.LoadoutPreset loadoutPreset = (fisherPresets.TryGetValue(race, out value) ? value : fisherPresets["human"]); return new BalrondActorLoadout { m_left = "", m_leftMaxVariant = 0, m_chest = GetRandom(isFemale ? loadoutPreset.FemaleChests : loadoutPreset.MaleChests), m_legs = GetRandom(loadoutPreset.LegsOptions), m_helmet = GetRandom(loadoutPreset.HelmetOptions), m_back = GetRandom(loadoutPreset.BackOptions), m_backVariant = 0, m_right = ((loadoutPreset.RightHand == "") ? GetRandom(isFemale ? loadoutPreset.FemaleWeapons : loadoutPreset.MaleWeapons) : loadoutPreset.RightHand), m_rightBack = GetRandom(loadoutPreset.RightBackOptions), m_leftBack = GetRandom(loadoutPreset.LeftBackOptions), m_tool = loadoutPreset.Tool, m_leftBackVariant = loadoutPreset.LeftBackVariant, m_rightBackVariant = loadoutPreset.RightBackVariant, m_canTakeOffHelmet = (race == "human" && loadoutPreset.CanTakeOffHelmet), m_canHideWeapons = true }; } private static BalrondActorLoadout GetDefender(int tier, bool isFemale, string race) { Dictionary defenderPresets = BalrondActorFactoryPresets.GetDefenderPresets(); race = race.ToLowerInvariant(); if (!defenderPresets.TryGetValue(race, out var value)) { value = defenderPresets["human"]; } BalrondActorFactoryPresets.LoadoutPreset loadoutPreset = value[tier - 1]; return new BalrondActorLoadout { m_left = loadoutPreset.LeftHand, m_leftMaxVariant = loadoutPreset.LeftVariant, m_chest = GetRandom(isFemale ? loadoutPreset.FemaleChests : loadoutPreset.MaleChests), m_legs = GetRandom(loadoutPreset.LegsOptions), m_helmet = GetRandom(loadoutPreset.HelmetOptions), m_back = GetRandom(loadoutPreset.BackOptions), m_backVariant = loadoutPreset.BackVariant, m_right = ((loadoutPreset.RightHand == "") ? GetRandom(isFemale ? loadoutPreset.FemaleWeapons : loadoutPreset.MaleWeapons) : loadoutPreset.RightHand), m_rightBack = GetRandom(loadoutPreset.RightBackOptions), m_leftBack = GetRandom(loadoutPreset.LeftBackOptions), m_tool = loadoutPreset.Tool, m_leftBackVariant = loadoutPreset.LeftBackVariant, m_rightBackVariant = loadoutPreset.RightBackVariant, m_canTakeOffHelmet = (race == "human" && loadoutPreset.CanTakeOffHelmet), m_canHideWeapons = true }; } private static BalrondActorLoadout GetGuard(int tier, bool isFemale, string race) { Dictionary guardPresets = BalrondActorFactoryPresets.GetGuardPresets(); race = race.ToLowerInvariant(); if (!guardPresets.TryGetValue(race, out var value)) { value = guardPresets["human"]; } BalrondActorFactoryPresets.LoadoutPreset loadoutPreset = value[tier - 1]; return new BalrondActorLoadout { m_left = loadoutPreset.LeftHand, m_leftMaxVariant = loadoutPreset.LeftVariant, m_chest = GetRandom(isFemale ? loadoutPreset.FemaleChests : loadoutPreset.MaleChests), m_legs = GetRandom(loadoutPreset.LegsOptions), m_helmet = GetRandom(loadoutPreset.HelmetOptions), m_back = GetRandom(loadoutPreset.BackOptions), m_backVariant = loadoutPreset.BackVariant, m_right = ((loadoutPreset.RightHand == "") ? GetRandom(isFemale ? loadoutPreset.FemaleWeapons : loadoutPreset.MaleWeapons) : loadoutPreset.RightHand), m_rightBack = GetRandom(loadoutPreset.RightBackOptions), m_leftBack = GetRandom(loadoutPreset.LeftBackOptions), m_tool = loadoutPreset.Tool, m_leftBackVariant = loadoutPreset.LeftBackVariant, m_rightBackVariant = loadoutPreset.RightBackVariant, m_canTakeOffHelmet = (race == "human" && loadoutPreset.CanTakeOffHelmet), m_canHideWeapons = true }; } private static BalrondActorLoadout GetBlacksmith(bool isFemale, string race) { Dictionary blacksmithPresets = BalrondActorFactoryPresets.GetBlacksmithPresets(); BalrondActorFactoryPresets.LoadoutPreset value; BalrondActorFactoryPresets.LoadoutPreset loadoutPreset = (blacksmithPresets.TryGetValue(race, out value) ? value : blacksmithPresets["human"]); return new BalrondActorLoadout { m_left = "", m_leftMaxVariant = 7, m_chest = GetRandom(isFemale ? loadoutPreset.FemaleChests : loadoutPreset.MaleChests), m_legs = GetRandom(loadoutPreset.LegsOptions), m_helmet = GetRandom(loadoutPreset.HelmetOptions), m_back = GetRandom(loadoutPreset.BackOptions), m_backVariant = 0, m_right = ((loadoutPreset.RightHand == "") ? GetRandom(isFemale ? loadoutPreset.FemaleWeapons : loadoutPreset.MaleWeapons) : loadoutPreset.RightHand), m_rightBack = GetRandom(loadoutPreset.RightBackOptions), m_leftBack = GetRandom(loadoutPreset.LeftBackOptions), m_tool = loadoutPreset.Tool, m_leftBackVariant = loadoutPreset.LeftBackVariant, m_rightBackVariant = loadoutPreset.RightBackVariant, m_canTakeOffHelmet = (race == "human" && loadoutPreset.CanTakeOffHelmet), m_canHideWeapons = true }; } private static BalrondActorLoadout GetLumberjack(bool isFemale, string race) { Dictionary lumberjackPresets = BalrondActorFactoryPresets.GetLumberjackPresets(); BalrondActorFactoryPresets.LoadoutPreset value; BalrondActorFactoryPresets.LoadoutPreset loadoutPreset = (lumberjackPresets.TryGetValue(race, out value) ? value : lumberjackPresets["human"]); return new BalrondActorLoadout { m_left = "", m_leftMaxVariant = 7, m_chest = GetRandom(isFemale ? loadoutPreset.FemaleChests : loadoutPreset.MaleChests), m_legs = GetRandom(loadoutPreset.LegsOptions), m_helmet = GetRandom(loadoutPreset.HelmetOptions), m_back = GetRandom(loadoutPreset.BackOptions), m_backVariant = 0, m_right = ((loadoutPreset.RightHand == "") ? GetRandom(isFemale ? loadoutPreset.FemaleWeapons : loadoutPreset.MaleWeapons) : loadoutPreset.RightHand), m_rightBack = GetRandom(loadoutPreset.RightBackOptions), m_leftBack = GetRandom(loadoutPreset.LeftBackOptions), m_tool = loadoutPreset.Tool, m_leftBackVariant = loadoutPreset.LeftBackVariant, m_rightBackVariant = loadoutPreset.RightBackVariant, m_canTakeOffHelmet = (race == "human" && loadoutPreset.CanTakeOffHelmet), m_canHideWeapons = true }; } private static BalrondActorLoadout GetMiner(bool isFemale, string race) { Dictionary minerPresets = BalrondActorFactoryPresets.GetMinerPresets(); BalrondActorFactoryPresets.LoadoutPreset value; BalrondActorFactoryPresets.LoadoutPreset loadoutPreset = (minerPresets.TryGetValue(race, out value) ? value : minerPresets["human"]); return new BalrondActorLoadout { m_left = "", m_leftMaxVariant = 7, m_chest = GetRandom(isFemale ? loadoutPreset.FemaleChests : loadoutPreset.MaleChests), m_legs = GetRandom(loadoutPreset.LegsOptions), m_helmet = GetRandom(loadoutPreset.HelmetOptions), m_back = GetRandom(loadoutPreset.BackOptions), m_backVariant = 0, m_right = ((loadoutPreset.RightHand == "") ? GetRandom(isFemale ? loadoutPreset.FemaleWeapons : loadoutPreset.MaleWeapons) : loadoutPreset.RightHand), m_rightBack = GetRandom(loadoutPreset.RightBackOptions), m_leftBack = GetRandom(loadoutPreset.LeftBackOptions), m_tool = loadoutPreset.Tool, m_leftBackVariant = loadoutPreset.LeftBackVariant, m_rightBackVariant = loadoutPreset.RightBackVariant, m_canTakeOffHelmet = (race == "human" && loadoutPreset.CanTakeOffHelmet), m_canHideWeapons = true }; } private static BalrondActorLoadout GetButcher(bool isFemale, string race) { Dictionary butcherPresets = BalrondActorFactoryPresets.GetButcherPresets(); BalrondActorFactoryPresets.LoadoutPreset value; BalrondActorFactoryPresets.LoadoutPreset loadoutPreset = (butcherPresets.TryGetValue(race, out value) ? value : butcherPresets["human"]); return new BalrondActorLoadout { m_left = "", m_leftMaxVariant = 7, m_chest = GetRandom(isFemale ? loadoutPreset.FemaleChests : loadoutPreset.MaleChests), m_legs = GetRandom(loadoutPreset.LegsOptions), m_helmet = GetRandom(loadoutPreset.HelmetOptions), m_back = GetRandom(loadoutPreset.BackOptions), m_backVariant = 0, m_right = ((loadoutPreset.RightHand == "") ? GetRandom(isFemale ? loadoutPreset.FemaleWeapons : loadoutPreset.MaleWeapons) : loadoutPreset.RightHand), m_rightBack = GetRandom(loadoutPreset.RightBackOptions), m_leftBack = GetRandom(loadoutPreset.LeftBackOptions), m_tool = loadoutPreset.Tool, m_leftBackVariant = loadoutPreset.LeftBackVariant, m_rightBackVariant = loadoutPreset.RightBackVariant, m_canTakeOffHelmet = (race == "human" && loadoutPreset.CanTakeOffHelmet), m_canHideWeapons = true }; } private static BalrondActorLoadout GetHunter(int tier, bool isFemale, string race) { object[] hunterPresets = BalrondActorFactoryPresets.GetHunterPresets(race.ToLowerInvariant()); BalrondActorFactoryPresets.LoadoutPreset loadoutPreset = (BalrondActorFactoryPresets.LoadoutPreset)hunterPresets[tier - 1]; return new BalrondActorLoadout { m_left = "", m_chest = GetRandom(isFemale ? loadoutPreset.FemaleChests : loadoutPreset.MaleChests), m_legs = GetRandom(loadoutPreset.LegsOptions), m_helmet = GetRandom(loadoutPreset.HelmetOptions), m_back = GetRandom(loadoutPreset.BackOptions), m_right = ((loadoutPreset.RightHand == "") ? GetRandom(isFemale ? loadoutPreset.FemaleWeapons : loadoutPreset.MaleWeapons) : loadoutPreset.RightHand), m_rightBack = GetRandom(loadoutPreset.RightBackOptions), m_leftBack = GetRandom(loadoutPreset.LeftBackOptions), m_tool = loadoutPreset.Tool, m_leftBackVariant = loadoutPreset.LeftBackVariant, m_rightBackVariant = loadoutPreset.RightBackVariant, m_canTakeOffHelmet = (race == "human" && loadoutPreset.CanTakeOffHelmet), m_canHideWeapons = true }; } private static BalrondActorLoadout GetPriest(bool isFemale, string race) { Dictionary priestPresets = BalrondActorFactoryPresets.GetPriestPresets(); race = race.ToLowerInvariant(); BalrondActorFactoryPresets.LoadoutPreset value; BalrondActorFactoryPresets.LoadoutPreset loadoutPreset = (priestPresets.TryGetValue(race, out value) ? value : priestPresets["human"]); return new BalrondActorLoadout { m_left = "", m_leftMaxVariant = 0, m_chest = GetRandom(isFemale ? loadoutPreset.FemaleChests : loadoutPreset.MaleChests), m_legs = GetRandom(loadoutPreset.LegsOptions), m_helmet = GetRandom(loadoutPreset.HelmetOptions), m_back = GetRandom(loadoutPreset.BackOptions), m_backVariant = loadoutPreset.BackVariant, m_tool = loadoutPreset.Tool, m_right = ((loadoutPreset.RightHand == "") ? GetRandom(isFemale ? loadoutPreset.FemaleWeapons : loadoutPreset.MaleWeapons) : loadoutPreset.RightHand), m_rightBack = GetRandom(loadoutPreset.RightBackOptions), m_leftBack = GetRandom(loadoutPreset.LeftBackOptions), m_leftBackVariant = loadoutPreset.LeftBackVariant, m_rightBackVariant = loadoutPreset.RightBackVariant, m_canTakeOffHelmet = (race == "human" && loadoutPreset.CanTakeOffHelmet), m_canHideWeapons = loadoutPreset.CanHideWeapons }; } private static BalrondActorLoadout GetMerchant(bool isFemale, string race) { Dictionary merchantPresets = BalrondActorFactoryPresets.GetMerchantPresets(); race = race.ToLowerInvariant(); BalrondActorFactoryPresets.LoadoutPreset value; BalrondActorFactoryPresets.LoadoutPreset loadoutPreset = (merchantPresets.TryGetValue(race, out value) ? value : merchantPresets["human"]); return new BalrondActorLoadout { m_left = "", m_leftMaxVariant = 0, m_helmet = GetRandom(loadoutPreset.HelmetOptions), m_back = GetRandom(loadoutPreset.BackOptions), m_backVariant = loadoutPreset.BackVariant, m_canTakeOffHelmet = (race == "human" && loadoutPreset.CanTakeOffHelmet), m_canHideWeapons = loadoutPreset.CanHideWeapons, m_leftBackVariant = loadoutPreset.LeftBackVariant, m_rightBackVariant = loadoutPreset.RightBackVariant, m_tool = loadoutPreset.Tool, m_chest = GetRandom(isFemale ? loadoutPreset.FemaleChests : loadoutPreset.MaleChests), m_legs = GetRandom(loadoutPreset.LegsOptions), m_right = ((loadoutPreset.RightHand == "") ? GetRandom(isFemale ? loadoutPreset.FemaleWeapons : loadoutPreset.MaleWeapons) : loadoutPreset.RightHand), m_rightBack = GetRandom(loadoutPreset.RightBackOptions), m_leftBack = GetRandom(loadoutPreset.LeftBackOptions) }; } private static BalrondActorLoadout GetInnkeeper(bool isFemale, string race) { Dictionary innkepperPresets = BalrondActorFactoryPresets.GetInnkepperPresets(); race = race.ToLowerInvariant(); BalrondActorFactoryPresets.LoadoutPreset value; BalrondActorFactoryPresets.LoadoutPreset loadoutPreset = (innkepperPresets.TryGetValue(race, out value) ? value : innkepperPresets["human"]); return new BalrondActorLoadout { m_left = "", m_leftMaxVariant = 0, m_helmet = GetRandom(loadoutPreset.HelmetOptions), m_back = GetRandom(loadoutPreset.BackOptions), m_backVariant = loadoutPreset.BackVariant, m_canTakeOffHelmet = (race == "human" && loadoutPreset.CanTakeOffHelmet), m_canHideWeapons = loadoutPreset.CanHideWeapons, m_leftBackVariant = loadoutPreset.LeftBackVariant, m_rightBackVariant = loadoutPreset.RightBackVariant, m_tool = loadoutPreset.Tool, m_chest = GetRandom(isFemale ? loadoutPreset.FemaleChests : loadoutPreset.MaleChests), m_legs = GetRandom(loadoutPreset.LegsOptions), m_right = ((loadoutPreset.RightHand == "") ? GetRandom(isFemale ? loadoutPreset.FemaleWeapons : loadoutPreset.MaleWeapons) : loadoutPreset.RightHand), m_rightBack = GetRandom(loadoutPreset.RightBackOptions), m_leftBack = GetRandom(loadoutPreset.LeftBackOptions) }; } private static BalrondActorLoadout GetBegger(bool isFemale, string race) { Dictionary beggarPresets = BalrondActorFactoryPresets.GetBeggarPresets(); race = race.ToLowerInvariant(); BalrondActorFactoryPresets.LoadoutPreset value; BalrondActorFactoryPresets.LoadoutPreset loadoutPreset = (beggarPresets.TryGetValue(race, out value) ? value : beggarPresets["human"]); return new BalrondActorLoadout { m_left = "", m_leftMaxVariant = 0, m_chest = GetRandom(isFemale ? loadoutPreset.FemaleChests : loadoutPreset.MaleChests), m_legs = GetRandom(loadoutPreset.LegsOptions), m_helmet = GetRandom(loadoutPreset.HelmetOptions), m_back = GetRandom(loadoutPreset.BackOptions), m_backVariant = loadoutPreset.BackVariant, m_leftBackVariant = loadoutPreset.LeftBackVariant, m_rightBackVariant = loadoutPreset.RightBackVariant, m_canTakeOffHelmet = (race == "human" && loadoutPreset.CanTakeOffHelmet), m_canHideWeapons = loadoutPreset.CanHideWeapons, m_right = ((loadoutPreset.RightHand == "") ? GetRandom(isFemale ? loadoutPreset.FemaleWeapons : loadoutPreset.MaleWeapons) : loadoutPreset.RightHand), m_rightBack = GetRandom(loadoutPreset.RightBackOptions), m_leftBack = GetRandom(loadoutPreset.LeftBackOptions) }; } private static BalrondActorLoadout GetPatron(bool isFemale, string race) { Dictionary patronPresets = BalrondActorFactoryPresets.GetPatronPresets(); race = race.ToLowerInvariant(); BalrondActorFactoryPresets.LoadoutPreset value; BalrondActorFactoryPresets.LoadoutPreset loadoutPreset = (patronPresets.TryGetValue(race, out value) ? value : patronPresets["human"]); string helmet = ((!isFemale) ? GetRandom(loadoutPreset.HelmetOptions) : ((Random.Range(0, 2) == 0) ? GetRandom(loadoutPreset.HelmetOptions) : "HelmetMidsummerCrown")); return new BalrondActorLoadout { m_left = "", m_leftMaxVariant = 0, m_leftBackVariant = loadoutPreset.LeftBackVariant, m_rightBackVariant = loadoutPreset.RightBackVariant, m_chest = GetRandom(isFemale ? loadoutPreset.FemaleChests : loadoutPreset.MaleChests), m_legs = GetRandom(loadoutPreset.LegsOptions), m_helmet = helmet, m_back = GetRandom(loadoutPreset.BackOptions), m_backVariant = loadoutPreset.BackVariant, m_canTakeOffHelmet = (race == "human" && loadoutPreset.CanTakeOffHelmet), m_canHideWeapons = loadoutPreset.CanHideWeapons, m_right = ((loadoutPreset.RightHand == "") ? GetRandom(isFemale ? loadoutPreset.FemaleWeapons : loadoutPreset.MaleWeapons) : loadoutPreset.RightHand), m_rightBack = GetRandom(loadoutPreset.RightBackOptions), m_leftBack = GetRandom(loadoutPreset.LeftBackOptions) }; } private static BalrondActorLoadout GetVillager(bool isFemale, string race) { Dictionary villagerPresets = BalrondActorFactoryPresets.GetVillagerPresets(); race = race.ToLowerInvariant(); BalrondActorFactoryPresets.LoadoutPreset value; BalrondActorFactoryPresets.LoadoutPreset loadoutPreset = (villagerPresets.TryGetValue(race, out value) ? value : villagerPresets["human"]); string helmet = ((!isFemale) ? GetRandom(loadoutPreset.HelmetOptions) : ((Random.Range(0, 2) == 0) ? GetRandom(loadoutPreset.HelmetOptions) : "HelmetMidsummerCrown")); return new BalrondActorLoadout { m_left = "", m_leftMaxVariant = 0, m_leftBackVariant = loadoutPreset.LeftBackVariant, m_rightBackVariant = loadoutPreset.RightBackVariant, m_chest = GetRandom(isFemale ? loadoutPreset.FemaleChests : loadoutPreset.MaleChests), m_legs = GetRandom(loadoutPreset.LegsOptions), m_helmet = helmet, m_back = GetRandom(loadoutPreset.BackOptions), m_backVariant = loadoutPreset.BackVariant, m_canTakeOffHelmet = (race == "human" && loadoutPreset.CanTakeOffHelmet), m_canHideWeapons = loadoutPreset.CanHideWeapons, m_right = ((loadoutPreset.RightHand == "") ? GetRandom(isFemale ? loadoutPreset.FemaleWeapons : loadoutPreset.MaleWeapons) : loadoutPreset.RightHand), m_rightBack = GetRandom(loadoutPreset.RightBackOptions), m_leftBack = GetRandom(loadoutPreset.LeftBackOptions) }; } } public class BalrondActorNamePicker : MonoBehaviour { public bool m_isFemale = false; public string m_name = "DEFAULT"; public string m_race = "human"; public ZNetView m_nview; private void Start() { m_nview = ((Component)this).gameObject.GetComponent(); if (!IsValidNView()) { return; } ZDO zDO = m_nview.GetZDO(); m_name = zDO.GetString("BalrondActorHasName", ""); if (m_name == "" || m_name == "DEFAULT") { m_name = BalrondActorNameLists.GetFullName(m_race, m_isFemale); if (m_nview.IsOwner()) { zDO.Set("BalrondActorHasName", m_name); } } SetNpcName(); } private bool IsValidNView() { return (Object)(object)m_nview != (Object)null && m_nview.IsValid(); } public void SetNpcName() { Humanoid component = ((Component)this).GetComponent(); if ((Object)(object)component != (Object)null) { ((Character)component).m_name = m_name; } BalrondActorTalker component2 = ((Component)this).GetComponent(); if ((Object)(object)component2 != (Object)null) { component2.m_name = m_name; } BalrondActor component3 = ((Component)this).GetComponent(); if ((Object)(object)component3 != (Object)null) { component3.m_name = m_name; } Trader component4 = ((Component)this).GetComponent(); if ((Object)(object)component4 != (Object)null) { component4.m_name = m_name; } Turret component5 = ((Component)this).GetComponent(); if ((Object)(object)component5 != (Object)null) { component5.m_name = m_name; } } } public class BalrondActorTalker : MonoBehaviour, Hoverable, Interactable { private class QueuedSay { public string text; public string trigger; public string randTrigger; public float rand; public EffectList m_effect; } public string m_name = "Haldor"; public string m_race = "human"; public string m_archetype = "Villager"; public float m_standRange = 15f; public float m_maxRange = 15f; public float m_greetRange = 10f; public float m_byeRange = 15f; public float m_offset = 2f; public float m_minTalkInterval = 1.5f; public float m_hideDialogDelay = 5f; public float m_randomTalkInterval = 10f; public float m_randomTalkChance = 1f; public List m_randomTalk = new List(); public List m_randomTalkInFactionBase = new List(); public List m_randomGreets = new List(); public List m_randomGoodbye = new List(); public List m_privateAreaAlarm = new List(); public List m_aggravated = new List(); public EffectList m_randomTalkFX = new EffectList(); public EffectList m_randomGreetFX = new EffectList(); public EffectList m_randomGoodbyeFX = new EffectList(); private bool m_didGreet; public bool m_didAnger; private bool m_didGoodbye; private Animator m_animator; private ZNetView m_nview; private BalrondActor m_balrondActor; private Queue m_queuedTexts = new Queue(); private float m_lastTalkTime; public LookAt m_lookAt; public int drinkTImer = 25; public bool isDrunk = false; private void Start() { m_animator = ((Component)this).GetComponentInChildren(); m_nview = ((Component)this).GetComponent(); m_lookAt = ((Component)this).GetComponentInChildren(); ((MonoBehaviour)this).InvokeRepeating("RandomTalk", Random.Range(m_randomTalkInterval / 5f, m_randomTalkInterval), m_randomTalkInterval); ((MonoBehaviour)this).InvokeRepeating("GetDrunk", Random.Range(m_randomTalkInterval / 3f, m_randomTalkInterval), m_randomTalkInterval); m_balrondActor = ((Component)this).GetComponent(); if ((Object)(object)m_balrondActor != (Object)null) { m_race = m_balrondActor.m_race; } } public string GetHoverText() { string text = m_name + "\n[$KEY_Use] $raven_interact"; return Localization.instance.Localize(text); } public string GetHoverName() { return Localization.instance.Localize(m_name); } private void Update() { //IL_0007: 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_0048: 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) Player closestPlayer = Player.GetClosestPlayer(((Component)this).transform.position, Mathf.Max(m_byeRange + 3f, m_standRange)); if (Object.op_Implicit((Object)(object)closestPlayer)) { float num = Vector3.Distance(((Component)closestPlayer).transform.position, ((Component)this).transform.position); if ((double)num < (double)m_standRange) { m_lookAt.SetLoockAtTarget(((Character)closestPlayer).GetHeadPoint()); } if (!m_didGreet && (double)num < (double)m_greetRange) { m_didGreet = true; QueueSay(m_randomGreets, "Greet", m_randomGreetFX); } if (!m_didGreet || m_didGoodbye || (double)num <= (double)m_byeRange) { return; } m_didGoodbye = true; QueueSay(m_randomGoodbye, "Greet", m_randomGoodbyeFX); } else { m_lookAt.ResetTarget(); } UpdateSayQueue(); } private void GetDrink() { } private void RPC_GetDrunk() { } public void OnDamaged(HitData hitData) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) Player closestPlayer = Player.GetClosestPlayer(((Component)this).transform.position, Mathf.Max(m_byeRange + 3f, m_standRange)); if (Object.op_Implicit((Object)(object)closestPlayer)) { float num = Vector3.Distance(((Component)closestPlayer).transform.position, ((Component)this).transform.position); if ((double)num < (double)m_standRange) { m_lookAt.SetLoockAtTarget(((Character)closestPlayer).GetHeadPoint()); } if (!m_didAnger || !TalkTimer()) { m_didAnger = true; QueueSay(m_aggravated, "Aggravated", null); } } } public void OnPrivateAreaAttacked(Character attacker) { //IL_000f: 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) if (!attacker.IsPlayer() && !((double)Vector3.Distance(((Component)this).transform.position, ((Component)attacker).transform.position) >= (double)m_maxRange)) { QueueSay(m_privateAreaAlarm, "Angry", null); } } public bool TalkTimer() { return (double)Time.time - (double)m_lastTalkTime < (double)m_minTalkInterval || (double)Random.Range(0f, 1f) > (double)m_randomTalkChance; } private void RandomTalk() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) if (!TalkTimer() && !StoreGui.IsVisible() && Player.IsPlayerInRange(((Component)this).transform.position, m_greetRange)) { QueueSay(InFactionBase() ? m_randomTalkInFactionBase : m_randomTalk, "Talk", m_randomTalkFX); } } public void QueueSay(List texts, string trigger, EffectList effect, string randTrigger = "", int maxRandValue = 0) { if (texts.Count != 0 && m_queuedTexts.Count < 3) { m_queuedTexts.Enqueue(new QueuedSay { text = texts[Random.Range(0, texts.Count)], trigger = trigger, randTrigger = randTrigger, rand = maxRandValue, m_effect = effect }); } } private void UpdateSayQueue() { //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) if (m_queuedTexts.Count != 0 && !((double)Time.time - (double)m_lastTalkTime < (double)m_minTalkInterval)) { QueuedSay queuedSay = m_queuedTexts.Dequeue(); Say(queuedSay.text, queuedSay.trigger, queuedSay.randTrigger, queuedSay.rand); if (queuedSay.m_effect != null) { queuedSay.m_effect.Create(((Component)this).transform.position, Quaternion.identity, (Transform)null, 1f, -1); } } } public void Say(string text, string trigger, string randTrigger, float maxRand) { //IL_0017: 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) m_lastTalkTime = Time.time; Chat.instance.SetNpcText(((Component)this).gameObject, Vector3.up * m_offset, 20f, m_hideDialogDelay, "", text, false); if (trigger.Length > 0) { if (randTrigger.Length <= 0) { int num = (int)Random.Range(0f, maxRand); m_animator.SetFloat(randTrigger, (float)num); } m_animator.SetTrigger(trigger); } } private Faction GetFaction() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0044: 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) //IL_003d: 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) return (Faction)(m_race switch { "human" => 0, "dverger" => 10, "goblin" => 7, _ => 0, }); } private bool InFactionBase() { //IL_0006: 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) return PrivateArea.InsideFactionArea(((Component)this).transform.position, GetFaction()); } public bool Interact(Humanoid user, bool hold, bool alt) { //IL_004c: 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) List list = (InFactionBase() ? m_randomTalkInFactionBase : m_randomTalk); Say(list[Random.Range(0, list.Count)], "Talk", "", 0f); m_randomTalkFX.Create(((Component)this).transform.position, Quaternion.identity, (Transform)null, 1f, -1); return true; } public bool UseItem(Humanoid user, ItemData item) { return false; } } public class BalrondActorTraderPresets { public static List _prefabs; private static readonly Dictionary>> _archetypeMap; static BalrondActorTraderPresets() { _archetypeMap = new Dictionary>> { { "Villager", GetVillagerItems }, { "Merchant", GetMerchantItems }, { "Begger", GetBeggerItems }, { "Hunter", GetHunterItems }, { "Guard", GetGuardItems }, { "Priest", GetPriestItems }, { "Blacksmith", GetBlacksmithItems }, { "Farmer", GetFarmerItems }, { "Defender", GetDefenderItems }, { "Lumberjack", GetLumberjackItems }, { "Miner", GetMinerItems }, { "Innkeeper", GetBarmanItems }, { "Patron", GetPatronItems }, { "Fisherman", GetFisherItems }, { "Forager", GetForagerItems }, { "Butcher", GetButcherItems } }; } public static List GetItemsForArchetype(string archetype) { if (_archetypeMap.TryGetValue(archetype, out var value)) { return value(); } Debug.LogWarning((object)("No trade items found for archetype '" + archetype + "'")); return new List(); } private static List GetLumberjackItems() { return new List { CreateTradeItem("Wood", 25), CreateTradeItem("WoodNails_bal", 25, 25), CreateTradeItem("Club"), CreateTradeItem("AxeFlint", 250), CreateTradeItem("Roundlog", 50), CreateTradeItem("FineWood", 100, 1, "defeated_bonemass") }.FindAll((TradeItem item) => item != null); } private static List GetMinerItems() { return new List { CreateTradeItem("PickaxeStone", 200), CreateTradeItem("Coal", 25), CreateTradeItem("Stone", 10), CreateTradeItem("Flint", 25), CreateTradeItem("CopperOre", 300, 1, "defeated_gdking"), CreateTradeItem("Torch") }.FindAll((TradeItem item) => item != null); } private static List GetForagerItems() { return new List { CreateTradeItem("Dandelion", 30), CreateTradeItem("Straw", 20), CreateTradeItem("Thistle", 10, 1, "defeated_gdking"), CreateTradeItem("CarrotSeeds", 35) }.FindAll((TradeItem item) => item != null); } private static List GetFisherItems() { return new List { CreateTradeItem("FishingBait", 10), CreateTradeItem("NeckTail", 250), CreateTradeItem("RedKelp_bal", 400, 1, "defeated_bonemass"), CreateTradeItem("FishRaw", 50), CreateTradeItem("Fish2", 150, 1, "defeated_gdking"), CreateTradeItem("Torch") }.FindAll((TradeItem item) => item != null); } private static List GetButcherItems() { return new List { CreateTradeItem("KnifeButcher", 400, 1, "defeated_gdking"), CreateTradeItem("KnifeCopper", 250), CreateTradeItem("KnifeFlint"), CreateTradeItem("Flint", 25), CreateTradeItem("DeerMeat", 125, 1, "defeated_gdking"), CreateTradeItem("RawMeat", 55) }.FindAll((TradeItem item) => item != null); } private static List GetBarmanItems() { return new List { CreateTradeItem("MeadTasty", 75), CreateTradeItem("BarleyWine", 425, 1, "defeated_dragon"), CreateTradeItem("MeadHealthMinor", 150, 1, "defeated_gdking"), CreateTradeItem("MeadStaminaMinor", 150, 1, "defeated_gdking"), CreateTradeItem("Tankard", 50), CreateTradeItem("Tankard_dvergr", 100, 1, "defeated_gdking") }.FindAll((TradeItem item) => item != null); } private static List GetPatronItems() { return new List { CreateTradeItem("Tankard", 75), CreateTradeItem("MeadTasty"), CreateTradeItem("Tankard_dvergr", 150) }.FindAll((TradeItem item) => item != null); } private static List GetBlacksmithItems() { return new List { CreateTradeItem("Hammer", 50), CreateTradeItem("CopperScrap", 300, 1, "defeated_gdking"), CreateTradeItem("KnifeCopper", 300), CreateTradeItem("Coal", 40), CreateTradeItem("BronzeNails", 50, 1, "defeated_gdking") }.FindAll((TradeItem item) => item != null); } private static List GetFarmerItems() { return new List { CreateTradeItem("Straw_bal", 25), CreateTradeItem("Apple_bal", 200, 1, "defeated_gdking"), CreateTradeItem("WaterJug_bal"), CreateTradeItem("BirdFeed_bal", 200, 1, "defeated_gdking"), CreateTradeItem("RottenVegetable_bal"), CreateTradeItem("Carrot"), CreateTradeItem("Onion", 300, 1, "defeated_bonemass") }.FindAll((TradeItem item) => item != null); } private static List GetGuardItems() { return new List { CreateTradeItem("ShieldWood", 250), CreateTradeItem("Club"), CreateTradeItem("KnifeFlint", 300), CreateTradeItem("Torch", 200) }.FindAll((TradeItem item) => item != null); } private static List GetDefenderItems() { return new List { CreateTradeItem("ShieldWood", 250), CreateTradeItem("Club"), CreateTradeItem("KnifeFlint", 300), CreateTradeItem("Torch", 200) }.FindAll((TradeItem item) => item != null); } private static List GetPriestItems() { return new List { CreateTradeItem("SilverNecklace", 45), CreateTradeItem("Pukeberries", 50), CreateTradeItem("Acorn", 50), CreateTradeItem("BoneFragments", 50), CreateTradeItem("MeadHealthMinor", 500, 1, "defeated_gdking"), CreateTradeItem("MeadStaminaMinor", 500, 1, "defeated_gdking"), CreateTradeItem("BarleyWine", 800, 1, "defeated_dragon") }.FindAll((TradeItem item) => item != null); } private static List GetBeggerItems() { return new List { CreateTradeItem("Straw_bal", 50), CreateTradeItem("BoneFragments"), CreateTradeItem("PoisonApple_bal"), CreateTradeItem("RottenMeat", 300, 1, "defeated_gdking"), CreateTradeItem("RottenVegetable_bal", 200, 1, "defeated_gdking"), CreateTradeItem("Stone", 50), CreateTradeItem("Wood", 25), CreateTradeItem("Larva_bal", 75, 1, "defeated_bonemass") }.FindAll((TradeItem item) => item != null); } private static List GetVillagerItems() { return new List { CreateTradeItem("Feathers", 150, 1, "defeated_gdking"), CreateTradeItem("StrawThread_bal"), CreateTradeItem("WaterJug_bal"), CreateTradeItem("LeatherScraps", 50), CreateTradeItem("WoodBucket_bal", 50, 1, "defeated_gdking"), CreateTradeItem("OilBase_bal", 500, 1, "defeated_gdking") }.FindAll((TradeItem item) => item != null); } private static List GetHunterItems() { return new List { CreateTradeItem("Feathers", 25, 1, "defeated_gdking"), CreateTradeItem("BoneFragments", 50), CreateTradeItem("DeerHide", 500, 1, "defeated_gdking"), CreateTradeItem("LeatherScraps", 50), CreateTradeItem("ArrowWood", 200, 20), CreateTradeItem("Bow", 200), CreateTradeItem("KnifeFlint", 200) }.FindAll((TradeItem item) => item != null); } private static List GetMerchantItems() { return new List { CreateTradeItem("StrawThread_bal"), CreateTradeItem("CookedMeat"), CreateTradeItem("Ruby"), CreateTradeItem("LinenThread", 400, 1, "defeated_dragon"), CreateTradeItem("PaintBucket_bal", 150, 1, "defeated_gdking"), CreateTradeItem("ChickenEgg", 300, 1, "defeated_dragon"), CreateTradeItem("SilverNecklace", 50, 1, "defeated_gdking"), CreateTradeItem("KnifeButcher", 500) }.FindAll((TradeItem item) => item != null); } private static TradeItem CreateTradeItem(string itemName, int price = 100, int amount = 1, string globalKey = "", string checkObject = "") { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: 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) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Expected O, but got Unknown if (!string.IsNullOrEmpty(checkObject)) { GameObject val = FindItem(checkObject); if ((Object)(object)val != (Object)null && ((Object)val).name != "Wood") { return null; } } GameObject val2 = FindItem(itemName); if ((Object)(object)val2 == (Object)null) { return null; } return new TradeItem { m_price = price, m_stack = amount, m_requiredGlobalKey = globalKey, m_prefab = val2.GetComponent() }; } private static GameObject FindItem(string name) { return _prefabs.Find((GameObject x) => ((Object)x).name == name); } } 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; } } 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 { public void ReplaceOnObject(GameObject gameObject, ZNetScene zNetScene) { 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, zNetScene); } } Destructible component2 = gameObject.GetComponent(); if ((Object)(object)component2 != (Object)null) { EffectList hitEffect = component2.m_hitEffect; if (hitEffect != null) { findEffectsAndChange(hitEffect.m_effectPrefabs, zNetScene); } EffectList destroyedEffect = component2.m_destroyedEffect; if (destroyedEffect != null) { findEffectsAndChange(destroyedEffect.m_effectPrefabs, zNetScene); } } Projectile component3 = gameObject.GetComponent(); if ((Object)(object)component3 != (Object)null) { EffectList hitEffects = component3.m_hitEffects; if (hitEffects != null) { findEffectsAndChange(hitEffects.m_effectPrefabs, zNetScene); } EffectList hitWaterEffects = component3.m_hitWaterEffects; if (hitWaterEffects != null) { findEffectsAndChange(hitWaterEffects.m_effectPrefabs, zNetScene); } EffectList spawnOnHitEffects = component3.m_spawnOnHitEffects; if (spawnOnHitEffects != null) { findEffectsAndChange(spawnOnHitEffects.m_effectPrefabs, zNetScene); } } } public void ReplaceOnVegetation(GameObject gameObject, ZNetScene zNetScene) { Pickable component = gameObject.GetComponent(); if ((Object)(object)component != (Object)null) { fixPlant(component, zNetScene); } Destructible component2 = gameObject.GetComponent(); if ((Object)(object)component2 != (Object)null) { fixPDestructable(component2, zNetScene); } MineRock5 component3 = gameObject.GetComponent(); if ((Object)(object)component3 != (Object)null) { fixMineRock5(component3, zNetScene); } MineRock component4 = gameObject.GetComponent(); if ((Object)(object)component4 != (Object)null) { fixMineRock(component4, zNetScene); } } private void fixPlant(Pickable pickable, ZNetScene zNetScene) { EffectList pickEffector = pickable.m_pickEffector; if (pickEffector != null) { findEffectsAndChange(pickEffector.m_effectPrefabs, zNetScene); } } private void fixPDestructable(Destructible minerock5, ZNetScene zNetScene) { EffectList hitEffect = minerock5.m_hitEffect; if (hitEffect != null) { findEffectsAndChange(hitEffect.m_effectPrefabs, zNetScene); } EffectList destroyedEffect = minerock5.m_destroyedEffect; if (destroyedEffect != null) { findEffectsAndChange(destroyedEffect.m_effectPrefabs, zNetScene); } } private void fixMineRock5(MineRock5 minerock5, ZNetScene zNetScene) { EffectList hitEffect = minerock5.m_hitEffect; if (hitEffect != null) { findEffectsAndChange(hitEffect.m_effectPrefabs, zNetScene); } EffectList destroyedEffect = minerock5.m_destroyedEffect; if (destroyedEffect != null) { findEffectsAndChange(destroyedEffect.m_effectPrefabs, zNetScene); } } private void fixMineRock(MineRock minerock5, ZNetScene zNetScene) { EffectList hitEffect = minerock5.m_hitEffect; if (hitEffect != null) { findEffectsAndChange(hitEffect.m_effectPrefabs, zNetScene); } EffectList destroyedEffect = minerock5.m_destroyedEffect; if (destroyedEffect != null) { findEffectsAndChange(destroyedEffect.m_effectPrefabs, zNetScene); } } public void ReplaceOnMonster(GameObject gameObject, ZNetScene zNetScene) { if ((Object)(object)gameObject == (Object)null) { Debug.LogWarning((object)(Launch.projectName + ":: GameObject not found")); return; } Humanoid component = gameObject.GetComponent(); if ((Object)(object)component == (Object)null) { Debug.LogWarning((object)(Launch.projectName + ":: GameObject not found")); return; } EffectList dropEffects = component.m_dropEffects; if (dropEffects != null) { findEffectsAndChange(dropEffects.m_effectPrefabs, zNetScene); } EffectList backstabHitEffects = ((Character)component).m_backstabHitEffects; if (backstabHitEffects != null) { findEffectsAndChange(backstabHitEffects.m_effectPrefabs, zNetScene); } EffectList consumeItemEffects = component.m_consumeItemEffects; if (consumeItemEffects != null) { findEffectsAndChange(consumeItemEffects.m_effectPrefabs, zNetScene); } EffectList critHitEffects = ((Character)component).m_critHitEffects; if (critHitEffects != null) { findEffectsAndChange(critHitEffects.m_effectPrefabs, zNetScene); } EffectList deathEffects = ((Character)component).m_deathEffects; if (deathEffects != null) { findEffectsAndChange(deathEffects.m_effectPrefabs, zNetScene); } EffectList hitEffects = ((Character)component).m_hitEffects; if (hitEffects != null) { findEffectsAndChange(hitEffects.m_effectPrefabs, zNetScene); } EffectList jumpEffects = ((Character)component).m_jumpEffects; if (jumpEffects != null) { findEffectsAndChange(jumpEffects.m_effectPrefabs, zNetScene); } EffectList perfectBlockEffect = component.m_perfectBlockEffect; if (perfectBlockEffect != null) { findEffectsAndChange(perfectBlockEffect.m_effectPrefabs, zNetScene); } EffectList pickupEffects = component.m_pickupEffects; if (pickupEffects != null) { findEffectsAndChange(pickupEffects.m_effectPrefabs, zNetScene); } EffectList slideEffects = ((Character)component).m_slideEffects; if (slideEffects != null) { findEffectsAndChange(slideEffects.m_effectPrefabs, zNetScene); } EffectList tarEffects = ((Character)component).m_tarEffects; if (tarEffects != null) { findEffectsAndChange(tarEffects.m_effectPrefabs, zNetScene); } EffectList waterEffects = ((Character)component).m_waterEffects; if (waterEffects != null) { findEffectsAndChange(waterEffects.m_effectPrefabs, zNetScene); } 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 = ZNetScene.instance.m_prefabs.Find((GameObject x) => ((Object)x).name == name); if (!((Object)(object)val == (Object)null)) { list[i] = val; } } } } } public void ReplaceOnItem(GameObject gameObject, ZNetScene zNetScene) { 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, zNetScene); } EffectList hitTerrainEffect = component.m_itemData.m_shared.m_hitTerrainEffect; if (hitTerrainEffect != null) { findEffectsAndChange(hitTerrainEffect.m_effectPrefabs, zNetScene); } EffectList holdStartEffect = component.m_itemData.m_shared.m_holdStartEffect; if (holdStartEffect != null) { findEffectsAndChange(holdStartEffect.m_effectPrefabs, zNetScene); } EffectList trailStartEffect = component.m_itemData.m_shared.m_trailStartEffect; if (trailStartEffect != null) { findEffectsAndChange(trailStartEffect.m_effectPrefabs, zNetScene); } EffectList blockEffect = component.m_itemData.m_shared.m_blockEffect; if (blockEffect != null) { findEffectsAndChange(blockEffect.m_effectPrefabs, zNetScene); } } } public void ReplaceFxOnPiece(GameObject gameObject, ZNetScene zNetScene) { 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, zNetScene); } } WearNTear component2 = gameObject.GetComponent(); if ((Object)(object)component2 != (Object)null) { EffectList hitEffect = component2.m_hitEffect; if (hitEffect != null) { findEffectsAndChange(hitEffect.m_effectPrefabs, zNetScene); } } } private void findEffectsAndChange(EffectData[] effects, ZNetScene zNetScene) { 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 = zNetScene.m_prefabs.Find((GameObject x) => (Object)(object)x != (Object)null && ((Object)x).name == name); if ((Object)(object)val2 != (Object)null) { val.m_prefab = val2; } else { Debug.LogWarning((object)("Coulnt not find in Znet fx name:" + name)); } } } } } [Serializable] public class MappedEffectList { public List pieceEffect; public List destroyedEffects; public List hitEffects; public List switchEffect; public List blockEffect; public List equipEffect; public List hitEffect; public List hitTerrainEffect; public List holdStartEffect; public List startEffect; public List trailStartEffect; public List triggerEffect; public List unequipEffect; public EffectList createEffectListFromInfo(List list) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown EffectList val = new EffectList(); List list2 = new List(); val.m_effectPrefabs = list2.ToArray(); return val; } private EffectData createEffectData(EffectInfo info) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown EffectData val = new EffectData(); val.m_inheritParentRotation = info.inheritRotation; val.m_multiplyParentVisualScale = info.multiplyScale; val.m_childTransform = info.childName; val.m_inheritParentScale = info.inheritScale; val.m_variant = info.variant; val.m_scale = info.scale; val.m_attach = info.attach; val.m_follow = info.follow; val.m_prefab = ZNetScene.instance.m_prefabs.Find((GameObject x) => ((Object)x).name == info.name); return val; } } [Serializable] public struct EffectInfo { public string name; public bool enabled; public int variant; public bool attach; public bool follow; public bool inheritRotation; public bool inheritScale; public bool multiplyScale; public bool radnomRotation; public bool scale; public string childName; public EffectInfo(string name, bool enabled = true, int variant = -1, bool attach = false, bool follow = false, bool inheritRotation = false, bool inheritScale = false, bool multiplyScale = false, bool radnomRotation = false, bool scale = false, string childName = null) { this.name = name; this.enabled = enabled; this.variant = variant; this.attach = attach; this.follow = follow; this.inheritRotation = inheritRotation; this.inheritScale = inheritScale; this.multiplyScale = multiplyScale; this.radnomRotation = radnomRotation; this.scale = scale; this.childName = childName; } } 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 List backgrounds = new List(); public FxReplacment fxReplacment = new FxReplacment(); public List recipes = new List(); public List statusEffects = new List(); public static Sprite scrapCopper; public StatusEffect newBarleyStatus = null; public ShaderReplacment shaderReplacment = new ShaderReplacment(); public Sprite newLogo = null; public void loadAssets() { assetBundle = GetAssetBundleFromResources("balrondidleactors"); string text = "Assets/Custom/BalrondIdleActors/"; loadPieces(text); loadItems(text); loadOther(text); prepareOtherEffects(text); } public void AddPrefabsToZnetScene(ZNetScene zNetScene) { List> list = new List> { itemPrefabs, plantPrefabs, vfxPrefabs, buildPrefabs, locationPrefabs, vegetationPrefabs, clutterPrefabs, monsterPrefabs }; foreach (List item in list) { validateAddedPrefabs(item, zNetScene); } zNetScene.m_prefabs.RemoveAll((GameObject x) => (Object)(object)x == (Object)null); } private void prepareOtherEffects(string mainPath) { string[] array = new string[0]; string[] array2 = array; foreach (string text in array2) { StatusEffect val = (StatusEffect)(object)assetBundle.LoadAsset(mainPath + "Status/" + text + ".asset"); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Satus not found: " + text)); } else { statusEffects.Add(val); } } } private void validateAddedPrefabs(List list, ZNetScene zNetScene) { foreach (GameObject item in list) { if (zNetScene.m_namedPrefabs.ContainsKey(BalrondHashCompat.StableHash(((Object)item).name))) { Debug.LogWarning((object)("DUPLICATE: " + ((Object)item).name)); } else { zNetScene.m_prefabs.Add(item); } } } private void loadBackground(string mainPath) { string[] array = new string[5] { "ashlands1.jpg", "ashlands2.png", "blackforest.png", "mistlands.jpg", "meadows.png" }; string[] array2 = array; foreach (string text in array2) { Sprite val = assetBundle.LoadAsset(mainPath + "screens/" + text); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Could not find background with name: " + text)); } else { backgrounds.Add(val); } } } private void setupBuildPiecesList(ZNetScene zNetScene) { string[] array = new string[5] { "Hammer", "HammerIron_bal", "HammerDverger_bal", "HammerBlackmetal_bal", "HammerMythic_bal" }; GameObject val = zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == "Hammer"); PieceTable buildPieces = val.GetComponent().m_itemData.m_shared.m_buildPieces; string[] array2 = array; foreach (string name in array2) { addTableToTool(name, buildPieces, zNetScene); } List pieces = buildPieces.m_pieces; foreach (GameObject buildPrefab in buildPrefabs) { setupRavenGuide(buildPrefab, zNetScene.m_prefabs); AddToBuildList(buildPrefab, pieces); } GameObject val2 = zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == "Hoe"); PieceTable buildPieces2 = val2.GetComponent().m_itemData.m_shared.m_buildPieces; addTableToTool("BlackMetalHoe_bal", buildPieces2, zNetScene); GameObject val3 = zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == "Cultivator"); PieceTable buildPieces3 = val3.GetComponent().m_itemData.m_shared.m_buildPieces; addTableToTool("BlackMetalCultivator_bal", buildPieces3, zNetScene); } private void addTableToTool(string name, PieceTable pieceTable, ZNetScene zNetScene) { GameObject val = zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == name); if (!((Object)(object)val == (Object)null)) { val.GetComponent().m_itemData.m_shared.m_buildPieces = pieceTable; } } public void setupRavenGuide(GameObject gameObject, List gameObjects) { GameObject val = null; Transform val2 = gameObject.transform.Find("GuidePoint"); if ((Object)(object)val2 == (Object)null) { return; } GameObject val3 = gameObjects.Find((GameObject x) => ((Object)x).name == "piece_workbench"); if ((Object)(object)val3 != (Object)null) { GameObject gameObject2 = ((Component)val3.transform.Find("GuidePoint")).gameObject; if ((Object)(object)gameObject2 != (Object)null) { GuidePoint component = gameObject2.GetComponent(); if ((Object)(object)component != (Object)null) { val = component.m_ravenPrefab; } } } if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)"Ravens not found"); } else { ((Component)val2).GetComponent().m_ravenPrefab = val; } } public void setupBuildPiecesListDB() { GameObject val = ObjectDB.instance.m_items.Find((GameObject x) => ((Object)x).name == "Hammer"); List pieces = val.GetComponent().m_itemData.m_shared.m_buildPieces.m_pieces; foreach (GameObject buildPrefab in buildPrefabs) { AddToBuildList(buildPrefab, pieces); } } private void AddToBuildList(GameObject prefab, List buildPieces) { if ((Object)(object)buildPieces.Find((GameObject x) => ((Object)x).name == ((Object)prefab).name) == (Object)null) { buildPieces.Add(prefab); } } private void addPlantstoCultivator(ZNetScene zNetScene) { GameObject val = zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == "Cultivator"); PieceTable buildPieces = val.GetComponent().m_itemData.m_shared.m_buildPieces; List pieces = buildPieces.m_pieces; foreach (GameObject gameObject in plantPrefabs) { if ((Object)(object)pieces.Find((GameObject x) => ((Object)x).name == ((Object)gameObject).name) == (Object)null) { pieces.Add(gameObject); } } } 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 loadPlants(string basePath) { string text = basePath + "Plants/"; string[] array = new string[0]; string[] array2 = array; foreach (string text2 in array2) { GameObject val = assetBundle.LoadAsset(text + text2 + ".prefab"); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Could not find plant with name: " + text2)); continue; } ShaderReplacment.Replace(val); plantPrefabs.Add(val); } } private void loadPieces(string basePath) { string text = basePath + "pieces/"; string[] npcs = NpcList.npcs; string[] array = npcs; foreach (string text2 in array) { GameObject val = assetBundle.LoadAsset(text + text2 + ".prefab"); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Could not find piece with name: " + text2)); continue; } ShaderReplacment.Replace(val); buildPrefabs.Add(val); } } 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); } } private void loadVegetation(string basePath) { string text = basePath + "Vegetation/"; string[] array = new string[0]; string[] array2 = array; foreach (string text2 in array2) { GameObject val = assetBundle.LoadAsset(text + text2 + ".prefab"); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Could not find vegegation with name: " + text2)); continue; } ShaderReplacment.Replace(val); vegetationPrefabs.Add(val); } } private void loadClutter(string basePath) { string text = basePath + "Clutter/"; string[] array = new string[0]; string[] array2 = array; foreach (string text2 in array2) { GameObject val = assetBundle.LoadAsset(text + text2 + ".prefab"); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Could not find clutter with name: " + text2)); continue; } ShaderReplacment.Replace(val); clutterPrefabs.Add(val); } } private void loadLocations(string basePath) { string text = basePath + "Location/"; string[] array = new string[0]; string[] array2 = array; foreach (string text2 in array2) { GameObject val = assetBundle.LoadAsset(text + text2 + ".prefab"); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Could not find location with name: " + text2)); continue; } ShaderReplacment.Replace(val); locationPrefabs.Add(val); } } private void loadOther(string basePath) { string text = basePath + "Other/"; string[] array = new string[4] { "Dverger_ragdoll_bal", "HumanFemale_ragdoll_bal", "HumanMale_ragdoll_bal", "NpcmancerBuildList_bal" }; string[] array2 = array; foreach (string text2 in array2) { 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); } } private DropData createDrop(ZNetScene zNetScene, string name, int min, int max, float chance) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0032: 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_0036: Unknown result type (might be due to invalid IL or missing references) DropData result = default(DropData); result.m_stackMin = min; result.m_stackMax = max; result.m_weight = chance; result.m_item = getItem(zNetScene, name); return result; } private GameObject getItem(ZNetScene zNetScene, string name) { return zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == name); } } public class ReferenceMapper { public static void MappBuildPieceEffectsFromTarget(GameObject gameObject, string sourceName, List list, bool isTable = false) { GameObject val = list.Find((GameObject x) => ((Object)x).name == sourceName); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Didnt found source name: " + sourceName)); return; } Piece component = gameObject.GetComponent(); Piece component2 = val.GetComponent(); WearNTear component3 = gameObject.GetComponent(); WearNTear component4 = val.GetComponent(); component.m_placeEffect = component2.m_placeEffect; component3.m_hitEffect = component4.m_hitEffect; component3.m_destroyedEffect = component4.m_destroyedEffect; component3.m_switchEffect = component4.m_switchEffect; if (isTable) { CraftingStation component5 = gameObject.GetComponent(); CraftingStation component6 = val.GetComponent(); component5.m_craftItemDoneEffects = component6.m_craftItemDoneEffects; component5.m_craftItemEffects = component6.m_craftItemEffects; component5.m_repairItemDoneEffects = component6.m_repairItemDoneEffects; component5.m_repairItemDoneEffects = component6.m_repairItemDoneEffects; } } public static void SwapEffectsForVanilla(EffectList effectList) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown List list = new List(); EffectList val = new EffectList(); EffectData[] effectPrefabs = effectList.m_effectPrefabs; foreach (EffectData effectData in effectPrefabs) { list.Add(RewriteEffectData(effectData)); } val.m_effectPrefabs = list.ToArray(); effectList = val; } private static EffectData RewriteEffectData(EffectData effectData) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown EffectData val = new EffectData(); val.m_inheritParentRotation = effectData.m_inheritParentRotation; val.m_multiplyParentVisualScale = effectData.m_multiplyParentVisualScale; val.m_childTransform = effectData.m_childTransform; val.m_inheritParentScale = effectData.m_inheritParentScale; val.m_variant = effectData.m_variant; val.m_scale = effectData.m_scale; val.m_attach = effectData.m_attach; val.m_follow = effectData.m_follow; GameObject val2 = ZNetScene.instance.m_prefabs.Find((GameObject x) => (Object)(object)x != (Object)null && ((Object)x).name == ((Object)effectData.m_prefab).name); if ((Object)(object)val2 != (Object)null) { val.m_prefab = val2; } else { val.m_prefab = effectData.m_prefab; } return val; } public static void CreateEffectsForList(EffectList effectList, List effectNames, bool clear = false) { List list = new List(); if (!clear) { list.AddRange(effectList.m_effectPrefabs); } foreach (string effectName in effectNames) { EffectInfo info = new EffectInfo(effectName); EffectData item = createEffectData(info); list.Add(item); } effectList.m_effectPrefabs = list.ToArray(); } private static EffectData createEffectData(EffectInfo info) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown EffectData val = new EffectData(); val.m_inheritParentRotation = info.inheritRotation; val.m_multiplyParentVisualScale = info.multiplyScale; val.m_childTransform = info.childName; val.m_inheritParentScale = info.inheritScale; val.m_variant = info.variant; val.m_scale = info.scale; val.m_attach = info.attach; val.m_follow = info.follow; val.m_prefab = ZNetScene.instance.m_prefabs.Find((GameObject x) => ((Object)x).name == info.name); return val; } public static void MappFromTextFile(GameObject gameObject, MappedEffectList mappedEffectList) { } } 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)) { 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 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 CraftingStation shamantable; public static CraftingStation foodtable; public static List pieces = new List(); public static void setupTables(List list) { pieces = list; prepareTables(); } private static CraftingStation FindStation(List list, string name, string replacement = "piece_workbench") { GameObject val = list.Find((GameObject x) => ((Object)x).name == name); if ((Object)(object)val != (Object)null) { return val.GetComponent(); } if ((Object)(object)val == (Object)null) { val = list.Find((GameObject x) => ((Object)x).name == replacement); 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", "forge"); blackforge = FindStation(pieces, "blackforge"); stoneCutter = FindStation(pieces, "piece_stonecutter"); artisian = FindStation(pieces, "piece_artisanstation"); runeforge = FindStation(pieces, "piece_runeforge_bal", "blackforge"); magetable = FindStation(pieces, "piece_magetable"); fletcher = FindStation(pieces, "piece_fletcher_bal"); shamantable = FindStation(pieces, "piece_shamantable_bal", "piece_magetable"); foodtable = FindStation(pieces, "piece_preptable"); alchemylab = FindStation(pieces, "piece_MeadCauldron"); } } internal class NpcList { public static string[] npcs = new string[92] { "DvergerMaleTalkerFarmer_bal", "DvergerMaleTraderFarmer_bal", "DvergerMaleTalkerVillager_bal", "DvergerMaleTraderVillager_bal", "DvergerMaleTalkerMerchant_bal", "DvergerMaleTraderMerchant_bal", "DvergerMaleTalkerPriest_bal", "DvergerMaleTraderPriest_bal", "DvergerMaleTalkerGuard_bal", "DvergerMaleTraderGuard_bal", "DvergerMaleTalkerHunter_bal", "DvergerMaleTraderHunter_bal", "DvergerMaleTalkerPatron_bal", "DvergerMaleTraderPatron_bal", "DvergerMaleTalkerButcher_bal", "DvergerMaleTraderButcher_bal", "DvergerMaleTalkerFisherman_bal", "DvergerMaleTraderFisherman_bal", "DvergerMaleTalkerBartender_bal", "DvergerMaleTraderBartender_bal", "DvergerMaleTalkerForager_bal", "DvergerMaleTraderForager_bal", "DvergerMaleTalkerBegger_bal", "DvergerMaleTraderBegger_bal", "DvergerMaleTalkerBlacksmith_bal", "DvergerMaleTraderBlacksmith_bal", "DvergerFemaleTalkerFarmer_bal", "DvergerFemaleTraderFarmer_bal", "DvergerFemaleTalkerVillager_bal", "DvergerFemaleTraderVillager_bal", "DvergerFemaleTalkerMerchant_bal", "DvergerFemaleTraderMerchant_bal", "DvergerFemaleTraderPriest_bal", "DvergerFemaleTalkerPriest_bal", "DvergerFemaleTalkerFisherman_bal", "DvergerFemaleTalkerButcher_bal", "HumanFemaleTalker_Bartender_bal", "HumanFemaleTalker_Begger_bal", "HumanFemaleTalker_Butcher_bal", "HumanFemaleTalker_Fisherman_bal", "HumanFemaleTalker_Forager_bal", "HumanFemaleTalker_Patron_bal", "HumanFemaleTalker_Defender_bal", "HumanFemaleTalker_Farmer_bal", "HumanFemaleTalker_Guard_bal", "HumanFemaleTalker_Hunter_bal", "HumanFemaleTalker_Merchant_bal", "HumanFemaleTalker_Priest_bal", "HumanFemaleTalker_Villager_bal", "HumanFemaleTrader_Farmer_bal", "HumanFemaleTrader_Guard_bal", "HumanFemaleTrader_Hunter_bal", "HumanFemaleTrader_Merchant_bal", "HumanFemaleTrader_Priest_bal", "HumanFemaleTrader_Villager_bal", "HumanFemaleTrader_Bartender_bal", "HumanFemaleTrader_Begger_bal", "HumanFemaleTrader_Butcher_bal", "HumanFemaleTrader_Fisherman_bal", "HumanFemaleTrader_Forager_bal", "HumanFemaleTrader_Patron_bal", "HumanMaleTalker_Patron_bal", "HumanMaleTalker_Bartender_bal", "HumanMaleTalker_Butcher_bal", "HumanMaleTalker_Fisherman_bal", "HumanMaleTalker_Forager_bal", "HumanMaleTalker_Defender_bal", "HumanMaleTalker_Begger_bal", "HumanMaleTalker_Blacksmith_bal", "HumanMaleTalker_Farmer_bal", "HumanMaleTalker_Guard_bal", "HumanMaleTalker_Hunter_bal", "HumanMaleTalker_Merchant_bal", "HumanMaleTalker_Priest_bal", "HumanMaleTalker_Villager_bal", "HumanMaleTalker_LumberJack_bal", "HumanMaleTalker_Miner_bal", "HumanMaleTrader_Patron_bal", "HumanMaleTrader_Bartender_bal", "HumanMaleTrader_Butcher_bal", "HumanMaleTrader_Fisherman_bal", "HumanMaleTrader_Forager_bal", "HumanMaleTrader_Begger_bal", "HumanMaleTrader_Blacksmith_bal", "HumanMaleTrader_Farmer_bal", "HumanMaleTrader_Guard_bal", "HumanMaleTrader_Hunter_bal", "HumanMaleTrader_Merchant_bal", "HumanMaleTrader_Priest_bal", "HumanMaleTrader_Villager_bal", "HumanMaleTrader_LumberJack_bal", "HumanMaleTrader_Miner_bal" }; } public class NpcDialogue { public List m_randomTalk = new List(); public List m_randomTalkInFactionBase = new List(); public List m_randomGreets = new List(); public List m_randomGoodbye = new List(); public List m_privateAreaAlarm = new List(); public List m_aggravated = new List(); public List m_randomStartTrade = new List(); public List m_randomBuy = new List(); public List m_randomSell = new List(); public void SetDialogArrays(string archetype, string race) { if (archetype == "Defender") { archetype = "Guard"; } m_randomTalk = ArchetypeDialoguePresets.createDialogList(archetype, race, "randomtalk"); m_randomTalkInFactionBase = ArchetypeDialoguePresets.createDialogList(archetype, race, "randomtalkinfaction"); m_randomGreets = ArchetypeDialoguePresets.createDialogList(archetype, race, "greeting"); m_randomGoodbye = ArchetypeDialoguePresets.createDialogList(archetype, race, "goodbye"); m_privateAreaAlarm = ArchetypeDialoguePresets.createDialogList(archetype, race, "privatealarm"); m_aggravated = ArchetypeDialoguePresets.createDialogList(archetype, race, "aggravated"); m_randomStartTrade = ArchetypeDialoguePresets.createDialogList(archetype, race, "starttrade"); m_randomBuy = ArchetypeDialoguePresets.createDialogList(archetype, race, "buy"); m_randomSell = ArchetypeDialoguePresets.createDialogList(archetype, race, "sell"); } public static NpcDialogue GetNpcDialogue(string archetype, string race) { NpcDialogue npcDialogue = new NpcDialogue(); npcDialogue.SetDialogArrays(archetype, race); return npcDialogue; } } internal class ItemList { public static string[] items = new string[70] { "NpcButcher_bal", "NpcFishingRod_bal", "NpcHelmetBandana_bal", "NpcHelmetRags_bal", "NpcHelmetChitin_bal", "NpcCapeBear_bal", "NpcCapeHeavyStraw_bal", "NpcCapeSwamp_bal", "NpcArmorForagerChest_bal", "NpcHelmetFabric_bal", "NpcArmorBearChest_bal", "NpcArmorTornLegs_bal", "NpcSickle_bal", "NpcHelmetMiner_bal", "NpcCapeRags_bal", "Npcmancer_bal", "DvergerKnife_bal", "DvergerHammer_bal", "DvergerHoe_bal", "DvergerCultivator_bal", "DvergerStaffFire_bal", "DvergerStaffHeal_bal", "DvergerStaffIce_bal", "DvergerStaffSupport_bal", "DvergerSuitDress_bal", "DvergerSuitDressHair_bal", "DvergerSuitDark_bal", "DvergerFemaleBlue1_bal", "DvergerFemaleGray1_bal", "DvergerFemaleOrange1_bal", "DvergerFemaleDress1_bal", "DvergerFemaleDress2_bal", "DvergerFemaleDress3_bal", "DvergerFemaleDress4_bal", "DvergerFemaleDress5_bal", "DvergerFemaleDress6_bal", "DvergerFemaleDress7_bal", "DvergerFemaleDress8_bal", "DvergerFemaleDress9_bal", "DvergerHairGray1_bal", "DvergerHairGray2_bal", "DvergerHairGray3_bal", "DvergerHairGray4_bal", "DvergerHairGray5_bal", "DvergerHairGray6_bal", "DvergerHairGray7_bal", "DvergerHairOrange1_bal", "DvergerHairOrange2_bal", "DvergerHairOrange3_bal", "DvergerHairOrange4_bal", "DvergerHairOrange5_bal", "DvergerHairOrange6_bal", "DvergerHairOrange7_bal", "DvergerHairBlue1_bal", "DvergerHairBlue2_bal", "DvergerHairBlue3_bal", "DvergerHairBlue4_bal", "DvergerHairBlue5_bal", "DvergerHairBlue6_bal", "DvergerHairBlue7_bal", "DvergerSuitDarkHat_bal", "DvergerSuitRed_bal", "DvergerSuitRedHood_bal", "DvergerSuitYellowHood_bal", "DvergerSuitGreenCap_bal", "ArmorPriest_bal", "NpcToolHammer_bal", "StaffPriest_bal", "NpcCapeFox_bal", "NpcCapeBlackWolf_bal" }; } 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, "BalrondIdleActors-translation/"); defaultPath = text; } public void createDefaultPath() { string configPath = Paths.ConfigPath; string path = Path.Combine(configPath, "BalrondIdleActors-translation/"); if (!Directory.Exists(path)) { CreateFolder(path); } defaultPath = path; } private string[] jsonFilePath(string folderName, string extension) { string configPath = Paths.ConfigPath; string path = Path.Combine(configPath, "BalrondIdleActors-translation/"); if (!Directory.Exists(path)) { CreateFolder(path); } return Directory.GetFiles(path, extension); } private static void CreateFolder(string path) { try { Directory.CreateDirectory(path); Debug.Log((object)"BalrondIdleActors: Folder created successfully."); } catch (Exception ex) { Debug.Log((object)("BalrondIdleActors: 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); num++; } else { Debug.LogError((object)("BalrondIdleActors: Loading FAILED file: " + text)); } } } } [BepInPlugin("balrond.astafaraios.BalrondIdleActors", "BalrondIdleActors", "1.0.5")] public class Launch : BaseUnityPlugin { [HarmonyPatch(typeof(FejdStartup), "SetupGui")] private class FejdStartup_SetupGUI { private static void Postfix() { AddTranslations(Localization.instance, Localization.instance.GetSelectedLanguage()); } } [HarmonyPatch(typeof(GameCamera), "Awake")] private class GameCamera_Awake { private static void Postfix(GameCamera __instance) { if (!((Object)(object)__instance == (Object)null) && Player.m_debugMode && (Object)(object)Console.instance != (Object)null && ((Terminal)Console.instance).IsCheatsEnabled()) { __instance.m_minWaterDistance = -1000f; } } } [HarmonyPatch(typeof(AudioMan), "Awake")] private static class AudioMan_Awake_Patch { private static void Postfix(AudioMan __instance) { if ((Object)(object)__instance == (Object)null || (Object)(object)__instance.m_masterMixer == (Object)null) { return; } foreach (List allPrefabGroup in GetAllPrefabGroups()) { if (allPrefabGroup == null) { continue; } foreach (GameObject item in allPrefabGroup) { if (!((Object)(object)item == (Object)null)) { AudioSource[] componentsInChildren = item.GetComponentsInChildren(true); foreach (AudioSource val in componentsInChildren) { val.outputAudioMixerGroup = __instance.m_masterMixer.outputAudioMixerGroup; } } } } } } [HarmonyPatch(typeof(WearNTear), "Damage")] public static class WearNTear_Damage_Patch { private static void Postfix(WearNTear __instance, HitData hit) { if (!((Object)(object)__instance == (Object)null)) { BalrondActor component = ((Component)__instance).GetComponent(); if ((Object)(object)component != (Object)null) { component.OnDamaged(hit); } } } } [HarmonyPatch(typeof(ObjectDB), "CopyOtherDB")] public static class Object_CopyOtherDB_Path { public static void Postfix() { if (IsObjectDBValid()) { databaseAddMethods.AddItems(modResourceLoader.itemPrefabs); } } } [HarmonyPatch(typeof(ObjectDB), "Awake")] public static class ObjectDB_Awake_Path { public static void Postfix() { if (IsObjectDBValid()) { databaseAddMethods.AddItems(modResourceLoader.itemPrefabs); databaseAddMethods.AddStatuseffects(modResourceLoader.statusEffects); recipeFactory.createRecipes(ObjectDB.instance.m_items, modResourceLoader.itemPrefabs); modResourceLoader.recipes.AddRange(recipeFactory.recipes); databaseAddMethods.AddRecipes(modResourceLoader.recipes); } } } [HarmonyPatch(typeof(ZNetScene), "Awake")] public static class ZNetScene_Awake_Path { public static void Prefix(ZNetScene __instance) { //IL_004d: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance == (Object)null) { Debug.LogWarning((object)(projectName + ": No ZnetScene found")); return; } modResourceLoader.AddPrefabsToZnetScene(__instance); if (!hasSpawned) { buildPieceBuilder.SetupBuildPieces(__instance.m_prefabs); if (!new ZNet().IsDedicated()) { ShaderReplacment.runMaterialFix(); hasSpawned = true; } } } } [HarmonyPriority(800)] [HarmonyPatch(typeof(Localization), "SetupLanguage")] private class Translation_SetupLanguage { private static void Prefix(Localization __instance, string language) { AddTranslations(__instance, language); } } [HarmonyPriority(800)] [HarmonyPatch(typeof(Localization), "LoadCSV")] private class Translation_LoadCSV { private static void Prefix(Localization __instance, string language) { AddTranslations(__instance, language); } } private readonly Harmony harmony = new Harmony("balrond.astafaraios.BalrondIdleActors"); public const string PluginGUID = "balrond.astafaraios.BalrondIdleActors"; public const string PluginName = "BalrondIdleActors"; public const string PluginVersion = "1.0.5"; public static ModResourceLoader modResourceLoader = new ModResourceLoader(); public static DatabaseAddMethods databaseAddMethods = new DatabaseAddMethods(); public static BuildPieceBuilder buildPieceBuilder = new BuildPieceBuilder(); public static RecipeFactory recipeFactory = new RecipeFactory(); public static string projectName = "BalrondIdleActors"; public static JsonLoader jsonLoader = new JsonLoader(); public static GameObject RootObject; public static GameObject PrefabContainer; public static bool hasSpawned = false; private void Awake() { jsonLoader.loadJson(); createPrefabContainer(); modResourceLoader.loadAssets(); harmony.PatchAll(); } public void createPrefabContainer() { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004c: 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.SetParent(RootObject.transform, false); PrefabContainer.SetActive(false); } } public static GameObject cloneMe(GameObject source, string name) { if ((Object)(object)source == (Object)null) { Debug.LogWarning((object)("BalrondIdleActors: Tried to clone a null prefab: " + name)); return null; } 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) { if ((Object)(object)clone == (Object)null || (Object)(object)source == (Object)null) { return clone; } Dictionary dictionary = new Dictionary(); MeshRenderer[] componentsInChildren = source.GetComponentsInChildren(true); foreach (MeshRenderer val in componentsInChildren) { dictionary[((Object)val).name] = ((Renderer)val).sharedMaterials; } MeshRenderer[] componentsInChildren2 = clone.GetComponentsInChildren(true); foreach (MeshRenderer val2 in componentsInChildren2) { if (dictionary.TryGetValue(((Object)val2).name, out var value)) { ((Renderer)val2).sharedMaterials = value; } } return clone; } private void OnDestroy() { harmony.UnpatchSelf(); } private 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; } private static void AddTranslations(Localization localization, string language) { if (localization == null) { Debug.LogWarning((object)"BalrondIdleActors: Localization instance is null."); return; } Dictionary dictionary = BalrondTranslator.getLanguage("English"); if (language != "English") { Dictionary language2 = BalrondTranslator.getLanguage(language); if (language2 != null) { dictionary = language2; } else { Debug.Log((object)("BalrondIdleActors: Did not find translation file for " + language + ", loading English.")); } } if (dictionary == null) { Debug.LogWarning((object)"BalrondIdleActors: No translation file found!"); return; } foreach (KeyValuePair item in dictionary) { localization.AddWord(item.Key, item.Value); } } private static IEnumerable> GetAllPrefabGroups() { yield return modResourceLoader.itemPrefabs; yield return modResourceLoader.buildPrefabs; yield return modResourceLoader.monsterPrefabs; yield return modResourceLoader.vfxPrefabs; yield return modResourceLoader.vegetationPrefabs; } } public class BalrondActorNameLists { public static List m_characterNamesMale = new List { "Erik", "Leif", "Bjorn", "Ivar", "Harald", "Ragnar", "Sigurd", "Halfdan", "Ulf", "Gunnar", "Torstein", "Hakon", "Olaf", "Sten", "Sven", "Eirik", "Knud", "Asger", "Trygve", "Arne", "Jorund", "Skarde", "Kolbjorn", "Ketil", "Thorvald", "Thorfinn", "Hemming", "Eilif", "Geir", "Frode" }; public static List m_characterNamesFemale = new List { "Astrid", "Freydis", "Gudrun", "Sigrid", "Brynhild", "Ingrid", "Kara", "Ragnhild", "Thyra", "Hilde", "Liv", "Alfhild", "Gunnhild", "Ylva", "Tove", "Solveig", "Helga", "Saga", "Eira", "Runa", "Skadi", "Sigrun", "Torvi", "Groa", "Ketilrid", "Unn", "Estrid", "Jorunn", "Aslaug", "Alva" }; public static List m_surnamesMale = new List { "Eriksson", "Bjornsson", "Haraldsson", "Ragnarsson", "Sigurdsson", "Ivarsson", "Leifsson", "Ulfsson", "Torsteinsson", "Halfdansson", "Ketilsson", "Hakonsson", "Olafsson", "Stensson", "Sveinsson", "Asmundsson", "Tryggvason", "Gunnarsso", "Thorfinnsson", "Geirsson", "Eiriksson", "Kolbjornsson", "Thorvaldsson", "Hemmingsson", "Knudsson", "Frodeson", "Arnesson", "Skardsson", "Jorundsson", "Eilifsson" }; public static List m_surnameFemale = new List { "Eriksdottir", "Bjornsdottir", "Haraldsdottir", "Ragnarsdottir", "Sigurdsdottir", "Ivarsdottir", "Leifsdottir", "Ulfsdottir", "Torsteinsdottir", "Halfdansdottir", "Ketilsdottir", "Hakonsdottir", "Olafsdottir", "Stensdottir", "Sveinsdottir", "Asmundsdottir", "Tryggvadottir", "Gunnarsdottir", "Thorfinnsdottir", "Geirsdottir", "Eiriksdottir", "Kolbjornsdottir", "Thorvaldsdottir", "Hemmingsdottir", "Knudsdottir", "Frodesdottir", "Arnesdottir", "Skardsdottir", "Jorundsdottir", "Eilifsdottir" }; public static List m_characterNamesMaleDverger = new List { "Thorin", "Balin", "Dwalin", "Fili", "Kili", "Oin", "Gloin", "Bifur", "Bofur", "Bombur", "Durin", "Fundin", "Grimnir", "Haldin", "Barin", "Narvi", "Nori", "Dori", "Glorim", "Thrain", "Thror", "Azag", "Orin", "Mardin", "Brokk", "Sindri", "Varric", "Rurik", "Hlin", "Thalrik" }; public static List m_characterNamesFemaleDverger = new List { "Dis", "Gimra", "Hilda", "Sigrun", "Brynja", "Eira", "Helga", "Astrid", "Gudrun", "Ingrid", "Torhild", "Yrsa", "Thora", "Olga", "Freya", "Svanhild", "Gunhild", "Ragna", "Solveig", "Jorunn", "Brynna", "Eydis", "Karli", "Signy", "Thyra", "Halla", "Kara", "Alfhild", "Liv", "Runa" }; public static List m_surnamesMaleDverger = new List { "Ironfist", "Stoneforge", "Hammerhand", "Deepdelver", "Rockbeard", "Thunderaxe", "Goldfinder", "Ironfoot", "Forgefire", "Steelbreaker", "Grimstone", "Oakenheart", "Bronzeshield", "Coalminer", "Frosthammer", "Darkforge", "Silvervein", "Stonehelm", "Ironhelm", "Bronzebeard", "Stormhammer", "Granitebreaker", "Fireforge", "Hammerfall", "Goldhammer", "Blackstone", "Ashenforge", "Darkmantle", "Stonecloak", "Frostbeard" }; public static List m_surnameFemaleDverger = new List { "Ironfist", "Stoneforge", "Hammerhand", "Deepdelver", "Rockbeard", "Thunderaxe", "Goldfinder", "Ironfoot", "Forgefire", "Steelbreaker", "Grimstone", "Oakenheart", "Bronzeshield", "Coalminer", "Frosthammer", "Darkforge", "Silvervein", "Stonehelm", "Ironhelm", "Bronzebeard", "Stormhammer", "Granitebreaker", "Fireforge", "Hammerfall", "Goldhammer", "Blackstone", "Ashenforge", "Darkmantle", "Stonecloak", "Frostbeard" }; public static List m_characterNamesMaleGoblin = new List { "Grik", "Snag", "Brog", "Krull", "Zog", "Gnar", "Skrit", "Thrak", "Mug", "Ruk", "Zug", "Brak", "Groth", "Snurk", "Krag", "Drak", "Gluk", "Vark", "Zrek", "Gruk", "Snor", "Thrunk", "Kragz", "Burz", "Glarg", "Skug", "Bruk", "Zhar", "Murg", "Snarl" }; public static List m_characterNamesFemaleGoblin = new List { "Griz", "Snaga", "Brekka", "Krilla", "Zaga", "Gnara", "Skrita", "Thrakka", "Muga", "Ruka", "Zuga", "Braka", "Grotha", "Snurka", "Kraga", "Draka", "Gluka", "Varka", "Zreka", "Gruka", "Snora", "Thrunka", "Kragza", "Burza", "Glarga", "Skuga", "Bruka", "Zhara", "Murga", "Snarla" }; public static List m_surnamesMaleGoblin = new List { "Bloodsnout", "Darkfang", "Bonecrusher", "Skullsplitter", "Blacktooth", "Grimclaw", "Shadowback", "Fangripper", "Stonechewer", "Rotfang", "Cragjaw", "Ironclaw", "Doomsnarl", "Venomspike", "Gravegash", "Ragefang", "Nightgash", "Mudfang", "Clawshredder", "Bleedingtooth", "Fangscar", "Bloodfang", "Skullrend", "Gorefang", "Bonegnasher", "Darkspike", "Slaughterfang", "Dreadtooth", "Grimfang", "Venomfang" }; public static List m_surnameFemaleGoblin = new List { "Bloodsnout", "Darkfang", "Bonecrusher", "Skullsplitter", "Blacktooth", "Grimclaw", "Shadowback", "Fangripper", "Stonechewer", "Rotfang", "Cragjaw", "Ironclaw", "Doomsnarl", "Venomspike", "Gravegash", "Ragefang", "Nightgash", "Mudfang", "Clawshredder", "Bleedingtooth", "Fangscar", "Bloodfang", "Skullrend", "Gorefang", "Bonegnasher", "Darkspike", "Slaughterfang", "Dreadtooth", "Grimfang", "Venomfang" }; public static string GetFullName(string race = "human", bool isFemale = false) { return race switch { "human" => GenerateHumanName(isFemale), "dverger" => GenerateDvergerName(isFemale), "goblin" => GenerateDvergerName(isFemale), _ => "", }; } private static string GenerateHumanName(bool isFemale = false) { if (isFemale) { if (m_characterNamesFemale.Count > 0) { return m_characterNamesFemale[Random.Range(0, m_characterNamesFemale.Count - 1)] + " " + m_surnameFemale[Random.Range(0, m_surnameFemale.Count - 1)]; } return ""; } if (m_characterNamesMale.Count > 0) { return m_characterNamesMale[Random.Range(0, m_characterNamesMale.Count - 1)] + " " + m_surnamesMale[Random.Range(0, m_surnamesMale.Count - 1)]; } return ""; } private static string GenerateDvergerName(bool isFemale = false) { if (isFemale) { if (m_characterNamesFemaleDverger.Count > 0) { return m_characterNamesFemaleDverger[Random.Range(0, m_characterNamesFemaleDverger.Count - 1)] + " " + m_surnameFemaleDverger[Random.Range(0, m_surnameFemaleDverger.Count - 1)]; } return ""; } if (m_characterNamesMaleDverger.Count > 0) { return m_characterNamesMaleDverger[Random.Range(0, m_characterNamesMaleDverger.Count - 1)] + " " + m_surnamesMaleDverger[Random.Range(0, m_surnamesMaleDverger.Count - 1)]; } return ""; } private static string GenerateGoblinName(bool isFemale = false) { if (isFemale) { if (m_characterNamesFemaleGoblin.Count > 0) { return m_characterNamesFemaleGoblin[Random.Range(0, m_characterNamesFemaleGoblin.Count - 1)] + " " + m_surnameFemaleGoblin[Random.Range(0, m_surnameFemaleGoblin.Count - 1)]; } return ""; } if (m_characterNamesMaleGoblin.Count > 0) { return m_characterNamesMaleGoblin[Random.Range(0, m_characterNamesMaleGoblin.Count - 1)] + " " + m_surnamesMaleGoblin[Random.Range(0, m_surnamesMaleGoblin.Count - 1)]; } return ""; } } public class BuildPieceBuilder { private List list; private string[] piecesNames = NpcList.npcs; public void SetupBuildPieces(List list) { TableMapper.setupTables(list); this.list = list; BalrondActorTraderPresets._prefabs = list; string[] array = piecesNames; foreach (string name in array) { GameObject val = list.Find((GameObject x) => ((Object)x).name == name); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Cant find buildpiece with name: " + name)); } else { EditBuildPiece(val); } } } private void EditBuildPiece(GameObject gameObject) { if ((Object)(object)gameObject == (Object)null) { return; } Piece component = gameObject.gameObject.GetComponent(); if (!((Object)(object)component == (Object)null)) { NpcTalk component2 = gameObject.GetComponent(); if ((Object)(object)component2 != (Object)null) { SetupBalrondTalker(component2); } switch (((Object)gameObject).name) { case "DvergerMaleTalkerPatron_bal": case "DvergerMaleTalkerButcher_bal": case "DvergerMaleTalkerFisherman_bal": case "DvergerMaleTalkerBartender_bal": case "DvergerMaleTalkerForager_bal": case "DvergerMaleTalkerFarmer_bal": case "DvergerMaleTalkerVillager_bal": case "DvergerMaleTalkerMerchant_bal": case "DvergerMaleTalkerPriest_bal": case "DvergerMaleTalkerGuard_bal": case "DvergerMaleTalkerHunter_bal": case "DvergerMaleTalkerBlacksmith_bal": case "DvergerMaleTalkerBegger_bal": SetStation(component, TableMapper.workbench); component.m_resources = (Requirement[])(object)new Requirement[0]; component.m_enabled = true; AddResources(component, "TrophySkeleton", 1); AddResources(component, "LeatherScraps", 1); AddResources(component, "BoneFragments", 1); AddResources(component, "Entrails", 1); SetupNPC(gameObject); break; case "DvergerMaleTraderPatron_bal": case "DvergerMaleTraderFarmer_bal": case "DvergerMaleTraderVillager_bal": case "DvergerMaleTraderMerchant_bal": case "DvergerMaleTraderPriest_bal": case "DvergerMaleTraderGuard_bal": case "DvergerMaleTraderHunter_bal": case "DvergerMaleTraderBegger_bal": case "DvergerMaleTraderBlacksmith_bal": case "DvergerMaleTraderForager_bal": case "DvergerMaleTraderBartender_bal": case "DvergerMaleTraderButcher_bal": case "DvergerMaleTraderFisherman_bal": SetStation(component, TableMapper.workbench); component.m_resources = (Requirement[])(object)new Requirement[0]; component.m_enabled = false; AddResources(component, "SwordCheat", 1, 0, recover: false); SetupNPC(gameObject); break; case "DvergerFemaleTalkerFisherman_bal": case "DvergerFemaleTalkerButcher_bal": case "DvergerFemaleTalkerFarmer_bal": case "DvergerFemaleTalkerVillager_bal": case "DvergerFemaleTalkerMerchant_bal": case "DvergerFemaleTalkerPriest_bal": SetStation(component, TableMapper.workbench); component.m_resources = (Requirement[])(object)new Requirement[0]; component.m_enabled = true; AddResources(component, "TrophySkeleton", 1); AddResources(component, "LeatherScraps", 1); AddResources(component, "BoneFragments", 1); AddResources(component, "Entrails", 1); SetupNPC(gameObject); break; case "DvergerFemaleTraderFarmer_bal": case "DvergerFemaleTraderVillager_bal": case "DvergerFemaleTraderMerchant_bal": case "DvergerFemaleTraderPriest_bal": SetStation(component, TableMapper.workbench); component.m_resources = (Requirement[])(object)new Requirement[0]; component.m_enabled = false; AddResources(component, "SwordCheat", 1, 0, recover: false); SetupNPC(gameObject); break; case "HumanFemaleTalker_Patron_bal": case "HumanFemaleTalker_Bartender_bal": case "HumanFemaleTalker_Begger_bal": case "HumanFemaleTalker_Butcher_bal": case "HumanFemaleTalker_Fisherman_bal": case "HumanFemaleTalker_Forager_bal": case "HumanFemaleTalker_Defender_bal": case "HumanFemaleTalker_Farmer_bal": case "HumanFemaleTalker_Guard_bal": case "HumanFemaleTalker_Hunter_bal": case "HumanFemaleTalker_Merchant_bal": case "HumanFemaleTalker_Priest_bal": case "HumanFemaleTalker_Villager_bal": SetStation(component, TableMapper.workbench); component.m_resources = (Requirement[])(object)new Requirement[0]; component.m_enabled = true; AddResources(component, "TrophySkeleton", 1); AddResources(component, "LeatherScraps", 1); AddResources(component, "BoneFragments", 1); AddResources(component, "Entrails", 1); SetupNPC(gameObject); break; case "HumanFemaleTrader_Patron_bal": case "HumanFemaleTrader_Butcher_bal": case "HumanFemaleTrader_Begger_bal": case "HumanFemaleTrader_Bartender_bal": case "HumanFemaleTrader_Fisherman_bal": case "HumanFemaleTrader_Forager_bal": case "HumanFemaleTrader_Farmer_bal": case "HumanFemaleTrader_Guard_bal": case "HumanFemaleTrader_Hunter_bal": case "HumanFemaleTrader_Merchant_bal": case "HumanFemaleTrader_Priest_bal": case "HumanFemaleTrader_Villager_bal": SetStation(component, TableMapper.workbench); component.m_resources = (Requirement[])(object)new Requirement[0]; component.m_enabled = false; AddResources(component, "SwordCheat", 1, 0, recover: false); SetupNPC(gameObject); break; case "HumanMaleTalker_Patron_bal": case "HumanMaleTalker_Butcher_bal": case "HumanMaleTalker_Bartender_bal": case "HumanMaleTalker_Forager_bal": case "HumanMaleTalker_Fisherman_bal": case "HumanMaleTalker_Miner_bal": case "HumanMaleTalker_LumberJack_bal": case "HumanMaleTalker_Defender_bal": case "HumanMaleTalker_Begger_bal": case "HumanMaleTalker_Blacksmith_bal": case "HumanMaleTalker_Farmer_bal": case "HumanMaleTalker_Guard_bal": case "HumanMaleTalker_Hunter_bal": case "HumanMaleTalker_Merchant_bal": case "HumanMaleTalker_Priest_bal": case "HumanMaleTalker_Villager_bal": SetStation(component, TableMapper.workbench); component.m_resources = (Requirement[])(object)new Requirement[0]; component.m_enabled = true; AddResources(component, "TrophySkeleton", 1); AddResources(component, "LeatherScraps", 1); AddResources(component, "BoneFragments", 1); AddResources(component, "Entrails", 1); SetupNPC(gameObject); break; case "HumanMaleTrader_Patron_bal": case "HumanMaleTrader_Butcher_bal": case "HumanMaleTrader_Bartender_bal": case "HumanMaleTrader_Forager_bal": case "HumanMaleTrader_Fisherman_bal": case "HumanMaleTrader_LumberJack_bal": case "HumanMaleTrader_Miner_bal": case "HumanMaleTrader_Begger_bal": case "HumanMaleTrader_Blacksmith_bal": case "HumanMaleTrader_Farmer_bal": case "HumanMaleTrader_Guard_bal": case "HumanMaleTrader_Hunter_bal": case "HumanMaleTrader_Merchant_bal": case "HumanMaleTrader_Priest_bal": case "HumanMaleTrader_Villager_bal": SetStation(component, TableMapper.workbench); component.m_resources = (Requirement[])(object)new Requirement[0]; component.m_enabled = false; AddResources(component, "SwordCheat", 1, 0, recover: false); SetupNPC(gameObject); break; } } } private void SetupBalrondTalker(NpcTalk npcTalk) { BalrondActorTalker balrondActorTalker = ((Component)npcTalk).gameObject.AddComponent(); balrondActorTalker.m_name = ""; balrondActorTalker.m_maxRange = npcTalk.m_maxRange; balrondActorTalker.m_greetRange = npcTalk.m_greetRange; balrondActorTalker.m_byeRange = npcTalk.m_byeRange; balrondActorTalker.m_offset = npcTalk.m_offset; balrondActorTalker.m_minTalkInterval = npcTalk.m_minTalkInterval; balrondActorTalker.m_hideDialogDelay = npcTalk.m_hideDialogDelay; balrondActorTalker.m_randomTalkInterval = npcTalk.m_randomTalkInterval; balrondActorTalker.m_randomTalkChance = npcTalk.m_randomTalkChance; balrondActorTalker.m_randomTalk = npcTalk.m_randomTalk; balrondActorTalker.m_randomTalkInFactionBase = npcTalk.m_randomTalkInFactionBase; balrondActorTalker.m_randomGreets = npcTalk.m_randomGreets; balrondActorTalker.m_randomGoodbye = npcTalk.m_randomGoodbye; balrondActorTalker.m_privateAreaAlarm = npcTalk.m_privateAreaAlarm; balrondActorTalker.m_aggravated = npcTalk.m_aggravated; balrondActorTalker.m_randomTalkFX = npcTalk.m_randomTalkFX; balrondActorTalker.m_randomGreetFX = npcTalk.m_randomGreetFX; balrondActorTalker.m_randomGoodbyeFX = npcTalk.m_randomGoodbyeFX; Object.DestroyImmediate((Object)(object)npcTalk); } private void SetupNPC(GameObject gameObject) { BalrondActor balrondActor = gameObject.GetComponent() ?? gameObject.AddComponent(); BalrondActorNamePicker balrondActorNamePicker = gameObject.GetComponent() ?? gameObject.AddComponent(); Trader component = gameObject.GetComponent(); if ((Object)(object)component != (Object)null) { if (((Object)gameObject).name.Contains("Dverger")) { component.m_dialogHeight = 1.6f; } else if (((Object)gameObject).name.Contains("Huamn")) { component.m_dialogHeight = 2.2f; } } Dictionary dictionary = new Dictionary { ["DvergerMaleTalkerFarmer_bal"] = (false, "dverger", "Farmer"), ["DvergerMaleTraderFarmer_bal"] = (false, "dverger", "Farmer"), ["DvergerMaleTalkerVillager_bal"] = (false, "dverger", "Villager"), ["DvergerMaleTraderVillager_bal"] = (false, "dverger", "Villager"), ["DvergerMaleTalkerMerchant_bal"] = (false, "dverger", "Merchant"), ["DvergerMaleTraderMerchant_bal"] = (false, "dverger", "Merchant"), ["DvergerMaleTalkerPriest_bal"] = (false, "dverger", "Priest"), ["DvergerMaleTraderPriest_bal"] = (false, "dverger", "Priest"), ["DvergerMaleTalkerGuard_bal"] = (false, "dverger", "Guard"), ["DvergerMaleTraderGuard_bal"] = (false, "dverger", "Guard"), ["DvergerMaleTalkerHunter_bal"] = (false, "dverger", "Hunter"), ["DvergerMaleTraderHunter_bal"] = (false, "dverger", "Hunter"), ["DvergerMaleTalkerBlacksmith_bal"] = (false, "dverger", "Blacksmith"), ["DvergerMaleTraderBlacksmith_bal"] = (false, "dverger", "Blacksmith"), ["DvergerMaleTalkerBegger_bal"] = (false, "dverger", "Begger"), ["DvergerMaleTraderBegger_bal"] = (false, "dverger", "Begger"), ["DvergerMaleTalkerButcher_bal"] = (false, "dverger", "Buther"), ["DvergerMaleTraderButcher_bal"] = (false, "dverger", "Buther"), ["DvergerMaleTalkerFisherman_bal"] = (false, "dverger", "Fisherman"), ["DvergerMaleTraderFisherman_bal"] = (false, "dverger", "Fisherman"), ["DvergerMaleTalkerPatron_bal"] = (false, "dverger", "Patron"), ["DvergerMaleTraderPatron_bal"] = (false, "dverger", "Patron"), ["DvergerMaleTalkerBartender_bal"] = (false, "dverger", "Innkeeper"), ["DvergerMaleTraderBartender_bal"] = (false, "dverger", "Innkeeper"), ["DvergerMaleTalkerForager_bal"] = (false, "dverger", "Forager"), ["DvergerMaleTraderForager_bal"] = (false, "dverger", "Forager"), ["DvergerFemaleTalkerFarmer_bal"] = (true, "dverger", "Farmer"), ["DvergerFemaleTraderFarmer_bal"] = (true, "dverger", "Farmer"), ["DvergerFemaleTalkerVillager_bal"] = (true, "dverger", "Villager"), ["DvergerFemaleTraderVillager_bal"] = (true, "dverger", "Villager"), ["DvergerFemaleTalkerMerchant_bal"] = (true, "dverger", "Merchant"), ["DvergerFemaleTraderMerchant_bal"] = (true, "dverger", "Merchant"), ["DvergerFemaleTalkerPriest_bal"] = (true, "dverger", "Priest"), ["DvergerFemaleTraderPriest_bal"] = (true, "dverger", "Priest"), ["DvergerFemaleTalkerFisherman_bal"] = (true, "dverger", "Fisherman"), ["DvergerFemaleTalkerButcher_bal"] = (true, "dverger", "Butcher"), ["HumanFemaleTalker_Patron_bal"] = (true, "human", "Patron"), ["HumanFemaleTalker_Bartender_bal"] = (true, "human", "Innkeeper"), ["HumanFemaleTalker_Begger_bal"] = (true, "human", "Begger"), ["HumanFemaleTalker_Butcher_bal"] = (true, "human", "Butcher"), ["HumanFemaleTalker_Fisherman_bal"] = (true, "human", "Fisherman"), ["HumanFemaleTalker_Forager_bal"] = (true, "human", "Forager"), ["HumanFemaleTalker_Defender_bal"] = (true, "human", "Defender"), ["HumanFemaleTalker_Farmer_bal"] = (true, "human", "Farmer"), ["HumanFemaleTalker_Guard_bal"] = (true, "human", "Guard"), ["HumanFemaleTalker_Hunter_bal"] = (true, "human", "Hunter"), ["HumanFemaleTalker_Merchant_bal"] = (true, "human", "Merchant"), ["HumanFemaleTalker_Priest_bal"] = (true, "human", "Priest"), ["HumanFemaleTalker_Villager_bal"] = (true, "human", "Villager"), ["HumanFemaleTrader_Farmer_bal"] = (true, "human", "Farmer"), ["HumanFemaleTrader_Guard_bal"] = (true, "human", "Guard"), ["HumanFemaleTrader_Hunter_bal"] = (true, "human", "Hunter"), ["HumanFemaleTrader_Merchant_bal"] = (true, "human", "Merchant"), ["HumanFemaleTrader_Priest_bal"] = (true, "human", "Priest"), ["HumanFemaleTrader_Villager_bal"] = (true, "human", "Villager"), ["HumanFemaleTrader_Patron_bal"] = (true, "human", "Patron"), ["HumanFemaleTrader_Bartender_bal"] = (true, "human", "Innkeeper"), ["HumanFemaleTrader_Begger_bal"] = (true, "human", "Begger"), ["HumanFemaleTrader_Butcher_bal"] = (true, "human", "Butcher"), ["HumanFemaleTrader_Fisherman_bal"] = (true, "human", "Fisherman"), ["HumanFemaleTrader_Forager_bal"] = (true, "human", "Forager"), ["HumanMaleTalker_Patron_bal"] = (false, "human", "Patron"), ["HumanMaleTalker_Bartender_bal"] = (false, "human", "Innkeeper"), ["HumanMaleTalker_Butcher_bal"] = (false, "human", "Butcher"), ["HumanMaleTalker_Fisherman_bal"] = (false, "human", "Fisherman"), ["HumanMaleTalker_Forager_bal"] = (false, "human", "Forager"), ["HumanMaleTalker_Defender_bal"] = (false, "human", "Defender"), ["HumanMaleTalker_Begger_bal"] = (false, "human", "Begger"), ["HumanMaleTalker_Blacksmith_bal"] = (false, "human", "Blacksmith"), ["HumanMaleTalker_Farmer_bal"] = (false, "human", "Farmer"), ["HumanMaleTalker_Guard_bal"] = (false, "human", "Guard"), ["HumanMaleTalker_Hunter_bal"] = (false, "human", "Hunter"), ["HumanMaleTalker_Merchant_bal"] = (false, "human", "Merchant"), ["HumanMaleTalker_Priest_bal"] = (false, "human", "Priest"), ["HumanMaleTalker_Villager_bal"] = (false, "human", "Villager"), ["HumanMaleTalker_LumberJack_bal"] = (false, "human", "Lumberjack"), ["HumanMaleTalker_Miner_bal"] = (false, "human", "Miner"), ["HumanMaleTrader_Patron_bal"] = (false, "human", "Patron"), ["HumanMaleTrader_Bartender_bal"] = (false, "human", "Innkeeper"), ["HumanMaleTrader_Butcher_bal"] = (false, "human", "Butcher"), ["HumanMaleTrader_Fisherman_bal"] = (false, "human", "Fisherman"), ["HumanMaleTrader_Forager_bal"] = (false, "human", "Forager"), ["HumanMaleTrader_Begger_bal"] = (false, "human", "Begger"), ["HumanMaleTrader_Blacksmith_bal"] = (false, "human", "Blacksmith"), ["HumanMaleTrader_Farmer_bal"] = (false, "human", "Farmer"), ["HumanMaleTrader_Guard_bal"] = (false, "human", "Guard"), ["HumanMaleTrader_Hunter_bal"] = (false, "human", "Hunter"), ["HumanMaleTrader_Merchant_bal"] = (false, "human", "Merchant"), ["HumanMaleTrader_Priest_bal"] = (false, "human", "Priest"), ["HumanMaleTrader_Villager_bal"] = (false, "human", "Villager"), ["HumanMaleTrader_LumberJack_bal"] = (false, "human", "Lumberjack"), ["HumanMaleTrader_Miner_bal"] = (false, "human", "Miner") }; if (dictionary.TryGetValue(((Object)gameObject).name, out var value)) { balrondActor.m_useLoadout = true; balrondActor.m_isFemale = value.Item1; balrondActor.m_shouldHaveHair = value.Item2 == "human" || value.Item1; balrondActor.m_shouldHaveBeard = value.Item2 == "human" && !value.Item1; balrondActor.m_race = value.Item2; balrondActor.m_archetype = value.Item3; } else { Debug.LogWarning((object)("No NPC setup for" + ((Object)gameObject).name)); } balrondActorNamePicker.m_race = balrondActor.m_race; balrondActorNamePicker.m_isFemale = balrondActor.m_isFemale; } private void SetStation(Piece piece, CraftingStation station) { piece.m_craftingStation = station; } private void AddResources(Piece piece, string itemName, int amount, int amountPerLevel = 0, bool recover = true) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected O, but got Unknown List list = new List(); list.AddRange(piece.m_resources); Requirement val = new Requirement(); val.m_resItem = FindItem(this.list, itemName).GetComponent(); val.m_amount = amount; val.m_amountPerLevel = amountPerLevel; val.m_recover = recover; list.Add(val); piece.m_resources = list.ToArray(); } private GameObject FindItem(List list, string name, bool isStation = false) { GameObject val = list.Find((GameObject x) => ((Object)x).name == name); if ((Object)(object)val != (Object)null) { return val; } if ((Object)(object)val == (Object)null && isStation) { return null; } Debug.LogWarning((object)(Launch.projectName + ": Item Not Found - " + name + ", Replaced With Wood")); return list.Find((GameObject x) => ((Object)x).name == "Wood"); } } public class FoodDataBlock { public int health; public int stamina; public int etir; public int healthRegen; public int time; } public class RecipeFactory { private List pieces; private List items; private List newItems; public List recipes = new List(); private string[] toRecipe = new string[1] { "Npcmancer_bal" }; public List createRecipes(List items, List newItems) { this.items = items; this.newItems = newItems; pieces = items.Find((GameObject x) => ((Object)x).name == "Hammer").GetComponent().m_itemData.m_shared.m_buildPieces.m_pieces; TableMapper.setupTables(pieces); CraftingStation forge = TableMapper.forge; int minStationLevel = 3; foreach (GameObject newItem in newItems) { if (toRecipe.Contains(((Object)newItem).name)) { Recipe val = ScriptableObject.CreateInstance(); val.m_craftingStation = forge; val.m_repairStation = forge; val.m_minStationLevel = minStationLevel; val = createResources(newItem, val); recipes.Add(val); } } return recipes; } private Recipe createResources(GameObject item, Recipe newRecipe) { ((Object)newRecipe).name = "Recipe_" + ((Object)item).name; newRecipe.m_item = item.GetComponent(); newRecipe.m_amount = 1; newRecipe.m_enabled = true; List list = new List(); string name = ((Object)item).name; string text = name; if (!(text == "Npcmancer_bal")) { if (text == "StaffGatoth_bal") { newRecipe.m_enabled = false; newRecipe.m_craftingStation = TableMapper.forge; newRecipe.m_minStationLevel = 1; list.Add(createReq("SwordCheat", 1, 0)); } } else { newRecipe.m_enabled = true; newRecipe.m_craftingStation = TableMapper.forge; newRecipe.m_minStationLevel = 1; list.Add(createReq("FineWood", 4, 0)); list.Add(createReq("Bloodbag", 4, 0)); list.Add(createReq("Iron", 4, 0)); } newRecipe.m_repairStation = newRecipe.m_craftingStation; if (list.Count == 0) { } newRecipe.m_resources = list.ToArray(); return newRecipe; } 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(name).GetComponent(); val.m_resItem = component; val.m_amount = amount; val.m_amountPerLevel = amountPerLevel; return val; } private GameObject FindItem(string name) { GameObject val = items.Find((GameObject x) => ((Object)x).name == name); if ((Object)(object)val == (Object)null) { val = newItems.Find((GameObject x) => ((Object)x).name == name); if ((Object)(object)val != (Object)null) { return val; } Debug.LogWarning((object)("Item Not Found - " + name + ", Replaced With Wood")); return items.Find((GameObject x) => ((Object)x).name == "Wood"); } if ((Object)(object)val != (Object)null) { return val; } Debug.LogWarning((object)("Item Not Found At All - " + name + ", Replaced With Wood")); return items.Find((GameObject x) => ((Object)x).name == "Wood"); } private 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(); } return null; } } 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(); } } 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; } } } 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 != 0) { 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 != 0) { 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 = default(ArrayMetadata); value.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 = default(PropertyMetadata); value2.Info = propertyInfo; value2.Type = propertyInfo.PropertyType; value.Properties.Add(propertyInfo.Name, value2); } } FieldInfo[] fields = type.GetFields(); foreach (FieldInfo fieldInfo in fields) { PropertyMetadata value3 = default(PropertyMetadata); value3.Info = fieldInfo; value3.IsField = true; value3.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")) { PropertyMetadata item = default(PropertyMetadata); item.Info = propertyInfo; item.IsField = false; list.Add(item); } } FieldInfo[] fields = type.GetFields(); foreach (FieldInfo info in fields) { PropertyMetadata item2 = default(PropertyMetadata); item2.Info = info; item2.IsField = true; list.Add(item2); } 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 } }