Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of Rustheim v0.3.0
RustyLoot.dll
Decompiled 2 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using EpicLootAPI; using HarmonyLib; using JetBrains.Annotations; using LocalizationManager; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Serialization; using RustyLoot.Managers; using ServerSync; using TMPro; using UnityEngine; using UnityEngine.UI; [assembly: Guid("E0E2F92E-557C-4A05-9D89-AA92A0BD75C4")] [assembly: ComVisible(false)] [assembly: AssemblyTrademark("")] [assembly: AssemblyCopyright("Copyright © 2022")] [assembly: AssemblyProduct("RustyLoot")] [assembly: AssemblyCompany("RustyMods")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyDescription("")] [assembly: AssemblyTitle("RustyLoot")] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: CompilationRelaxations(8)] [assembly: AssemblyFileVersion("0.0.2")] [assembly: AssemblyConfiguration("")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.2.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [<8392a56d-ead9-4ec9-aa2f-e181e9fcce15>Embedded] internal sealed class <8392a56d-ead9-4ec9-aa2f-e181e9fcce15>EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] [<8392a56d-ead9-4ec9-aa2f-e181e9fcce15>Embedded] internal sealed class <4fdc30f7-b68c-418d-93b5-c88926ee132e>NullableAttribute : Attribute { public readonly byte[] NullableFlags; public <4fdc30f7-b68c-418d-93b5-c88926ee132e>NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public <4fdc30f7-b68c-418d-93b5-c88926ee132e>NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [<8392a56d-ead9-4ec9-aa2f-e181e9fcce15>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] [CompilerGenerated] internal sealed class <8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContextAttribute : Attribute { public readonly byte Flag; public <8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace LocalizationManager { [PublicAPI] [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(0)] public class Localizer { private static readonly Dictionary<string, Dictionary<string, Func<string>>> PlaceholderProcessors; private static readonly Dictionary<string, Dictionary<string, string>> loadedTexts; private static readonly ConditionalWeakTable<Localization, string> localizationLanguage; private static readonly List<WeakReference<Localization>> localizationObjects; [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] private static BaseUnityPlugin _plugin; private static readonly List<string> fileExtensions; private static BaseUnityPlugin plugin { get { //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Expected O, but got Unknown if (_plugin == null) { IEnumerable<TypeInfo> source; try { source = Assembly.GetExecutingAssembly().DefinedTypes.ToList(); } catch (ReflectionTypeLoadException ex) { source = from t in ex.Types where t != null select t.GetTypeInfo(); } _plugin = (BaseUnityPlugin)Chainloader.ManagerObject.GetComponent((Type)source.First([<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(0)] (TypeInfo t) => t.IsClass && typeof(BaseUnityPlugin).IsAssignableFrom(t))); } return _plugin; } } private static void UpdatePlaceholderText(Localization localization, string key) { localizationLanguage.TryGetValue(localization, out var value); string text = loadedTexts[value][key]; if (PlaceholderProcessors.TryGetValue(key, out var value2)) { text = value2.Aggregate(text, [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(0)] (string current, KeyValuePair<string, Func<string>> kv) => current.Replace("{" + kv.Key + "}", kv.Value())); } localization.AddWord(key, text); } public static void AddPlaceholder<T>(string key, string placeholder, ConfigEntry<T> config, [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(new byte[] { 2, 1, 1 })] Func<T, string> convertConfigValue = null) { if (convertConfigValue == null) { convertConfigValue = (T val) => val.ToString(); } if (!PlaceholderProcessors.ContainsKey(key)) { PlaceholderProcessors[key] = new Dictionary<string, Func<string>>(); } config.SettingChanged += [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(0)] (object _, EventArgs _) => { UpdatePlaceholder(); }; if (loadedTexts.ContainsKey(Localization.instance.GetSelectedLanguage())) { UpdatePlaceholder(); } void UpdatePlaceholder() { PlaceholderProcessors[key][placeholder] = () => convertConfigValue(config.Value); UpdatePlaceholderText(Localization.instance, key); } } public static void AddText(string key, string text) { List<WeakReference<Localization>> list = new List<WeakReference<Localization>>(); foreach (WeakReference<Localization> localizationObject in localizationObjects) { if (localizationObject.TryGetTarget(out var target)) { Dictionary<string, string> dictionary = loadedTexts[localizationLanguage.GetOrCreateValue(target)]; if (!target.m_translations.ContainsKey(key)) { dictionary[key] = text; target.AddWord(key, text); } } else { list.Add(localizationObject); } } foreach (WeakReference<Localization> item in list) { localizationObjects.Remove(item); } } public static void Load() { LoadLocalization(Localization.instance, Localization.instance.GetSelectedLanguage()); } private static void LoadLocalization(Localization __instance, string language) { //IL_01a6: Expected O, but got Unknown //IL_02a6: Expected O, but got Unknown if (!localizationLanguage.Remove(__instance)) { localizationObjects.Add(new WeakReference<Localization>(__instance)); } localizationLanguage.Add(__instance, language); Dictionary<string, string> dictionary = new Dictionary<string, string>(); foreach (string item in from f in Directory.GetFiles(Path.GetDirectoryName(Paths.PluginPath), plugin.Info.Metadata.Name + ".*", SearchOption.AllDirectories) where fileExtensions.IndexOf(Path.GetExtension(f)) >= 0 select f) { string text = Path.GetFileNameWithoutExtension(item).Split(new char[1] { '.' })[1]; if (dictionary.ContainsKey(text)) { Debug.LogWarning((object)("Duplicate key " + text + " found for " + plugin.Info.Metadata.Name + ". The duplicate file found at " + item + " will be skipped.")); } else { dictionary[text] = item; } } byte[] array = LoadTranslationFromAssembly("English"); if (array == null) { throw new Exception("Found no English localizations in mod " + plugin.Info.Metadata.Name + ". Expected an embedded resource translations/English.json."); } Dictionary<string, string> dictionary2; try { dictionary2 = JsonConvert.DeserializeObject<Dictionary<string, string>>(Encoding.UTF8.GetString(array)); } catch (JsonException val) { JsonException val2 = val; throw new Exception("Localization for mod " + plugin.Info.Metadata.Name + " failed: Invalid JSON in English localization file. " + ((Exception)(object)val2).Message); } if (dictionary2 == null) { throw new Exception("Localization for mod " + plugin.Info.Metadata.Name + " failed: Localization file was empty."); } string text2 = null; if (language != "English") { if (dictionary.ContainsKey(language)) { text2 = File.ReadAllText(dictionary[language]); } else { byte[] array2 = LoadTranslationFromAssembly(language); if (array2 != null) { text2 = Encoding.UTF8.GetString(array2); } } } if (text2 == null && dictionary.ContainsKey("English")) { text2 = File.ReadAllText(dictionary["English"]); } if (text2 != null) { Dictionary<string, string> dictionary3; try { dictionary3 = JsonConvert.DeserializeObject<Dictionary<string, string>>(text2); } catch (JsonException val3) { JsonException val4 = val3; throw new Exception("Localization for mod " + plugin.Info.Metadata.Name + " failed: Invalid JSON in " + language + " localization file. " + ((Exception)(object)val4).Message); } foreach (KeyValuePair<string, string> item2 in dictionary3 ?? new Dictionary<string, string>()) { dictionary2[item2.Key] = item2.Value; } } loadedTexts[language] = dictionary2; foreach (KeyValuePair<string, string> item3 in dictionary2) { UpdatePlaceholderText(__instance, item3.Key); } } static Localizer() { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Expected O, but got Unknown PlaceholderProcessors = new Dictionary<string, Dictionary<string, Func<string>>>(); loadedTexts = new Dictionary<string, Dictionary<string, string>>(); localizationLanguage = new ConditionalWeakTable<Localization, string>(); localizationObjects = new List<WeakReference<Localization>>(); fileExtensions = new List<string> { ".json" }; Harmony val = new Harmony("org.bepinex.helpers.LocalizationManager"); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Localization), "LoadCSV", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Localizer), "LoadLocalization", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } [return: <4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] private static byte[] LoadTranslationFromAssembly(string language) { foreach (string fileExtension in fileExtensions) { byte[] array = ReadEmbeddedFileBytes("translations." + language + fileExtension); if (array != null) { return array; } } return null; } [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(2)] public static byte[] ReadEmbeddedFileBytes([<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(1)] string resourceFileName, Assembly containingAssembly = null) { using MemoryStream memoryStream = new MemoryStream(); if ((object)containingAssembly == null) { containingAssembly = Assembly.GetCallingAssembly(); } string text = containingAssembly.GetManifestResourceNames().FirstOrDefault([<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(0)] (string str) => str.EndsWith(resourceFileName, StringComparison.Ordinal)); if (text != null) { containingAssembly.GetManifestResourceStream(text)?.CopyTo(memoryStream); } return (memoryStream.Length == 0L) ? null : memoryStream.ToArray(); } } } namespace RustyLoot { [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(0)] [PublicAPI] public static class AssetBundleManager { private static readonly Dictionary<string, AssetBundle> CachedBundles = new Dictionary<string, AssetBundle>(); [return: <4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] public static T LoadAsset<[<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(0)] T>(string assetBundle, string prefab) where T : Object { AssetBundle assetBundle2 = GetAssetBundle(assetBundle); return (assetBundle2 == null) ? default(T) : assetBundle2.LoadAsset<T>(prefab); } public static AssetBundle GetAssetBundle(string fileName) { if (CachedBundles.TryGetValue(fileName, out var value)) { return value; } AssetBundle val = AssetBundle.GetAllLoadedAssetBundles().FirstOrDefault((Func<AssetBundle, bool>)([<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(0)] (AssetBundle b) => ((Object)b).name == fileName)); if (val != null) { CachedBundles[fileName] = val; return val; } Assembly executingAssembly = Assembly.GetExecutingAssembly(); string name = executingAssembly.GetManifestResourceNames().Single([<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(0)] (string str) => str.EndsWith(fileName)); using Stream stream = executingAssembly.GetManifestResourceStream(name); AssetBundle val2 = AssetBundle.LoadFromStream(stream); CachedBundles[fileName] = val2; return val2; } } [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(0)] public class Clone { internal static readonly Dictionary<string, GameObject> registeredPrefabs = new Dictionary<string, GameObject>(); [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] private GameObject Prefab; private readonly string PrefabName; private readonly string NewName; private bool Loaded; [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] private GameObject Source; [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(new byte[] { 2, 1 })] [method: <4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(new byte[] { 2, 1 })] [field: <4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(new byte[] { 2, 1 })] public event Action<GameObject> OnCreated; public Clone(string prefabName, string newName) { PrefabName = prefabName; NewName = newName; PrefabManager.Clones.Add(this); } public Clone(GameObject source, string newName) { Source = source; NewName = newName; PrefabName = ((Object)source).name; } internal void Create() { if (Loaded) { return; } if (Source == null) { GameObject prefab = Helpers.GetPrefab(PrefabName); if (prefab == null) { return; } Prefab = Object.Instantiate<GameObject>(prefab, RustyLootPlugin.root.transform, false); } else { Prefab = Object.Instantiate<GameObject>(Source, RustyLootPlugin.root.transform, false); } ((Object)Prefab).name = NewName; PrefabManager.RegisterPrefab(Prefab); this.OnCreated?.Invoke(Prefab); registeredPrefabs[((Object)Prefab).name] = Prefab; Loaded = true; } } [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] [PublicAPI] [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(0)] public static class Helpers { [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] internal static ZNetScene _ZNetScene; [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] internal static ObjectDB _ObjectDB; [return: <4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] internal static GameObject GetPrefab(string prefabName) { if ((Object)(object)ZNetScene.instance != (Object)null) { return ZNetScene.instance.GetPrefab(prefabName); } if ((Object)(object)_ZNetScene == (Object)null) { return null; } GameObject val = _ZNetScene.m_prefabs.Find([<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(0)] (GameObject prefab) => ((Object)prefab).name == prefabName); if ((Object)(object)val != (Object)null) { return val; } GameObject value; return Clone.registeredPrefabs.TryGetValue(prefabName, out value) ? value : val; } public static string GetNormalizedName(string name) { return Regex.Replace(name, "\\s*\\(.*?\\)", "").Trim(); } public static bool HasComponent<[<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(0)] T>(this GameObject go) where T : Component { return Object.op_Implicit((Object)(object)go.GetComponent<T>()); } public static void RemoveComponent<[<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(0)] T>(this GameObject go) where T : Component { T val = default(T); if (go.TryGetComponent<T>(ref val)) { Object.DestroyImmediate((Object)(object)val); } } public static void RemoveAllComponents<[<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(0)] T>(this GameObject go, bool includeChildren = false, params Type[] ignoreComponents) where T : MonoBehaviour { List<T> list = go.GetComponents<T>().ToList(); if (includeChildren) { list.AddRange(go.GetComponentsInChildren<T>(true)); } foreach (T item in list) { if (!ignoreComponents.Contains(((object)item).GetType())) { Object.DestroyImmediate((Object)(object)item); } } } public static bool IsValid(this ItemData item) { return item.m_shared.m_icons.Length != 0; } } [PublicAPI] [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(0)] [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] public static class PrefabManager { internal static List<GameObject> PrefabsToRegister; internal static List<Clone> Clones; static PrefabManager() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Expected O, but got Unknown PrefabsToRegister = new List<GameObject>(); Clones = new List<Clone>(); Harmony val = new Harmony("org.bepinex.helpers.MWL_Manager"); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(FejdStartup), "Awake", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PrefabManager), "Patch_FejdStartup", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ZNetScene), "Awake", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PrefabManager), "Patch_ZNetScene_Awake", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(2)] public static void RegisterPrefab(GameObject prefab) { if (!((Object)(object)prefab == (Object)null)) { PrefabsToRegister.Add(prefab); } } public static void RegisterPrefab(string assetBundleName, string prefabName) { RegisterPrefab(AssetBundleManager.LoadAsset<GameObject>(assetBundleName, prefabName)); } public static void RegisterPrefab(AssetBundle assetBundle, string prefabName) { RegisterPrefab(assetBundle.LoadAsset<GameObject>(prefabName)); } [HarmonyPriority(700)] internal static void Patch_ZNetScene_Awake(ZNetScene __instance) { foreach (GameObject item in PrefabsToRegister) { if (Object.op_Implicit((Object)(object)item.GetComponent<ZNetView>())) { __instance.m_prefabs.Add(item); } } } [HarmonyPriority(700)] internal static void Patch_FejdStartup(FejdStartup __instance) { Helpers._ZNetScene = __instance.m_objectDBPrefab.GetComponent<ZNetScene>(); Helpers._ObjectDB = __instance.m_objectDBPrefab.GetComponent<ObjectDB>(); foreach (Clone clone in Clones) { clone.Create(); } } } public static class SpriteManager { [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] [return: <4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] public static Sprite RegisterSprite(string fileName, string folderName = "icons") { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Expected O, but got Unknown //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) Assembly executingAssembly = Assembly.GetExecutingAssembly(); string name = "RustyLoot." + folderName + "." + fileName; using Stream stream = executingAssembly.GetManifestResourceStream(name); if (stream == null) { return null; } byte[] array = new byte[stream.Length]; stream.Read(array, 0, array.Length); Texture2D val = new Texture2D(2, 2); Sprite val2 = (ImageConversion.LoadImage(val, array) ? Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), Vector2.zero) : null); if ((Object)(object)val2 != (Object)null) { ((Object)val2).name = fileName; } return val2; } } public enum Toggle { On = 1, Off = 0 } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("RustyMods.RustyLoot", "RustyLoot", "0.0.2")] [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(0)] [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] public class RustyLootPlugin : BaseUnityPlugin { [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(0)] private class ConfigurationManagerAttributes { [UsedImplicitly] public int? Order = null; [UsedImplicitly] public bool? Browsable = null; [UsedImplicitly] [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] public string Category = null; [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(new byte[] { 2, 1 })] [UsedImplicitly] public Action<ConfigEntryBase> CustomDrawer = null; } internal const string ModName = "RustyLoot"; internal const string ModVersion = "0.0.2"; internal const string Author = "RustyMods"; private const string ModGUID = "RustyMods.RustyLoot"; private static readonly string ConfigFileName = "RustyMods.RustyLoot.cfg"; private static readonly string ConfigFileFullPath; internal static string ConnectionError; private readonly Harmony _harmony = new Harmony("RustyMods.RustyLoot"); public static readonly ManualLogSource RustyLootLogger; public static readonly ConfigSync ConfigSync; private static ConfigEntry<Toggle> _serverConfigLocked; private static ConfigEntry<Toggle> _addLogs; public static RustyLootPlugin instance; public static GameObject root; public static bool ShowLogs => _addLogs.Value == Toggle.On; public static void LogDebug(string message) { if (ShowLogs) { RustyLootLogger.LogDebug((object)message); } } public static void LogWarning(string message) { if (ShowLogs) { RustyLootLogger.LogWarning((object)message); } } public static void LogError(string message) { RustyLootLogger.LogError((object)message); } public void Awake() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown instance = this; SetupConfigs(); root = new GameObject("RustyLoot_Root"); Object.DontDestroyOnLoad((Object)(object)root); root.SetActive(false); Localizer.Load(); EpicLoot.logger.OnWarning += LogWarning; EpicLoot.logger.OnError += LogError; SetupMagicEffects(); SetupSets(); Assembly executingAssembly = Assembly.GetExecutingAssembly(); _harmony.PatchAll(executingAssembly); SetupWatcher(); MagicEffect.SetupWatcher(); MagicSet.SetupWatcher(); } public void SetupConfigs() { _serverConfigLocked = config("1 - General", "Lock Configuration", Toggle.On, "If on, the configuration is locked and can be changed by server admins only."); ConfigSync.AddLockingConfigEntry<Toggle>(_serverConfigLocked); _addLogs = config("1 - General", "Show logs", Toggle.On, "If on, will show logs to show details of effects"); } public void SetupLegendaryItems() { Mistweaver.Setup(); Hafrnlight.Setup(); } public void SetupSets() { Wayfarer.Setup(); Hrafnstorm.Setup(); Ulfheonar.Setup(); Seidrweaver.Setup(); } public void SetupMagicEffects() { PiercingShot.Setup(); MagicProjectiles.SetupMagicArrow(); MagicProjectiles.SetupMagicBolt(); Seasonality.Setup(); MistVision.Setup(); ModifyTrinketDuration.Setup(); SeaWolf.Setup(); Rejuvenate.Setup(); IronMaiden.Setup(); ModifyAdrenaline.Setup(); ModifyAdrenalineCost.Setup(); Honeybound.Setup(); AddArmor.Setup(); Lifebloom.Setup(); ForsakenBlow.Setup(); Sturdy.Setup(); Bleed.Setup(); StaminaLeech.Setup(); } private void OnDestroy() { ((BaseUnityPlugin)this).Config.Save(); } private void SetupWatcher() { FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(Paths.ConfigPath, ConfigFileName); fileSystemWatcher.Changed += ReadConfigValues; fileSystemWatcher.Created += ReadConfigValues; fileSystemWatcher.Renamed += ReadConfigValues; fileSystemWatcher.IncludeSubdirectories = true; fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject; fileSystemWatcher.EnableRaisingEvents = true; } private void ReadConfigValues(object sender, FileSystemEventArgs e) { if (!File.Exists(ConfigFileFullPath)) { return; } try { RustyLootLogger.LogDebug((object)"ReadConfigValues called"); ((BaseUnityPlugin)this).Config.Reload(); } catch { RustyLootLogger.LogError((object)("There was an issue loading your " + ConfigFileName)); RustyLootLogger.LogError((object)"Please check your config entries for spelling and format!"); } } public static ConfigEntry<T> config<[<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] T>(string group, string name, T value, ConfigDescription description, bool synchronizedSetting = true) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown ConfigDescription val = new ConfigDescription(description.Description + (synchronizedSetting ? " [Synced with Server]" : " [Not Synced with Server]"), description.AcceptableValues, description.Tags); ConfigEntry<T> val2 = ((BaseUnityPlugin)instance).Config.Bind<T>(group, name, value, val); SyncedConfigEntry<T> syncedConfigEntry = ConfigSync.AddConfigEntry<T>(val2); syncedConfigEntry.SynchronizedConfig = synchronizedSetting; return val2; } public static ConfigEntry<T> config<[<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] T>(string group, string name, T value, string description, bool synchronizedSetting = true) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown return config(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty<object>()), synchronizedSetting); } static RustyLootPlugin() { string configPath = Paths.ConfigPath; char directorySeparatorChar = Path.DirectorySeparatorChar; ConfigFileFullPath = configPath + directorySeparatorChar + ConfigFileName; ConnectionError = ""; RustyLootLogger = Logger.CreateLogSource("RustyLoot"); ConfigSync = new ConfigSync("RustyMods.RustyLoot") { DisplayName = "RustyLoot", CurrentVersion = "0.0.2", MinimumRequiredVersion = "0.0.2" }; _serverConfigLocked = null; _addLogs = null; instance = null; root = null; } } [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(0)] [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] public class EffectListRef { [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(0)] public class EffectDataRef { public readonly string prefabName; public int variant; public bool attach; public bool follow; public bool inheritParentRotation; public bool inheritParentScale; public bool multiplyParentVisualScale; public bool randomRotation; public bool scale; public string childTransform = string.Empty; [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] private EffectData _data; public EffectDataRef(string prefabName) { this.prefabName = prefabName; } public EffectData ToEffectData() { //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Expected O, but got Unknown //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Expected O, but got Unknown if (_data != null) { return _data; } GameObject prefab = Helpers.GetPrefab(prefabName); if (prefab == null) { Debug.LogError((object)("Effect Data Reference invalid: " + prefabName)); return new EffectData(); } _data = new EffectData { m_prefab = prefab, m_variant = variant, m_attach = attach, m_follow = follow, m_inheritParentRotation = inheritParentRotation, m_inheritParentScale = inheritParentScale, m_multiplyParentVisualScale = multiplyParentVisualScale, m_randomRotation = randomRotation, m_scale = scale, m_childTransform = childTransform }; return _data; } } private readonly List<EffectDataRef> dataRefs = new List<EffectDataRef>(); private readonly List<EffectData> data = new List<EffectData>(); [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] private EffectList _effects; public EffectList Effects { get { //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Expected O, but got Unknown if (_effects != null) { return _effects; } foreach (EffectDataRef dataRef in dataRefs) { data.Add(dataRef.ToEffectData()); } _effects = new EffectList(); _effects.m_effectPrefabs = data.ToArray(); return _effects; } } public GameObject[] Create(Vector3 basePos, Quaternion baseRot, [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] Transform baseParent = null, float scale = 1f, int variant = -1) { //IL_0006: 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) return Effects.Create(basePos, baseRot, baseParent, scale, variant); } public EffectListRef(params string[] effects) { Add(effects); } public EffectListRef(params EffectDataRef[] refs) { dataRefs.AddRange(refs); } public EffectListRef() { } public void Add(params string[] effects) { foreach (string prefabName in effects) { dataRefs.Add(new EffectDataRef(prefabName)); } } public void Add(params EffectDataRef[] refs) { dataRefs.AddRange(refs); } } [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(0)] public static class Extensions { [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(0)] public class IgnoreEmptyValuesResolver : DefaultContractResolver { [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) JsonProperty property = ((DefaultContractResolver)this).CreateProperty(member, memberSerialization); if (property.PropertyType == typeof(string)) { property.ShouldSerialize = [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] (object instance) => { IValueProvider valueProvider2 = property.ValueProvider; string value = ((valueProvider2 != null) ? valueProvider2.GetValue(instance) : null) as string; return !string.IsNullOrWhiteSpace(value); }; return property; } if (typeof(IEnumerable).IsAssignableFrom(property.PropertyType)) { property.ShouldSerialize = [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] (object instance) => { IValueProvider valueProvider = property.ValueProvider; object obj = ((valueProvider != null) ? valueProvider.GetValue(instance) : null); if (obj == null) { return false; } if (obj is IEnumerable enumerable) { IEnumerator enumerator = enumerable.GetEnumerator(); using (enumerator as IDisposable) { return enumerator.MoveNext(); } } return true; }; } return property; } } public static readonly JsonSerializerSettings serializationSettings = new JsonSerializerSettings { NullValueHandling = (NullValueHandling)1, DefaultValueHandling = (DefaultValueHandling)1, Formatting = (Formatting)1, ContractResolver = (IContractResolver)(object)new IgnoreEmptyValuesResolver(), Converters = { (JsonConverter)new StringEnumConverter() } }; public static readonly JsonSerializerSettings deserializationSettings = new JsonSerializerSettings { MissingMemberHandling = (MissingMemberHandling)0, NullValueHandling = (NullValueHandling)1, ObjectCreationHandling = (ObjectCreationHandling)2, DefaultValueHandling = (DefaultValueHandling)2, Converters = { (JsonConverter)new StringEnumConverter() } }; public static void CopyFieldsFrom<[<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] T>(this T target, T source) { FieldInfo[] fields = typeof(T).GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (FieldInfo fieldInfo in fields) { object value = fieldInfo.GetValue(source); if (value != null) { fieldInfo.SetValue(target, value); } } } public static void All(this List<ItemRarity> list) { list.Add(ItemRarity.Magic, ItemRarity.Rare, ItemRarity.Epic, ItemRarity.Legendary, ItemRarity.Mythic); } } [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(0)] public class Legendary { public readonly LegendaryInfo info; private static JsonSerializerSettings serializationSettings => Extensions.serializationSettings; private static JsonSerializerSettings deserializationSettings => Extensions.deserializationSettings; private static string legendaryFolderPath => MagicSet.legendaryFolderPath; public Legendary(LegendaryType type, string id) { string text = id.ToLower(); info = new LegendaryInfo(type, id, "$mod_epicloot_" + text, "$mod_epicloot_" + text + "_desc"); } public void Register(bool serialize = true) { info.Register(); if (serialize) { Serialize(); } } public void Serialize() { string path = info.ID + ".json"; string text = Path.Combine(legendaryFolderPath, path); MagicSet.legendaries[text] = info; CustomSyncedValue<string> sync = new CustomSyncedValue<string>(RustyLootPlugin.ConfigSync, "RustyLoot.SyncedFiles.LegendaryItems." + info.ID); sync.ValueChanged += delegate { if (Object.op_Implicit((Object)(object)ZNet.instance) && !ZNet.instance.IsServer() && !string.IsNullOrEmpty(sync.Value)) { LegendaryInfo legendaryInfo = JsonConvert.DeserializeObject<LegendaryInfo>(sync.Value, deserializationSettings); if (legendaryInfo != null) { info.CopyFieldsFrom(legendaryInfo); info.Update(); RustyLootPlugin.LogDebug("Updated " + info.ID); } } }; MagicSet.syncedItems[info] = sync; if (File.Exists(text)) { MagicSet.DeserializeItem(text); return; } string contents = JsonConvert.SerializeObject((object)info, serializationSettings); File.WriteAllText(text, contents); } } public static class Hafrnlight { public static void Setup() { Legendary legendary = new Legendary(LegendaryType.Legendary, "Hafrnlight"); legendary.info.GuaranteedEffectCount = 6; legendary.info.GuaranteedMagicEffects.Add(new GuaranteedMagicEffect("MistVision")); legendary.info.Requirements.AllowedItemNames.Add("$item_demister"); legendary.info.Requirements.AllowedRarities.Add(ItemRarity.Legendary, ItemRarity.Mythic); legendary.Register(); } } public static class Mistweaver { public static void Setup() { Legendary legendary = new Legendary(LegendaryType.Legendary, "Mistweaver"); legendary.info.GuaranteedEffectCount = 6; legendary.info.GuaranteedMagicEffects.Add(new GuaranteedMagicEffect("MagicArrow"), new GuaranteedMagicEffect(EffectType.Weightless), new GuaranteedMagicEffect(EffectType.AddBowsSkill, 10f, 20f)); legendary.info.Requirements.AllowedSkillTypes.Add((SkillType)8); legendary.info.Requirements.AllowedRarities.Add(ItemRarity.Legendary, ItemRarity.Mythic); legendary.Register(); } } public static class Hrafnstorm { [HarmonyPatch(typeof(Projectile), "OnHit")] private static class Projectile_OnHit_Patch { [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] private static void Prefix(Projectile __instance) { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Invalid comparison between Unknown and I4 //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Expected O, but got Unknown //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Expected O, but got Unknown Character owner = __instance.m_owner; Player val = (Player)(object)((owner is Player) ? owner : null); if (val != null && !((Object)(object)val != (Object)(object)Player.m_localPlayer) && (int)__instance.m_type == 1) { Projectile obj = __instance; obj.m_onHit = (OnProjectileHit)Delegate.Combine((Delegate?)(object)obj.m_onHit, (Delegate?)(OnProjectileHit)delegate(Collider collider, Vector3 point, bool water) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) Hrafnstorm.OnHit?.Invoke(__instance, collider, point, water); }); } } } [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(0)] public class HrafnstormProxy : Proxy { public override void Initialize(Player player, string id, float cooldown) { base.Initialize(player, id, cooldown); OnHit += OnProjectileHit; } public override void OnRemoved() { OnHit -= OnProjectileHit; } private void OnProjectileHit(Projectile source, [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] Collider collider, Vector3 hitPoint, bool water) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Expected O, but got Unknown //IL_0092: Unknown result type (might be due to invalid IL or missing references) GameObject prefab = ZNetScene.instance.GetPrefab(((Object)source).name.Replace("(Clone)", string.Empty)); if (prefab != null) { HitData val = new HitData { m_damage = source.m_originalHitData.m_damage, m_pushForce = source.m_originalHitData.m_pushForce, m_backstabBonus = source.m_originalHitData.m_backstabBonus, m_ranged = true, m_hitType = (HitType)2 }; val.SetAttacker((Character)(object)Player); val.ApplyModifier(0.5f); if (TryTrigger(prefab, hitPoint, val)) { SetCooldownEndTime(Proxy.GetTime() - Cooldown); } } } private static bool TryTrigger(GameObject projectile, Vector3 pos, HitData hitData) { //IL_0019: 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_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) Projectile val4 = default(Projectile); for (int i = 0; i < 10; i++) { float num = Random.Range(3f, 10f); Vector2 val = Random.insideUnitCircle * num; Vector3 val2 = pos + new Vector3(val.x, Random.Range(35f, 55f), val.y); GameObject val3 = Object.Instantiate<GameObject>(projectile.gameObject, val2, Quaternion.identity); if (val3.TryGetComponent<Projectile>(ref val4)) { Vector3 val5 = pos - val2; Vector3 normalized = ((Vector3)(ref val5)).normalized; float num2 = Random.Range(25f, 35f); Vector3 val6 = normalized * num2; val4.Setup((Character)null, val6, 10f, hitData, (ItemData)null, (ItemData)null); } } return true; } } [HarmonyPatch(typeof(ObjectDB), "Awake")] private static class ObjectDB_Awake_Patch { [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] private static void Postfix(ObjectDB __instance) { GameObject itemPrefab = __instance.GetItemPrefab("ArrowWood"); ItemDrop val = default(ItemDrop); if (itemPrefab != null && itemPrefab.TryGetComponent<ItemDrop>(ref val)) { EpicLoot.RegisterAsset("ArrowWood", val.m_itemData.GetIcon()); } } } [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(new byte[] { 2, 1, 2 })] [method: <4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(new byte[] { 2, 1, 2 })] [field: <4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(new byte[] { 2, 1, 2 })] public static event Action<Projectile, Collider, Vector3, bool> OnHit; public static void Setup() { Sprite asset = SpriteManager.RegisterSprite("bow_wood1.png"); EpicLoot.RegisterAsset("HunterBow", asset); AbilityProxyDefinition abilityProxyDefinition = new AbilityProxyDefinition("ArrowRain", AbilityActivationMode.Triggerable, typeof(HrafnstormProxy)); abilityProxyDefinition.Ability.IconAsset = "HunterBow"; abilityProxyDefinition.Ability.Cooldown = 10f; abilityProxyDefinition.Register(); MagicEffect magicEffect = new MagicEffect("ArrowRain"); magicEffect.Requirements.NoRoll = true; magicEffect.Ability = "ArrowRain"; magicEffect.Register(); LegendaryInfo legendaryInfo = new LegendaryInfo(LegendaryType.Legendary, "HunterChest", "$mod_epicloot_hunterchest", "$mod_epicloot_hunterchest_desc"); legendaryInfo.Requirements.AddAllowedItemTypes((ItemType)7); legendaryInfo.GuaranteedEffectCount = 6; LegendaryInfo legendaryInfo2 = new LegendaryInfo(LegendaryType.Legendary, "HunterLegs", "$mod_epicloot_hunterlegs", "$mod_epicloot_hunterlegs_desc"); legendaryInfo2.Requirements.AddAllowedItemTypes((ItemType)11); legendaryInfo2.GuaranteedEffectCount = 6; LegendaryInfo legendaryInfo3 = new LegendaryInfo(LegendaryType.Legendary, "HunterCape", "$mod_epicloot_huntercape", "$mod_epicloot_huntercape_desc"); legendaryInfo3.Requirements.AddAllowedItemTypes((ItemType)17); legendaryInfo3.GuaranteedEffectCount = 6; LegendaryInfo legendaryInfo4 = new LegendaryInfo(LegendaryType.Legendary, "HunterHelmet", "$mod_epicloot_hunterhelmet", "$mod_epicloot_hunterhelmet_desc"); legendaryInfo4.Requirements.AddAllowedItemTypes((ItemType)6); legendaryInfo4.GuaranteedEffectCount = 6; MagicSet magicSet = new MagicSet("HunterSet", LegendaryType.Mythic); magicSet.AddItems(legendaryInfo4, legendaryInfo, legendaryInfo2, legendaryInfo3); magicSet.SetBonuses.Add(2, EffectType.AddBowsSkill, 10f, 20f); magicSet.SetBonuses.Add(3, EffectType.ModifyDodgeStaminaUse, 10f, 20f); magicSet.SetBonuses.Add(4, "ArrowRain"); magicSet.Register(); magicSet.Serialize(); } } public static class Seidrweaver { public class SE_Seidrweaver : SE_Stats { } public class SiedrweaverProxy : Proxy { public override void Activate() { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) if (!((Character)Player).HaveEitr(30f)) { Hud.instance.EitrBarEmptyFlash(); } else { if (IsOnCooldown()) { return; } SetCooldownEndTime(Proxy.GetTime() + Cooldown); List<Player> list = new List<Player>(); Player.GetPlayersInRange(((Component)Player).transform.position, 50f, list); list.Add(Player); foreach (Player item in list) { ((Character)item).GetSEMan().AddStatusEffect(StringExtensionMethods.GetStableHashCode("SE_Seidrweaver"), true, 0, 0f); } healEffect.Create(((Character)Player).GetHeadPoint(), Quaternion.identity); } } } [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(1)] private static readonly EffectListRef healEffect = new EffectListRef("fx_DvergerMage_Nova_ring"); public static void Setup() { Sprite val = SpriteManager.RegisterSprite("mushroom_big_red.png"); SE_Seidrweaver sE_Seidrweaver = ScriptableObject.CreateInstance<SE_Seidrweaver>(); ((Object)sE_Seidrweaver).name = "SE_Seidrweaver"; ((StatusEffect)sE_Seidrweaver).m_name = "$mod_epicloot_siedrweaver"; ((StatusEffect)sE_Seidrweaver).m_tooltip = "$mod_epicloot_siedrweaver_desc"; ((SE_Stats)sE_Seidrweaver).m_healthOverTime = 200f; ((SE_Stats)sE_Seidrweaver).m_healthOverTimeInterval = 1f; ((StatusEffect)sE_Seidrweaver).m_ttl = 120f; ((StatusEffect)sE_Seidrweaver).m_icon = val; ((StatusEffect)(object)sE_Seidrweaver).Register(); EpicLoot.RegisterAsset("Siedrweaver", val); LegendaryInfo legendaryInfo = new LegendaryInfo(LegendaryType.Mythic, "SiedrweaverHelmet", "$mod_epicloot_siedrweaver_helm", "$mod_epicloot_siedrweaver_helm_desc"); legendaryInfo.Requirements.AddAllowedItemTypes((ItemType)6); legendaryInfo.GuaranteedEffectCount = 6; legendaryInfo.GuaranteedMagicEffects.Add(new GuaranteedMagicEffect(EffectType.IncreaseEitr, 15f, 20f), new GuaranteedMagicEffect(EffectType.ModifyEitrRegen, 10f, 20f)); LegendaryInfo legendaryInfo2 = new LegendaryInfo(LegendaryType.Mythic, "SiedrweaverCape", "$mod_epicloot_siedrweaver_cape", "$mod_epicloot_siedrweaver_cape_desc"); legendaryInfo2.Requirements.AddAllowedItemTypes((ItemType)17); legendaryInfo2.GuaranteedEffectCount = 6; legendaryInfo2.GuaranteedMagicEffects.Add(new GuaranteedMagicEffect(EffectType.AddBloodMagicSkill, 10f, 20f), new GuaranteedMagicEffect(EffectType.ModifyAttackEitrUse, 10f, 20f)); LegendaryInfo legendaryInfo3 = new LegendaryInfo(LegendaryType.Mythic, "SiedrweaverLegs", "$mod_epicloot_siedrweaver_legs", "$mod_epicloot_siedrweaver_legs_desc"); legendaryInfo3.Requirements.AddAllowedItemTypes((ItemType)11); legendaryInfo3.GuaranteedEffectCount = 6; legendaryInfo3.GuaranteedMagicEffects.Add(new GuaranteedMagicEffect(EffectType.ModifyEitrRegenLowHealth, 10f, 20f), new GuaranteedMagicEffect(EffectType.EitrWeave, 10f, 20f)); LegendaryInfo legendaryInfo4 = new LegendaryInfo(LegendaryType.Mythic, "SiedrweaverChest", "$mod_epicloot_siedrweaver_chest", "$mod_epicloot_siedrweaver_chest_desc"); legendaryInfo4.Requirements.AddAllowedItemTypes((ItemType)7); legendaryInfo4.GuaranteedEffectCount = 6; legendaryInfo4.GuaranteedMagicEffects.Add(new GuaranteedMagicEffect(EffectType.ModifyElementalDamage, 10f, 20f), new GuaranteedMagicEffect(EffectType.AddElementalResistancePercentage, 10f, 20f)); MagicSet magicSet = new MagicSet("Siedrweaver", LegendaryType.Mythic); magicSet.AddItems(legendaryInfo, legendaryInfo4, legendaryInfo3, legendaryInfo2); magicSet.SetBonuses.Add(2, EffectType.IncreaseEitr, 10f, 20f); magicSet.SetBonuses.Add(2, EffectType.ModifyEitrRegen, 10f, 20f); magicSet.SetBonuses.Add(3, EffectType.AddBloodMagicSkill, 10f, 25f); magicSet.SetBonuses.Add(4, "Siedrweaver"); magicSet.Register(); magicSet.Serialize(); AbilityProxyDefinition abilityProxyDefinition = new AbilityProxyDefinition("Siedrweaver", AbilityActivationMode.Activated, typeof(SiedrweaverProxy)); abilityProxyDefinition.Ability.Cooldown = 600f; abilityProxyDefinition.Ability.IconAsset = "Siedrweaver"; abilityProxyDefinition.Register(); MagicItemEffectDefinition magicItemEffectDefinition = new MagicItemEffectDefinition("Siedrweaver", "$mod_epicloot_siedrweaver_desc", "$mod_epicloot_siedrweaver_desc"); magicItemEffectDefinition.Requirements.NoRoll = true; magicItemEffectDefinition.Ability = "Siedrweaver"; magicItemEffectDefinition.Register(); } } public static class Ulfheonar { public class UlfheonarProxy : Proxy { public override void Activate() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) if (IsOnCooldown()) { return; } SetCooldownEndTime(Proxy.GetTime() + Cooldown); List<Player> list = new List<Player>(); Player.GetPlayersInRange(((Component)Player).transform.position, 50f, list); list.Add(Player); foreach (Player item in list) { ((Character)item).GetSEMan().AddStatusEffect(StringExtensionMethods.GetStableHashCode("SE_Flamethrower"), true, 0, 0f); } } } [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(0)] [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] public class SE_Flamethrower : SE_Stats { public float damageModifier = 1.1f; public override void Setup(Character character) { ((SE_Stats)this).Setup(character); Trigger(); } public override void OnDamaged(HitData hit, Character attacker) { hit.ApplyModifier(damageModifier); } public override string GetTooltipString() { string tooltipString = ((SE_Stats)this).GetTooltipString(); return tooltipString + $"\n$mod_epicloot_damage_taken: <color=orange>+{(damageModifier - 1f) * 100f}</color>%"; } public void Trigger() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) Vector3 headPoint = ((StatusEffect)this).m_character.GetHeadPoint(); Quaternion lookYaw = ((StatusEffect)this).m_character.GetLookYaw(); Vector3 val = lookYaw * Vector3.forward; HitData val2 = new HitData(); val2.SetAttacker(((StatusEffect)this).m_character); val2.m_damage.m_fire = 50f; val2.m_damage.m_chop = 20f; flamethrowerEffects.Create(headPoint, lookYaw, ((StatusEffect)this).m_character.m_head, 1f, -1); Collider[] array = (Collider[])(object)new Collider[10]; int num = Physics.OverlapSphereNonAlloc(headPoint + val * 5f, 3f, array); for (int i = 0; i < num; i++) { Collider val3 = array[i]; IDestructible componentInParent = ((Component)val3).GetComponentInParent<IDestructible>(); if (componentInParent == null) { continue; } Vector3 val4 = ((Component)val3).transform.position - headPoint; Vector3 normalized = ((Vector3)(ref val4)).normalized; float num2 = Vector3.Angle(val, normalized); if (num2 <= 45f) { float num3 = Vector3.Distance(headPoint, ((Component)val3).transform.position); if (num3 <= 10f) { componentInParent.Damage(val2); } } } } } [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(1)] private static readonly EffectList flamethrowerEffects = new EffectList(); public static void Setup() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_003f: 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_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Expected O, but got Unknown GameObject val = AssetBundleManager.LoadAsset<GameObject>("ascension_bundle", "vfx_flamethrower_purple"); Transform transform = val.transform; transform.localScale *= 1.2f; PrefabManager.RegisterPrefab(val); flamethrowerEffects.m_effectPrefabs = new List<EffectData> { new EffectData { m_prefab = val, m_attach = true } }.ToArray(); Sprite val2 = SpriteManager.RegisterSprite("bone_skull.png"); EpicLoot.RegisterAsset("BoneSkull", val2); SE_Flamethrower sE_Flamethrower = ScriptableObject.CreateInstance<SE_Flamethrower>(); ((Object)sE_Flamethrower).name = "SE_Flamethrower"; ((StatusEffect)sE_Flamethrower).m_name = "$mod_epicloot_ulfheonar"; ((StatusEffect)sE_Flamethrower).m_tooltip = "$mod_epicloot_ulfheonar_desc"; ((SE_Stats)sE_Flamethrower).m_speedModifier = 0.2f; ((SE_Stats)sE_Flamethrower).m_percentigeDamageModifiers.m_blunt = 0.5f; ((SE_Stats)sE_Flamethrower).m_percentigeDamageModifiers.m_pierce = 0.5f; ((SE_Stats)sE_Flamethrower).m_percentigeDamageModifiers.m_slash = 0.5f; ((StatusEffect)sE_Flamethrower).m_ttl = 300f; ((StatusEffect)sE_Flamethrower).m_icon = val2; ((StatusEffect)(object)sE_Flamethrower).Register(); LegendaryInfo legendaryInfo = new LegendaryInfo(LegendaryType.Mythic, "UlfheonarHelmet", "$mod_epicloot_ulfheonar_helm", "$mod_epicloot_ulfheonar_helm_desc"); legendaryInfo.Requirements.AddAllowedItemTypes((ItemType)6); legendaryInfo.GuaranteedEffectCount = 6; legendaryInfo.GuaranteedMagicEffects.Add(new GuaranteedMagicEffect(EffectType.ModifyDamageLowHealth, 15f, 20f), new GuaranteedMagicEffect(EffectType.AvoidDamageTakenLowHealth, 10f, 20f)); LegendaryInfo legendaryInfo2 = new LegendaryInfo(LegendaryType.Mythic, "UlfheonarCape", "$mod_epicloot_ulfheonar_cape", "$mod_epicloot_ulfheonar_cape_desc"); legendaryInfo2.Requirements.AddAllowedItemTypes((ItemType)7); legendaryInfo2.GuaranteedEffectCount = 6; legendaryInfo2.GuaranteedMagicEffects.Add(new GuaranteedMagicEffect(EffectType.ModifyPhysicalDamage, 10f, 20f), new GuaranteedMagicEffect(EffectType.ModifyStaggerDuration, 10f, 20f)); LegendaryInfo legendaryInfo3 = new LegendaryInfo(LegendaryType.Mythic, "UlfheonarLegs", "$mod_epicloot_ulfheonar_legs", "$mod_epicloot_ulfheonar_legs_desc"); legendaryInfo3.Requirements.AddAllowedItemTypes((ItemType)11); legendaryInfo3.GuaranteedEffectCount = 6; legendaryInfo3.GuaranteedMagicEffects.Add(new GuaranteedMagicEffect(EffectType.ModifyMovementSpeedLowHealth, 10f, 20f), new GuaranteedMagicEffect(EffectType.AvoidDamageTakenLowHealth, 10f, 20f)); LegendaryInfo legendaryInfo4 = new LegendaryInfo(LegendaryType.Mythic, "UlfheonarClaws", "$mod_epicloot_ulfheonar_claws", "$mod_epicloot_ulfheonar_claws_desc"); legendaryInfo4.Requirements.AddAllowedItemTypes((ItemType)14); legendaryInfo4.Requirements.AllowedSkillTypes.Add((SkillType)11); legendaryInfo4.GuaranteedEffectCount = 6; legendaryInfo4.GuaranteedMagicEffects.Add(new GuaranteedMagicEffect(EffectType.AddUnarmedSkill, 10f, 20f), new GuaranteedMagicEffect(EffectType.ModifyAttackSpeed, 10f, 20f)); MagicSet magicSet = new MagicSet("Ulfheonar", LegendaryType.Mythic); magicSet.AddItems(legendaryInfo, legendaryInfo4, legendaryInfo3, legendaryInfo2); magicSet.SetBonuses.Add(2, EffectType.AddMovementSkills, 10f, 20f); magicSet.SetBonuses.Add(2, EffectType.IncreaseHeatResistance, 10f, 20f); magicSet.SetBonuses.Add(3, EffectType.ModifyDamage, 10f, 25f); magicSet.SetBonuses.Add(4, "Ulfheonar"); magicSet.Register(); magicSet.Serialize(); AbilityProxyDefinition abilityProxyDefinition = new AbilityProxyDefinition("Ulfheonar", AbilityActivationMode.Activated, typeof(UlfheonarProxy)); abilityProxyDefinition.Ability.Cooldown = 600f; abilityProxyDefinition.Ability.IconAsset = "BoneSkull"; abilityProxyDefinition.Register(); MagicItemEffectDefinition magicItemEffectDefinition = new MagicItemEffectDefinition("Ulfheonar", "$mod_epicloot_ulfheonar_desc", "$mod_epicloot_ulfheonar_desc"); magicItemEffectDefinition.Requirements.NoRoll = true; magicItemEffectDefinition.Ability = "Ulfheonar"; magicItemEffectDefinition.Register(); } } public static class Wayfarer { public class WayfarerProxy : Proxy { public override void Activate() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) if (IsOnCooldown()) { return; } SetCooldownEndTime(Proxy.GetTime() + Cooldown); List<Player> list = new List<Player>(); Player.GetPlayersInRange(((Component)Player).transform.position, 10f, list); list.Add(Player); foreach (Player item in list) { ((Character)item).GetSEMan().AddStatusEffect(StringExtensionMethods.GetStableHashCode("SE_Wayfarer"), true, 0, 0f); } } } public class SE_Wayfarer : SE_Stats { [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] public override void Setup(Character character) { Player val = (Player)(object)((character is Player) ? character : null); if (val != null) { ((StatusEffect)this).m_startEffects = val.m_skillLevelupEffects; } ((SE_Stats)this).Setup(character); } } [HarmonyPatch(typeof(Player), "GetEquipmentMovementModifier")] private static class Wayfarer_Player_GetEquipmentMovementModifier { [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] private static void Postfix(Player __instance, ref float __result) { if (!(__result > 0f) && ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("SE_Wayfarer"))) { __result = 0f; } } } public static void Setup() { //IL_026f: Unknown result type (might be due to invalid IL or missing references) LegendaryInfo legendaryInfo = new LegendaryInfo(LegendaryType.Mythic, "WayfarerHelmet", "$mod_epicloot_wayfarer_helm", "$mod_epicloot_wayfarer_helm_desc"); legendaryInfo.Requirements.AddAllowedItemTypes((ItemType)6); legendaryInfo.GuaranteedEffectCount = 6; LegendaryInfo legendaryInfo2 = new LegendaryInfo(LegendaryType.Mythic, "WayfarerChest", "$mod_epicloot_wayfarer_chest", "$mod_epicloot_wayfarer_chest_desc"); legendaryInfo2.Requirements.AddAllowedItemTypes((ItemType)7); legendaryInfo2.GuaranteedEffectCount = 6; LegendaryInfo legendaryInfo3 = new LegendaryInfo(LegendaryType.Mythic, "WayfarerLegs", "$mod_epicloot_wayfarer_legs", "$mod_epicloot_wayfarer_legs_desc"); legendaryInfo3.Requirements.AddAllowedItemTypes((ItemType)11); legendaryInfo3.GuaranteedEffectCount = 6; LegendaryInfo legendaryInfo4 = new LegendaryInfo(LegendaryType.Mythic, "WayfarerCape", "$mod_epicloot_wayfarer_cape", "$mod_epicloot_wayfarer_cape_desc"); legendaryInfo4.Requirements.AddAllowedItemTypes((ItemType)17); legendaryInfo4.GuaranteedEffectCount = 6; MagicSet magicSet = new MagicSet("Wayfarer", LegendaryType.Mythic); magicSet.AddItems(legendaryInfo, legendaryInfo2, legendaryInfo3, legendaryInfo4); magicSet.SetBonuses.Add(2, EffectType.AddMovementSkills, 10f, 20f); magicSet.SetBonuses.Add(2, EffectType.AddPhysicalResistancePercentage, 10f, 20f); magicSet.SetBonuses.Add(3, EffectType.ModifyDiscoveryRadius, 10f, 25f); magicSet.SetBonuses.Add(4, "Wayfarer"); magicSet.Register(); magicSet.Serialize(); Sprite val = SpriteManager.RegisterSprite("cape_hood_darkyellow.png"); EpicLoot.RegisterAsset("CapeHood", val); AbilityProxyDefinition abilityProxyDefinition = new AbilityProxyDefinition("Wayfarer", AbilityActivationMode.Activated, typeof(WayfarerProxy)); abilityProxyDefinition.Ability.Cooldown = 600f; abilityProxyDefinition.Ability.IconAsset = "CapeHood"; abilityProxyDefinition.Register(); MagicItemEffectDefinition magicItemEffectDefinition = new MagicItemEffectDefinition("Wayfarer", "$mod_epicloot_wayfarer_desc", "$mod_epicloot_wayfarer_desc"); magicItemEffectDefinition.Requirements.NoRoll = true; magicItemEffectDefinition.Ability = "Wayfarer"; magicItemEffectDefinition.Register(); SE_Wayfarer sE_Wayfarer = ScriptableObject.CreateInstance<SE_Wayfarer>(); ((Object)sE_Wayfarer).name = "SE_Wayfarer"; ((StatusEffect)sE_Wayfarer).m_ttl = 300f; ((StatusEffect)sE_Wayfarer).m_name = "$mod_epicloot_wayfarer"; ((StatusEffect)sE_Wayfarer).m_tooltip = "$mod_epicloot_wayfarer_desc"; ((SE_Stats)sE_Wayfarer).m_addMaxCarryWeight = 300f; ((StatusEffect)sE_Wayfarer).m_attributes = (StatusAttribute)4; ((StatusEffect)sE_Wayfarer).m_icon = val; ((StatusEffect)(object)sE_Wayfarer).Register(); } } [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(0)] public class MagicEffect { private const string folderName = "RustyLoot"; private const string effectFolderName = "MagicEffects"; private static readonly string folderPath = Path.Combine(Paths.ConfigPath, "RustyLoot"); private static readonly string effectFolderPath = Path.Combine(folderPath, "MagicEffects"); private static readonly Dictionary<string, MagicItemEffectDefinition> effects = new Dictionary<string, MagicItemEffectDefinition>(); private static readonly Dictionary<string, ConfigEntry<Toggle>> noRollConfigs = new Dictionary<string, ConfigEntry<Toggle>>(); private static readonly Dictionary<string, ConfigEntry<Toggle>> showLogConfigs = new Dictionary<string, ConfigEntry<Toggle>>(); public static readonly List<MagicEffect> MagicEffects = new List<MagicEffect>(); public static Dictionary<MagicItemEffectDefinition, CustomSyncedValue<string>> syncedEffects = new Dictionary<MagicItemEffectDefinition, CustomSyncedValue<string>>(); public readonly MagicItemEffectDefinition definition; [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] public ConfigEntry<Toggle> noRollConfig; [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] public ConfigEntry<Toggle> showLogs; private static JsonSerializerSettings serializationSettings => Extensions.serializationSettings; private static JsonSerializerSettings deserializationSettings => Extensions.deserializationSettings; public MagicItemEffectRequirements Requirements => definition.Requirements; public ValuesPerRarityDef ValuesPerRarity => definition.ValuesPerRarity; public string Ability { set { definition.Ability = value; } } public MagicEffect(string effectType) { string text = effectType.ToLower(); string displayText = "$mod_epicloot_" + text; string description = "$mod_epicloot_" + text + "_desc"; definition = new MagicItemEffectDefinition(effectType, displayText, description); MagicEffects.Add(this); } public bool IsEnabled() { Toggle? toggle = noRollConfig?.Value; return toggle.HasValue && toggle.GetValueOrDefault() == Toggle.On; } public bool ShowLogs() { Toggle? toggle = showLogs?.Value; return toggle.HasValue && toggle.GetValueOrDefault() == Toggle.On; } public void Register(bool serialize = true, bool configs = true) { definition.Register(); if (serialize) { Serialize(); } if (configs) { SetupConfigs(); } } private void SetupConfigs() { noRollConfig = RustyLootPlugin.config("Magic Effects", definition.Type, Toggle.On, "If on, " + definition.Type + " has chance to roll"); noRollConfig.SettingChanged += [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(0)] (object _, EventArgs _) => { definition.Requirements.NoRoll = noRollConfig.Value == Toggle.Off; definition.Update(); }; noRollConfigs[definition.Type] = noRollConfig; showLogs = RustyLootPlugin.config("Logs", definition.Type, Toggle.Off, "If on, " + definition.Type + " will display detailed logs"); showLogConfigs[definition.Type] = showLogs; } private void Serialize() { if (!Directory.Exists(folderPath)) { Directory.CreateDirectory(folderPath); } if (!Directory.Exists(effectFolderPath)) { Directory.CreateDirectory(effectFolderPath); } string path = definition.Type + ".json"; string text = Path.Combine(effectFolderPath, path); effects[text] = definition; CustomSyncedValue<string> customSyncedValue = new CustomSyncedValue<string>(RustyLootPlugin.ConfigSync, "RustyLoot.SyncedFiles.MagicEffects." + definition.Type, ""); customSyncedValue.ValueChanged += delegate { OnServerSyncFileChanged(definition); }; syncedEffects[definition] = customSyncedValue; if (File.Exists(text)) { DeserializeEffect(text); return; } string contents = JsonConvert.SerializeObject((object)definition, serializationSettings); File.WriteAllText(text, contents); } public static void SyncEffect(MagicItemEffectDefinition definition) { if (Object.op_Implicit((Object)(object)ZNet.instance) && ZNet.instance.IsServer() && syncedEffects.TryGetValue(definition, out var value)) { string value2 = JsonConvert.SerializeObject((object)definition, Extensions.serializationSettings); value.Value = value2; } } private static void OnServerSyncFileChanged(MagicItemEffectDefinition definition) { if (Object.op_Implicit((Object)(object)ZNet.instance) && !ZNet.instance.IsServer() && syncedEffects.TryGetValue(definition, out var value) && !string.IsNullOrEmpty(value.Value)) { MagicItemEffectDefinition magicItemEffectDefinition = JsonConvert.DeserializeObject<MagicItemEffectDefinition>(value.Value, deserializationSettings); if (magicItemEffectDefinition != null) { definition.CopyFieldsFrom(magicItemEffectDefinition); definition.Update(); RustyLootPlugin.LogDebug("Updated " + definition.Type); } } } private static void DeserializeEffect(string filePath) { if (File.Exists(filePath) && effects.TryGetValue(filePath, out var value)) { string text = File.ReadAllText(filePath); MagicItemEffectDefinition source = JsonConvert.DeserializeObject<MagicItemEffectDefinition>(text, deserializationSettings); value.CopyFieldsFrom(source); value.Update(); SyncEffect(value); } } public static void SetupWatcher() { FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(effectFolderPath, "*.json"); fileSystemWatcher.NotifyFilter = NotifyFilters.LastWrite; fileSystemWatcher.EnableRaisingEvents = true; fileSystemWatcher.IncludeSubdirectories = true; fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject; fileSystemWatcher.Changed += [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(0)] (object _, FileSystemEventArgs e) => { RustyLootPlugin.RustyLootLogger.LogDebug((object)("File changed: " + Path.GetFileName(e.FullPath))); DeserializeEffect(e.FullPath); }; } public static bool IsEnabled(string effectType) { ConfigEntry<Toggle> value; return noRollConfigs.TryGetValue(effectType, out value) && value.Value == Toggle.On; } public static bool ShowLogs(string effectType) { ConfigEntry<Toggle> value; return showLogConfigs.TryGetValue(effectType, out value) && value.Value == Toggle.On; } } public static class AddArmor { [HarmonyPatch(typeof(ItemData), "GetArmor", new Type[] { typeof(int), typeof(float) })] private static class AddArmor_ItemData_GetAmor_Patch { [HarmonyPriority(800)] [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] private static void Postfix(ItemData __instance, ref float __result) { if (!effect.IsEnabled()) { return; } MagicItem magicItem = __instance.GetMagicItem(); if (magicItem == null) { return; } MagicItemEffect magicItemEffect = magicItem.Effects.FirstOrDefault((MagicItemEffect x) => x.EffectType == "AddArmor"); if (magicItemEffect != null) { float effectValue = magicItemEffect.EffectValue; float num = __result; __result += effectValue; if (effect.ShowLogs()) { RustyLootPlugin.LogDebug($"[AddArmor] item:{__instance.m_shared.m_name} base:{num:0.#} +{effectValue:0.#} => {__result:0.#}"); } } } } [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(1)] private static MagicEffect effect; public static void Setup() { effect = new MagicEffect("AddArmor"); MagicItemEffectRequirements requirements = effect.Requirements; ItemType[] array = new ItemType[4]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); requirements.AddAllowedItemTypes((ItemType[])(object)array); effect.Requirements.AllowedRarities.All(); effect.ValuesPerRarity.Magic.Set(1f, 2f); effect.ValuesPerRarity.Rare = new ValueDef(1f, 3f, 1f); effect.ValuesPerRarity.Epic = new ValueDef(1f, 4f, 1f); effect.ValuesPerRarity.Legendary = new ValueDef(1f, 5f, 1f); effect.ValuesPerRarity.Mythic = new ValueDef(1f, 6f, 1f); effect.Register(); } } public static class Bleed { public class SE_Bleed : StatusEffect { public float damageTimer; public float damagePerTick = 1f; public float maxDamagePerTick = 10f; [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] public Character attacker; public override void UpdateStatusEffect(float dt) { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Expected O, but got Unknown //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) ((StatusEffect)this).UpdateStatusEffect(dt); if (damagePerTick <= 0f) { return; } damageTimer += dt; if (!(damageTimer < 1f)) { damageTimer = 0f; HitData val = new HitData(); val.m_hitType = (HitType)14; if ((Object)(object)attacker != (Object)null) { val.SetAttacker(attacker); } val.m_damage.m_damage = damagePerTick; base.m_character.Damage(val); WorldText.instance?.ShowText(base.m_character.GetTopPoint(), $"{damagePerTick} $mod_epicloot_bleed_msg", Color.red); damagePerTick -= 1f; if (damagePerTick <= 0f) { base.m_ttl = 0f; } } } public void Increment() { damagePerTick = Mathf.Max(damagePerTick + 1f, maxDamagePerTick); ((StatusEffect)this).ResetTime(); } } [HarmonyPatch(typeof(Character), "RPC_Damage")] private static class Bleed_Character_RPC_Damage { [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] private static void Postfix(Character __instance, HitData hit) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Invalid comparison between Unknown and I4 if (!MagicEffect.IsEnabled("Bleed")) { return; } Character attacker = hit.GetAttacker(); Player val = (Player)(object)((attacker is Player) ? attacker : null); if (val == null || (int)hit.m_hitType == 14 || !val.HasActiveMagicEffect("Bleed", out var effectValue, 0.01f)) { return; } float num = Mathf.Clamp01(effectValue); float value = Random.value; bool flag = num > value; if (flag) { if (__instance.GetSEMan().GetStatusEffect(StringExtensionMethods.GetStableHashCode("SE_Bleed")) is SE_Bleed sE_Bleed) { sE_Bleed.Increment(); sE_Bleed.attacker = (Character)(object)val; } else { SE_Bleed sE_Bleed2 = (SE_Bleed)(object)__instance.GetSEMan().AddStatusEffect(StringExtensionMethods.GetStableHashCode("SE_Bleed"), false, 0, 0f); sE_Bleed2.attacker = (Character)(object)val; } } if (MagicEffect.ShowLogs("Bleed")) { RustyLootPlugin.LogDebug($"[Bleed]: attacker: {val.GetPlayerName()}, chance: {num}({num * 100f}), roll: {value}, trigger: {flag}"); } } } public static void Setup() { SE_Bleed sE_Bleed = ScriptableObject.CreateInstance<SE_Bleed>(); ((Object)sE_Bleed).name = "SE_Bleed"; ((StatusEffect)sE_Bleed).m_name = "$mod_epicloot_bleed"; ((StatusEffect)sE_Bleed).m_tooltip = "$mod_epicloot_bleed_desc"; sE_Bleed.damagePerTick = 1f; sE_Bleed.maxDamagePerTick = 10f; ((StatusEffect)sE_Bleed).m_ttl = 10f; ((StatusEffect)(object)sE_Bleed).Register(); MagicEffect magicEffect = new MagicEffect("Bleed"); MagicItemEffectRequirements requirements = magicEffect.Requirements; ItemType[] array = new ItemType[5]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); requirements.AddAllowedItemTypes((ItemType[])(object)array); magicEffect.Requirements.AllowedRarities.Add(ItemRarity.Magic, ItemRarity.Rare, ItemRarity.Epic, ItemRarity.Legendary, ItemRarity.Mythic); magicEffect.ValuesPerRarity.Magic = new ValueDef(5f, 8f, 1f); magicEffect.ValuesPerRarity.Rare = new ValueDef(7f, 12f, 1f); magicEffect.ValuesPerRarity.Epic = new ValueDef(11f, 15f, 1f); magicEffect.ValuesPerRarity.Legendary = new ValueDef(14f, 19f, 1f); magicEffect.ValuesPerRarity.Mythic = new ValueDef(18f, 25f, 1f); magicEffect.Register(); } } public static class ForsakenBlow { [HarmonyPatch(typeof(Character), "BlockAttack")] private static class ForsakenBlow_Character_BlockAttack_Patch { [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] private static void Postfix(Character __instance) { if (!MagicEffect.IsEnabled("ForsakenBlow")) { return; } Player val = (Player)(object)((__instance is Player) ? __instance : null); if (val != null && val.HasActiveMagicEffect("ForsakenBlow", out var effectValue)) { float guardianPowerCooldown = val.m_guardianPowerCooldown; val.m_guardianPowerCooldown -= effectValue; float guardianPowerCooldown2 = val.m_guardianPowerCooldown; if (MagicEffect.ShowLogs("ForsakenBlow")) { RustyLootPlugin.LogDebug($"[ForsakenBlow] block: cooldown {guardianPowerCooldown:0.#} -{effectValue:0.#} => {guardianPowerCooldown2:0.#}"); } } } } public static void Setup() { MagicEffect magicEffect = new MagicEffect("ForsakenBlow"); magicEffect.Requirements.AddAllowedItemTypes((ItemType)5); magicEffect.Requirements.AllowedRarities.All(); magicEffect.ValuesPerRarity.Magic = new ValueDef(1f, 5f, 1f); magicEffect.ValuesPerRarity.Rare = new ValueDef(3f, 8f, 1f); magicEffect.ValuesPerRarity.Epic = new ValueDef(6f, 12f, 1f); magicEffect.ValuesPerRarity.Legendary = new ValueDef(10f, 15f, 1f); magicEffect.ValuesPerRarity.Mythic = new ValueDef(13f, 20f, 1f); magicEffect.Register(); } } public static class Honeybound { [HarmonyPatch(typeof(Player), "EatFood")] private static class Player_EatFood_Patch { [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] private static void Postfix(Player __instance, ItemData item, bool __result) { if (!MagicEffect.IsEnabled("Honeybound") || !__result || !__instance.HasActiveMagicEffect("Honeybound", out var effectValue)) { return; } foreach (Food food in __instance.m_foods) { if (food.m_item.m_shared.m_name != item.m_shared.m_name) { continue; } float time = food.m_time; food.m_time *= 1f + effectValue / 100f; float time2 = food.m_time; if (MagicEffect.ShowLogs("Honeybound")) { RustyLootPlugin.LogDebug($"[Honeybound] food:{item.m_shared.m_name} time {time:0.#} +{time2 - time:0.#} => {time2:0.#} ({effectValue:0.#}%)"); } break; } } } public static void Setup() { MagicEffect magicEffect = new MagicEffect("Honeybound"); MagicItemEffectRequirements requirements = magicEffect.Requirements; ItemType[] array = new ItemType[4]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); requirements.AddAllowedItemTypes((ItemType[])(object)array); magicEffect.Requirements.AllowedRarities.Add(ItemRarity.Magic, ItemRarity.Rare, ItemRarity.Epic, ItemRarity.Legendary, ItemRarity.Mythic); magicEffect.ValuesPerRarity.Magic = new ValueDef(1f, 3f, 1f); magicEffect.ValuesPerRarity.Rare = new ValueDef(2f, 4f, 1f); magicEffect.ValuesPerRarity.Epic = new ValueDef(3f, 5f, 1f); magicEffect.ValuesPerRarity.Legendary = new ValueDef(4f, 6f, 1f); magicEffect.ValuesPerRarity.Mythic = new ValueDef(7f, 10f, 1f); magicEffect.Register(); } } public static class IronMaiden { public class SE_IronMaiden : SE_Stats { [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] public override void Setup(Character character) { ((SE_Stats)this).Setup(character); SetupIronMaiden(); } public void SetupIronMaiden() { Character character = ((StatusEffect)this).m_character; Player val = (Player)(object)((character is Player) ? character : null); if (val != null && val.HasActiveMagicEffect("IronMaiden", out var effectValue)) { base.m_addArmor = effectValue; ((StatusEffect)this).m_name = string.Format(Localization.instance.Localize(((StatusEffect)this).m_name), base.m_addArmor); } } } [HarmonyPatch(typeof(Player), "OnDamaged")] private static class Player_OnDamaged_Patch { [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] private static void Postfix(Player __instance, HitData hit) { //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) if (MagicEffect.IsEnabled("IronMaiden") && __instance.HasActiveMagicEffect("IronMaiden", out var effectValue)) { float totalDamage = hit.GetTotalDamage(); float maxHealth = ((Character)__instance).GetMaxHealth(); float num = maxHealth * 0.25f; bool flag = totalDamage > num; if (flag) { ((Character)__instance).GetSEMan().AddStatusEffect(StringExtensionMethods.GetStableHashCode("SE_IronMaiden"), true, 0, 0f); __instance.m_adrenalinePopEffects.Create(((Component)__instance).transform.position, Quaternion.identity, (Transform)null, 1f, -1); } if (MagicEffect.ShowLogs("IronMaiden")) { RustyLootPlugin.LogDebug($"[IronMaiden] dmg:{totalDamage:0.#} thresh:{num:0.#} trig:{flag} mod:{effectValue:0.#}"); } } } } public static void Setup() { MagicEffect magicEffect = new MagicEffect("IronMaiden"); MagicItemEffectRequirements requirements = magicEffect.Requirements; ItemType[] array = new ItemType[3]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); requirements.AddAllowedItemTypes((ItemType[])(object)array); magicEffect.Requirements.AllowedRarities.Add(ItemRarity.Epic, ItemRarity.Legendary, ItemRarity.Mythic); magicEffect.ValuesPerRarity.Epic = new ValueDef(5f, 10f, 1f); magicEffect.ValuesPerRarity.Legendary = new ValueDef(8f, 12f, 1f); magicEffect.ValuesPerRarity.Mythic = new ValueDef(10f, 15f, 1f); magicEffect.Register(); Sprite icon = SpriteManager.RegisterSprite("iron_maiden.png"); SE_IronMaiden sE_IronMaiden = ScriptableObject.CreateInstance<SE_IronMaiden>(); ((Object)sE_IronMaiden).name = "SE_IronMaiden"; ((StatusEffect)sE_IronMaiden).m_name = "$mod_epicloot_ironmaiden"; ((StatusEffect)sE_IronMaiden).m_tooltip = "$mod_epicloot_ironmaiden_desc"; ((StatusEffect)sE_IronMaiden).m_ttl = 180f; ((SE_Stats)sE_IronMaiden).m_addArmor = 5f; ((StatusEffect)sE_IronMaiden).m_icon = icon; ((StatusEffect)(object)sE_IronMaiden).Register(); } } public static class Lifebloom { public class SE_Lifebloom : SE_Stats { public override void SetLevel(int itemLevel, float skillLevel) { base.m_healthOverTime = skillLevel; base.m_healthOverTimeDuration = 12f; base.m_healthOverTimeTicks = base.m_healthOverTimeDuration / base.m_healthOverTimeInterval; base.m_healthOverTimeTickHP = base.m_healthOverTime / base.m_healthOverTimeTicks; ((StatusEffect)this).m_name = string.Format(Localization.instance.Localize(((StatusEffect)this).m_name), skillLevel).Replace("%", string.Empty); if (MagicEffect.ShowLogs("Lifebloom")) { RustyLootPlugin.LogDebug($"[SE_Lifebloom]: item lvl: {itemLevel}, heal amount: {skillLevel}, duration: {base.m_healthOverTimeDuration}, hp/tick: {base.m_healthOverTimeTickHP}"); } } } [HarmonyPatch(typeof(Player), "OnDamaged")] private static class Lifebloom_Player_OnDamaged_Patch { [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] private static void Postfix(Player __instance, HitData hit) { //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) if (MagicEffect.IsEnabled("Lifebloom") && __instance.HasActiveMagicEffect("Lifebloom", out var effectValue, 0.01f)) { float totalDamage = hit.GetTotalDamage(); float num = totalDamage * 0.15f; float num2 = Mathf.Clamp01(effectValue); float value = Random.value; bool flag = num2 > value; if (flag) { ((Character)__instance).GetSEMan().AddStatusEffect(StringExtensionMethods.GetStableHashCode("SE_Lifebloom"), true, 0, num); __instance.m_adrenalinePopEffects.Create(((Component)__instance).transform.position, Quaternion.identity, (Transform)null, 1f, -1); } if (MagicEffect.ShowLogs("Lifebloom")) { RustyLootPlugin.LogDebug($"[Lifebloom] dmg:{totalDamage:0.#} heal:{num:0.#} chance:{num2:0.###} roll:{value:0.###} trig:{flag}"); } } } } public static void Setup() { MagicEffect magicEffect = new MagicEffect("Lifebloom"); magicEffect.Requirements.AddAllowedItemTypes((ItemType)5); magicEffect.Requirements.AllowedRarities.Add(ItemRarity.Magic, ItemRarity.Rare, ItemRarity.Epic, ItemRarity.Legendary, ItemRarity.Mythic); magicEffect.ValuesPerRarity.Magic = new ValueDef(5f, 10f, 1f); magicEffect.ValuesPerRarity.Rare = new ValueDef(10f, 15f, 1f); magicEffect.ValuesPerRarity.Epic = new ValueDef(15f, 20f, 1f); magicEffect.ValuesPerRarity.Legendary = new ValueDef(20f, 25f, 1f); magicEffect.ValuesPerRarity.Mythic = new ValueDef(25f, 30f, 1f); magicEffect.Register(); SE_Lifebloom sE_Lifebloom = ScriptableObject.CreateInstance<SE_Lifebloom>(); ((Object)sE_Lifebloom).name = "SE_Lifebloom"; ((StatusEffect)sE_Lifebloom).m_name = "$mod_epicloot_lifebloom"; ((StatusEffect)sE_Lifebloom).m_tooltip = "$mod_epicloot_lifebloom_desc"; ((StatusEffect)sE_Lifebloom).m_ttl = 12f; ((SE_Stats)sE_Lifebloom).m_healthOverTime = 5f; ((SE_Stats)sE_Lifebloom).m_healthOverTimeInterval = 1f; ((StatusEffect)sE_Lifebloom).m_icon = Rejuvenate.icon; ((StatusEffect)(object)sE_Lifebloom).Register(); } } public static class MagicProjectiles { [HarmonyPatch(typeof(Attack), "HaveAmmo")] private static class Attack_HaveAmmo_Patch { [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] private static bool Prefix(Humanoid character, ItemData weapon, ref bool __result) { //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Invalid comparison between Unknown and I4 //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Invalid comparison between Unknown and I4 if (!MagicEffect.IsEnabled("MagicArrow") && !MagicEffect.IsEnabled("MagicBolt")) { return true; } Player val = (Player)(object)((character is Player) ? character : null); if (val == null) { return true; } SkillType skillType = weapon.m_shared.m_skillType; if (((int)skillType != 8 && (int)skillType != 14) || 1 == 0) { return true; } if (string.IsNullOrEmpty(weapon.m_shared.m_ammoType)) { return true; } ItemData ammoItem = ((Humanoid)val).GetAmmoItem(); if (ammoItem != null && ((Humanoid)val).GetInventory().ContainsItem(ammoItem) && ammoItem.m_shared.m_ammoType == weapon.m_shared.m_ammoType) { return true; } float effectValue; if ((Object)(object)arrow != (Object)null && weapon.m_shared.m_ammoType == arrow.m_itemData.m_shared.m_ammoType) { if (!EpicLoot.HasActiveMagicEffectOnWeapon(null, weapon, "MagicArrow", out effectValue)) { return true; } if (!((Character)val).HaveEitr(arrowEitrCost)) { return true; } } else { if (!((Object)(object)bolt != (Object)null) || !(weapon.m_shared.m_ammoType == bolt.m_itemData.m_shared.m_ammoType)) { return true; } if (!EpicLoot.HasActiveMagicEffectOnWeapon(null, weapon, "MagicBolt", out effectValue)) { return true; } if (!((Character)val).HaveEitr(boltEitrCost)) { return true; } } __result = true; return false; } } [HarmonyPatch(typeof(Attack), "FindAmmo")] private static class Attack_FindAmmo_Patch { [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] private static void Postfix(Humanoid character, ItemData weapon, [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] ref ItemData __result) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Invalid comparison between Unknown and I4 //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Invalid comparison between Unknown and I4 if ((!MagicEffect.IsEnabled("MagicArrow") && !MagicEffect.IsEnabled("MagicBolt")) || __result != null) { return; } Player val = (Player)(object)((character is Player) ? character : null); if (val == null) { return; } SkillType skillType = weapon.m_shared.m_skillType; if (((int)skillType != 8 && (int)skillType != 14) || 1 == 0) { return; } float effectValue; if ((Object)(object)arrow != (Object)null && arrow.m_itemData.m_shared.m_ammoType == weapon.m_shared.m_ammoType) { if (EpicLoot.HasActiveMagicEffectOnWeapon(null, weapon, "MagicArrow", out effectValue) && ((Character)val).HaveEitr(arrowEitrCost)) { __result = arrow.m_itemData.Clone(); } } else if ((Object)(object)bolt != (Object)null && bolt.m_itemData.m_shared.m_ammoType == weapon.m_shared.m_ammoType && EpicLoot.HasActiveMagicEffectOnWeapon(null, weapon, "MagicBolt", out effectValue) && ((Character)val).HaveEitr(boltEitrCost)) { __result = bolt.m_itemData.Clone(); } } } [HarmonyPatch(typeof(Attack), "UseAmmo")] private static class Attack_UseAmmo_Patch { [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] private static bool Prefix(Attack __instance, [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] out ItemData ammoItem, ref bool __result) { ammoItem = __instance.m_character.GetAmmoItem(); if (!MagicEffect.IsEnabled("MagicArrow") && !MagicEffect.IsEnabled("MagicBolt")) { return true; } Humanoid character = __instance.m_character; Player val = (Player)(object)((character is Player) ? character : null); if (val == null) { return true; } ItemData ammoItem2 = ((Humanoid)val).GetAmmoItem(); if (ammoItem2 != null && ammoItem2.m_shared.m_ammoType == __instance.m_weapon.m_shared.m_ammoType && ((Humanoid)val).GetInventory().ContainsItem(ammoItem2)) { return true; } float effectValue; if ((Object)(object)arrow != (Object)null && __instance.m_weapon.m_shared.m_ammoType == arrow.m_itemData.m_shared.m_ammoType) { if (!EpicLoot.HasActiveMagicEffectOnWeapon(null, __instance.m_weapon, "MagicArrow", out effectValue)) { return true; } if (!((Character)val).HaveEitr(arrowEitrCost)) { return true; } __result = true; ammoItem = arrow.m_itemData.Clone(); __instance.m_ammoItem = ammoItem; ((Character)val).UseEitr(arrowEitrCost); } else { if (!((Object)(object)bolt != (Object)null) || !(__instance.m_weapon.m_shared.m_ammoType == bolt.m_itemData.m_shared.m_ammoType)) { return true; } if (!EpicLoot.HasActiveMagicEffectOnWeapon(null, __instance.m_weapon, "MagicBolt", out effectValue)) { return true; } if (!((Character)val).HaveEitr(boltEitrCost)) { return true; } __result = true; ammoItem = bolt.m_itemData.Clone(); __instance.m_ammoItem = ammoItem; ((Character)val).UseEitr(boltEitrCost); } return false; } } [HarmonyPatch(typeof(Attack), "EquipAmmoItem")] private static class Attack_EquipAmmoItem_Patch { [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] private static bool Prefix(Humanoid character, ItemData weapon, ref bool __result) { if (!MagicEffect.IsEnabled("MagicArrow") && !MagicEffect.IsEnabled("MagicBolt")) { return true; } Player val = (Player)(object)((character is Player) ? character : null); if (val == null) { return true; } ItemData ammoItem = ((Humanoid)val).GetInventory().GetAmmoItem(weapon.m_shared.m_ammoType, (string)null); if (ammoItem != null && ammoItem.m_shared.m_ammoType == weapon.m_shared.m_ammoType) { return true; } float effectValue; if ((Object)(object)arrow != (Object)null && weapon.m_shared.m_ammoType == arrow.m_itemData.m_shared.m_ammoType) { if (!EpicLoot.HasActiveMagicEffectOnWeapon(null, weapon, "MagicArrow", out effectValue)) { return true; } if (!((Character)val).HaveEitr(arrowEitrCost)) { return true; } } else { if (!((Object)(object)bolt != (Object)null) || !(weapon.m_shared.m_ammoType == bolt.m_itemData.m_shared.m_ammoType)) { return true; } if (!EpicLoot.HasActiveMagicEffectOnWeapon(null, weapon, "MagicBolt", out effectValue)) { return true; } if (!((Character)val).HaveEitr(boltEitrCost)) { return true; } } __result = true; return false; } } [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] private static ItemDrop arrow; [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] private static ItemDrop bolt; [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] private static ConfigEntry<float> arrowEitrUse; [<4fdc30f7-b68c-418d-93b5-c88926ee132e>Nullable(2)] private static ConfigEntry<float> boltEitrUse; private static float arrowEitrCost => arrowEitrUse?.Value ?? 10f; private static float boltEitrCost => boltEitrUse?.Value ?? 10f; public static void SetupMagicArrow() { Clone clone = new Clone("ArrowFrost", "RS_MagicArrow"); clone.OnCreated += [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] (GameObject prefab) => { //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Expected O, but got Unknown //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) ItemDrop val = default(ItemDrop); if (prefab.TryGetComponent<ItemDrop>(ref val)) { val.m_itemData.m_shared.m_name = "$item_arrow_magic"; val.m_itemData.m_shared.m_description = "$item_arrow_magic_desc"; GameObject attackProjectile = val.m_itemData.m_shared.m_attack.m_attackProjectile; if ((Object)(object)attackProjectile == (Object)null) { Debug.LogError((object)"Magic Arrow projectile is null"); } else { GameObject val2 = Object.Instantiate<GameObject>(attackProjectile, RustyLootPlugin.root.transform, false); ((Object)val2).name = "bow_projectile_magic"; Transform val3 = val2.transform.Find("model"); if ((Object)(object)val3 == (Object)null) { Debug.LogError((object)"Magic Arrow model is null"); } else { MeshRenderer component = ((Component)val3).GetComponent<MeshRenderer>(); List<Material> list = new List<Material>(); Material[] sharedMaterials = ((Renderer)component).sharedMaterials; foreach (Material val4 in sharedMaterials) { Material val5 = new Material(val4); ((Object)val5).name = ((Object)val4).name + "_magic_arrow"; Color color = val4.GetColor("_EmissionColor"); val5.SetColor("_EmissionColor", color * 5f); list.Add(val5); } ((Renderer)component).sharedMaterials = list.ToArray(); ((Renderer)component).materials = list.ToArray(); Transform val6 = val2.transform.Find("Sphere"); if ((Object)(object)val6 == (Object)null) { Debug.LogError((object)"Magic arrow tip is null"); } else { MeshRenderer component2 = ((Component)val6).GetComponent<MeshRenderer>(); ((Renderer)component2).sharedMaterials = list.ToArray(); ((Renderer)component2).materials = list.ToArray(); val.m_itemData.m_shared.m_attack.m_attackProjectile = val2; PrefabManager.RegisterPrefab(val2); arrow = val; } } } } }; MagicEffect magicEffect = new MagicEffect("MagicArrow"); magicEffect.Requirements.AllowedSkillTypes.Add((SkillType)8); magicEffect.Requirements.AllowedRarities.Add(ItemRarity.Epic, ItemRarity.Legendary, ItemRarity.Mythic); magicEffect.Register(); ConfigEntry<float> pierceDmg = RustyLootPlugin.config("Magic Arrow", "Pierce Damage", 26f, "Set magic arrow pierce damage"); ConfigEntry<float> frostDmg = RustyLootPlugin.config("Magic Arrow", "Frost Damage", 52f, "Set magic arrow frost damage"); arrowEitrUse = RustyLootPlugin.config("Magic Arrow", "Eitr Use", 10f, "Set magic arrow eitr cost"); pierceDmg.SettingChanged += delegate { OnConfigChange(); }; frostDmg.SettingChanged += delegate { OnConfigChange(); }; OnConfigChange(); void OnConfigChange() { if (!((Object)(object)arrow == (Object)null)) { arrow.m_itemData.m_shared.m_damages.m_pierce = pierceDmg.Value; arrow.m_itemData.m_shared.m_damages.m_frost = frostDmg.Value; } } } public static void SetupMagicBolt() { Clone clone = new Clone("BoltCarapace", "RS_MagicBolt"); clone.OnCreated += [<8c7a10b3-c30b-4194-9ab2-10a87d388603>NullableContext(1)] (GameObject prefab) => { //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Expected O, but got Unknown //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) ItemDrop val = default(ItemDrop); if (prefab.TryGetComponent<ItemDrop>(ref val)) { val.m_itemData.m_shared.m_name = "$item_bolt_magic"; val.m_itemData.m_shared.m_description = "$item_bolt_magic_desc"; GameObject attackProjectile = val.m_itemData.m_shared.m_attack.m_attackProjectile; if ((Object)(object)attackProjectile == (Object)null) { Debug.LogError((object)"Magic Bolt projectile is null"); } else { GameObject val2 = Object.Instantiate<GameObject>(attackProjectile, RustyLootPlugin.root.transform, false); ((Object)val2).name = "arbalest_projectile_magic"; Transform val3 = val2.transform.Find("default"); if ((Object)(object)val3 == (Object)null) { Debug.LogError((object)"Magic Bolt model is null"); } else { MeshRenderer component = ((Component)val3).GetComponent<MeshRenderer>(); List<Material> list = new List<Material>(); Material[] sharedMaterials = ((Renderer)component).sharedMaterials; foreach (Material val4 in sharedMaterials) { Material val5 = new Material(val4); ((Object)val5).name = ((Object)val4).name + "_magic_arrow"; val5.EnableKeyword("_EMISSION"); val5.SetColor("_EmissionColor", new Color(0f, 0.8f, 1f) * 5f); list.Add(val5); } ((Renderer)component).sharedMaterials = list.ToArray(); ((Renderer)component).materials = list.ToArray(); val.m_itemData.m_shared.m_attack.m_attackProjectile = val2; PrefabManager.RegisterPrefab(val2); bolt = val; } } } }; MagicEffect magicEffect = new MagicEffect("MagicBolt"); magicEffect.Requirements.AllowedSkillTypes.Add((SkillType)14); magicEffect.Requirements.AllowedRarities.Add(ItemRarit