using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Versioning;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using ItemManager;
using JetBrains.Annotations;
using Jewelcrafting;
using LocalizationManager;
using Managers;
using Microsoft.CodeAnalysis;
using MockManager;
using MoreJewelry.Data;
using ServerSync;
using SoftReferenceableAssets;
using TMPro;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using YamlDotNet.Core;
using YamlDotNet.Core.Events;
using YamlDotNet.Core.Tokens;
using YamlDotNet.Helpers;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.BufferedDeserialization;
using YamlDotNet.Serialization.BufferedDeserialization.TypeDiscriminators;
using YamlDotNet.Serialization.Callbacks;
using YamlDotNet.Serialization.Converters;
using YamlDotNet.Serialization.EventEmitters;
using YamlDotNet.Serialization.NamingConventions;
using YamlDotNet.Serialization.NodeDeserializers;
using YamlDotNet.Serialization.NodeTypeResolvers;
using YamlDotNet.Serialization.ObjectFactories;
using YamlDotNet.Serialization.ObjectGraphTraversalStrategies;
using YamlDotNet.Serialization.ObjectGraphVisitors;
using YamlDotNet.Serialization.Schemas;
using YamlDotNet.Serialization.TypeInspectors;
using YamlDotNet.Serialization.TypeResolvers;
using YamlDotNet.Serialization.Utilities;
using YamlDotNet.Serialization.ValueDeserializers;
[assembly: Guid("964752f0-09df-446a-9c20-88bf895c6178")]
[assembly: ComVisible(false)]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCopyright("Copyright probablykory © 2024")]
[assembly: AssemblyProduct("MoreJewelry")]
[assembly: AssemblyCompany("probablykory")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyDescription("https://thunderstore.io/c/valheim/p/probablykory/MoreJewelry/")]
[assembly: AssemblyTitle("MoreJewelry")]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: CompilationRelaxations(8)]
[assembly: AssemblyFileVersion("1.0.12")]
[assembly: AssemblyConfiguration("")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.12.0")]
[module: <e21badd8-3ab7-478b-ba6f-a721f3fc9813>RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[<207c91b5-d7d9-4a51-9fcb-baa1ff799ef9>Embedded]
internal sealed class <207c91b5-d7d9-4a51-9fcb-baa1ff799ef9>EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[<207c91b5-d7d9-4a51-9fcb-baa1ff799ef9>Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
[CompilerGenerated]
internal sealed class <d5503cf9-fcbd-4060-9644-09c2c6ea979e>NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public <d5503cf9-fcbd-4060-9644-09c2c6ea979e>NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public <d5503cf9-fcbd-4060-9644-09c2c6ea979e>NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
[<207c91b5-d7d9-4a51-9fcb-baa1ff799ef9>Embedded]
[CompilerGenerated]
internal sealed class <bc3df989-e0d1-4950-8c2f-95e51aa49bae>NullableContextAttribute : Attribute
{
public readonly byte Flag;
public <bc3df989-e0d1-4950-8c2f-95e51aa49bae>NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
[CompilerGenerated]
[<207c91b5-d7d9-4a51-9fcb-baa1ff799ef9>Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class <e21badd8-3ab7-478b-ba6f-a721f3fc9813>RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public <e21badd8-3ab7-478b-ba6f-a721f3fc9813>RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace MoreJewelry
{
public static class ConfigDrawers
{
public static Action<ConfigEntryBase> DrawLocationsConfigTable()
{
if (!CmAPI.IsLoaded())
{
return null;
}
return delegate(ConfigEntryBase cfg)
{
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
//IL_0084: Expected O, but got Unknown
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_00ce: Expected O, but got Unknown
//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
//IL_0105: Expected O, but got Unknown
List<string> list = new List<string>();
bool flag = false;
_ = CmAPI.RightColumnWidth;
GUILayout.BeginVertical(Array.Empty<GUILayoutOption>());
foreach (string item in ((string)cfg.BoxedValue).Split(new char[1] { ':' }).ToList())
{
GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
string text = GUILayout.TextField(item, new GUIStyle(GUI.skin.textField)
{
fixedWidth = CmAPI.RightColumnWidth - 21 - 21 - 9
}, Array.Empty<GUILayoutOption>());
string text2 = (string.IsNullOrEmpty(text) ? item : text);
flag = flag || text2 != item;
if (GUILayout.Button("x", new GUIStyle(GUI.skin.button)
{
fixedWidth = 21f
}, Array.Empty<GUILayoutOption>()))
{
flag = true;
}
else
{
list.Add(text2);
}
if (GUILayout.Button("+", new GUIStyle(GUI.skin.button)
{
fixedWidth = 21f
}, Array.Empty<GUILayoutOption>()))
{
flag = true;
list.Add("<Location Name>");
}
GUILayout.EndHorizontal();
}
GUILayout.EndVertical();
if (flag)
{
cfg.BoxedValue = string.Join(":", list);
}
};
}
}
[Flags]
public enum GemLocation : ulong
{
Head = 1uL,
Cloak = 2uL,
Legs = 4uL,
Chest = 8uL,
Sword = 0x20uL,
Knife = 0x40uL,
Club = 0x80uL,
Polearm = 0x100uL,
Spear = 0x200uL,
Axe = 0x400uL,
Bow = 0x800uL,
Crossbow = 0x1000uL,
Weapon = 0x2000uL,
ElementalMagic = 0x4000uL,
BloodMagic = 0x8000uL,
Magic = 0x10000uL,
Tool = 0x20000uL,
Shield = 0x40000uL,
Utility = 0x80000uL,
All = 0x100000uL
}
public static class JcPatches
{
public static void DoPatches(Harmony harmony)
{
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Expected O, but got Unknown
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
//IL_00c5: Expected O, but got Unknown
//IL_011d: Unknown result type (might be due to invalid IL or missing references)
//IL_012a: Expected O, but got Unknown
Assembly assembly = typeof(API.GemInfo).Assembly;
MethodInfo method = assembly.GetType("Jewelcrafting.Utils").GetMethod("GetGemLocation");
MethodInfo method2 = typeof(JcPatches).GetMethod("GetGemLocationPrefix", BindingFlags.Static | BindingFlags.NonPublic);
if (method != null && method2 != null)
{
harmony.Patch((MethodBase)method, new HarmonyMethod(method2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
}
else
{
Logger.LogError($"Unable to patch Jewelcrafting.Utils.GetGemLocation: target = {method}, method = {method2}");
}
method = assembly.GetType("Jewelcrafting.GemEffects.Warmth+PreventColdNights").GetMethod("RemoveColdInColdNights", BindingFlags.Static | BindingFlags.NonPublic);
method2 = typeof(JcPatches).GetMethod("RemoveColdInColdNightsPrefix", BindingFlags.Static | BindingFlags.NonPublic);
if (method != null && method2 != null)
{
harmony.Patch((MethodBase)method, new HarmonyMethod(method2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
}
else
{
Logger.LogError($"Unable to patch Jewelcrafting.GemEffects.Warmth+PreventColdNights.RemoveColdInColdNights: target = {method}, method = {method2}");
}
method = assembly.GetType("Jewelcrafting.Visual+EquipItem").GetMethod("Equip", BindingFlags.Static | BindingFlags.NonPublic);
method2 = typeof(JcPatches).GetMethod("OnJCEquipPostfix", BindingFlags.Static | BindingFlags.NonPublic);
if (method != null && method2 != null)
{
harmony.Patch((MethodBase)method, (HarmonyMethod)null, new HarmonyMethod(method2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
}
else
{
Logger.LogError($"Unable to patch Jewelcrafting.Visual+EquipItem.Equip: target = {method}, method = {method2}");
}
}
[UsedImplicitly]
private static bool GetGemLocationPrefix(SharedData item, [<d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(2)] Player player, ref object __result)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Invalid comparison between Unknown and I4
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Invalid comparison between Unknown and I4
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_000d: Invalid comparison between Unknown and I4
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Expected I4, but got Unknown
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Invalid comparison between Unknown and I4
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: 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_00b2: Expected I4, but got Unknown
//IL_0133: Unknown result type (might be due to invalid IL or missing references)
//IL_013a: Invalid comparison between Unknown and I4
ItemType itemType = item.m_itemType;
GemLocation gemLocation;
if ((int)itemType <= 7)
{
if ((int)itemType != 6)
{
if ((int)itemType != 7)
{
goto IL_0069;
}
gemLocation = GemLocation.Chest;
}
else
{
gemLocation = GemLocation.Head;
}
}
else if ((int)itemType != 11)
{
switch (itemType - 17)
{
case 1:
break;
case 0:
goto IL_0055;
case 2:
goto IL_005d;
default:
goto IL_0069;
}
gemLocation = GemLocation.Utility;
}
else
{
gemLocation = GemLocation.Legs;
}
goto IL_015a;
IL_0055:
gemLocation = GemLocation.Cloak;
goto IL_015a;
IL_0069:
SkillType skillType = item.m_skillType;
GemLocation gemLocation2;
switch (skillType - 1)
{
case 0:
gemLocation2 = GemLocation.Sword;
break;
case 1:
gemLocation2 = GemLocation.Knife;
break;
case 2:
gemLocation2 = GemLocation.Club;
break;
case 3:
gemLocation2 = GemLocation.Polearm;
break;
case 4:
gemLocation2 = GemLocation.Spear;
break;
case 5:
gemLocation2 = GemLocation.Shield;
break;
case 6:
gemLocation2 = (GemLocation)(((Object)(object)player != (Object)null && JewelryManager.IsEffectItemEquipped(player, Effects.Lumberjack)) ? 131072 : 1024);
break;
case 7:
gemLocation2 = GemLocation.Bow;
break;
case 13:
gemLocation2 = GemLocation.Crossbow;
break;
case 11:
gemLocation2 = GemLocation.Tool;
break;
case 10:
if ((int)item.m_itemType == 14)
{
gemLocation2 = GemLocation.Knife;
break;
}
goto default;
case 9:
gemLocation2 = GemLocation.BloodMagic;
break;
case 8:
gemLocation2 = GemLocation.ElementalMagic;
break;
default:
gemLocation2 = GemLocation.Sword;
break;
}
gemLocation = gemLocation2;
goto IL_015a;
IL_005d:
gemLocation = GemLocation.Tool;
goto IL_015a;
IL_015a:
GemLocation gemLocation3 = gemLocation;
__result = gemLocation3;
return false;
}
[UsedImplicitly]
private static bool RemoveColdInColdNightsPrefix(bool cold, Player player, ref bool __result)
{
if (cold && EnvMan.instance.GetCurrentEnvironment().m_isColdAtNight && JewelryManager.IsEffectItemEquipped(player, Effects.Warmth))
{
cold = false;
}
__result = cold;
return false;
}
[UsedImplicitly]
private static void OnJCEquipPostfix(Humanoid humanoid, ItemData item, ref bool __result)
{
if (__result && (Object)(object)item.m_shared?.m_equipStatusEffect != (Object)null && JewelryManager.AvailableEffects.ContainsValue(item.m_shared.m_equipStatusEffect))
{
Logger.LogDebugOnly($"Checked if {item.m_shared.m_name} is equipped and JM comtains {item.m_shared.m_equipStatusEffect}");
item.m_shared.m_equipStatusEffect.m_icon = item.GetIcon();
}
}
}
public class YamlConfig
{
public class ParsedResult
{
public List<JewelryData> Jewelry;
}
private static string separator;
private string filePath = "";
private string fileName = "";
private Watcher watcher;
[<d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(2)]
private object deserializedYaml;
private bool isLocalChange;
private bool isRebroadcast;
[<d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(2)]
private static IDeserializer deserializer;
[<d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(2)]
private static ISerializer serializer;
public bool SkipSavingOfValueChange { get; set; }
public bool UseBuiltinConfig { get; set; }
public bool EnableRaisingFileEvents
{
get
{
if (watcher != null)
{
return watcher.EnableRaisingEvents;
}
return false;
}
set
{
if (watcher != null)
{
watcher.EnableRaisingEvents = value;
}
}
}
public CustomSyncedValue<string> SyncedValue { get; private set; }
public ParsedResult Config { get; private set; }
[<d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(2)]
[method: <bc3df989-e0d1-4950-8c2f-95e51aa49bae>NullableContext(2)]
[field: <d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(2)]
public event Action YamlConfigChanged;
private string GetYamlFullPath()
{
return filePath + separator + fileName + ".yml";
}
private bool IsSourceOfTruth()
{
return MoreJewelry.ConfigSync.IsSourceOfTruth;
}
public YamlConfig(string path, string file)
{
if (string.IsNullOrWhiteSpace(path))
{
throw new ArgumentNullException("path");
}
if (string.IsNullOrWhiteSpace(file))
{
throw new ArgumentNullException("file");
}
filePath = path;
fileName = file;
SkipSavingOfValueChange = true;
watcher = new Watcher(filePath, fileName + ".yml");
watcher.EnableRaisingEvents = false;
watcher.FileChanged += WatcherOnFileChanged;
SyncedValue = new CustomSyncedValue<string>(MoreJewelry.ConfigSync, fileName, "");
SyncedValue.ValueChanged += OnSyncedValueChanged;
}
private void WatcherOnFileChanged(object arg1, FileSystemEventArgs arg2)
{
isLocalChange = true;
OnLoadConfigFile();
isLocalChange = false;
}
private void RebroadcastSyncedValue()
{
isRebroadcast = true;
Extensions.Delay(delegate
{
SkipSavingOfValueChange = true;
SyncedValue.Value = SyncedValue.Value;
SkipSavingOfValueChange = false;
})();
}
private void OnSyncedValueChanged()
{
Logger.LogDebugOnly($"OnSyncedValueChanged: isLocalChange {isLocalChange}, isSourceTruth {IsSourceOfTruth()}, value hash {StringExtensionMethods.GetStableHashCode(SyncedValue.Value)}");
if (IsSourceOfTruth() && isLocalChange)
{
return;
}
if (isRebroadcast)
{
isRebroadcast = false;
return;
}
if (IsSourceOfTruth() && !isLocalChange)
{
if (ZNet.instance != null && ZNet.instance.IsServer())
{
Logger.LogDebugOnly("server, nonlocal change, isSourceTruth, queue a rebroadcast of synced value.");
RebroadcastSyncedValue();
}
OnSaveConfigFile(SyncedValue.Value);
return;
}
string text = "remote yaml";
if (TryParseConfig(text, SyncedValue.Value, out var result))
{
if (ZNet.instance != null && ZNet.instance.IsServer() && !isLocalChange)
{
Logger.LogDebugOnly("server, nonlocal change, NOT SourceTruth, queue a rebroadcast of synced value.");
RebroadcastSyncedValue();
}
SkipSavingOfValueChange = true;
SyncedValue.AssignLocalValue(SyncedValue.Value);
SkipSavingOfValueChange = false;
Config = result;
this.YamlConfigChanged?.Invoke();
Logger.LogInfo("Successfully loaded " + text);
}
else
{
Logger.LogWarning("Ignoring the changed config file, retaining the originally loaded file.");
}
}
public void LoadInitialConfig(bool enabled)
{
watcher.EnableRaisingEvents = enabled;
UseBuiltinConfig = !enabled;
isLocalChange = true;
OnLoadConfigFile();
isLocalChange = false;
}
public void ReloadConfig(bool isLocal)
{
isLocalChange = isLocal;
if (!IsSourceOfTruth())
{
OnSyncedValueChanged();
return;
}
if (!UseBuiltinConfig && !File.Exists(GetYamlFullPath()))
{
Logger.LogDebugOnly(GetYamlFullPath() + " does not exist. Writing defaults to disk.");
File.Create(GetYamlFullPath()).Close();
string contents = ReadTextFromBuiltinFile();
WriteTextToFile(contents);
}
OnLoadConfigFile();
}
private void OnLoadConfigFile()
{
string text = ReadTextFromFile();
if (TryParseConfig(fileName + ".yml", text, out var result))
{
SkipSavingOfValueChange = true;
SyncedValue.AssignLocalValue(text);
SkipSavingOfValueChange = false;
Config = result;
if (IsSourceOfTruth())
{
this.YamlConfigChanged?.Invoke();
}
string text2 = "Successfully loaded ";
text2 = ((!UseBuiltinConfig) ? (text2 + fileName + ".yml") : (text2 + "the built-in " + fileName + ".defaults.yml"));
if (!IsSourceOfTruth())
{
text2 += ", but skipped applying as remote configuration is active";
}
Logger.LogInfo(text2);
}
else
{
Logger.LogWarning("Ignoring the changed config file, retaining the originally loaded file.");
}
}
private bool TryParseConfig(string source, string text, out ParsedResult result)
{
bool flag = false;
result = null;
try
{
deserializedYaml = ReadYaml<Dictionary<string, JewelryDataUnparsed>>(text);
result = Parse(deserializedYaml, out var errors);
if (errors.Count > 0)
{
Logger.LogWarning("Found errors in " + source + " config. Please review the syntax of your file:\n" + string.Join("\n", errors));
flag = true;
}
}
catch (YamlException ex)
{
Logger.LogWarning("Parsing " + source + " config failed with an error:\n" + ex.Message + ((ex.InnerException != null) ? (": " + ex.InnerException.Message) : ""));
flag = true;
}
return !flag;
}
private void OnSaveConfigFile(object contents)
{
if (!SkipSavingOfValueChange && IsSourceOfTruth())
{
watcher.EnableRaisingEvents = false;
WriteTextToFile($"{contents}");
watcher.EnableRaisingEvents = true;
}
}
private string ReadTextFromBuiltinFile()
{
return Encoding.UTF8.GetString(Localizer.ReadEmbeddedFileBytes(fileName + ".defaults.yml"));
}
private string ReadTextFromFile()
{
string result = "";
string path = filePath + separator + fileName + ".yml";
if (UseBuiltinConfig)
{
result = ReadTextFromBuiltinFile();
}
else
{
try
{
Logger.LogDebugOnly("attempting to read from " + fileName);
result = File.ReadAllText(path);
}
catch (IOException ex)
{
Logger.LogError("Failed reading from " + fileName + " config in " + filePath + ", message:\n " + ex.Message);
}
}
return result;
}
private void WriteTextToFile(string contents)
{
string yamlFullPath = GetYamlFullPath();
string text = fileName + ".temp";
try
{
Logger.LogDebugOnly("attempting to write to " + text);
File.WriteAllText(text, contents);
File.Replace(text, yamlFullPath, null);
}
catch (IOException ex)
{
Logger.LogError("Failed writing config back to " + yamlFullPath + ", message: \n" + ex.Message);
}
}
public static T RereadYaml<T>([<d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(2)] object obj)
{
return ReadYaml<T>(WriteYaml(obj));
}
public static T ReadYaml<T>(string text)
{
if (string.IsNullOrEmpty(text))
{
return default(T);
}
if (deserializer == null)
{
deserializer = new DeserializerBuilder().WithNamingConvention(LowerCaseNamingConvention.Instance).Build();
}
return deserializer.Deserialize<T>(text);
}
public static string WriteYaml([<d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(2)] object obj)
{
if (serializer == null)
{
serializer = new SerializerBuilder().WithNamingConvention(LowerCaseNamingConvention.Instance).Build();
}
return serializer.Serialize(obj);
}
public static List<string> ErrorCheck(string text)
{
Parse(ReadYaml<Dictionary<string, JewelryDataUnparsed>>(text), out var errors);
return errors;
}
[return: <d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(new byte[] { 0, 0, 2 })]
private static Dictionary<string, object> castToStringDict([<d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(new byte[] { 0, 0, 2 })] Dictionary<object, object> dict)
{
return new Dictionary<string, object>(dict.ToDictionary((KeyValuePair<object, object> kv) => kv.Key.ToString(), (KeyValuePair<object, object> kv) => kv.Value), StringComparer.InvariantCultureIgnoreCase);
}
public static ParsedResult Parse([<d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(2)] object root, out List<string> errors)
{
ParsedResult parsedResult = new ParsedResult
{
Jewelry = new List<JewelryData>()
};
errors = new List<string>();
if (!(root is Dictionary<string, JewelryDataUnparsed> dictionary))
{
if (root != null)
{
errors.Add($"All top-level keys must be a mapping. Got unexpected {root.GetType()}.");
}
return parsedResult;
}
foreach (KeyValuePair<string, JewelryDataUnparsed> item in dictionary)
{
string text = ((item.Key != null) ? item.Key : item.Key.ToString());
if (item.Value != null && item.Value != null)
{
JewelryData jewelryData = new JewelryData();
jewelryData.Name = text;
jewelryData.Description = item.Value.Description;
if (string.IsNullOrWhiteSpace(item.Value.Prefab))
{
errors.Add("Prefab of " + text + " was empty: Prefab must contain a value.");
}
else
{
jewelryData.Prefab = item.Value.Prefab;
}
VisualData visualData2;
string text2 = parseGemColor(item.Value.Gem, out visualData2);
if (text2 != null)
{
errors.Add(text2);
}
else
{
jewelryData.Gem = visualData2;
}
CraftingData craftingData2;
string text3 = parseCrafting(item.Value.Crafting, out craftingData2);
if (text3 != null)
{
errors.Add(text3);
}
else
{
jewelryData.Crafting = craftingData2;
}
UpgradeData upgradeData2;
string text4 = parseUpgrade(item.Value.Upgrade, out upgradeData2);
if (text4 != null)
{
errors.Add(text4);
}
else
{
jewelryData.Upgrade = upgradeData2;
}
EffectData effect2;
string text5 = parseEffect(item.Value.effect, out effect2);
if (text5 != null)
{
errors.Add(text5);
}
else
{
jewelryData.effect = effect2;
}
parsedResult.Jewelry.Add(jewelryData);
continue;
}
errors.Add($"Expected value to be of type JewelryDataUnparsed, instead got {item.GetType()}.");
return parsedResult;
}
return parsedResult;
[return: <d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(2)]
static string parseCosts(object costsObj, out List<CostData> costData)
{
costData = new List<CostData>();
if (!(costsObj is Dictionary<object, object> dictionary3))
{
return string.Format("Costs value must be a mapping of property names & values, got unexpected {0} of type {1}", costsObj, costsObj?.GetType().ToString() ?? "null");
}
foreach (KeyValuePair<object, object> item2 in dictionary3)
{
CostData costData3 = new CostData
{
Name = item2.Key.ToString()
};
string[] array = item2.Value?.ToString().Split(new char[1] { ',' });
if (array == null || array.Length == 0)
{
return $"Found costs but failed parsing value {item2.Value} for key {item2.Key}";
}
costData3.Amount = ((array.Length == 0 || !int.TryParse(array[0], out var result2)) ? 1 : result2);
costData3.AmountPerLevel = ((array.Length > 1 && int.TryParse(array[1], out var result3)) ? result3 : 0);
costData.Add(costData3);
}
return null;
}
static string parseCrafting(object craftingObj, out CraftingData craftingData)
{
craftingData = new CraftingData();
if (!(craftingObj is IDictionary) || !(craftingObj is Dictionary<object, object>))
{
return string.Format("Crafting must be a mapping of property names & values, got unexpected {0} of type {1}", craftingObj, craftingObj?.GetType().ToString() ?? "null");
}
Dictionary<string, object> dictionary4 = castToStringDict(craftingObj as Dictionary<object, object>);
if (!dictionary4.TryGetValue("craftingstation", out var value) || !(value is string))
{
return $"Crafting must contain a valid craftingstation: {value}";
}
craftingData.CraftingStation = (string)value;
if (dictionary4.TryGetValue("stationlevel", out var value2) && value2 is string && int.TryParse((string)value2, out var result4))
{
craftingData.StationLevel = result4;
}
else
{
craftingData.StationLevel = 1;
}
if (dictionary4.TryGetValue("maxquality", out var value3) && value3 is string && int.TryParse((string)value3, out var result5))
{
craftingData.MaxQuality = result5;
}
else
{
craftingData.MaxQuality = -1;
}
if (dictionary4.TryGetValue("costs", out var value4))
{
List<CostData> costData4;
string text7 = parseCosts(value4, out costData4);
if (text7 != null)
{
return text7;
}
craftingData.Costs = costData4;
}
return null;
}
[return: <d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(2)]
static string parseEffect(object effectObj, out EffectData effect)
{
effect = new EffectData();
if (effectObj is IDictionary obj)
{
StatusEffectData seData;
try
{
seData = RereadYaml<StatusEffectData>(obj);
}
catch (YamlException ex)
{
return "Found an effect definition but, but parsing failed with an error:\n" + ex.Message + ((ex.InnerException != null) ? (": " + ex.InnerException.Message) : "");
}
effect.SeData = seData;
}
else if (effectObj is string nameToResolve)
{
effect.NameToResolve = nameToResolve;
}
else
{
if (effectObj != null)
{
return string.Format("Effect value must be either a string or a mapping of property names & values, got unexpected {0} of type {1}", effectObj, effectObj?.GetType().ToString() ?? "null");
}
effect = null;
}
return null;
}
[return: <d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(2)]
static string parseGemColor(object colorObj, out VisualData visualData)
{
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
visualData = new VisualData
{
Color = null
};
if (colorObj == null)
{
visualData.Visible = true;
}
else
{
if (!(colorObj is string text8))
{
return string.Format("Color value must be a string value either of 'visible', 'hidden' or an html color, got unexpected {0} of type {1}", colorObj, colorObj?.GetType().ToString() ?? "null");
}
if (string.Equals("hidden", text8, StringComparison.InvariantCultureIgnoreCase))
{
visualData.Visible = false;
}
else if (string.Equals("visible", text8, StringComparison.InvariantCultureIgnoreCase))
{
visualData.Visible = true;
}
else
{
Color value5 = default(Color);
if (!ColorUtility.TryParseHtmlString(text8, ref value5) && !ColorUtility.TryParseHtmlString("#" + text8, ref value5))
{
return $"Color value must be a string value either of 'visible', 'hidden' or an html color, got unexpected {colorObj}";
}
visualData.Color = value5;
visualData.Visible = true;
}
}
return null;
}
[return: <d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(2)]
static string parseUpgrade(object upgradeOjb, out UpgradeData upgradeData)
{
upgradeData = new UpgradeData
{
Costs = new Dictionary<int, List<CostData>>()
};
if (upgradeOjb is Dictionary<object, object> dictionary2)
{
foreach (KeyValuePair<object, object> item3 in dictionary2)
{
if (!int.TryParse(item3.Key.ToString(), out var result))
{
return $"Found upgrade but failed parsing level key {item3.Key}";
}
List<CostData> costData2;
string text6 = parseCosts(item3.Value, out costData2);
if (text6 != null)
{
return text6;
}
upgradeData.Costs[result] = costData2;
}
}
else
{
if (upgradeOjb != null)
{
return string.Format("Upgrade value must be a mapping of an integer level starting at 1 for the first upgrade, got unexpected {0} of type {1}", upgradeOjb, upgradeOjb?.GetType().ToString() ?? "null");
}
upgradeData = null;
}
return null;
}
}
static YamlConfig()
{
char directorySeparatorChar = Path.DirectorySeparatorChar;
separator = directorySeparatorChar.ToString();
deserializer = null;
serializer = null;
}
}
public static class Extensions
{
public static Action Delay(this Action func, int milliseconds = 100)
{
CancellationTokenSource cancelTokenSource = null;
return delegate
{
cancelTokenSource?.Cancel();
cancelTokenSource = new CancellationTokenSource();
Task.Delay(milliseconds, cancelTokenSource.Token).ContinueWith(delegate(Task t)
{
if (!t.IsCanceled)
{
func();
}
}, TaskScheduler.Default);
};
}
}
public static class Aquatic
{
[HarmonyPatch(typeof(SE_Wet), "UpdateStatusEffect")]
private static class ApplyAquatic
{
private static void Postfix(SE_Wet __instance)
{
if ((Object)(object)((StatusEffect)__instance).m_character != (Object)(object)Player.m_localPlayer || !JewelryManager.IsEffectItemEquipped(Player.m_localPlayer, Effects.Aquatic))
{
return;
}
SE_Stats gemEffect = JcAPI.GetGemEffect<SE_Stats>(Effects.Aquatic);
if (!((Object)(object)gemEffect != (Object)null))
{
return;
}
StatusEffect val = ((Character)Player.m_localPlayer).GetSEMan().GetStatusEffect(StringExtensionMethods.GetStableHashCode(((Object)gemEffect).name));
if ((Object)(object)val == (Object)null)
{
ItemData equippedItemByEffect = JewelryManager.GetEquippedItemByEffect(Player.m_localPlayer, Effects.Aquatic);
if (equippedItemByEffect != null)
{
((StatusEffect)gemEffect).m_icon = equippedItemByEffect.GetIcon();
}
val = ((Character)Player.m_localPlayer).GetSEMan().AddStatusEffect((StatusEffect)(object)gemEffect, false, 0, 0f);
}
val.m_ttl = ((StatusEffect)__instance).m_ttl;
val.m_time = ((StatusEffect)__instance).m_time;
}
}
static Aquatic()
{
JcAPI.AddOnEffectRecalc(delegate
{
if (!JewelryManager.IsEffectItemEquipped(Player.m_localPlayer, Effects.Aquatic))
{
SE_Stats gemEffect = JcAPI.GetGemEffect<SE_Stats>(Effects.Aquatic);
if ((Object)(object)gemEffect != (Object)null)
{
((Character)Player.m_localPlayer).m_seman.RemoveStatusEffect((StatusEffect)(object)gemEffect, false);
}
}
});
}
}
public static class Effects
{
public static string None => string.Empty;
public static string Aquatic => "aquatic";
public static string Atunement => "atunement";
public static string Awareness => "awareness";
public static string Guidance => "guidance";
public static string Headhunter => "headhunter";
public static string Legacy => "legacy";
public static string Lumberjack => "lumberjack";
public static string MagicRepair => "magicRepair";
public static string ModersBlessing => "modersBlessing";
public static string RigidFinger => "rigidFinger";
public static string Warmth => "warmth";
public static string Perception => "perception";
public static string GetEffectNameFromJcName(string jcName)
{
return jcName switch
{
"JC_Necklace_Red" => Awareness,
"JC_Necklace_Green" => MagicRepair,
"JC_Necklace_Blue" => Aquatic,
"JC_Necklace_Yellow" => Lumberjack,
"JC_Necklace_Purple" => Guidance,
"JC_Necklace_Orange" => Atunement,
"JC_Ring_Purple" => RigidFinger,
"JC_Ring_Green" => Headhunter,
"JC_Ring_Red" => Warmth,
"JC_Ring_Blue" => ModersBlessing,
"JC_Ring_Black" => Legacy,
_ => None,
};
}
}
public static class Headhunter
{
[HarmonyPatch(typeof(Character), "Damage")]
private static class ApplyHeadHunter
{
private static void Postfix(Character __instance, HitData hit)
{
if (!__instance.IsBoss())
{
return;
}
Character attacker = hit.GetAttacker();
Player val = (Player)(object)((attacker is Player) ? attacker : null);
if (val == null || !JewelryManager.IsEffectItemEquipped(val, Effects.Headhunter) || __instance.m_nview.GetZDO().GetBool($"Jewelcrafting HeadHunter {val.GetPlayerID()}", false))
{
return;
}
SE_Stats gemEffect = JcAPI.GetGemEffect<SE_Stats>(Effects.Headhunter);
if ((Object)(object)gemEffect != (Object)null)
{
ItemData equippedItemByEffect = JewelryManager.GetEquippedItemByEffect(Player.m_localPlayer, Effects.Headhunter);
if (equippedItemByEffect != null)
{
((StatusEffect)gemEffect).m_icon = equippedItemByEffect.GetIcon();
}
((Character)val).m_seman.AddStatusEffect((StatusEffect)(object)gemEffect, true, 0, 0f);
__instance.m_nview.GetZDO().Set($"Jewelcrafting HeadHunter {val.GetPlayerID()}", true);
}
}
}
static Headhunter()
{
JcAPI.AddOnEffectRecalc(delegate
{
if (!JewelryManager.IsEffectItemEquipped(Player.m_localPlayer, Effects.Headhunter))
{
SE_Stats gemEffect = JcAPI.GetGemEffect<SE_Stats>(Effects.Headhunter);
if ((Object)(object)gemEffect != (Object)null)
{
((Character)Player.m_localPlayer).m_seman.RemoveStatusEffect((StatusEffect)(object)gemEffect, false);
}
}
});
}
}
public class Perception : SE_Stats
{
private static GameObject questObjectiveVfx;
private static List<string> Locations;
static Perception()
{
questObjectiveVfx = null;
Locations = new List<string> { "Vendor_BlackForest", "Hildir_camp" };
object? obj = AccessTools.Field(typeof(API.GemInfo).Assembly.GetType("Jewelcrafting.GemEffectSetup"), "legacyRingHildirQuest")?.GetValue(null);
questObjectiveVfx = (GameObject)((obj is GameObject) ? obj : null);
}
public Perception()
{
((StatusEffect)this).m_name = "$jc_se_perception";
((StatusEffect)this).m_tooltip = ((StatusEffect)this).m_name + "_description";
}
public static Perception GetInstance()
{
Perception perception = ScriptableObject.CreateInstance<Perception>();
((Object)perception).name = "Custom_SE_Perception_PK";
return perception;
}
public static void SetLocations(string locations)
{
if (!string.IsNullOrWhiteSpace(locations))
{
Locations = locations.Split(new char[1] { ':' }).ToList();
}
}
public override void UpdateStatusEffect(float dt)
{
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
//IL_012a: Unknown result type (might be due to invalid IL or missing references)
//IL_012c: Unknown result type (might be due to invalid IL or missing references)
//IL_010b: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
//IL_0142: Unknown result type (might be due to invalid IL or missing references)
//IL_0144: Unknown result type (might be due to invalid IL or missing references)
//IL_0149: Unknown result type (might be due to invalid IL or missing references)
//IL_014e: Unknown result type (might be due to invalid IL or missing references)
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
//IL_0168: Unknown result type (might be due to invalid IL or missing references)
//IL_0172: Unknown result type (might be due to invalid IL or missing references)
//IL_0177: Unknown result type (might be due to invalid IL or missing references)
//IL_017d: Unknown result type (might be due to invalid IL or missing references)
//IL_0182: Unknown result type (might be due to invalid IL or missing references)
//IL_0187: Unknown result type (might be due to invalid IL or missing references)
//IL_0189: Unknown result type (might be due to invalid IL or missing references)
base.m_tickTimer += dt;
if (base.m_tickTimer >= MoreJewelry.perceptionCooldown.Value)
{
Transform transform = ((Component)Player.m_localPlayer).transform;
if (transform.position.y < 3500f && Locations.Count > 0)
{
Dictionary<Vector3, string> dictionary = new Dictionary<Vector3, string>();
LocationInstance val = default(LocationInstance);
foreach (string location in Locations)
{
if (ZoneSystem.instance.FindClosestLocation(location, transform.position, ref val))
{
dictionary.Add(val.m_position, location);
}
}
Vector3 key = default(Vector3);
((Vector3)(ref key))..ctor(1000000f, 1000000f, 1000000f);
foreach (KeyValuePair<Vector3, string> item in dictionary)
{
if (Locations.Contains(item.Value) && Utils.DistanceXZ(key, transform.position) > Utils.DistanceXZ(item.Key, transform.position))
{
key = item.Key;
}
}
if (Utils.DistanceXZ(key, transform.position) < MoreJewelry.perceptionMinDistance.Value)
{
Vector3 val2 = key - transform.position;
val2.y = 0f;
Object.Instantiate<GameObject>(questObjectiveVfx, transform.position + transform.forward * 2f + transform.up, Quaternion.LookRotation(val2));
}
}
base.m_tickTimer = 0f;
}
((SE_Stats)this).UpdateStatusEffect(dt);
}
}
public static class Icons
{
public static void SnapshotItem(ItemDrop item, Quaternion? quat = null)
{
MoreJewelry instance = MoreJewelry.Instance;
if (instance != null)
{
((MonoBehaviour)instance).StartCoroutine(Do());
}
IEnumerator Do()
{
yield return null;
Quaternion rotation = (quat.HasValue ? quat.Value : Quaternion.Euler(20f, -150f, 40f));
Camera component = new GameObject("Camera", new Type[1] { typeof(Camera) }).GetComponent<Camera>();
component.backgroundColor = Color.clear;
component.clearFlags = (CameraClearFlags)2;
component.fieldOfView = 0.5f;
component.farClipPlane = 10000000f;
component.cullingMask = 1073741824;
Light component2 = new GameObject("Light", new Type[1] { typeof(Light) }).GetComponent<Light>();
((Component)component2).transform.rotation = Quaternion.Euler(5f, -5f, 5f);
component2.type = (LightType)1;
component2.cullingMask = 1073741824;
component2.intensity = 1.25f;
Rect val = default(Rect);
((Rect)(ref val))..ctor(0f, 0f, 64f, 64f);
GameObject val2 = Object.Instantiate<GameObject>(((Component)((Component)item).transform.Find("attach")).gameObject);
val2.transform.rotation = rotation;
Transform[] componentsInChildren = val2.GetComponentsInChildren<Transform>();
for (int i = 0; i < componentsInChildren.Length; i++)
{
((Component)componentsInChildren[i]).gameObject.layer = 30;
}
Renderer[] componentsInChildren2 = val2.GetComponentsInChildren<Renderer>();
Vector3 val3 = componentsInChildren2.Aggregate<Renderer, Vector3>(Vector3.positiveInfinity, delegate(Vector3 cur, Renderer renderer)
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
if (!(renderer is ParticleSystemRenderer))
{
Bounds bounds2 = renderer.bounds;
return Vector3.Min(cur, ((Bounds)(ref bounds2)).min);
}
return cur;
});
Vector3 val4 = componentsInChildren2.Aggregate<Renderer, Vector3>(Vector3.negativeInfinity, delegate(Vector3 cur, Renderer renderer)
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
if (!(renderer is ParticleSystemRenderer))
{
Bounds bounds = renderer.bounds;
return Vector3.Max(cur, ((Bounds)(ref bounds)).max);
}
return cur;
});
Vector3 val5 = val4 - val3;
component.targetTexture = RenderTexture.GetTemporary((int)((Rect)(ref val)).width, (int)((Rect)(ref val)).height, 0, (RenderTextureFormat)7, (RenderTextureReadWrite)1);
float num = Mathf.Max(val5.x, val5.y) * 1.05f / Mathf.Tan(component.fieldOfView * ((float)Math.PI / 180f));
((Component)component).transform.position = (val3 + val4) / 2f + new Vector3(0f, 0f, 0f - num);
component.Render();
RenderTexture active = RenderTexture.active;
RenderTexture.active = component.targetTexture;
Texture2D val6 = new Texture2D((int)((Rect)(ref val)).width, (int)((Rect)(ref val)).height, (TextureFormat)5, false);
val6.ReadPixels(val, 0, 0);
val6.Apply();
RenderTexture.active = active;
item.m_itemData.m_shared.m_icons = (Sprite[])(object)new Sprite[1] { Sprite.Create(val6, val, new Vector2(0.5f, 0.5f)) };
if ((Object)(object)item.m_itemData.m_shared.m_equipStatusEffect != (Object)null)
{
item.m_itemData.m_shared.m_equipStatusEffect.m_icon = item.m_itemData.m_shared.m_icons[0];
}
Object.DestroyImmediate((Object)(object)val2);
component.targetTexture.Release();
Object.Destroy((Object)(object)component);
Object.Destroy((Object)(object)component2);
}
}
}
public enum GemStyle
{
None,
Default,
Color
}
public static class JcAPI
{
private static Type visualType;
private static IDictionary visualsDict;
private static GameObject riabPrefab;
public static bool IsLoaded()
{
return API.IsLoaded();
}
public static GameObject GetGemcuttersTable()
{
return API.GetGemcuttersTable();
}
public static void AddOnEffectRecalc(Action action)
{
if (action != null)
{
API.OnEffectRecalc += action;
}
}
public static void RemoveOnEffectRecalc(Action action)
{
if (action != null)
{
API.OnEffectRecalc -= action;
}
}
public static T GetGemEffect<T>(string name) where T : Object
{
object? obj = AccessTools.Field(typeof(API.GemInfo).Assembly.GetType("Jewelcrafting.GemEffectSetup"), name)?.GetValue(null);
return (T)((obj is T) ? obj : null);
}
public static bool IsJewelryEquipped(Player player, string prefabName)
{
return API.IsJewelryEquipped(player, prefabName);
}
public static GameObject CreateNecklaceFromTemplate(string colorName, Color color)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
return API.CreateNecklaceFromTemplate(colorName, color);
}
public static GameObject CreateNecklaceFromTemplate(string colorName, Material material)
{
return API.CreateNecklaceFromTemplate(colorName, material);
}
public static GameObject CreateRingFromTemplate(string colorName, Color color)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
return API.CreateRingFromTemplate(colorName, color);
}
public static GameObject CreateRingFromTemplate(string colorName, Material material)
{
return API.CreateRingFromTemplate(colorName, material);
}
public static GameObject CreateItemFromTemplate(GameObject template, string prefabName, string localizationName, Color color)
{
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
return CreateItemFromTemplate(template, prefabName, localizationName, GemStyle.Color, color);
}
public static GameObject CreateItemFromTemplate(GameObject template, string prefabName, string localizationName, GemStyle style = GemStyle.Default, Color? color = null)
{
prefabName = "JC_" + prefabName.Replace(" ", "_");
localizationName = localizationName.Replace(" ", "_");
GameObject obj = Object.Instantiate<GameObject>(template, MoreJewelry.Instance.Container.transform);
((Object)obj).name = prefabName;
SharedData shared = obj.GetComponent<ItemDrop>().m_itemData.m_shared;
shared.m_name = "$" + localizationName;
shared.m_description = "$" + localizationName + "_description";
SetItemStyle(obj, style, color);
API.MarkJewelry(obj);
return obj;
}
public static void SetItemStyle(GameObject gameObject, GemStyle style, Color? color)
{
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
//IL_0120: Unknown result type (might be due to invalid IL or missing references)
switch (style)
{
case GemStyle.None:
((Component)gameObject.transform.Find("attach/Custom_Color_Mesh")).gameObject.SetActive(false);
break;
case GemStyle.Default:
((Component)gameObject.transform.Find("attach/Custom_Color_Mesh")).gameObject.SetActive(true);
break;
case GemStyle.Color:
if (color.HasValue)
{
MeshRenderer component = ((Component)gameObject.transform.Find("attach/Custom_Color_Mesh")).GetComponent<MeshRenderer>();
int? num = AccessTools.Field(typeof(API.GemInfo).Assembly.GetType("Jewelcrafting.GemStoneSetup"), "ShaderColorKey")?.GetValue(null) as int?;
int? num2 = AccessTools.Field(typeof(API.GemInfo).Assembly.GetType("Jewelcrafting.GemStoneSetup"), "EmissionColor")?.GetValue(null) as int?;
if (num.HasValue && num2.HasValue)
{
((Renderer)component).material.SetColor(num.Value, color.Value);
((Renderer)component).material.SetColor(num2.Value, color.Value);
}
}
break;
}
Icons.SnapshotItem(gameObject.GetComponent<ItemDrop>());
}
private static object GetFieldFromVisualsDictByName(Player player, string fieldname)
{
object result = null;
if (visualsDict == null)
{
visualType = typeof(API.GemInfo).Assembly.GetType("Jewelcrafting.Visual");
visualsDict = AccessTools.Field(visualType, "visuals").GetValue(null) as IDictionary;
}
if (visualsDict.Contains(((Humanoid)player).m_visEquipment))
{
object obj = visualsDict[((Humanoid)player).m_visEquipment];
result = AccessTools.Field(visualType, fieldname).GetValue(obj);
}
return result;
}
public static ItemData GetEquippedFingerItem(Player player)
{
object fieldFromVisualsDictByName = GetFieldFromVisualsDictByName(player, "equippedFingerItem");
return (ItemData)((fieldFromVisualsDictByName is ItemData) ? fieldFromVisualsDictByName : null);
}
public static ItemData GetEquippedNeckItem(Player player)
{
object fieldFromVisualsDictByName = GetFieldFromVisualsDictByName(player, "equippedNeckItem");
return (ItemData)((fieldFromVisualsDictByName is ItemData) ? fieldFromVisualsDictByName : null);
}
public static GameObject GetRIAB()
{
if ((Object)(object)riabPrefab == (Object)null)
{
Type type = typeof(API.GemInfo).Assembly.GetType("PieceManager.BuildPiece");
foreach (object item in AccessTools.Field(type, "registeredPieces").GetValue(null) as IList)
{
object? value = AccessTools.Field(type, "Prefab").GetValue(item);
GameObject val = (GameObject)((value is GameObject) ? value : null);
if ((Object)(object)val != (Object)null && "Odins_Jewelry_Box".Equals(((Object)val).name))
{
riabPrefab = val;
}
}
}
return riabPrefab;
}
public static void AddJewelryToRIAB(ItemDrop item)
{
GameObject rIAB = GetRIAB();
ItemStand val = ((rIAB != null) ? rIAB.GetComponentInChildren<ItemStand>() : null);
if ((Object)(object)val != (Object)null && !val.m_supportedItems.Contains(item))
{
val.m_supportedItems.Add(item);
}
}
public static void RemoveJewelryFromRIAB(ItemDrop item)
{
GameObject rIAB = GetRIAB();
ItemStand val = ((rIAB != null) ? rIAB.GetComponentInChildren<ItemStand>() : null);
if ((Object)(object)val != (Object)null && val.m_supportedItems.Contains(item))
{
val.m_supportedItems.Remove(item);
}
}
}
public enum JewelryKind
{
None,
DefaultNecklace,
CustomNecklace,
LeatherNecklace,
SilverNecklace,
DefaultRing,
CustomRing,
StoneRing,
BoneRing,
SilverRing
}
public static class JewelryManager
{
public static readonly Dictionary<string, StatusEffect> AvailableEffects = new Dictionary<string, StatusEffect>(StringComparer.InvariantCultureIgnoreCase);
public static readonly Dictionary<string, List<string>> EffectItemMap = new Dictionary<string, List<string>>(StringComparer.InvariantCultureIgnoreCase);
public static readonly Dictionary<JewelryKind, GameObject> AvailablePrefabs = new Dictionary<JewelryKind, GameObject>();
private static bool initialized = false;
public static bool IsInitialized()
{
return initialized;
}
public static void Initialize()
{
if (initialized)
{
return;
}
foreach (string item in new List<string> { "JC_Necklace_Red", "JC_Necklace_Green", "JC_Necklace_Yellow", "JC_Necklace_Purple", "JC_Necklace_Orange", "JC_Ring_Purple", "JC_Ring_Red", "JC_Ring_Blue", "JC_Ring_Black" })
{
string effectNameFromJcName = Effects.GetEffectNameFromJcName(item);
if (!AvailableEffects.TryGetValue(effectNameFromJcName, out var value))
{
value = fetchEffectFor(item);
if ((Object)(object)value != (Object)null)
{
AvailableEffects.Add(effectNameFromJcName, value);
AddItemToEffectItemMap(item, effectNameFromJcName);
Logger.LogDebugOnly("Found " + item + ", extracted " + effectNameFromJcName);
}
else
{
Logger.LogDebug("Could not find " + item + " prefab for effect extraction.");
}
}
}
AvailableEffects.Add(Effects.Perception, (StatusEffect)(object)Perception.GetInstance());
AddItemToEffectItemMap("JC_Necklace_Blue", Effects.Aquatic);
AddItemToEffectItemMap("JC_Ring_Green", Effects.Headhunter);
initialized = true;
static StatusEffect fetchEffectFor(string prefabName)
{
GameObject prefab = PrefabManager.GetPrefab(prefabName);
return ((prefab == null) ? null : prefab.GetComponent<ItemDrop>()?.m_itemData.m_shared)?.m_equipStatusEffect;
}
}
private static void AddItemToEffectItemMap(string prefabName, string effectName)
{
if (!EffectItemMap.TryGetValue(effectName, out var value) || value == null)
{
value = new List<string>();
EffectItemMap.Add(effectName, value);
}
if (!value.Contains(prefabName))
{
value.Add(prefabName);
Logger.LogDebugOnly("Adding " + effectName + " to prefab " + prefabName);
}
}
public static void AddAvailablePrefab(JewelryKind kind, GameObject prefab)
{
AvailablePrefabs.Add(kind, prefab);
}
public static bool IsEffectItemEquipped(Player player, string effectName)
{
if (!initialized)
{
return false;
}
bool flag = false;
if (EffectItemMap.TryGetValue(effectName, out var value) && value != null && value.Count > 0)
{
foreach (string item in value)
{
flag = flag || JcAPI.IsJewelryEquipped(player, item);
}
}
return flag;
}
public static ItemData GetEquippedItemByEffect(Player player, string effectName)
{
if (!initialized)
{
return null;
}
ItemData val = null;
if (EffectItemMap.TryGetValue(effectName, out var value) && value != null && value.Count > 0)
{
val = JcAPI.GetEquippedFingerItem(player);
if (val != null)
{
List<string> list = value;
GameObject dropPrefab = val.m_dropPrefab;
if (list.Contains((dropPrefab != null) ? ((Object)dropPrefab).name : null))
{
return val;
}
}
val = JcAPI.GetEquippedNeckItem(player);
if (val != null)
{
List<string> list2 = value;
GameObject dropPrefab2 = val.m_dropPrefab;
if (list2.Contains((dropPrefab2 != null) ? ((Object)dropPrefab2).name : null))
{
return val;
}
}
}
return null;
}
public static bool IsItemMappedToEffect(GameObject prefab, string effectName)
{
if (!initialized)
{
return false;
}
if (EffectItemMap.TryGetValue(effectName, out var value) && value == null)
{
return value.Contains(((Object)prefab).name);
}
return false;
}
public static void RemoveItemFromEffectItemMap(string prefabName, string effectName)
{
if (initialized && EffectItemMap.TryGetValue(effectName, out var value) && value != null)
{
if (value.Contains(prefabName))
{
value.Remove(prefabName);
}
if (value.Count == 0)
{
EffectItemMap.Remove(effectName);
}
}
}
public static void AddEffectToItem(Item item, string effectName)
{
if (!initialized)
{
return;
}
AddItemToEffectItemMap(((Object)item.Prefab).name, effectName);
StatusEffect value;
if (Effects.Aquatic.Equals(effectName) || Effects.Headhunter.Equals(effectName))
{
SE_Stats gemEffect = JcAPI.GetGemEffect<SE_Stats>(effectName);
if (gemEffect != null)
{
item.Description.English(item.Description.English() + "\n\n<color=orange>" + Localization.instance.Localize(((StatusEffect)gemEffect).m_name) + "</color>\n" + Localization.instance.Localize(((StatusEffect)gemEffect).GetTooltipString()).Replace(".", "").Replace("\n", " ") + Localization.instance.Localize(((StatusEffect)gemEffect).m_name + "_effect"));
}
}
else if (AvailableEffects.TryGetValue(effectName, out value) && (Object)(object)value != (Object)null)
{
item.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared.m_equipStatusEffect = value;
}
}
public static void ClearAllEffectsFromItem(Item item)
{
if (!initialized)
{
return;
}
item.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared.m_equipStatusEffect = null;
foreach (string item2 in EffectItemMap.Keys.ToList())
{
RemoveItemFromEffectItemMap(((Object)item.Prefab).name, item2);
}
}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("probablykory.MoreJewelry", "MoreJewelry", "1.0.12")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class MoreJewelry : BaseUnityPlugin, IPlugin
{
public enum Toggle
{
On = 1,
Off = 0
}
private class ConfigurationManagerAttributes
{
[UsedImplicitly]
public int? Order;
[UsedImplicitly]
public bool? Browsable;
[<d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(2)]
[UsedImplicitly]
public string Category;
[UsedImplicitly]
public bool? HideSettingName;
[UsedImplicitly]
public bool? HideDefaultButton;
[UsedImplicitly]
public bool? IsAdvanced;
[UsedImplicitly]
[<d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(new byte[] { 2, 0 })]
public Action<ConfigEntryBase> CustomDrawer;
}
internal const string PluginName = "MoreJewelry";
internal const string PluginVersion = "1.0.12";
internal const string PluginAuthor = "probablykory";
internal const string PluginGUID = "probablykory.MoreJewelry";
internal static MoreJewelry Instance = null;
private readonly Harmony harmony = new Harmony("probablykory.MoreJewelry");
private AssetBundle assetBundle;
private GameObject rootContainer;
internal static readonly ConfigSync ConfigSync = new ConfigSync("probablykory.MoreJewelry")
{
DisplayName = "MoreJewelry",
CurrentVersion = "1.0.12",
MinimumRequiredVersion = "1.0.12"
};
private static ConfigEntry<Toggle> serverConfigLocked = null;
private static ConfigEntry<Toggle> isDebugEnabled = null;
private static SyncedConfigEntry<Toggle> useExternalYaml = null;
private static ConfigEntry<int> yamlAnchor = null;
private static YamlConfig yamlConfig;
private static YamlConfigEditor yamlEditor;
private static ConfigEntry<string> perceptionLocations = null;
internal static ConfigEntry<float> perceptionCooldown = null;
internal static ConfigEntry<float> perceptionMinDistance = null;
private bool yamlParsed;
private bool assetsLoaded;
private static readonly Dictionary<string, string> stationMap = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase)
{
{
"None",
string.Empty
},
{ "Workbench", "piece_workbench" },
{ "Forge", "forge" },
{ "Stonecutter", "piece_stonecutter" },
{ "Cauldron", "piece_cauldron" },
{ "ArtisanTable", "piece_artisanstation" },
{ "BlackForge", "blackforge" },
{ "GaldrTable", "piece_magetable" },
{ "GemcutterTable", "op_transmution_table" },
{ "Gemcutter", "op_transmution_table" }
};
private static readonly Dictionary<string, Item> loadedItems = new Dictionary<string, Item>();
public string GUID => "probablykory.MoreJewelry";
public Logger Logger => Logger.Instance;
public ManualLogSource LogSource { get; private set; } = Logger.CreateLogSource("MoreJewelry");
public bool Debug
{
get
{
if (isDebugEnabled == null)
{
return false;
}
return isDebugEnabled.Value == Toggle.On;
}
}
public Harmony Harmony => harmony;
internal GameObject Container => rootContainer;
public void Awake()
{
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_0102: Expected O, but got Unknown
//IL_0141: Unknown result type (might be due to invalid IL or missing references)
//IL_014b: Expected O, but got Unknown
//IL_01da: Unknown result type (might be due to invalid IL or missing references)
//IL_01e5: Expected O, but got Unknown
//IL_0232: Unknown result type (might be due to invalid IL or missing references)
//IL_023d: Expected O, but got Unknown
//IL_029f: Unknown result type (might be due to invalid IL or missing references)
//IL_02aa: Expected O, but got Unknown
//IL_02e3: Unknown result type (might be due to invalid IL or missing references)
//IL_02ee: Expected O, but got Unknown
//IL_0314: Unknown result type (might be due to invalid IL or missing references)
//IL_031e: Expected O, but got Unknown
Instance = this;
((BaseUnityPlugin)this).Config.SaveOnConfigSet = true;
if (!JcAPI.IsLoaded())
{
Logger.LogFatal("Jewelcrafting mod is missing, unable to load MoreJewelry.");
return;
}
yamlConfig = new YamlConfig(Path.GetDirectoryName(((BaseUnityPlugin)this).Config.ConfigFilePath), "MoreJewelry");
yamlConfig.YamlConfigChanged += OnYamlConfigChanged;
yamlEditor = ((Component)this).gameObject.AddComponent<YamlConfigEditor>();
yamlEditor.Initialize("MoreJewelry", ConfigSync, yamlConfig, YamlConfig.ErrorCheck);
int num = 0;
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);
isDebugEnabled = config("1 - General", "Debugging Enabled", Toggle.Off, new ConfigDescription("If on, mod will output alot more information in the debug log level.", (AcceptableValueBase)null, new object[1]
{
new ConfigurationManagerAttributes
{
IsAdvanced = true
}
}));
useExternalYaml = ConfigSync.AddConfigEntry<Toggle>(((BaseUnityPlugin)this).Config.Bind<Toggle>("2 - Jewelry", "Use External YAML", Toggle.Off, new ConfigDescription("If set to on, the YAML file from your config folder will be used to configure custom jewelry.", (AcceptableValueBase)null, new object[1]
{
new ConfigurationManagerAttributes
{
Order = (num -= 1)
}
})));
useExternalYaml.SourceConfig.SettingChanged += OnExternalYamlSettingChanged;
yamlAnchor = config("2 - Jewelry", "YAML Editor Anchor", 0, new ConfigDescription("Just ignore this.", (AcceptableValueBase)null, new object[1]
{
new ConfigurationManagerAttributes
{
HideSettingName = true,
HideDefaultButton = true,
CustomDrawer = yamlEditor.DrawYamlEditorButton,
Order = (num -= 1),
Browsable = false
}
}), synchronizedSetting: false);
perceptionLocations = config("2 - Jewelry", "Perception Locations", "Vendor_BlackForest:Hildir_camp", new ConfigDescription("The list of locations Perception will lead the wearer towards.", (AcceptableValueBase)(object)new AcceptableValueConfigNote("You must use valid location names, separated by a colon."), new object[1]
{
new ConfigurationManagerAttributes
{
CustomDrawer = ConfigDrawers.DrawLocationsConfigTable(),
Order = (num -= 1)
}
}));
perceptionLocations.SettingChanged += delegate
{
Perception.SetLocations(perceptionLocations.Value);
};
perceptionCooldown = config("2 - Jewelry", "Perception Cooldown", 30f, new ConfigDescription("The interval in seconds the effect will trigger.", (AcceptableValueBase)null, new object[1]
{
new ConfigurationManagerAttributes
{
Order = (num -= 1)
}
}));
perceptionMinDistance = config("2 - Jewelry", "Perception Minimum Distance", 1000f, new ConfigDescription("The minimum distance to a location required to trigger the effect.", (AcceptableValueBase)null, new object[1]
{
new ConfigurationManagerAttributes
{
Order = (num -= 1)
}
}));
Localizer.Load();
harmony.PatchAll();
JcPatches.DoPatches(harmony);
rootContainer = new GameObject("jewelryPrefabs");
rootContainer.transform.parent = Main.GetRootObject().transform;
rootContainer.SetActive(false);
global::MockManager.MockManager.Instance.Init();
assetBundle = PrefabManager.RegisterAssetBundle("jewelry");
Logger.LogDebugOnly($"assetbundle loaded {assetBundle}");
yamlConfig.LoadInitialConfig(useExternalYaml.Value == Toggle.On);
OnExternalYamlSettingChanged();
LoadAssets();
Main.OnVanillaPrefabsAvailable += OnVanillaPrefabsAvailable;
new ConfigWatcher(this);
}
private void OnExternalYamlSettingChanged(object sender = null, EventArgs e = null)
{
bool isLocal = true;
if (useExternalYaml.SynchronizedConfig && useExternalYaml.LocalBaseValue != null)
{
isLocal = (Toggle)useExternalYaml.LocalBaseValue == useExternalYaml.Value;
}
bool flag = useExternalYaml.Value == Toggle.On;
yamlConfig.EnableRaisingFileEvents = flag;
yamlConfig.UseBuiltinConfig = !flag;
(((ConfigEntryBase)yamlAnchor).Description.Tags.Where((object o) => o is ConfigurationManagerAttributes).FirstOrDefault() as ConfigurationManagerAttributes).Browsable = flag;
if (CmAPI.IsLoaded())
{
CmAPI.ReloadConfigDisplay();
}
if (sender != null)
{
yamlConfig.ReloadConfig(isLocal);
}
}
private void OnDestroy()
{
((BaseUnityPlugin)this).Config.Save();
}
private ConfigEntry<T> config<T>(string group, string name, T value, ConfigDescription description, bool synchronizedSetting = true)
{
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: 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)this).Config.Bind<T>(group, name, value, val);
ConfigSync.AddConfigEntry<T>(val2).SynchronizedConfig = synchronizedSetting;
return val2;
}
private ConfigEntry<T> config<T>(string group, string name, T value, string description, bool synchronizedSetting = true)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Expected O, but got Unknown
return config(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty<object>()), synchronizedSetting);
}
private void OnConfigReloaded(object sender, EventArgs e)
{
Logger.LogDebugOnly("Config reloaded received.");
}
private void OnVanillaPrefabsAvailable()
{
Logger.LogDebugOnly("OnVanillaPrefabsAvailable fired.");
JewelryManager.Initialize();
((ICollection<GameObject>)JewelryManager.AvailablePrefabs.Values).FixReferences(recursive: true);
CollectionExtensions.Do<Item>((IEnumerable<Item>)loadedItems.Values, (Action<Item>)delegate(Item i)
{
i.Prefab.FixReferences(recursive: true);
Icons.SnapshotItem(i.Prefab.GetComponent<ItemDrop>());
});
ApplyYamlConfig();
}
private void OnYamlConfigChanged()
{
Logger.LogDebugOnly($"YamlConfigChanged fired, contains {yamlConfig.Config}");
yamlParsed = true;
ApplyYamlConfig();
}
private void LoadAssets()
{
Dictionary<string, JewelryKind> prefabs = new Dictionary<string, JewelryKind>
{
{
"Custom_Necklace_Default_PK",
JewelryKind.DefaultNecklace
},
{
"Custom_Necklace_Wrought_PK",
JewelryKind.CustomNecklace
},
{
"Custom_Necklace_Leather_PK",
JewelryKind.LeatherNecklace
},
{
"Custom_Necklace_Silver_PK",
JewelryKind.SilverNecklace
},
{
"Custom_Ring_Default_PK",
JewelryKind.DefaultRing
},
{
"Custom_Ring_Wrought_PK",
JewelryKind.CustomRing
},
{
"Custom_Ring_Stone_PK",
JewelryKind.StoneRing
},
{
"Custom_Ring_Bone_PK",
JewelryKind.BoneRing
},
{
"Custom_Ring_Silver_PK",
JewelryKind.SilverRing
}
};
foreach (KeyValuePair<string, JewelryKind> item in prefabs)
{
GameObject prefab = PrefabManager.RegisterPrefab(assetBundle, item.Key);
JewelryManager.AddAvailablePrefab(item.Value, prefab);
}
if (VneiAPI.IsLoaded())
{
VneiAPI.AfterDisableItems += delegate
{
Logger.LogDebugOnly("VNEI detected, disabling template prefabs.");
CollectionExtensions.Do<string>((IEnumerable<string>)prefabs.Keys, (Action<string>)delegate(string name)
{
VneiAPI.DisableItem(name, "MoreJewelry");
});
};
}
assetsLoaded = true;
ApplyYamlConfig();
}
private static string SanitizeName(string name)
{
return name.Replace(" ", " ").Trim().Replace(" ", "_");
}
private static string getStation(string station)
{
if (stationMap.TryGetValue(station, out var value))
{
return value;
}
return station;
}
private static JewelryKind mapNameToJewelryKind(string prefab)
{
StringComparison comparisonType = StringComparison.InvariantCultureIgnoreCase;
if (prefab != null)
{
if (prefab.IndexOf("jc_ring_", comparisonType) >= 0)
{
return JewelryKind.DefaultRing;
}
if (prefab.IndexOf("defaultring", comparisonType) >= 0)
{
return JewelryKind.DefaultRing;
}
if (prefab.IndexOf("jc_necklace_", comparisonType) >= 0)
{
return JewelryKind.DefaultNecklace;
}
if (prefab.IndexOf("defaultneck", comparisonType) >= 0)
{
return JewelryKind.DefaultNecklace;
}
if (prefab.IndexOf("defaultnecklace", comparisonType) >= 0)
{
return JewelryKind.DefaultNecklace;
}
if (prefab.IndexOf("jc_custom_ring", comparisonType) >= 0)
{
return JewelryKind.CustomRing;
}
if (prefab.IndexOf("customring", comparisonType) >= 0)
{
return JewelryKind.CustomRing;
}
if (prefab.IndexOf("jc_custom_necklace", comparisonType) >= 0)
{
return JewelryKind.CustomNecklace;
}
if (prefab.IndexOf("customneck", comparisonType) >= 0)
{
return JewelryKind.CustomNecklace;
}
if (prefab.IndexOf("customnecklace", comparisonType) >= 0)
{
return JewelryKind.CustomNecklace;
}
if (prefab.IndexOf("leathernecklace", comparisonType) >= 0)
{
return JewelryKind.LeatherNecklace;
}
if (prefab.IndexOf("leatherneck", comparisonType) >= 0)
{
return JewelryKind.LeatherNecklace;
}
if (prefab.IndexOf("leather", comparisonType) >= 0)
{
return JewelryKind.LeatherNecklace;
}
if (prefab.IndexOf("silvernecklace", comparisonType) >= 0)
{
return JewelryKind.LeatherNecklace;
}
if (prefab.IndexOf("silverneck", comparisonType) >= 0)
{
return JewelryKind.SilverNecklace;
}
if (prefab.IndexOf("stonering", comparisonType) >= 0)
{
return JewelryKind.StoneRing;
}
if (prefab.IndexOf("bonering", comparisonType) >= 0)
{
return JewelryKind.BoneRing;
}
if (prefab.IndexOf("silverring", comparisonType) >= 0)
{
return JewelryKind.SilverRing;
}
}
return JewelryKind.None;
}
private GemStyle determineStyle(VisualData config)
{
GemStyle result = GemStyle.None;
if (config.Visible && config.Color.HasValue)
{
result = GemStyle.Color;
}
else if (config.Visible)
{
result = GemStyle.Default;
}
return result;
}
private string getItemName(JewelryData data)
{
string text = SanitizeName(data.Name);
JewelryKind jewelryKind = mapNameToJewelryKind(data.Prefab);
if (JewelryManager.AvailablePrefabs.ContainsKey(jewelryKind))
{
text = ((jewelryKind != JewelryKind.DefaultNecklace && jewelryKind != JewelryKind.CustomNecklace && jewelryKind != JewelryKind.LeatherNecklace && jewelryKind != JewelryKind.SilverNecklace) ? ("Ring_" + text) : ("Necklace_" + text));
return "JC_" + text;
}
return null;
}
private GameObject getItemPrefab(JewelryData data)
{
string text = SanitizeName(data.Name);
JewelryKind jewelryKind = mapNameToJewelryKind(data.Prefab);
GemStyle style = determineStyle(data.Gem);
if (JewelryManager.AvailablePrefabs.TryGetValue(jewelryKind, out var value))
{
string localizationName;
if (jewelryKind == JewelryKind.DefaultNecklace || jewelryKind == JewelryKind.CustomNecklace || jewelryKind == JewelryKind.LeatherNecklace || jewelryKind == JewelryKind.SilverNecklace)
{
localizationName = "jc_necklace_" + text.ToLower();
text = "Necklace_" + text;
}
else
{
localizationName = "jc_ring_" + text.ToLower();
text = "Ring_" + text;
}
return JcAPI.CreateItemFromTemplate(value, text, localizationName, style, data.Gem.Color);
}
return null;
}
private void ApplyYamlConfig()
{
if (!assetsLoaded || !yamlParsed)
{
return;
}
HashSet<string> hashSet = new HashSet<string>();
foreach (JewelryData item3 in yamlConfig.Config.Jewelry)
{
string itemName = getItemName(item3);
if (itemName == null)
{
Logger.LogWarning("Name " + item3.Prefab + " could not be matched to a valid prefab. Skipping.");
continue;
}
hashSet.Add(itemName);
if (!loadedItems.TryGetValue(itemName, out var value))
{
if (PrefabManager.GetPrefab(item3.Name) != null)
{
Logger.LogWarning("Could not add " + item3.Name + " as an internal entity named such already exists.");
continue;
}
GameObject itemPrefab = getItemPrefab(item3);
if ((Object)(object)itemPrefab == (Object)null)
{
Logger.LogWarning($"Name {value.Prefab} could not be matched to a valid prefab. Skipping.");
continue;
}
Dictionary<string, Item> dictionary = loadedItems;
Item obj = new Item(itemPrefab)
{
Configurable = Configurability.Disabled
};
((Object)obj.Prefab).name = itemName;
Item item2 = obj;
dictionary[itemName] = obj;
value = item2;
}
value.Name.English(item3.Name);
value.Description.English(item3.Description ?? "A random trinket.");
mapNameToJewelryKind(item3.Prefab);
JcAPI.SetItemStyle(value.Prefab, determineStyle(item3.Gem), item3.Gem.Color);
ItemDrop component = value.Prefab.GetComponent<ItemDrop>();
component.m_autoPickup = true;
component.m_autoDestroy = true;
SharedData shared = component.m_itemData.m_shared;
if (JewelryManager.IsInitialized())
{
JewelryManager.ClearAllEffectsFromItem(value);
string text = item3.effect?.NameToResolve ?? null;
if (text != null)
{
if (JewelryManager.AvailableEffects.ContainsKey(text))
{
JewelryManager.AddEffectToItem(value, text);
}
else if (text.Equals(Effects.Aquatic, StringComparison.InvariantCultureIgnoreCase) || text.Equals(Effects.Headhunter, StringComparison.InvariantCultureIgnoreCase))
{
JewelryManager.AddEffectToItem(value, text);
}
else
{
Logger.LogWarning(text + " isn't among the built-in effects, & StatusEffect lookup isn't supported yet. ");
}
}
else
{
StatusEffectData statusEffectData = item3.effect?.SeData;
if (statusEffectData != null)
{
string text2 = ((Object)value.Prefab).name.Replace("JC_", "JC_Se_");
if ((Object)(object)shared.m_equipStatusEffect == (Object)null || !text2.Equals(((Object)shared.m_equipStatusEffect).name))
{
StatusEffect val = statusEffectData.ToStatusEffect();
val.m_name = (string.IsNullOrWhiteSpace(statusEffectData.Name) ? item3.Name : statusEffectData.Name);
((Object)val).name = text2;
val.m_icon = shared.m_icons[0];
shared.m_equipStatusEffect = val;
}
}
}
}
value.Crafting.Stations.Clear();
value.RequiredItems.Requirements.Clear();
value.RequiredUpgradeItems.Requirements.Clear();
value.Crafting.Add(getStation(item3.Crafting.CraftingStation), item3.Crafting.StationLevel);
if (item3.Crafting.Costs.Count > 0)
{
value.RequiredItems.Requirements.AddRange(item3.Crafting.Costs.Select(delegate(CostData c)
{
Requirement result3 = default(Requirement);
result3.itemName = c.Name;
result3.amount = c.Amount;
result3.quality = 0;
return result3;
}).ToArray());
}
int maxQuality = 1;
UpgradeData upgrade = item3.Upgrade;
if (upgrade != null && upgrade.Costs?.Count > 0)
{
foreach (KeyValuePair<int, List<CostData>> kvp in item3.Upgrade.Costs)
{
value.RequiredUpgradeItems.Requirements.AddRange(kvp.Value.Select(delegate(CostData c)
{
Requirement result2 = default(Requirement);
result2.itemName = c.Name;
result2.amount = c.Amount;
result2.quality = kvp.Key + 1;
return result2;
}));
}
maxQuality = ((item3.Crafting.Costs.Count > 0) ? 1 : 0) + item3.Upgrade.Costs.Count;
}
else if (item3.Crafting.MaxQuality > 1 && item3.Crafting.MaxQuality <= 10 && item3.Crafting.Costs.Any((CostData c) => c.AmountPerLevel > 0))
{
maxQuality = item3.Crafting.MaxQuality;
int i;
for (i = 2; i <= maxQuality; i++)
{
value.RequiredUpgradeItems.Requirements.AddRange(item3.Crafting.Costs.Select(delegate(CostData c)
{
Requirement result = default(Requirement);
result.itemName = c.Name;
result.amount = c.AmountPerLevel * (i - 1);
result.quality = i;
return result;
}).ToArray());
}
}
shared.m_maxQuality = maxQuality;
ZNetScene instance = ZNetScene.instance;
if ((Object)(object)((instance != null) ? instance.GetPrefab("_ZoneCtrl") : null) != (Object)null)
{
value.ReloadCraftingConfiguration();
value.ApplyToAllInstances(delegate(ItemData item)
{
item.m_shared = shared;
item.m_shared.m_maxQuality = maxQuality;
});
}
if (((Object)value.Prefab).name.StartsWith("JC_Ring"))
{
JcAPI.AddJewelryToRIAB(value.Prefab.GetComponent<ItemDrop>());
}
}
foreach (KeyValuePair<string, Item> loadedItem in loadedItems)
{
if (!hashSet.Contains(loadedItem.Key) && loadedItem.Value != null)
{
Item.RecipesEnabled activeRecipesEnabled = loadedItem.Value.GetActiveRecipesEnabled();
if (activeRecipesEnabled == Item.RecipesEnabled.True || activeRecipesEnabled == Item.RecipesEnabled.Mixed)
{
loadedItem.Value.ToggleAllActiveRecipes(isEnabled: false);
}
JewelryManager.ClearAllEffectsFromItem(loadedItem.Value);
if (((Object)loadedItem.Value.Prefab).name.StartsWith("JC_Ring"))
{
JcAPI.RemoveJewelryFromRIAB(loadedItem.Value.Prefab.GetComponent<ItemDrop>());
}
}
}
}
private void testCreateJewelry()
{
Item item = new Item(JcAPI.CreateItemFromTemplate(JewelryManager.AvailablePrefabs[JewelryKind.LeatherNecklace], "Necklace Leather", "jc_necklace_leather_one"));
item.Name.English("Leather necklace");
item.Description.English("Que?");
item.Crafting.Add(((Object)JcAPI.GetGemcuttersTable()).name, 1);
item.RequiredItems.Add("Stone", 1);
item.MaximumRequiredStationLevel = 3;
JewelryManager.AddEffectToItem(item, Effects.Aquatic);
Item item2 = new Item(JcAPI.CreateItemFromTemplate(JewelryManager.AvailablePrefabs[JewelryKind.SilverRing], "Ring Silver", "jc_ring_silver_one"));
item2.Name.English("Silver ring");
item2.Description.English("Que?");
item2.Crafting.Add(((Object)JcAPI.GetGemcuttersTable()).name, 1);
item2.RequiredItems.Add("Stone", 1);
item2.MaximumRequiredStationLevel = 3;
JewelryManager.AddEffectToItem(item2, Effects.Headhunter);
}
ConfigFile IPlugin.get_Config()
{
return ((BaseUnityPlugin)this).Config;
}
PluginInfo IPlugin.get_Info()
{
return ((BaseUnityPlugin)this).Info;
}
Coroutine IPlugin.StartCoroutine(string methodName)
{
return ((MonoBehaviour)this).StartCoroutine(methodName);
}
Coroutine IPlugin.StartCoroutine(IEnumerator routine)
{
return ((MonoBehaviour)this).StartCoroutine(routine);
}
Coroutine IPlugin.StartCoroutine(string methodName, object value)
{
return ((MonoBehaviour)this).StartCoroutine(methodName, value);
}
}
public class YamlConfigEditor : MonoBehaviour
{
private const int WindowId = -669;
private static Rect yamlWindowRect;
private string currentYamlInput;
private bool collapsed;
private Vector2 yamlTextareaScrollPosition;
private Vector2 yamlErrorsScrollPosition;
private bool hasErrors;
private YamlConfig yamlConfig;
[<d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(new byte[] { 2, 0 })]
private CustomSyncedValue<string> activeConfig;
private Func<string, List<string>> errorChecker;
private ConfigSync configSync;
private string modName;
public static string EditButtonName => Localization.instance.Localize("$mj_yaml_editor_edit");
public void Initialize(string modName, ConfigSync configSync, YamlConfig yaml, Func<string, List<string>> errorCheck)
{
if (CmAPI.IsLoaded())
{
this.modName = modName;
this.configSync = configSync;
yamlConfig = yaml;
activeConfig = yaml.SyncedValue;
errorChecker = errorCheck;
Logger.LogDebugOnly("Setting up " + modName + " YAML Editor");
}
else
{
Logger.LogDebugOnly("No CM pressent, skipping YAML Editor setup.");
}
}
public void DrawYamlEditorButton(ConfigEntryBase _)
{
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
if (CmAPI.IsLoaded())
{
GUILayout.BeginVertical(Array.Empty<GUILayoutOption>());
GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
GUILayout.Space((float)CmAPI.LeftColumnWidth + 2f);
if (!string.IsNullOrWhiteSpace(activeConfig.Value) && GUILayout.Button(EditButtonName, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }))
{
currentYamlInput = activeConfig.Value;
yamlTextareaScrollPosition = default(Vector2);
}
GUILayout.Space(59f);
GUILayout.EndHorizontal();
GUILayout.EndVertical();
}
}
private void Update()
{
if (currentYamlInput != null)
{
Cursor.lockState = (CursorLockMode)0;
Cursor.visible = true;
}
}
private void LateUpdate()
{
Update();
}
private void OnGUI()
{
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: 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_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Expected O, but got Unknown
//IL_005f: Expected O, but got Unknown
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: 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_0099: Expected O, but got Unknown
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
if (currentYamlInput != null)
{
Update();
yamlWindowRect = new Rect(10f, 10f, (float)(Screen.width - 20), (float)(Screen.height - 20));
GUI.Box(yamlWindowRect, GUIContent.none, new GUIStyle
{
normal = new GUIStyleState
{
background = CmAPI.WindowBackground
}
});
GUI.backgroundColor = CmAPI._windowBackgroundColor;
GUILayout.Window(-669, yamlWindowRect, new WindowFunction(yamlWindowDrawer), modName + " YAML Editor", Array.Empty<GUILayoutOption>());
}
}
private void yamlWindowDrawer(int id)
{
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Expected O, but got Unknown
//IL_0016: 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_007b: 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_0434: Unknown result type (might be due to invalid IL or missing references)
//IL_044b: Unknown result type (might be due to invalid IL or missing references)
//IL_0464: Unknown result type (might be due to invalid IL or missing references)
//IL_0469: Unknown result type (might be due to invalid IL or missing references)
//IL_0485: Unknown result type (might be due to invalid IL or missing references)
//IL_048a: Unknown result type (might be due to invalid IL or missing references)
//IL_04a4: Unknown result type (might be due to invalid IL or missing references)
//IL_04b0: Expected O, but got Unknown
//IL_04b0: Unknown result type (might be due to invalid IL or missing references)
//IL_04c9: Unknown result type (might be due to invalid IL or missing references)
//IL_0173: Unknown result type (might be due to invalid IL or missing references)
//IL_0178: Unknown result type (might be due to invalid IL or missing references)
//IL_0179: Unknown result type (might be due to invalid IL or missing references)
//IL_017b: Invalid comparison between Unknown and I4
//IL_0337: Unknown result type (might be due to invalid IL or missing references)
//IL_034b: Unknown result type (might be due to invalid IL or missing references)
//IL_0350: Unknown result type (might be due to invalid IL or missing references)
//IL_017d: Unknown result type (might be due to invalid IL or missing references)
//IL_017f: Invalid comparison between Unknown and I4
//IL_0198: Unknown result type (might be due to invalid IL or missing references)
//IL_019f: Invalid comparison between Unknown and I4
//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
//IL_01ba: Invalid comparison between Unknown and I4
//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
//IL_01d6: Expected O, but got Unknown
//IL_0201: Unknown result type (might be due to invalid IL or missing references)
//IL_020b: Invalid comparison between Unknown and I4
//IL_0231: Unknown result type (might be due to invalid IL or missing references)
//IL_0237: Invalid comparison between Unknown and I4
//IL_0212: Unknown result type (might be due to invalid IL or missing references)
//IL_0219: Invalid comparison between Unknown and I4
//IL_0250: Unknown result type (might be due to invalid IL or missing references)
//IL_0257: Expected O, but got Unknown
GUIStyle val = new GUIStyle(GUI.skin.box);
val.normal.textColor = CmAPI._fontColor;
val.normal.background = CmAPI.EntryBackground;
val.fontSize = CmAPI.fontSize;
GUI.backgroundColor = CmAPI._entryBackgroundColor;
GUILayout.BeginHorizontal(val, Array.Empty<GUILayoutOption>());
GUI.enabled = !hasErrors && (!configSync.IsLocked || configSync.IsSourceOfTruth);
Color backgroundColor = GUI.backgroundColor;
GUI.backgroundColor = CmAPI._widgetBackgroundColor;
if (GUILayout.Button(Localization.instance.Localize("$mj_yaml_editor_save"), (GUILayoutOption[])(object)new GUILayoutOption[0]) && !hasErrors)
{
save();
currentYamlInput = null;
}
if (configSync.IsSourceOfTruth && GUILayout.Button(Localization.instance.Localize("$mj_yaml_editor_apply"), Array.Empty<GUILayoutOption>()) && !hasErrors)
{
yamlConfig.SkipSavingOfValueChange = true;
save();
yamlConfig.SkipSavingOfValueChange = false;
currentYamlInput = null;
}
GUI.backgroundColor = backgroundColor;
GUI.enabled = true;
if (GUILayout.Button(Localization.instance.Localize("$mj_yaml_editor_discard"), Array.Empty<GUILayoutOption>()))
{
currentYamlInput = null;
}
GUILayout.EndHorizontal();
hasErrors = false;
string text = "";
if (GUI.GetNameOfFocusedControl() == modName + " yaml textarea")
{
EventType type = Event.current.type;
if (((int)type == 4 || (int)type == 5) && Event.current.isKey)
{
if ((int)Event.current.keyCode == 9 || Event.current.character == '\t')
{
if ((int)Event.current.type == 5)
{
TextEditor val2 = (TextEditor)GUIUtility.GetStateObject(typeof(TextEditor), GUIUtility.keyboardControl);
val2.Insert(' ');
val2.Insert(' ');
currentYamlInput = val2.text;
}
Event.current.Use();
}
if ((int)Event.current.keyCode == 271 || (int)Event.current.keyCode == 13 || Event.current.character == '\n')
{
if ((int)Event.current.type == 5)
{
TextEditor val3 = (TextEditor)GUIUtility.GetStateObject(typeof(TextEditor), GUIUtility.keyboardControl);
string text2 = val3.text;
int num = val3.cursorIndex;
if (num > 0)
{
while (text2[num - 1] != '\n' && --num > 0)
{
}
}
int num2 = num;
if (num2 < text2.Length && text2[num2] == ' ')
{
while (true)
{
if (num2 >= text2.Length || text2[num2] == '\n')
{
num2 = num;
break;
}
if (text2[num2] != ' ')
{
break;
}
num2++;
}
}
if (num2 > val3.cursorIndex)
{
num2 = num;
}
val3.Insert('\n');
for (int num3 = num2 - num; num3 > 0; num3--)
{
val3.Insert(' ');
}
currentYamlInput = val3.text;
}
Event.current.Use();
}
}
}
if (currentYamlInput != null)
{
GUILayout.BeginVertical(val, Array.Empty<GUILayoutOption>());
yamlTextareaScrollPosition = GUILayout.BeginScrollView(yamlTextareaScrollPosition, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandHeight(true) });
GUI.SetNextControlName(modName + " yaml textarea");
currentYamlInput = GUILayout.TextArea(currentYamlInput, (GUILayoutOption[])(object)new GUILayoutOption[2]
{
GUILayout.ExpandWidth(true),
GUILayout.ExpandHeight(true)
});
GUILayout.EndScrollView();
GUILayout.EndVertical();
}
try
{
List<string> list = errorChecker(currentYamlInput);
if (list.Count > 0)
{
hasErrors = true;
text = text + "There are errors in your yaml config:\n" + string.Join("\n", list) + "\n";
}
}
catch (YamlException ex)
{
text = "Parsing your yaml config failed with an error:\n" + ex.Message + ((ex.InnerException != null) ? (": " + ex.InnerException.Message) : "");
hasErrors = true;
}
val.normal.background = CmAPI.WindowBackground;
GUI.backgroundColor = CmAPI._entryBackgroundColor;
GUILayout.BeginVertical(val, Array.Empty<GUILayoutOption>());
yamlErrorsScrollPosition = GUILayout.BeginScrollView(yamlErrorsScrollPosition, val, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(100f) });
if (text != "")
{
GUIStyle val4 = new GUIStyle(GUI.skin.label);
val4.normal.textColor = new Color(0.8f, 0.14f, 0.14f, 1f);
GUIStyle val5 = val4;
Color contentColor = GUI.contentColor;
GUI.contentColor = new Color(0.8f, 0.14f, 0.14f, 1f);
GUILayout.Label(text, val5, Array.Empty<GUILayoutOption>());
GUI.contentColor = contentColor;
}
else
{
GUILayout.Label("Configuration syntax is valid.", Array.Empty<GUILayoutOption>());
}
GUILayout.EndScrollView();
GUILayout.EndVertical();
void save()
{
activeConfig.Value = currentYamlInput;
}
}
}
}
namespace MoreJewelry.Data
{
[<d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(0)]
[<bc3df989-e0d1-4950-8c2f-95e51aa49bae>NullableContext(2)]
public class JewelryDataUnparsed
{
public string Name;
public string Description;
public string Prefab;
public object Gem;
public object Crafting;
public object Upgrade;
public object effect;
}
[Serializable]
[CanBeNull]
public class JewelryData
{
public string Name = "";
public string Description = "";
public string Prefab = "";
public VisualData Gem;
public CraftingData Crafting;
public UpgradeData Upgrade;
public EffectData effect;
}
[Serializable]
[CanBeNull]
public class CraftingData
{
public string CraftingStation;
public int StationLevel;
public int MaxQuality = -1;
public List<CostData> Costs;
}
[Serializable]
[CanBeNull]
public class UpgradeData
{
public Dictionary<int, List<CostData>> Costs;
}
[Serializable]
[CanBeNull]
public class CostData
{
public string Name;
public int Amount;
public int AmountPerLevel;
}
[Serializable]
[<d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(0)]
[CanBeNull]
[<bc3df989-e0d1-4950-8c2f-95e51aa49bae>NullableContext(2)]
public class EffectData
{
public string NameToResolve;
public StatusEffectData SeData;
}
[Serializable]
[CanBeNull]
public class VisualData
{
public bool Visible;
public Color? Color;
}
public static class SkillUtils
{
public static string FromSkill(SkillType skill)
{
return Localization.instance.Localize("$skill_" + ((object)(SkillType)(ref skill)).ToString().ToLower());
}
public static SkillType FromName(string englishName)
{
return (SkillType)Math.Abs(StringExtensionMethods.GetStableHashCode(englishName));
}
}
[Serializable]
[CanBeNull]
public class DamageTypeData
{
public float Blunt { get; set; }
public float Slash { get; set; }
public float Pierce { get; set; }
public float Chop { get; set; }
public float Pickaxe { get; set; }
public float Fire { get; set; }
public float Frost { get; set; }
public float Poison { get; set; }
public float Lightning { get; set; }
public float Spirit { get; set; }
}
[Serializable]
[CanBeNull]
public class DamageModifierData
{
public string Type { get; set; }
public string Modifier { get; set; }
public DamageModifierData()
{
}
public DamageModifierData(string type, string mod)
{
Type = type;
Modifier = mod;
}
}
[Serializable]
[CanBeNull]
public class SkillModifierData
{
public string Type { get; set; }
public float Modifier { get; set; }
public SkillModifierData()
{
}
public SkillModifierData(string type, float mod)
{
Type = type;
Modifier = mod;
}
}
[Serializable]
[CanBeNull]
public class StatusEffectData
{
[<d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(2)]
public string Name;
[<d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(2)]
public string Tooltip;
[YamlMember(Alias = "StartMsgLoc")]
public MessageType? StartMessageLoc;
[<d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(2)]
[YamlMember(Alias = "StartMsg")]
public string StartMessage;
[YamlMember(Alias = "StopMsgLoc")]
public MessageType? StopMessageLoc;
[<d5503cf9-fcbd-4060-9644-09c2c6ea979e>Nullable(2)]
[YamlMember(Alias = "StopMsg")]
public string StopMessage;
[YamlMember(Alias = "RunStaminaDrainModifier")]
public float? m_runStaminaDrainModifier;
[YamlMember(Alias = "JumpStaminaModifier")]
public float? m_jumpStaminaUseModifier;
[YamlMember(Alias = "HealthRegen")]
public float? m_healthRegenMultiplier = 1f;
[YamlMember(Alias = "StaminaRegen")]
public float? m_staminaRegenMultiplier = 1f;
[YamlMember(Alias = "EitrRegen")]
public float? m_eitrRegenMultiplier = 1f;
[YamlMember(Alias = "RaiseSkill")]
public SkillModifierData RaiseSkillMod;
[YamlMember(Alias = "SkillLevel")]
public SkillModifierData SkillLevelMod;
[YamlMember(Alias = "SkillLevelTwo")]
public SkillModifierData SkillLevel2Mod;
[YamlMember(Alias = "DamageModifiers")]
public List<DamageModifierData> DamageMods = new List<DamageModifierData>();
[YamlMember(Alias = "AttackSkill")]
public SkillModifierData AttackSkillMod;
[YamlMember(Alias = "MaxCarry")]
public float? m_addMaxCarryWeight;
[YamlMember(Alias = "MoveSpeed")]
public float? m_speedModifier;
[YamlMember(Alias = "FallSpeed")]
public float? m_maxMaxFallSpeed;
[YamlMember(Alias = "FallDamage")]
public float? m_fallDamageModifier;
[YamlMember(Alias = "AttackStaminaModifier")]
public float m_attackStaminaUseModifier;
[YamlMember(Alias = "BlockStaminaModifier")]
public float m_blockStaminaUseModifier;
[YamlMember(Alias = "DodgeStaminaModifier")]
public float m_dodgeStaminaUseModifier;
[YamlMember(Alias = "SwimStaminaModifier")]
public float m_swimStaminaUseModifier;
[YamlMember(Alias = "BaseItemStaminaModifier")]
public float m_homeItemStaminaUseModifier;
[YamlMember(Alias = "SneakStaminaModifier")]
public float m_sneakStaminaUseModifier;
[YamlMember(Alias = "RunStaminaModifier")]
public float m_runStaminaUseModifier;
[YamlMember(Alias = "PercentDamageModifiers")]
public DamageTypeData PercentDamageModifiers;
public StatusEffect ToStatusEffect()
{
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_009c: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
//IL_0150: Unknown result type (might be due to invalid IL or missing references)
//IL_0155: Unknown result type (might be due to invalid IL or missing references)
//IL_017f: Unknown result type (might be due to invalid IL or missing references)
//IL_0184: Unknown result type (might be due to invalid IL or missing references)
//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
//IL_0229: Unknown result type (might be due to invalid IL or missing references)
//IL_022e: Unknown result type (might be due to invalid IL or missing references)
//IL_0253: Unknown result type (might be due to invalid IL or missing references)
//IL_0258: Unknown result type (might be due to invalid IL or missing references)
SE_Stats val = ScriptableObject.CreateInstance<SE_Stats>();
if (hasValue(Name))
{
((StatusEffect)val).m_name = Name;
}
if (hasValue(Tooltip))
{
((StatusEffect)val).m_tooltip = Tooltip;
}
if (hasValue(StartMessage))
{
((StatusEffect)val).m_startMessage = StartMessage;
}
if (StartMessageLoc.HasValue)
{
((StatusEffect)val).m_startMessageType = StartMessageLoc.Value;
}
if (hasValue(StopMessage))
{
((StatusEffect)val).m_stopMessage = StopMessage;
}
if (StopMessageLoc.HasValue)
{
((StatusEffect)val).m_stopMessageType = StopMessageLoc.Value;
}
if (m_runStaminaDrainModifier.HasValue)
{
val.m_runStaminaDrainModifier = m_runStaminaDrainModifier.Value;
}
if (m_jumpStaminaUseModifier.HasValue)
{
val.m_jumpStaminaUseModifier = m_jumpStaminaUseModifier.Value;
}
if (m_healthRegenMultiplier.HasValue)
{
val.m_healthRegenMultiplier = m_healthRegenMultiplier.Value;
}
if (m_staminaRegenMultiplier.HasValue)
{
val.m_staminaRegenMultiplier = m_staminaRegenMultiplier.Value;
}
if (m_eitrRegenMultiplier.HasValue)
{
val.m_eitrRegenMultiplier = m_eitrRegenMultiplier.Value;
}
if (RaiseSkillMod != null)
{
val.m_raiseSkill = GetSkillType(RaiseSkillMod.Type);
val.m_raiseSkillModifier = RaiseSkillMod.Modifier;
}
if (SkillLevelMod != null)
{
val.m_skillLevel = GetSkillType(SkillLevelMod.Type);
val.m_skillLevelModifier = SkillLevelMod.Modifier;
}
if (SkillLevel2Mod != null)
{
val.m_skillLevel2 = GetSkillType(SkillLevel2Mod.Type);
val.m_skillLevelModifier2 = SkillLevel2Mod.Modifier;
}
List<DamageModifierData> damageMods = DamageMods;
if (damageMods != null && damageMods.Count > 0)
{
val.m_mods = DamageMods.Select(delegate(DamageModifierData m)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: 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_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
DamageModPair result = default(DamageModPair);
result.m_type = GetDamageType(m.Type);
result.m_modifier = GetDamageModifier(m.Modifier);
return result;
}).ToList();
}
if (AttackSkillMod != null)
{
val.m_modifyAttackSkill = GetSkillType(AttackSkillMod.Type);
val.m_damageModifier = AttackSkillMod.Modifier;
}
if (PercentDamageModifiers != null)
{
val.m_percentigeDamageModifiers = GetDamageTypes(PercentDamageModifiers);
}
if (m_addMaxCarryWeight.HasValue)
{
val.m_addMaxCarryWeight = m_addMaxCarryWeight.Value;
}
if (m_speedModifier.HasValue)
{
val.m_speedModifier = m_speedModifier.Value;
}
if (m_maxMaxFallSpeed.HasValue)
{
val.m_maxMaxFallSpeed = m_maxMaxFallSpeed.Value;
}
if (m_fallDamageModifier.HasValue)
{
val.m_fallDamageModifier = m_fallDamageModifier.Value;
}
return (StatusEffect)(object)val;
static bool hasValue(string input)
{
return !string.IsNullOrEmpty(input);
}