using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Jotunn; using Jotunn.Configs; using Jotunn.Entities; using Jotunn.Managers; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyCompany("SakeysSneakingBox")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("SakeysSneakingBox")] [assembly: AssemblyTitle("SakeysSneakingBox")] [assembly: AssemblyVersion("1.0.0.0")] namespace SakeysSneakingBox; [BepInPlugin("com.sakey.sneakingbox", "Sakey's Sneaking Box", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class SneakingBoxPlugin : BaseUnityPlugin { public struct BoxData { public string itemId; public string displayName; public string description; } public const string PluginGUID = "com.sakey.sneakingbox"; public const string PluginName = "Sakey's Sneaking Box"; public const string PluginVersion = "1.0.0"; public const string ASSET_BUNDLE_NAME = "sneaking_box"; public const string ITEM_NAME = "SneakingBoxUtility"; public const string BOX_MODEL_NAME = "box1"; public const string FROST_EFFECT_NAME = "SE_SneakingBoxFrostResistance"; public static AssetBundle assetBundle; public static StatusEffect FrostResistanceEffect; private Harmony harmony; private static ConfigEntry boxPrice; private static ConfigEntry sellAtHaldor; private static ConfigEntry sellAtHildir; private static ConfigEntry sellAtBogWitch; public static BoxData boxData = new BoxData { itemId = "SneakingBoxUtility", displayName = "段ボール箱", description = "待たせたな。\nただの箱だ。\nだが、ある世界の戦場では重要なアイテムだ" }; private void Awake() { //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Expected O, but got Unknown boxPrice = ((BaseUnityPlugin)this).Config.Bind("General", "BoxPrice", "500", "商人から購入するときのコインの価格です。"); sellAtHaldor = ((BaseUnityPlugin)this).Config.Bind("Merchant Settings", "SellAtHaldor", true, "ハルドルで販売するかどうか"); sellAtHildir = ((BaseUnityPlugin)this).Config.Bind("Merchant Settings", "SellAtHildir", false, "ヒルディルで販売するかどうか"); sellAtBogWitch = ((BaseUnityPlugin)this).Config.Bind("Merchant Settings", "SellAtBogWitch", true, "ボグウィッチで販売するかどうか"); string text = Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "sneaking_box"); assetBundle = AssetBundle.LoadFromFile(text); if ((Object)(object)assetBundle == (Object)null) { ((BaseUnityPlugin)this).Logger.LogError((object)("[SneakingBox] AssetBundleの読み込みに失敗しました: " + text)); } else { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[SneakingBox] AssetBundle loaded."); } LocalizationManager.OnLocalizationAdded += AddCustomLocalizations; PrefabManager.OnPrefabsRegistered += OnPrefabsRegistered; CreateFrostResistanceEffect(); harmony = new Harmony("com.sakey.sneakingbox"); harmony.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Sakey's Sneaking Box] Plugin loaded successfully."); } private void OnDestroy() { LocalizationManager.OnLocalizationAdded -= AddCustomLocalizations; PrefabManager.OnPrefabsRegistered -= OnPrefabsRegistered; if (harmony != null) { harmony.UnpatchSelf(); } assetBundle = null; } private void AddCustomLocalizations() { if (Localization.instance != null) { Localization.instance.AddWord(boxData.displayName, boxData.displayName); Localization.instance.AddWord(boxData.description, boxData.description); } } private void CreateFrostResistanceEffect() { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0064: 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_0076: 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_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Expected O, but got Unknown if (!((Object)(object)FrostResistanceEffect != (Object)null)) { SE_Stats obj = ScriptableObject.CreateInstance(); ((Object)obj).name = "SE_SneakingBoxFrostResistance"; ((StatusEffect)obj).m_name = "防寒段ボール"; ((StatusEffect)obj).m_tooltip = "段ボールの中に入り、寒さから身を守っている。"; ((StatusEffect)obj).m_icon = null; obj.m_mods = new List { new DamageModPair { m_type = (DamageType)64, m_modifier = (DamageModifier)1 }, new DamageModPair { m_type = (DamageType)32, m_modifier = (DamageModifier)1 } }; obj.m_noiseModifier = -1f; obj.m_stealthModifier = -1f; FrostResistanceEffect = (StatusEffect)(object)obj; CustomStatusEffect val = new CustomStatusEffect((StatusEffect)(object)obj, false); ItemManager.Instance.AddStatusEffect(val); ((BaseUnityPlugin)this).Logger.LogInfo((object)"[SneakingBox] 防寒段ボールStatusEffectを登録しました。"); } } private void OnPrefabsRegistered() { //IL_00ed: 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_0164: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Expected O, but got Unknown //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_0363: Unknown result type (might be due to invalid IL or missing references) //IL_036a: Expected O, but got Unknown //IL_03be: Unknown result type (might be due to invalid IL or missing references) //IL_03c4: Expected O, but got Unknown //IL_03ce: Unknown result type (might be due to invalid IL or missing references) //IL_03d4: Expected O, but got Unknown //IL_03de: Unknown result type (might be due to invalid IL or missing references) //IL_03e4: Expected O, but got Unknown //IL_0219: 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_0248: Unknown result type (might be due to invalid IL or missing references) //IL_040d: Unknown result type (might be due to invalid IL or missing references) //IL_0414: Expected O, but got Unknown //IL_0421: Unknown result type (might be due to invalid IL or missing references) //IL_0428: Expected O, but got Unknown //IL_046e: Unknown result type (might be due to invalid IL or missing references) //IL_0474: Expected O, but got Unknown //IL_047e: Unknown result type (might be due to invalid IL or missing references) //IL_0484: Expected O, but got Unknown //IL_048e: Unknown result type (might be due to invalid IL or missing references) //IL_0494: Expected O, but got Unknown //IL_049b: Unknown result type (might be due to invalid IL or missing references) //IL_04a2: Expected O, but got Unknown //IL_02f5: Unknown result type (might be due to invalid IL or missing references) //IL_030e: Unknown result type (might be due to invalid IL or missing references) PrefabManager.OnPrefabsRegistered -= OnPrefabsRegistered; try { GameObject val = PrefabManager.Instance.CreateClonedPrefab("SneakingBoxUtility", "Wood"); if ((Object)(object)val == (Object)null) { ((BaseUnityPlugin)this).Logger.LogError((object)"[SneakingBox] Woodから段ボールPrefabを作成できませんでした。"); return; } ItemDrop component = val.GetComponent(); if ((Object)(object)component == (Object)null) { ((BaseUnityPlugin)this).Logger.LogError((object)"[SneakingBox] 段ボールPrefabにItemDropがありません。"); return; } ZNetView component2 = val.GetComponent(); if ((Object)(object)component2 != (Object)null) { component2.m_persistent = true; } if (component.m_itemData != null && component.m_itemData.m_shared != null) { component.m_itemData.m_shared.m_name = boxData.displayName; component.m_itemData.m_shared.m_description = boxData.description; component.m_itemData.m_shared.m_maxStackSize = 1; component.m_itemData.m_shared.m_itemType = (ItemType)18; component.m_itemData.m_shared.m_weight = 1f; component.m_itemData.m_shared.m_armor = 0f; } for (int num = val.transform.childCount - 1; num >= 0; num--) { Object.DestroyImmediate((Object)(object)((Component)val.transform.GetChild(num)).gameObject); } val.transform.localScale = Vector3.one; GameObject val2 = new GameObject("attach"); val2.transform.SetParent(val.transform, false); val2.transform.localPosition = Vector3.zero; val2.transform.localRotation = Quaternion.identity; val2.transform.localScale = Vector3.one; if ((Object)(object)assetBundle != (Object)null) { GameObject val3 = assetBundle.LoadAsset("box1"); if ((Object)(object)val3 == (Object)null) { ((BaseUnityPlugin)this).Logger.LogError((object)"[SneakingBox] AssetBundle内に box1 がありません。"); } else { GameObject obj = Object.Instantiate(val3, val2.transform); ((Object)obj).name = "model"; obj.transform.localPosition = new Vector3(0f, 0.45f, 0f); obj.transform.localRotation = Quaternion.identity; obj.transform.localScale = new Vector3(0.8f, 0.8f, 0.8f); LODGroup[] componentsInChildren = obj.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { Object.DestroyImmediate((Object)(object)componentsInChildren[i]); } int num2 = LayerMask.NameToLayer("item"); if (num2 == -1) { num2 = 12; } Transform[] componentsInChildren2 = val.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren2.Length; i++) { ((Component)componentsInChildren2[i]).gameObject.layer = num2; } Collider[] componentsInChildren3 = val.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren3.Length; i++) { Object.DestroyImmediate((Object)(object)componentsInChildren3[i]); } BoxCollider obj2 = val.AddComponent(); obj2.center = new Vector3(0f, 0.45f, 0f); obj2.size = new Vector3(0.6f, 0.6f, 0.6f); Rigidbody val4 = val.GetComponent(); if ((Object)(object)val4 == (Object)null) { val4 = val.AddComponent(); } val4.isKinematic = false; val4.useGravity = true; } } Sprite val5 = null; if ((Object)(object)assetBundle != (Object)null) { val5 = assetBundle.LoadAsset("icon_box"); } ItemConfig val6 = new ItemConfig(); val6.Name = boxData.displayName; val6.Description = boxData.description; val6.CraftingStation = "piece_workbench"; val6.MinStationLevel = 1; val6.Weight = 1f; val6.Requirements = (RequirementConfig[])(object)new RequirementConfig[3] { new RequirementConfig("SerpentMeat", 1, 0, true), new RequirementConfig("TrophySerpent", 1, 0, true), new RequirementConfig("Torch", 1, 0, true) }; ItemConfig val7 = val6; if ((Object)(object)val5 != (Object)null) { val7.Icons = (Sprite[])(object)new Sprite[1] { val5 }; } CustomItem val8 = new CustomItem(val, true, val7); ItemManager.Instance.AddItem(val8); RecipeConfig val9 = new RecipeConfig(); val9.Name = "Recipe_SneakingBoxUtility"; val9.Item = "SneakingBoxUtility"; val9.CraftingStation = "piece_workbench"; val9.MinStationLevel = 1; val9.Amount = 1; val9.Requirements = (RequirementConfig[])(object)new RequirementConfig[3] { new RequirementConfig("SerpentMeat", 1, 0, true), new RequirementConfig("TrophySerpent", 1, 0, true), new RequirementConfig("Torch", 1, 0, true) }; CustomRecipe val10 = new CustomRecipe(val9); ItemManager.Instance.AddRecipe(val10); ((BaseUnityPlugin)this).Logger.LogInfo((object)"[SneakingBox] 段ボールアイテム登録完了。"); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("[SneakingBox] アイテム登録中にエラー:\n" + ex)); } } public static void AddBoxToTrader(Trader trader, List result) { //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Expected O, but got Unknown if ((Object)(object)trader == (Object)null || result == null) { return; } GameObject gameObject = ((Component)trader).gameObject; if ((Object)(object)gameObject == (Object)null) { return; } string name = ((Object)gameObject).name; bool flag = name.StartsWith("Haldor", StringComparison.OrdinalIgnoreCase); bool flag2 = name.StartsWith("Hildir", StringComparison.OrdinalIgnoreCase); bool flag3 = name.IndexOf("BogWitch", StringComparison.OrdinalIgnoreCase) >= 0; if ((flag && !sellAtHaldor.Value) || (flag2 && !sellAtHildir.Value) || (flag3 && !sellAtBogWitch.Value) || (!flag && !flag2 && !flag3)) { return; } for (int i = 0; i < result.Count; i++) { TradeItem val = result[i]; if (val != null && !((Object)(object)val.m_prefab == (Object)null) && ((Object)((Component)val.m_prefab).gameObject).name == "SneakingBoxUtility") { return; } } ItemDrop val2 = null; if ((Object)(object)ObjectDB.instance != (Object)null) { GameObject itemPrefab = ObjectDB.instance.GetItemPrefab("SneakingBoxUtility"); if ((Object)(object)itemPrefab != (Object)null) { val2 = itemPrefab.GetComponent(); } } if ((Object)(object)val2 == (Object)null && (Object)(object)ZNetScene.instance != (Object)null) { GameObject prefab = ZNetScene.instance.GetPrefab("SneakingBoxUtility"); if ((Object)(object)prefab != (Object)null) { val2 = prefab.GetComponent(); } } if (!((Object)(object)val2 == (Object)null)) { if (!int.TryParse(boxPrice.Value, out var result2)) { result2 = 50; } result.Add(new TradeItem { m_prefab = val2, m_stack = 1, m_price = result2, m_requiredGlobalKey = string.Empty }); Logger.LogInfo((object)("[SneakingBox] " + name + " に段ボールを追加しました。")); } } } [HarmonyPatch(typeof(Trader), "GetAvailableItems")] public static class SneakingBoxTraderPatch { private static void Postfix(Trader __instance, ref List __result) { if (!((Object)(object)__instance == (Object)null)) { if (__result == null) { __result = new List(); } SneakingBoxPlugin.AddBoxToTrader(__instance, __result); } } } public static class SneakingBoxController { private static GameObject boxVisual; private static Player currentPlayer; private static bool boxModeActive; private static readonly Dictionary originalRendererStates = new Dictionary(); public static bool IsBoxModeActive => boxModeActive; public static bool IsBoxEquipped(Player player) { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Invalid comparison between Unknown and I4 if ((Object)(object)player == (Object)null) { return false; } Inventory inventory = ((Humanoid)player).GetInventory(); if (inventory == null) { return false; } List allItems = inventory.GetAllItems(); if (allItems == null) { return false; } foreach (ItemData item in allItems) { if (item != null && item.m_shared != null && item.m_equipped && (int)item.m_shared.m_itemType == 18 && !((Object)(object)item.m_dropPrefab == (Object)null) && ((Object)item.m_dropPrefab).name == "SneakingBoxUtility") { return true; } } return false; } public static void EnterBoxMode(Player player) { if (!((Object)(object)player == (Object)null) && !boxModeActive) { currentPlayer = player; HidePlayerModel(player); CreateBoxVisual(player); AddFrostResistance(player); boxModeActive = true; } } public static void ExitBoxMode(Player player) { if ((Object)(object)player == (Object)null) { player = currentPlayer; } RemoveFrostResistance(player); DestroyBoxVisual(); RestorePlayerModel(); boxModeActive = false; currentPlayer = null; } private static void HidePlayerModel(Player player) { originalRendererStates.Clear(); GameObject visual = ((Character)player).GetVisual(); if ((Object)(object)visual == (Object)null) { return; } Renderer[] componentsInChildren = visual.GetComponentsInChildren(true); foreach (Renderer val in componentsInChildren) { if (!((Object)(object)val == (Object)null)) { originalRendererStates[val] = val.enabled; val.enabled = false; } } } public static void ReapplyPlayerModelHidden(Player player) { if ((Object)(object)player == (Object)null) { return; } GameObject visual = ((Character)player).GetVisual(); if ((Object)(object)visual == (Object)null) { return; } Renderer[] componentsInChildren = visual.GetComponentsInChildren(true); foreach (Renderer val in componentsInChildren) { if (!((Object)(object)val == (Object)null)) { if (!originalRendererStates.ContainsKey(val)) { originalRendererStates[val] = val.enabled; } val.enabled = false; } } } private static void RestorePlayerModel() { foreach (KeyValuePair originalRendererState in originalRendererStates) { Renderer key = originalRendererState.Key; if (!((Object)(object)key == (Object)null)) { key.enabled = originalRendererState.Value; } } originalRendererStates.Clear(); } private static void CreateBoxVisual(Player player) { //IL_0079: 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_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)boxVisual != (Object)null || (Object)(object)SneakingBoxPlugin.assetBundle == (Object)null) { return; } GameObject val = SneakingBoxPlugin.assetBundle.LoadAsset("box1"); if ((Object)(object)val == (Object)null) { Logger.LogError((object)"[SneakingBox] box1をAssetBundleから読み込めませんでした。"); return; } boxVisual = Object.Instantiate(val, ((Component)player).transform); ((Object)boxVisual).name = "SneakingBox_ActiveVisual"; boxVisual.transform.localPosition = new Vector3(0f, 0.6f, 0f); boxVisual.transform.localRotation = Quaternion.Euler(0f, -90f, 0f); boxVisual.transform.Rotate(Vector3.right, -90f, (Space)1); boxVisual.transform.localScale = new Vector3(0.8f, 0.8f, 0.8f); BoxCollider val2 = boxVisual.GetComponent(); if ((Object)(object)val2 == (Object)null) { val2 = boxVisual.AddComponent(); } val2.center = new Vector3(0f, 0.45f, 0f); val2.size = new Vector3(0.6f, 0.6f, 0.6f); Collider[] componentsInChildren = boxVisual.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { Object.Destroy((Object)(object)componentsInChildren[i]); } Rigidbody[] componentsInChildren2 = boxVisual.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren2.Length; i++) { Object.Destroy((Object)(object)componentsInChildren2[i]); } LODGroup[] componentsInChildren3 = boxVisual.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren3.Length; i++) { Object.Destroy((Object)(object)componentsInChildren3[i]); } } private static void DestroyBoxVisual() { if (!((Object)(object)boxVisual == (Object)null)) { Object.Destroy((Object)(object)boxVisual); boxVisual = null; } } private static void AddFrostResistance(Player player) { if ((Object)(object)player == (Object)null) { return; } StatusEffect frostResistanceEffect = SneakingBoxPlugin.FrostResistanceEffect; if ((Object)(object)frostResistanceEffect == (Object)null) { return; } SEMan sEMan = ((Character)player).GetSEMan(); if (sEMan != null) { int stableHashCode = StringExtensionMethods.GetStableHashCode(((Object)frostResistanceEffect).name); if (!sEMan.HaveStatusEffect(stableHashCode)) { sEMan.AddStatusEffect(frostResistanceEffect, false, 0, 0f); } } } private static void RemoveFrostResistance(Player player) { if ((Object)(object)player == (Object)null) { return; } StatusEffect frostResistanceEffect = SneakingBoxPlugin.FrostResistanceEffect; if ((Object)(object)frostResistanceEffect == (Object)null) { return; } SEMan sEMan = ((Character)player).GetSEMan(); if (sEMan != null) { int stableHashCode = StringExtensionMethods.GetStableHashCode(((Object)frostResistanceEffect).name); if (sEMan.HaveStatusEffect(stableHashCode)) { sEMan.RemoveStatusEffect(stableHashCode, false); } } } } [HarmonyPatch(typeof(Player), "Update")] public static class SneakingBoxPlayerUpdatePatch { private static void Postfix(Player __instance) { if ((Object)(object)__instance == (Object)null || (Object)(object)__instance != (Object)(object)Player.m_localPlayer) { return; } bool num = SneakingBoxController.IsBoxEquipped(__instance); bool flag = ((Character)__instance).IsCrouching(); if (num && flag) { if (!SneakingBoxController.IsBoxModeActive) { SneakingBoxController.EnterBoxMode(__instance); } else { SneakingBoxController.ReapplyPlayerModelHidden(__instance); } } else if (SneakingBoxController.IsBoxModeActive) { SneakingBoxController.ExitBoxMode(__instance); } } } [HarmonyPatch(typeof(Player), "GetStealthFactor")] public static class SneakingBoxStealthPatch { private static void Postfix(Player __instance, ref float __result) { if (!((Object)(object)__instance == (Object)null) && !((Object)(object)__instance != (Object)(object)Player.m_localPlayer) && SneakingBoxController.IsBoxModeActive) { __result = 0f; } } }