Decompiled source of BackpackChest v0.3.13
BepInEx/plugins/BackpackChest/BackpackChest.dll
Decompiled 2 days ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("BackpackChest")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("BackpackChest")] [assembly: AssemblyTitle("BackpackChest")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace BackpackChest { [BepInPlugin("com.yourname.backpackchest", "BackpackChest", "0.3.12")] public class BackpackChestPlugin : BaseUnityPlugin { private struct ZdoUid { public long userID; public long id; } [CompilerGenerated] private sealed class <DelayedInitialSync>d__76 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public Player player; public BackpackChestPlugin <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <DelayedInitialSync>d__76(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(0.6f); <>1__state = 1; return true; case 1: <>1__state = -1; if (!Object.op_Implicit((Object)(object)player)) { return false; } if (Object.op_Implicit((Object)(object)Player.m_localPlayer) && (Object)(object)player == (Object)(object)Player.m_localPlayer) { SyncPlayerCarryState(player); } return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <EnumerateAllZdos>d__70 : IEnumerable<ZDO>, IEnumerable, IEnumerator<ZDO>, IDisposable, IEnumerator { private int <>1__state; private ZDO <>2__current; private int <>l__initialThreadId; private FieldInfo <fiById>5__1; private FieldInfo <fiBySector>5__2; private IDictionary <dict>5__3; private IEnumerator <>s__4; private object <v>5__5; private ZDO <z>5__6; private IDictionary <dict2>5__7; private IEnumerator <>s__8; private object <v>5__9; private IEnumerable <en>5__10; private IEnumerator <>s__11; private object <it>5__12; private ZDO <z>5__13; ZDO IEnumerator<ZDO>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <EnumerateAllZdos>d__70(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; switch (num) { case -3: case 1: try { } finally { <>m__Finally1(); } break; case -5: case -4: case 2: try { if (num == -5 || num == 2) { try { } finally { <>m__Finally3(); } } } finally { <>m__Finally2(); } break; } <fiById>5__1 = null; <fiBySector>5__2 = null; <dict>5__3 = null; <>s__4 = null; <v>5__5 = null; <z>5__6 = null; <dict2>5__7 = null; <>s__8 = null; <v>5__9 = null; <en>5__10 = null; <>s__11 = null; <it>5__12 = null; <z>5__13 = null; <>1__state = -2; } private bool MoveNext() { try { switch (<>1__state) { default: return false; case 0: { <>1__state = -1; if (ZDOMan.instance == null) { return false; } <fiById>5__1 = AccessTools.Field(typeof(ZDOMan), "m_objectsByID"); object value; if (<fiById>5__1 != null) { value = <fiById>5__1.GetValue(ZDOMan.instance); <dict>5__3 = value as IDictionary; if (<dict>5__3 != null) { <>s__4 = <dict>5__3.Values.GetEnumerator(); <>1__state = -3; goto IL_012b; } <dict>5__3 = null; } <fiBySector>5__2 = AccessTools.Field(typeof(ZDOMan), "m_objectsBySector"); if (!(<fiBySector>5__2 != null)) { break; } value = <fiBySector>5__2.GetValue(ZDOMan.instance); <dict2>5__7 = value as IDictionary; if (<dict2>5__7 != null) { <>s__8 = <dict2>5__7.Values.GetEnumerator(); <>1__state = -4; goto IL_02b6; } <dict2>5__7 = null; break; } case 1: <>1__state = -3; goto IL_011d; case 2: { <>1__state = -5; goto IL_027d; } IL_02a7: <en>5__10 = null; <v>5__9 = null; goto IL_02b6; IL_011d: <z>5__6 = null; <v>5__5 = null; goto IL_012b; IL_02b6: if (<>s__8.MoveNext()) { <v>5__9 = <>s__8.Current; <en>5__10 = <v>5__9 as IEnumerable; if (<en>5__10 != null) { <>s__11 = <en>5__10.GetEnumerator(); <>1__state = -5; goto IL_028b; } goto IL_02a7; } <>m__Finally2(); <>s__8 = null; return false; IL_012b: if (<>s__4.MoveNext()) { <v>5__5 = <>s__4.Current; ref ZDO reference = ref <z>5__6; object obj = <v>5__5; reference = (ZDO)((obj is ZDO) ? obj : null); if (<z>5__6 != null) { <>2__current = <z>5__6; <>1__state = 1; return true; } goto IL_011d; } <>m__Finally1(); <>s__4 = null; return false; IL_027d: <z>5__13 = null; <it>5__12 = null; goto IL_028b; IL_028b: if (<>s__11.MoveNext()) { <it>5__12 = <>s__11.Current; ref ZDO reference2 = ref <z>5__13; object obj2 = <it>5__12; reference2 = (ZDO)((obj2 is ZDO) ? obj2 : null); if (<z>5__13 != null) { <>2__current = <z>5__13; <>1__state = 2; return true; } goto IL_027d; } <>m__Finally3(); <>s__11 = null; goto IL_02a7; } return false; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>s__4 is IDisposable disposable) { disposable.Dispose(); } } private void <>m__Finally2() { <>1__state = -1; if (<>s__8 is IDisposable disposable) { disposable.Dispose(); } } private void <>m__Finally3() { <>1__state = -4; if (<>s__11 is IDisposable disposable) { disposable.Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<ZDO> IEnumerable<ZDO>.GetEnumerator() { if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; return this; } return new <EnumerateAllZdos>d__70(0); } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<ZDO>)this).GetEnumerator(); } } public const string ModGuid = "com.yourname.backpackchest"; public const string ModName = "BackpackChest"; public const string ModVersion = "0.3.12"; internal static BackpackChestPlugin Instance = null; internal static Harmony Harmony = null; internal static ManualLogSource Log = null; internal static Sprite? CustomIconSprite; internal const string ZdoKeyCarried = "bc_carried"; internal const string ZdoKeyCarrier = "bc_carrier"; internal const string ZdoKeyNonTeleportable = "bc_nontele"; internal const string PlayerKeyHasChest = "bc_haschest"; internal const string PlayerKeyNonTele = "bc_nontele"; internal const string PlayerKeyChestZdoUser = "bc_chest_user"; internal const string PlayerKeyChestZdoId = "bc_chest_id"; internal const string SEName = "SE_BackpackChest"; internal ConfigEntry<KeyCode> EquipKey = null; internal ConfigEntry<KeyCode> DropKey = null; internal ConfigEntry<float> InteractDistance = null; internal ConfigEntry<float> ServerSyncInterval = null; internal ConfigEntry<Vector3> NetworkBackOffset = null; internal ConfigEntry<Vector3> NetworkBackEuler = null; internal ConfigEntry<Vector3> VisualLocalOffset = null; internal ConfigEntry<Vector3> VisualLocalEuler = null; internal ConfigEntry<float> VisualScale = null; internal ConfigEntry<string> VisualBoneFallbackNames = null; internal ConfigEntry<bool> ShowStatus = null; internal ConfigEntry<float> DebuffCarryWeight = null; internal ConfigEntry<float> DebuffRunSlowPercent = null; internal ConfigEntry<string> StatusName = null; internal ConfigEntry<string> StatusTooltip = null; private float _syncTimer; private static bool _rpcsRegistered; private static readonly FieldInfo? FI_Character_m_nview = AccessTools.Field(typeof(Character), "m_nview"); internal static readonly FieldInfo? FI_ZNetView_m_persistent = AccessTools.Field(typeof(ZNetView), "m_persistent"); private static readonly FieldInfo? FI_ZDO_m_uid = AccessTools.Field(typeof(ZDO), "m_uid"); private static readonly FieldInfo? FI_ZNetScene_m_instances = AccessTools.Field(typeof(ZNetScene), "m_instances"); private static readonly Type? T_ZDOID = AccessTools.TypeByName("ZDOID"); private static readonly FieldInfo? FI_ZDOID_userID = T_ZDOID?.GetField("userID"); private static readonly FieldInfo? FI_ZDOID_id = T_ZDOID?.GetField("id"); private static readonly MethodInfo? MI_ZDOMan_GetZDO = AccessTools.Method(typeof(ZDOMan), "GetZDO", new Type[1] { AccessTools.TypeByName("ZDOID") }, (Type[])null); private static readonly MethodInfo? MI_ZDO_SetPosition = AccessTools.Method(typeof(ZDO), "SetPosition", new Type[1] { typeof(Vector3) }, (Type[])null); private static readonly MethodInfo? MI_ZDO_SetRotation = AccessTools.Method(typeof(ZDO), "SetRotation", new Type[1] { typeof(Quaternion) }, (Type[])null); private static int SEHash => StableHash("SE_BackpackChest"); private static void EnsureRpcsRegistered() { if (_rpcsRegistered) { return; } ZRoutedRpc instance = ZRoutedRpc.instance; if (instance == null) { return; } instance.Register<long, long, long>("bc_request_drop_uid", (Action<long, long, long, long>)delegate(long sender, long user, long id, long playerId) { if (Object.op_Implicit((Object)(object)ZNet.instance) && ZNet.instance.IsServer()) { Player val2 = ((IEnumerable<Player>)Player.GetAllPlayers()).FirstOrDefault((Func<Player, bool>)((Player p) => Object.op_Implicit((Object)(object)p) && p.GetPlayerID() == playerId)); if (Object.op_Implicit((Object)(object)val2)) { DoDropServerByUid(user, id, val2); } } }); instance.Register<long>("bc_request_drop_self", (Action<long, long>)delegate(long sender, long playerId) { if (Object.op_Implicit((Object)(object)ZNet.instance) && ZNet.instance.IsServer()) { Player val = ((IEnumerable<Player>)Player.GetAllPlayers()).FirstOrDefault((Func<Player, bool>)((Player p) => Object.op_Implicit((Object)(object)p) && p.GetPlayerID() == playerId)); if (Object.op_Implicit((Object)(object)val)) { DoDropServerByCarrier(val); } } }); _rpcsRegistered = true; ManualLogSource log = Log; if (log != null) { log.LogInfo((object)"[BackpackChest] Routed RPCs registered"); } } internal static bool GetPersistent(ZNetView v) { try { if (FI_ZNetView_m_persistent == null || (Object)(object)v == (Object)null) { return false; } return (bool)FI_ZNetView_m_persistent.GetValue(v); } catch { return false; } } internal static void SetPersistent(ZNetView v, bool value) { try { if (!(FI_ZNetView_m_persistent == null) && !((Object)(object)v == (Object)null)) { FI_ZNetView_m_persistent.SetValue(v, value); } } catch { } } internal static int StableHash(string s) { int num = 0; for (int i = 0; i < s.Length; i++) { num = num * 31 + s[i]; } return num; } internal static ZNetView? GetCharacterNView(Character c) { if (!Object.op_Implicit((Object)(object)c)) { return null; } if (FI_Character_m_nview == null) { return null; } object? value = FI_Character_m_nview.GetValue(c); return (ZNetView?)((value is ZNetView) ? value : null); } internal static ZDO? GetCharacterZDO(Character c) { ZNetView characterNView = GetCharacterNView(c); return ((Object)(object)characterNView != (Object)null && characterNView.IsValid()) ? characterNView.GetZDO() : null; } private static ZdoUid GetZdoUid(ZDO zdo) { try { object obj = FI_ZDO_m_uid?.GetValue(zdo); if (obj == null) { return default(ZdoUid); } Type type = obj.GetType(); FieldInfo field = type.GetField("userID"); FieldInfo field2 = type.GetField("id"); long userID = 0L; long id = 0L; if (field != null) { userID = Convert.ToInt64(field.GetValue(obj)); } if (field2 != null) { id = Convert.ToInt64(field2.GetValue(obj)); } ZdoUid result = default(ZdoUid); result.userID = userID; result.id = id; return result; } catch { return default(ZdoUid); } } private static object? MakeZdoidBox(long user, long id) { try { if (T_ZDOID == null) { return null; } object obj = Activator.CreateInstance(T_ZDOID); if (obj == null) { return null; } FI_ZDOID_userID?.SetValue(obj, user); if (FI_ZDOID_id != null) { Type fieldType = FI_ZDOID_id.FieldType; object value = Convert.ChangeType(id, fieldType); FI_ZDOID_id.SetValue(obj, value); } return obj; } catch { return null; } } private static ZNetView? FindInstanceByZdoUid(long user, long id) { try { if (user == 0L || id == 0) { return null; } if ((Object)(object)ZNetScene.instance == (Object)null) { return null; } object obj = FI_ZNetScene_m_instances?.GetValue(ZNetScene.instance); if (obj is IDictionary dictionary) { object obj2 = MakeZdoidBox(user, id); if (obj2 == null) { return null; } object? obj3 = dictionary[obj2]; return (ZNetView?)((obj3 is ZNetView) ? obj3 : null); } } catch { } return null; } private static ZDO? GetZdoByUid(long user, long id) { try { if (ZDOMan.instance == null) { return null; } object obj = MakeZdoidBox(user, id); if (obj == null) { return null; } object? obj2 = MI_ZDOMan_GetZDO?.Invoke(ZDOMan.instance, new object[1] { obj }); return (ZDO?)((obj2 is ZDO) ? obj2 : null); } catch { return null; } } private static void TryWriteZdoTransformByUid(long user, long id, Vector3 pos, Quaternion rot) { //IL_0031: 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) try { ZDO zdoByUid = GetZdoByUid(user, id); if (zdoByUid != null) { if (MI_ZDO_SetPosition != null) { MI_ZDO_SetPosition.Invoke(zdoByUid, new object[1] { pos }); } if (MI_ZDO_SetRotation != null) { MI_ZDO_SetRotation.Invoke(zdoByUid, new object[1] { rot }); } } } catch { } } internal static void TryWriteZdoTransform(ZNetView view, Vector3 pos, Quaternion rot) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) try { ZDO val = ((view != null) ? view.GetZDO() : null); if (val != null) { if (MI_ZDO_SetPosition != null) { MI_ZDO_SetPosition.Invoke(val, new object[1] { pos }); } if (MI_ZDO_SetRotation != null) { MI_ZDO_SetRotation.Invoke(val, new object[1] { rot }); } } } catch { } } private void Awake() { //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0285: Unknown result type (might be due to invalid IL or missing references) //IL_028f: Expected O, but got Unknown Instance = this; Log = ((BaseUnityPlugin)this).Logger; CustomIconSprite = LoadSpriteNextToDll("backpackchest_icon.png"); EquipKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "EquipKey", (KeyCode)98, "Equip targeted Chest to your back."); DropKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "DropKey", (KeyCode)118, "Drop worn Chest."); InteractDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Controls", "InteractDistance", 4f, "Max distance from player body to chest to equip it."); ServerSyncInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Network", "SyncIntervalSeconds", 0.02f, "Server interval (seconds) to update carried chest NETWORK transform (what vanilla clients see)."); NetworkBackOffset = ((BaseUnityPlugin)this).Config.Bind<Vector3>("Network", "BackOffset", new Vector3(0f, 0.1f, -0.45f), "Offset from carrier torso for NETWORK chest."); NetworkBackEuler = ((BaseUnityPlugin)this).Config.Bind<Vector3>("Network", "BackEuler", new Vector3(0f, 180f, 0f), "Euler rotation for NETWORK chest."); VisualLocalOffset = ((BaseUnityPlugin)this).Config.Bind<Vector3>("Visual", "BoneLocalOffset", new Vector3(0f, -0.25f, -0.38f), "Local offset for VISUAL clone relative to chosen bone."); VisualLocalEuler = ((BaseUnityPlugin)this).Config.Bind<Vector3>("Visual", "BoneLocalEuler", new Vector3(0f, 180f, 0f), "Local euler rotation for VISUAL clone relative to chosen bone."); VisualScale = ((BaseUnityPlugin)this).Config.Bind<float>("Visual", "VisualScale", 1f, "Extra scale multiplier for VISUAL clone after bone scale compensation."); VisualBoneFallbackNames = ((BaseUnityPlugin)this).Config.Bind<string>("Visual", "FallbackBoneNames", "spine,spine2,Spine,Chest,UpperChest,hips,pelvis", "Bone name fragments (comma-separated) used if Animator bones unavailable."); ShowStatus = ((BaseUnityPlugin)this).Config.Bind<bool>("Debuffs", "ShowStatusEffect", true, "Show a status effect while carrying the chest."); DebuffCarryWeight = ((BaseUnityPlugin)this).Config.Bind<float>("Debuffs", "CarryWeightPenalty", 200f, "Max carry weight reduction while carrying chest."); DebuffRunSlowPercent = ((BaseUnityPlugin)this).Config.Bind<float>("Debuffs", "RunSlowPercent", 0.2f, "Run speed penalty (0.20 = 20%) while carrying chest."); StatusName = ((BaseUnityPlugin)this).Config.Bind<string>("Debuffs", "StatusName", "Сундук на спине", "Status effect name."); StatusTooltip = ((BaseUnityPlugin)this).Config.Bind<string>("Debuffs", "StatusTooltip", "Тяжёлый сундук уменьшает переносимый вес и мешает быстро бегать.\nЕсли внутри есть запрещённые предметы — телепорт блокируется.", "Status tooltip text."); Harmony = new Harmony("com.yourname.backpackchest"); Harmony.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"BackpackChest 0.3.12 loaded"); } private void Update() { //IL_0038: 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) EnsureRpcsRegistered(); Player localPlayer = Player.m_localPlayer; if (!Object.op_Implicit((Object)(object)localPlayer)) { return; } EnsureRpcsRegistered(); if (!IsUserTyping()) { if (Input.GetKeyDown(EquipKey.Value)) { TryEquipLookTarget(localPlayer); } if (Input.GetKeyDown(DropKey.Value)) { TryDrop(localPlayer); } } if (Object.op_Implicit((Object)(object)ZNet.instance) && ZNet.instance.IsServer()) { _syncTimer += Time.deltaTime; float num = Mathf.Max(0.005f, ServerSyncInterval.Value); if (!(_syncTimer < num)) { _syncTimer = 0f; SyncAllCarriedChests_Server(); } } } private static bool IsUserTyping() { try { Console instance = Console.instance; if ((Object)(object)instance != (Object)null) { MethodInfo method = ((object)instance).GetType().GetMethod("IsVisible", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (method != null && method.ReturnType == typeof(bool)) { if ((bool)method.Invoke(instance, null)) { return true; } } else { FieldInfo field = ((object)instance).GetType().GetField("m_visible", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null && field.FieldType == typeof(bool) && (bool)field.GetValue(instance)) { return true; } } } Chat instance2 = Chat.instance; if ((Object)(object)instance2 != (Object)null) { object obj = null; FieldInfo fieldInfo = ((object)instance2).GetType().GetField("m_input", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) ?? ((object)instance2).GetType().GetField("m_inputField", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) ?? ((object)instance2).GetType().GetField("m_inputFieldGamepad", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (fieldInfo != null) { obj = fieldInfo.GetValue(instance2); } if (obj != null) { Type type = obj.GetType(); PropertyInfo property = type.GetProperty("isFocused", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (property != null && property.PropertyType == typeof(bool) && (bool)property.GetValue(obj)) { return true; } MethodInfo methodInfo = type.GetMethod("IsFocused", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) ?? type.GetMethod("HasFocus", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (methodInfo != null && methodInfo.ReturnType == typeof(bool) && methodInfo.GetParameters().Length == 0 && (bool)methodInfo.Invoke(obj, null)) { return true; } FieldInfo fieldInfo2 = type.GetField("m_isFocused", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) ?? type.GetField("isFocused", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (fieldInfo2 != null && fieldInfo2.FieldType == typeof(bool) && (bool)fieldInfo2.GetValue(obj)) { return true; } } FieldInfo field2 = ((object)instance2).GetType().GetField("m_chatWindow", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field2 != null) { object? value = field2.GetValue(instance2); GameObject val = (GameObject)((value is GameObject) ? value : null); if ((Object)(object)val != (Object)null && val.activeInHierarchy) { return true; } } } } catch { } return false; } private void TryEquipLookTarget(Player player) { //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)BackpackChestState.GetCarriedChestView(player) != (Object)null) { Message(player, "У тебя уже есть сундук на спине."); return; } if ((Object)(object)GameCamera.instance == (Object)null) { Message(player, "Камера не найдена."); return; } RaycastHit val = default(RaycastHit); if (!Physics.Raycast(((Component)GameCamera.instance).transform.position, ((Component)GameCamera.instance).transform.forward, ref val, 30f, -1, (QueryTriggerInteraction)1)) { Message(player, "Не вижу сундук."); return; } ZNetView val2 = (Object.op_Implicit((Object)(object)((RaycastHit)(ref val)).collider) ? ((Component)((RaycastHit)(ref val)).collider).GetComponentInParent<ZNetView>() : null); if (!Object.op_Implicit((Object)(object)val2) || !val2.IsValid()) { Message(player, "Это не сетевой объект."); return; } float effectiveInteractDistance = GetEffectiveInteractDistance(player); if ((Object)(object)((RaycastHit)(ref val)).collider == (Object)null) { Message(player, "Не вижу коллайдер сундука."); return; } Vector3 bodyInteractOrigin = GetBodyInteractOrigin(player); Vector3 val3 = ((RaycastHit)(ref val)).collider.ClosestPoint(bodyInteractOrigin); float num = Vector3.Distance(bodyInteractOrigin, val3); if (num > effectiveInteractDistance) { Message(player, "Слишком далеко."); return; } string text = PrefabNameFromInstanceName(((Object)((Component)val2).gameObject).name); if (!string.Equals(text, "Chest", StringComparison.Ordinal)) { Message(player, "Это не Chest, а: " + text); return; } ZDO zDO = val2.GetZDO(); if (zDO == null) { Message(player, "ZDO недоступен."); return; } if (zDO.GetBool("bc_carried", false)) { Message(player, "Этот сундук уже у кого-то на спине."); return; } bool flag = ChestInventoryHasNonTeleportable(val2); val2.ClaimOwnership(); zDO.Set("bc_nontele", flag); zDO.Set("bc_carried", true); zDO.Set("bc_carrier", player.GetPlayerID()); ZDO characterZDO = GetCharacterZDO((Character)(object)player); if (characterZDO != null) { ZdoUid zdoUid = GetZdoUid(zDO); characterZDO.Set("bc_chest_user", zdoUid.userID); characterZDO.Set("bc_chest_id", zdoUid.id); } EnsureFollower(val2); SyncPlayerCarryState(player); Message(player, "Сундук экипирован на спину."); } private void TryDrop(Player player) { if (!Object.op_Implicit((Object)(object)player)) { return; } EnsureRpcsRegistered(); ZDO characterZDO = GetCharacterZDO((Character)(object)player); if (characterZDO == null) { Message(player, "ZDO игрока недоступен."); return; } bool @bool = characterZDO.GetBool("bc_haschest", false); long @long = characterZDO.GetLong("bc_chest_user", 0L); long long2 = characterZDO.GetLong("bc_chest_id", 0L); ZNetView carriedChestView = BackpackChestState.GetCarriedChestView(player); if (Object.op_Implicit((Object)(object)carriedChestView) && carriedChestView.IsValid()) { RemoveChestStatus(player); characterZDO.Set("bc_haschest", false); characterZDO.Set("bc_nontele", false); characterZDO.Set("bc_chest_user", 0); characterZDO.Set("bc_chest_id", 0); SyncPlayerCarryState(player); if (Object.op_Implicit((Object)(object)ZNet.instance) && !ZNet.instance.IsServer()) { carriedChestView.InvokeRPC("bc_request_drop", new object[1] { player.GetPlayerID() }); } else { DoDropServer(carriedChestView, player); } } else if (@bool && @long != 0L && long2 != 0) { RemoveChestStatus(player); characterZDO.Set("bc_haschest", false); characterZDO.Set("bc_nontele", false); characterZDO.Set("bc_chest_user", 0); characterZDO.Set("bc_chest_id", 0); SyncPlayerCarryState(player); if (ZRoutedRpc.instance != null) { ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.Everybody, "bc_request_drop_uid", new object[3] { @long, long2, player.GetPlayerID() }); } } else if (@bool) { RemoveChestStatus(player); characterZDO.Set("bc_haschest", false); characterZDO.Set("bc_nontele", false); characterZDO.Set("bc_chest_user", 0); characterZDO.Set("bc_chest_id", 0); SyncPlayerCarryState(player); if (ZRoutedRpc.instance != null) { ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.Everybody, "bc_request_drop_self", new object[1] { player.GetPlayerID() }); } } else { Message(player, "На спине нет сундука."); } } private void SyncAllCarriedChests_Server() { //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Unknown result type (might be due to invalid IL or missing references) List<Player> allPlayers = Player.GetAllPlayers(); if (allPlayers == null || allPlayers.Count == 0) { return; } foreach (Player item in allPlayers) { if (!Object.op_Implicit((Object)(object)item)) { continue; } ZDO characterZDO = GetCharacterZDO((Character)(object)item); if (characterZDO == null || !characterZDO.GetBool("bc_haschest", false)) { continue; } long @long = characterZDO.GetLong("bc_chest_user", 0L); long long2 = characterZDO.GetLong("bc_chest_id", 0L); if (@long == 0L || long2 == 0) { continue; } ComputeNetworkBackTransform(item, out var pos, out var rot); TryWriteZdoTransformByUid(@long, long2, pos, rot); ZNetView val = FindInstanceByZdoUid(@long, long2); if ((Object)(object)val == (Object)null || !val.IsValid()) { continue; } ZDO zDO = val.GetZDO(); if (zDO != null && zDO.GetBool("bc_carried", false) && zDO.GetLong("bc_carrier", 0L) == item.GetPlayerID()) { EnsureFollower(val); ((Component)val).transform.SetPositionAndRotation(pos, rot); TryWriteZdoTransform(val, pos, rot); if (!val.IsOwner()) { val.ClaimOwnership(); } } } } internal void ComputeNetworkBackTransform(Player carrier, out Vector3 pos, out Quaternion rot) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_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) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0040: 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_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) Quaternion rotation = ((Component)carrier).transform.rotation; Vector3 val = ((Component)carrier).transform.position + Vector3.up * 1f; pos = val + rotation * NetworkBackOffset.Value; rot = rotation * Quaternion.Euler(NetworkBackEuler.Value); } internal Transform? FindBackBone(Player carrier) { Animator componentInChildren = ((Component)carrier).GetComponentInChildren<Animator>(); if ((Object)(object)componentInChildren != (Object)null) { Transform boneTransform = componentInChildren.GetBoneTransform((HumanBodyBones)54); if ((Object)(object)boneTransform != (Object)null) { return boneTransform; } boneTransform = componentInChildren.GetBoneTransform((HumanBodyBones)8); if ((Object)(object)boneTransform != (Object)null) { return boneTransform; } boneTransform = componentInChildren.GetBoneTransform((HumanBodyBones)7); if ((Object)(object)boneTransform != (Object)null) { return boneTransform; } boneTransform = componentInChildren.GetBoneTransform((HumanBodyBones)0); if ((Object)(object)boneTransform != (Object)null) { return boneTransform; } } string[] array = (from s in (VisualBoneFallbackNames.Value ?? "").Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries) select s.Trim() into s where s.Length > 0 select s).ToArray(); if (array.Length == 0) { array = new string[4] { "spine", "chest", "hips", "pelvis" }; } Queue<Transform> queue = new Queue<Transform>(); queue.Enqueue(((Component)carrier).transform); while (queue.Count > 0) { Transform val = queue.Dequeue(); string[] array2 = array; foreach (string value in array2) { if (((Object)val).name.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0) { return val; } } for (int j = 0; j < val.childCount; j++) { queue.Enqueue(val.GetChild(j)); } } return null; } private static Player? FindPlayerById(long playerId) { foreach (Player allPlayer in Player.GetAllPlayers()) { if (Object.op_Implicit((Object)(object)allPlayer) && allPlayer.GetPlayerID() == playerId) { return allPlayer; } } return null; } internal static void DoDropServer(ZNetView chestView, Player carrier) { //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: 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_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: 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_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)chestView) || !chestView.IsValid()) { return; } ZDO zDO = chestView.GetZDO(); if (zDO == null || !zDO.GetBool("bc_carried", false)) { return; } long @long = zDO.GetLong("bc_carrier", 0L); if (@long == carrier.GetPlayerID()) { zDO.Set("bc_carried", false); ZDO characterZDO = GetCharacterZDO((Character)(object)carrier); if (characterZDO != null) { characterZDO.Set("bc_haschest", false); characterZDO.Set("bc_nontele", false); characterZDO.Set("bc_chest_user", 0); characterZDO.Set("bc_chest_id", 0); } Vector3 val = ((Component)carrier).transform.position - ((Component)carrier).transform.forward * 0.8f + Vector3.up * 0.2f; ((Component)chestView).transform.position = val; TryWriteZdoTransform(chestView, val, ((Component)chestView).transform.rotation); EnsureFollower(chestView); } } internal static void DoDropServerByUid(long user, long id, Player carrier) { //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_0129: 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_015c: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)carrier) || user == 0L || id == 0) { return; } ZDO zdoByUid = GetZdoByUid(user, id); if (zdoByUid == null || !zdoByUid.GetBool("bc_carried", false) || zdoByUid.GetLong("bc_carrier", 0L) != carrier.GetPlayerID()) { return; } zdoByUid.Set("bc_carried", false); zdoByUid.Set("bc_carrier", 0L); ZDO characterZDO = GetCharacterZDO((Character)(object)carrier); if (characterZDO != null) { characterZDO.Set("bc_haschest", false); characterZDO.Set("bc_nontele", false); characterZDO.Set("bc_chest_user", 0); characterZDO.Set("bc_chest_id", 0); } Vector3 val = ((Component)carrier).transform.position - ((Component)carrier).transform.forward * 0.8f + Vector3.up * 0.2f; Quaternion rotation = ((Component)carrier).transform.rotation; TryWriteZdoTransformByUid(user, id, val, rotation); ZNetView val2 = FindInstanceByZdoUid(user, id); if ((Object)(object)val2 != (Object)null && val2.IsValid()) { ((Component)val2).transform.SetPositionAndRotation(val, rotation); TryWriteZdoTransform(val2, val, rotation); EnsureFollower(val2); if (!val2.IsOwner()) { val2.ClaimOwnership(); } } } internal static void DoDropServerByCarrier(Player carrier) { //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0125: 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_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)carrier)) { return; } ZDO val = FindCarriedChestZdo(carrier.GetPlayerID()); if (val == null) { return; } ZdoUid zdoUid = GetZdoUid(val); if (zdoUid.userID != 0L && zdoUid.id != 0) { DoDropServerByUid(zdoUid.userID, zdoUid.id, carrier); } else { if (!val.GetBool("bc_carried", false) || val.GetLong("bc_carrier", 0L) != carrier.GetPlayerID()) { return; } val.Set("bc_carried", false); val.Set("bc_carrier", 0L); ZDO characterZDO = GetCharacterZDO((Character)(object)carrier); if (characterZDO != null) { characterZDO.Set("bc_haschest", false); characterZDO.Set("bc_nontele", false); characterZDO.Set("bc_chest_user", 0); characterZDO.Set("bc_chest_id", 0); } Vector3 val2 = ((Component)carrier).transform.position - ((Component)carrier).transform.forward * 0.8f + Vector3.up * 0.2f; Quaternion rotation = ((Component)carrier).transform.rotation; try { if (MI_ZDO_SetPosition != null) { MI_ZDO_SetPosition.Invoke(val, new object[1] { val2 }); } if (MI_ZDO_SetRotation != null) { MI_ZDO_SetRotation.Invoke(val, new object[1] { rotation }); } } catch { } } } private static ZDO? FindCarriedChestZdo(long carrierId) { try { foreach (ZDO item in EnumerateAllZdos()) { if (item == null || !item.GetBool("bc_carried", false) || item.GetLong("bc_carrier", 0L) != carrierId) { continue; } return item; } } catch { } return null; } [IteratorStateMachine(typeof(<EnumerateAllZdos>d__70))] private static IEnumerable<ZDO> EnumerateAllZdos() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <EnumerateAllZdos>d__70(-2); } internal static void Message(Player p, string text) { ((Character)p).Message((MessageType)2, text, 0, (Sprite)null); } internal static bool WorldAllowsTeleportAllItems() { try { ZoneSystem instance = ZoneSystem.instance; if ((Object)(object)instance != (Object)null) { MethodInfo methodInfo = AccessTools.Method(((object)instance).GetType(), "GetGlobalKey", new Type[1] { typeof(string) }, (Type[])null); if (methodInfo != null) { object obj = methodInfo.Invoke(instance, new object[1] { "TeleportAll" }); bool flag = default(bool); int num; if (obj is bool) { flag = (bool)obj; num = 1; } else { num = 0; } if (((uint)num & (flag ? 1u : 0u)) != 0) { return true; } } FieldInfo fieldInfo = AccessTools.Field(((object)instance).GetType(), "m_globalKeys"); if (fieldInfo != null && fieldInfo.GetValue(instance) is IEnumerable<string> enumerable) { foreach (string item in enumerable) { if (string.Equals(item, "TeleportAll", StringComparison.OrdinalIgnoreCase)) { return true; } } } } } catch { } return false; } internal float GetEffectiveInteractDistance(Player player) { try { FieldInfo fieldInfo = AccessTools.Field(typeof(Player), "m_maxInteractDistance"); if (fieldInfo != null && fieldInfo.FieldType == typeof(float)) { float num = (float)fieldInfo.GetValue(player); if (num > 0.1f) { return num; } } } catch { } return Mathf.Max(0.1f, InteractDistance.Value); } internal static Vector3 GetBodyInteractOrigin(Player player) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) return ((Component)player).transform.position + Vector3.up * 1f; } internal static void SyncPlayerCarryState(Player player) { if (!Object.op_Implicit((Object)(object)player)) { return; } ZDO characterZDO = GetCharacterZDO((Character)(object)player); if (characterZDO == null) { return; } ZNetView carriedChestView = BackpackChestState.GetCarriedChestView(player); if (Object.op_Implicit((Object)(object)carriedChestView) && carriedChestView.IsValid()) { bool flag = false; ZDO zDO = carriedChestView.GetZDO(); if (zDO != null) { flag = zDO.GetBool("bc_nontele", false); } if (zDO != null) { ZdoUid zdoUid = GetZdoUid(zDO); if (zdoUid.userID != 0L && zdoUid.id != 0) { characterZDO.Set("bc_chest_user", zdoUid.userID); characterZDO.Set("bc_chest_id", zdoUid.id); } } characterZDO.Set("bc_haschest", true); characterZDO.Set("bc_nontele", flag); AddChestStatus(player); return; } if (characterZDO.GetBool("bc_haschest", false)) { long @long = characterZDO.GetLong("bc_chest_user", 0L); long long2 = characterZDO.GetLong("bc_chest_id", 0L); if (@long != 0L && long2 != 0) { return; } } characterZDO.Set("bc_haschest", false); characterZDO.Set("bc_nontele", false); RemoveChestStatus(player); } [IteratorStateMachine(typeof(<DelayedInitialSync>d__76))] internal IEnumerator DelayedInitialSync(Player player) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <DelayedInitialSync>d__76(0) { <>4__this = this, player = player }; } private static void EnsureFollower(ZNetView nview) { if (Object.op_Implicit((Object)(object)nview) && !((Object)(object)((Component)nview).GetComponent<BackpackChestFollower>() != (Object)null)) { ((Component)nview).gameObject.AddComponent<BackpackChestFollower>(); } } internal static string PrefabNameFromInstanceName(string instanceName) { return instanceName.EndsWith("(Clone)", StringComparison.Ordinal) ? instanceName.Substring(0, instanceName.Length - "(Clone)".Length) : instanceName; } private static bool ChestInventoryHasNonTeleportable(ZNetView chestView) { if (!Object.op_Implicit((Object)(object)chestView) || !chestView.IsValid()) { return false; } Container componentInChildren = ((Component)chestView).GetComponentInChildren<Container>(); if (!Object.op_Implicit((Object)(object)componentInChildren)) { return false; } Inventory inventory = componentInChildren.GetInventory(); if (inventory == null) { return false; } List<ItemData> allItems = inventory.GetAllItems(); for (int i = 0; i < allItems.Count; i++) { ItemData val = allItems[i]; if (val?.m_shared != null && !val.m_shared.m_teleportable) { return true; } } return false; } internal static void AddChestStatus(Player p) { if (!Instance.ShowStatus.Value || !Object.op_Implicit((Object)(object)p)) { return; } ObjectDB instance = ObjectDB.instance; StatusEffect val = null; if ((Object)(object)instance != (Object)null) { val = instance.GetStatusEffect(SEHash); if ((Object)(object)val == (Object)null && instance.m_StatusEffects != null) { val = ((IEnumerable<StatusEffect>)instance.m_StatusEffects).FirstOrDefault((Func<StatusEffect, bool>)((StatusEffect x) => Object.op_Implicit((Object)(object)x) && ((Object)x).name == "SE_BackpackChest")); } SE_Stats val2 = (SE_Stats)(object)((val is SE_Stats) ? val : null); if (val2 != null) { ((StatusEffect)val2).m_name = Instance.StatusName.Value; ((StatusEffect)val2).m_tooltip = Instance.StatusTooltip.Value; } } SEMan sEMan = ((Character)p).GetSEMan(); if (sEMan == null) { return; } if ((Object)(object)val != (Object)null) { if (!SEManBridge.TryAdd(sEMan, val)) { sEMan.AddStatusEffect(SEHash, true, 0, 0f); } return; } if ((Object)(object)ObjectDB.instance != (Object)null) { BackpackChestStatusRegistrar.Ensure(ObjectDB.instance); } sEMan.AddStatusEffect(SEHash, true, 0, 0f); } internal static void RemoveChestStatus(Player p) { if (!Object.op_Implicit((Object)(object)p)) { return; } SEMan sEMan = ((Character)p).GetSEMan(); if (sEMan == null) { return; } try { ObjectDB instance = ObjectDB.instance; StatusEffect val = null; if ((Object)(object)instance != (Object)null) { val = instance.GetStatusEffect(SEHash); if ((Object)(object)val == (Object)null && instance.m_StatusEffects != null) { val = ((IEnumerable<StatusEffect>)instance.m_StatusEffects).FirstOrDefault((Func<StatusEffect, bool>)((StatusEffect x) => Object.op_Implicit((Object)(object)x) && ((Object)x).name == "SE_BackpackChest")); } } if ((Object)(object)val != (Object)null && SEManBridge.TryRemove(sEMan, val)) { return; } } catch { } sEMan.RemoveStatusEffect(SEHash, true); } internal static Sprite? LoadSpriteNextToDll(string fileName, int pixelsPerUnit = 100) { //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Expected O, but got Unknown //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) try { string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)Instance).Info.Location); if (string.IsNullOrEmpty(directoryName)) { return null; } string text = Path.Combine(directoryName, fileName); if (!File.Exists(text)) { Log.LogWarning((object)("Icon file not found: " + text)); return null; } byte[] data = File.ReadAllBytes(text); Texture2D val = new Texture2D(2, 2, (TextureFormat)4, false); if (!LoadImageCompat(val, data)) { Log.LogWarning((object)("Failed to decode icon PNG: " + text)); return null; } ((Texture)val).wrapMode = (TextureWrapMode)1; ((Texture)val).filterMode = (FilterMode)1; return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f), (float)pixelsPerUnit); } catch (Exception arg) { Log.LogWarning((object)$"LoadSpriteNextToDll failed: {arg}"); return null; } } internal static bool LoadImageCompat(Texture2D tex, byte[] data) { try { MethodInfo method = typeof(Texture2D).GetMethod("LoadImage", BindingFlags.Instance | BindingFlags.Public, null, new Type[1] { typeof(byte[]) }, null); if (method != null) { object obj = method.Invoke(tex, new object[1] { data }); bool flag = default(bool); int num; if (obj is bool) { flag = (bool)obj; num = 1; } else { num = 0; } return (byte)((uint)num & (flag ? 1u : 0u)) != 0; } MethodInfo methodInfo = Type.GetType("UnityEngine.ImageConversion, UnityEngine.ImageConversionModule")?.GetMethod("LoadImage", BindingFlags.Static | BindingFlags.Public, null, new Type[2] { typeof(Texture2D), typeof(byte[]) }, null); if (methodInfo != null) { object obj2 = methodInfo.Invoke(null, new object[2] { tex, data }); bool flag2 = default(bool); int num2; if (obj2 is bool) { flag2 = (bool)obj2; num2 = 1; } else { num2 = 0; } return (byte)((uint)num2 & (flag2 ? 1u : 0u)) != 0; } } catch { } return false; } } internal static class BackpackChestState { internal static ZNetView? GetCarriedChestView(Player player) { if (!Object.op_Implicit((Object)(object)player)) { return null; } ZDO characterZDO = BackpackChestPlugin.GetCharacterZDO((Character)(object)player); if (characterZDO != null) { long @long = characterZDO.GetLong("bc_chest_user", 0L); long long2 = characterZDO.GetLong("bc_chest_id", 0L); if (@long != 0L && long2 != 0) { object? obj = AccessTools.Method(typeof(BackpackChestPlugin), "FindInstanceByZdoUid", (Type[])null, (Type[])null)?.Invoke(null, new object[2] { @long, long2 }); ZNetView val = (ZNetView)((obj is ZNetView) ? obj : null); if ((Object)(object)val != (Object)null && val.IsValid()) { ZDO zDO = val.GetZDO(); if (zDO != null && zDO.GetBool("bc_carried", false) && zDO.GetLong("bc_carrier", 0L) == player.GetPlayerID() && BackpackChestPlugin.PrefabNameFromInstanceName(((Object)((Component)val).gameObject).name) == "Chest") { return val; } } } } ZNetView[] array = Object.FindObjectsByType<ZNetView>((FindObjectsSortMode)0); foreach (ZNetView val2 in array) { if (!Object.op_Implicit((Object)(object)val2) || !val2.IsValid()) { continue; } ZDO zDO2 = val2.GetZDO(); if (zDO2 != null && zDO2.GetBool("bc_carried", false) && zDO2.GetLong("bc_carrier", 0L) == player.GetPlayerID()) { string a = BackpackChestPlugin.PrefabNameFromInstanceName(((Object)((Component)val2).gameObject).name); if (string.Equals(a, "Chest", StringComparison.Ordinal)) { return val2; } } } return null; } } [HarmonyPatch(typeof(Container), "Interact")] internal static class ContainerInteractPatch { [HarmonyPrefix] private static bool Prefix(Container __instance, Humanoid character, bool hold, bool alt, ref bool __result) { if ((Object)(object)__instance == (Object)null || (Object)(object)character == (Object)null) { return true; } Player val = (Player)(object)((character is Player) ? character : null); if (val == null) { return true; } ZNetView component = ((Component)__instance).GetComponent<ZNetView>(); if (!Object.op_Implicit((Object)(object)component) || !component.IsValid()) { return true; } string a = BackpackChestPlugin.PrefabNameFromInstanceName(((Object)((Component)component).gameObject).name); if (!string.Equals(a, "Chest", StringComparison.Ordinal)) { return true; } ZDO zDO = component.GetZDO(); if (zDO == null) { return true; } if (zDO.GetBool("bc_carried", false)) { BackpackChestPlugin.Message(val, "Нельзя открыть сундук, пока он на спине."); __result = false; return false; } return true; } } [HarmonyPatch(typeof(ZNetView), "Awake")] internal static class ZNetViewAwakePatch { [HarmonyPostfix] private static void Postfix(ZNetView __instance) { ZNetView __instance2 = __instance; if (!Object.op_Implicit((Object)(object)__instance2) || !__instance2.IsValid()) { return; } string a = BackpackChestPlugin.PrefabNameFromInstanceName(((Object)((Component)__instance2).gameObject).name); if (string.Equals(a, "Chest", StringComparison.Ordinal) && (Object)(object)((Component)__instance2).GetComponent<BackpackChestFollower>() == (Object)null) { ((Component)__instance2).gameObject.AddComponent<BackpackChestFollower>(); } __instance2.Register<long>("bc_request_drop", (Action<long, long>)delegate(long sender, long playerId) { if (Object.op_Implicit((Object)(object)ZNet.instance) && ZNet.instance.IsServer()) { Player val = ((IEnumerable<Player>)Player.GetAllPlayers()).FirstOrDefault((Func<Player, bool>)((Player p) => Object.op_Implicit((Object)(object)p) && p.GetPlayerID() == playerId)); if (Object.op_Implicit((Object)(object)val)) { string a2 = BackpackChestPlugin.PrefabNameFromInstanceName(((Object)((Component)__instance2).gameObject).name); if (string.Equals(a2, "Chest", StringComparison.Ordinal)) { BackpackChestPlugin.DoDropServer(__instance2, val); } } } }); } } internal static class BackpackChestStatusRegistrar { private static readonly MethodInfo? MI_UpdateRegisters = AccessTools.Method(typeof(ObjectDB), "UpdateRegisters", (Type[])null, (Type[])null); internal static void Ensure(ObjectDB db) { if (!Object.op_Implicit((Object)(object)db) || db.m_StatusEffects == null) { return; } StatusEffect? obj = ((IEnumerable<StatusEffect>)db.m_StatusEffects).FirstOrDefault((Func<StatusEffect, bool>)((StatusEffect se) => Object.op_Implicit((Object)(object)se) && ((Object)se).name == "SE_BackpackChest")); SE_Stats val = (SE_Stats)(object)((obj is SE_Stats) ? obj : null); if ((Object)(object)val == (Object)null) { val = ScriptableObject.CreateInstance<SE_Stats>(); ((Object)val).name = "SE_BackpackChest"; db.m_StatusEffects.Add((StatusEffect)(object)val); } if ((Object)(object)BackpackChestPlugin.Instance != (Object)null) { ((StatusEffect)val).m_name = BackpackChestPlugin.Instance.StatusName.Value; ((StatusEffect)val).m_tooltip = BackpackChestPlugin.Instance.StatusTooltip.Value; if ((Object)(object)BackpackChestPlugin.CustomIconSprite == (Object)null) { BackpackChestPlugin.CustomIconSprite = BackpackChestPlugin.LoadSpriteNextToDll("backpackchest_icon.png"); } if ((Object)(object)BackpackChestPlugin.CustomIconSprite != (Object)null) { ((StatusEffect)val).m_icon = BackpackChestPlugin.CustomIconSprite; } val.m_addMaxCarryWeight = 0f; } try { MI_UpdateRegisters?.Invoke(db, Array.Empty<object>()); } catch { } } } internal static class BackpackChestBuildRegistrar { [CompilerGenerated] private sealed class <EnsureDelayed>d__1 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; private int <i>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <EnsureDelayed>d__1(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; if (_applied) { return false; } <i>5__1 = 0; break; case 1: <>1__state = -1; <i>5__1++; break; } if (<i>5__1 < 120 && (!Object.op_Implicit((Object)(object)ObjectDB.instance) || !Object.op_Implicit((Object)(object)ZNetScene.instance))) { <>2__current = null; <>1__state = 1; return true; } Apply(); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static bool _applied; [IteratorStateMachine(typeof(<EnsureDelayed>d__1))] internal static IEnumerator EnsureDelayed() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <EnsureDelayed>d__1(0); } private static void Apply() { //IL_013a: Unknown result type (might be due to invalid IL or missing references) if (_applied) { return; } ObjectDB instance = ObjectDB.instance; ZNetScene instance2 = ZNetScene.instance; if (!Object.op_Implicit((Object)(object)instance) || !Object.op_Implicit((Object)(object)instance2)) { return; } GameObject itemPrefab = instance.GetItemPrefab("Hammer"); if (!Object.op_Implicit((Object)(object)itemPrefab)) { ManualLogSource log = BackpackChestPlugin.Log; if (log != null) { log.LogWarning((object)"Hammer prefab not found in ObjectDB."); } return; } PieceTable val = itemPrefab.GetComponent<ItemDrop>()?.m_itemData?.m_shared?.m_buildPieces; if (!Object.op_Implicit((Object)(object)val)) { ManualLogSource log2 = BackpackChestPlugin.Log; if (log2 != null) { log2.LogWarning((object)"Hammer has no PieceTable (m_buildPieces)."); } return; } GameObject prefab = instance2.GetPrefab("Chest"); if (!Object.op_Implicit((Object)(object)prefab)) { ManualLogSource log3 = BackpackChestPlugin.Log; if (log3 != null) { log3.LogWarning((object)"Prefab 'Chest' not found in ZNetScene."); } return; } Piece val2 = prefab.GetComponent<Piece>() ?? prefab.AddComponent<Piece>(); if (string.IsNullOrEmpty(val2.m_name)) { val2.m_name = "$piece_chest"; } val2.m_category = (PieceCategory)4; GameObject prefab2 = instance2.GetPrefab("forge"); CraftingStation val3 = (Object.op_Implicit((Object)(object)prefab2) ? prefab2.GetComponent<CraftingStation>() : null); if (!Object.op_Implicit((Object)(object)val3)) { ManualLogSource log4 = BackpackChestPlugin.Log; if (log4 != null) { log4.LogWarning((object)"Forge crafting station not found (prefab 'forge')."); } return; } val2.m_craftingStation = val3; GameObject itemPrefab2 = instance.GetItemPrefab("FineWood"); GameObject itemPrefab3 = instance.GetItemPrefab("Tin"); if (!Object.op_Implicit((Object)(object)itemPrefab2) || !Object.op_Implicit((Object)(object)itemPrefab3)) { ManualLogSource log5 = BackpackChestPlugin.Log; if (log5 != null) { log5.LogWarning((object)"FineWood or Tin prefab not found in ObjectDB."); } return; } val2.m_resources = (Requirement[])(object)new Requirement[2] { NewReq(itemPrefab2, 40, recover: true), NewReq(itemPrefab3, 20, recover: true) }; if ((Object)(object)BackpackChestPlugin.CustomIconSprite != (Object)null) { val2.m_icon = BackpackChestPlugin.CustomIconSprite; } if (val.m_pieces == null) { val.m_pieces = new List<GameObject>(); } if (!val.m_pieces.Contains(prefab)) { val.m_pieces.Add(prefab); } ReorderToFirstFurniture(val, prefab); _applied = true; ManualLogSource log6 = BackpackChestPlugin.Log; if (log6 != null) { log6.LogInfo((object)"Added prefab 'Chest' to Hammer/Furniture with Forge requirement and custom cost."); } } private static void ReorderToFirstFurniture(PieceTable pieceTable, GameObject chestPrefab) { //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Invalid comparison between Unknown and I4 if (pieceTable.m_pieces == null) { return; } pieceTable.m_pieces.Remove(chestPrefab); int index = 0; for (int i = 0; i < pieceTable.m_pieces.Count; i++) { GameObject val = pieceTable.m_pieces[i]; if (Object.op_Implicit((Object)(object)val)) { Piece component = val.GetComponent<Piece>(); if ((Object)(object)component != (Object)null && (int)component.m_category == 4) { index = i; break; } } } pieceTable.m_pieces.Insert(index, chestPrefab); } private static Requirement NewReq(GameObject itemPrefab, int amount, bool recover) { //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_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown return new Requirement { m_resItem = itemPrefab.GetComponent<ItemDrop>(), m_amount = amount, m_recover = recover }; } } [HarmonyPatch(typeof(ObjectDB), "Awake")] internal static class ObjectDBAwake_BackpackChestSE { [HarmonyPostfix] private static void Postfix(ObjectDB __instance) { BackpackChestStatusRegistrar.Ensure(__instance); if ((Object)(object)BackpackChestPlugin.Instance != (Object)null) { ((MonoBehaviour)BackpackChestPlugin.Instance).StartCoroutine(BackpackChestBuildRegistrar.EnsureDelayed()); } } } [HarmonyPatch(typeof(ObjectDB), "CopyOtherDB")] internal static class ObjectDBCopyOtherDB_BackpackChestSE { [HarmonyPostfix] private static void Postfix(ObjectDB __instance) { BackpackChestStatusRegistrar.Ensure(__instance); if ((Object)(object)BackpackChestPlugin.Instance != (Object)null) { ((MonoBehaviour)BackpackChestPlugin.Instance).StartCoroutine(BackpackChestBuildRegistrar.EnsureDelayed()); } } } [HarmonyPatch] internal static class CarryWeightPenaltyPatch { [HarmonyTargetMethod] private static MethodBase? TargetMethod() { MethodInfo methodInfo = AccessTools.Method(typeof(Player), "GetMaxCarryWeight", (Type[])null, (Type[])null); if (methodInfo != null && methodInfo.ReturnType == typeof(float)) { return methodInfo; } MethodInfo[] methods = typeof(Player).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (MethodInfo methodInfo2 in methods) { if (methodInfo2.Name == "GetMaxCarryWeight" && methodInfo2.ReturnType == typeof(float)) { return methodInfo2; } } return null; } [HarmonyPostfix] private static void Postfix(Player __instance, ref float __result) { if (Object.op_Implicit((Object)(object)__instance)) { ZDO characterZDO = BackpackChestPlugin.GetCharacterZDO((Character)(object)__instance); if (characterZDO != null && characterZDO.GetBool("bc_haschest", false)) { float num = Mathf.Max(0f, BackpackChestPlugin.Instance.DebuffCarryWeight.Value); __result = Mathf.Max(0f, __result - num); } } } } [HarmonyPatch] internal static class RunSlowOnlyPatch { [CompilerGenerated] private sealed class <TargetMethods>d__0 : IEnumerable<MethodBase>, IEnumerable, IEnumerator<MethodBase>, IDisposable, IEnumerator { private int <>1__state; private MethodBase <>2__current; private int <>l__initialThreadId; private Type[] <types>5__1; private Type[] <>s__2; private int <>s__3; private Type <t>5__4; private List<MethodInfo>.Enumerator <>s__5; private MethodInfo <method>5__6; MethodBase IEnumerator<MethodBase>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <TargetMethods>d__0(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } <types>5__1 = null; <>s__2 = null; <t>5__4 = null; <>s__5 = default(List<MethodInfo>.Enumerator); <method>5__6 = null; <>1__state = -2; } private bool MoveNext() { try { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -3; goto IL_01a7; } <>1__state = -1; <types>5__1 = new Type[3] { typeof(Character), typeof(Player), typeof(Humanoid) }; <>s__2 = <types>5__1; <>s__3 = 0; goto IL_01e8; IL_01e8: if (<>s__3 < <>s__2.Length) { <t>5__4 = <>s__2[<>s__3]; <>s__5 = AccessTools.GetDeclaredMethods(<t>5__4).GetEnumerator(); <>1__state = -3; goto IL_01af; } <>s__2 = null; return false; IL_010c: if (<method>5__6.Name.IndexOf("RunSpeed", StringComparison.OrdinalIgnoreCase) >= 0 || <method>5__6.Name == "GetRunSpeed" || <method>5__6.Name == "GetRunSpeedFactor" || <method>5__6.Name == "GetRunSpeedModifier" || <method>5__6.Name == "GetRunSpeedFactorInternal") { <>2__current = <method>5__6; <>1__state = 1; return true; } goto IL_01a7; IL_01af: while (<>s__5.MoveNext()) { <method>5__6 = <>s__5.Current; if (<method>5__6 == null || <method>5__6.ReturnType != typeof(float) || <method>5__6.IsSpecialName) { continue; } goto IL_010c; } <>m__Finally1(); <>s__5 = default(List<MethodInfo>.Enumerator); <t>5__4 = null; <>s__3++; goto IL_01e8; IL_01a7: <method>5__6 = null; goto IL_01af; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; ((IDisposable)<>s__5).Dispose(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<MethodBase> IEnumerable<MethodBase>.GetEnumerator() { if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; return this; } return new <TargetMethods>d__0(0); } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<MethodBase>)this).GetEnumerator(); } } [IteratorStateMachine(typeof(<TargetMethods>d__0))] [HarmonyTargetMethods] private static IEnumerable<MethodBase> TargetMethods() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <TargetMethods>d__0(-2); } [HarmonyPostfix] private static void Postfix(object __instance, ref float __result) { Player val = (Player)((__instance is Player) ? __instance : null); if (val == null) { return; } ZDO characterZDO = BackpackChestPlugin.GetCharacterZDO((Character)(object)val); if (characterZDO != null && characterZDO.GetBool("bc_haschest", false)) { float num = Mathf.Clamp01(BackpackChestPlugin.Instance.DebuffRunSlowPercent.Value); if (((Character)val).IsRunning()) { __result *= 1f - num; } } } } [HarmonyPatch] internal static class PlayerTeleportHardBlockPatch { [CompilerGenerated] private sealed class <TargetMethods>d__2 : IEnumerable<MethodBase>, IEnumerable, IEnumerator<MethodBase>, IDisposable, IEnumerator { private int <>1__state; private MethodBase <>2__current; private int <>l__initialThreadId; private List<MethodInfo> <ms>5__1; private List<MethodInfo>.Enumerator <>s__2; private MethodInfo <m>5__3; private ParameterInfo[] <ps>5__4; MethodBase IEnumerator<MethodBase>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <TargetMethods>d__2(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } <ms>5__1 = null; <>s__2 = default(List<MethodInfo>.Enumerator); <m>5__3 = null; <ps>5__4 = null; <>1__state = -2; } private bool MoveNext() { try { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -3; goto IL_012b; } <>1__state = -1; <ms>5__1 = AccessTools.GetDeclaredMethods(typeof(Player)); <>s__2 = <ms>5__1.GetEnumerator(); <>1__state = -3; goto IL_013a; IL_012b: <ps>5__4 = null; <m>5__3 = null; goto IL_013a; IL_013a: while (true) { if (<>s__2.MoveNext()) { <m>5__3 = <>s__2.Current; if (!(<m>5__3.ReturnType != typeof(bool)) && (!(<m>5__3.Name != "TeleportTo") || !(<m>5__3.Name != "Teleport"))) { <ps>5__4 = <m>5__3.GetParameters(); if (<ps>5__4.Length >= 1) { break; } } continue; } <>m__Finally1(); <>s__2 = default(List<MethodInfo>.Enumerator); return false; } if (<ps>5__4[0].ParameterType == typeof(Vector3)) { <>2__current = <m>5__3; <>1__state = 1; return true; } goto IL_012b; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; ((IDisposable)<>s__2).Dispose(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<MethodBase> IEnumerable<MethodBase>.GetEnumerator() { if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; return this; } return new <TargetMethods>d__2(0); } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<MethodBase>)this).GetEnumerator(); } } private static float _nextMsgTime; private static bool ShouldBlock(Player p) { if (BackpackChestPlugin.WorldAllowsTeleportAllItems()) { return false; } ZDO characterZDO = BackpackChestPlugin.GetCharacterZDO((Character)(object)p); if (characterZDO == null) { return false; } if (!characterZDO.GetBool("bc_haschest", false)) { return false; } if (!characterZDO.GetBool("bc_nontele", false)) { return false; } return true; } [IteratorStateMachine(typeof(<TargetMethods>d__2))] [HarmonyTargetMethods] private static IEnumerable<MethodBase> TargetMethods() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <TargetMethods>d__2(-2); } [HarmonyPrefix] private static bool Prefix(Player __instance, ref bool __result) { if (!Object.op_Implicit((Object)(object)__instance)) { return true; } if (!ShouldBlock(__instance)) { return true; } if (Time.time >= _nextMsgTime) { _nextMsgTime = Time.time + 1f; BackpackChestPlugin.Message(__instance, "Нельзя телепортироваться: в сундуке есть предметы, запрещённые для порталов."); } __result = false; return false; } } [HarmonyPatch] internal static class PlayerTeleport_MoveCarriedChestPatch { [CompilerGenerated] private sealed class <TargetMethods>d__0 : IEnumerable<MethodBase>, IEnumerable, IEnumerator<MethodBase>, IDisposable, IEnumerator { private int <>1__state; private MethodBase <>2__current; private int <>l__initialThreadId; private List<MethodInfo> <ms>5__1; private List<MethodInfo>.Enumerator <>s__2; private MethodInfo <m>5__3; private ParameterInfo[] <ps>5__4; MethodBase IEnumerator<MethodBase>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <TargetMethods>d__0(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } <ms>5__1 = null; <>s__2 = default(List<MethodInfo>.Enumerator); <m>5__3 = null; <ps>5__4 = null; <>1__state = -2; } private bool MoveNext() { try { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -3; goto IL_012b; } <>1__state = -1; <ms>5__1 = AccessTools.GetDeclaredMethods(typeof(Player)); <>s__2 = <ms>5__1.GetEnumerator(); <>1__state = -3; goto IL_013a; IL_012b: <ps>5__4 = null; <m>5__3 = null; goto IL_013a; IL_013a: while (true) { if (<>s__2.MoveNext()) { <m>5__3 = <>s__2.Current; if (!(<m>5__3.ReturnType != typeof(bool)) && (!(<m>5__3.Name != "TeleportTo") || !(<m>5__3.Name != "Teleport"))) { <ps>5__4 = <m>5__3.GetParameters(); if (<ps>5__4.Length >= 1) { break; } } continue; } <>m__Finally1(); <>s__2 = default(List<MethodInfo>.Enumerator); return false; } if (<ps>5__4[0].ParameterType == typeof(Vector3)) { <>2__current = <m>5__3; <>1__state = 1; return true; } goto IL_012b; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; ((IDisposable)<>s__2).Dispose(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<MethodBase> IEnumerable<MethodBase>.GetEnumerator() { if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; return this; } return new <TargetMethods>d__0(0); } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<MethodBase>)this).GetEnumerator(); } } [IteratorStateMachine(typeof(<TargetMethods>d__0))] [HarmonyTargetMethods] private static IEnumerable<MethodBase> TargetMethods() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <TargetMethods>d__0(-2); } [HarmonyPostfix] private static void Postfix(Player __instance, ref bool __result) { //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_01fa: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)__instance) || !__result || !Object.op_Implicit((Object)(object)ZNet.instance) || !ZNet.instance.IsServer()) { return; } ZDO characterZDO = BackpackChestPlugin.GetCharacterZDO((Character)(object)__instance); if (characterZDO == null || !characterZDO.GetBool("bc_haschest", false)) { return; } long @long = characterZDO.GetLong("bc_chest_user", 0L); long long2 = characterZDO.GetLong("bc_chest_id", 0L); if (@long == 0L || long2 == 0) { return; } BackpackChestPlugin.Instance.ComputeNetworkBackTransform(__instance, out var pos, out var rot); MethodInfo methodInfo = AccessTools.Method(typeof(BackpackChestPlugin), "TryWriteZdoTransformByUid", new Type[4] { typeof(long), typeof(long), typeof(Vector3), typeof(Quaternion) }, (Type[])null); if (methodInfo != null) { try { methodInfo.Invoke(null, new object[4] { @long, long2, pos, rot }); } catch { } } MethodInfo methodInfo2 = AccessTools.Method(typeof(BackpackChestPlugin), "FindInstanceByZdoUid", new Type[2] { typeof(long), typeof(long) }, (Type[])null); if (!(methodInfo2 != null)) { return; } try { object? obj2 = methodInfo2.Invoke(null, new object[2] { @long, long2 }); ZNetView val = (ZNetView)((obj2 is ZNetView) ? obj2 : null); if ((Object)(object)val != (Object)null && val.IsValid()) { ((Component)val).transform.SetPositionAndRotation(pos, rot); BackpackChestPlugin.TryWriteZdoTransform(val, pos, rot); if (!val.IsOwner()) { val.ClaimOwnership(); } } } catch { } } } [HarmonyPatch(typeof(Player), "Awake")] internal static class PlayerAwakeInitialSyncPatch { [HarmonyPostfix] private static void Postfix(Player __instance) { if (Object.op_Implicit((Object)(object)__instance)) { if ((Object)(object)((Component)__instance).GetComponent<BackpackChestPlayerVisual>() == (Object)null) { ((Component)__instance).gameObject.AddComponent<BackpackChestPlayerVisual>(); } if ((Object)(object)BackpackChestPlugin.Instance != (Object)null) { ((MonoBehaviour)BackpackChestPlugin.Instance).StartCoroutine(BackpackChestPlugin.Instance.DelayedInitialSync(__instance)); } } } } internal class BackpackChestPlayerVisual : MonoBehaviour { private Player? _player; private GameObject? _visualRoot; private Transform? _bone; private void Awake() { _player = ((Component)this).GetComponent<Player>(); } private void OnDestroy() { DestroyVisual(); } private void LateUpdate() { if (!((Object)(object)_player == (Object)null) && Object.op_Implicit((Object)(object)_player)) { ZDO characterZDO = BackpackChestPlugin.GetCharacterZDO((Character)(object)_player); if (characterZDO == null) { DestroyVisual(); return; } if (!characterZDO.GetBool("bc_haschest", false)) { DestroyVisual(); return; } EnsureVisual(); UpdatePose(); } } private void EnsureVisual() { if (!((Object)(object)BackpackChestPlugin.Instance == (Object)null) && !((Object)(object)_visualRoot != (Object)null) && !((Object)(object)ZNetScene.instance == (Object)null)) { GameObject prefab = ZNetScene.instance.GetPrefab("Chest"); if (!((Object)(object)prefab == (Object)null)) { _visualRoot = BuildVisualCloneFromPrefab(prefab.transform); ((Object)_visualRoot).name = "BackpackChestLocalVisual"; _bone = BackpackChestPlugin.Instance.FindBackBone(_player) ?? ((Component)_player).transform; _visualRoot.transform.SetParent(_bone, false); } } } private static Vector3 InverseLossyScale(Transform t) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0082: 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) Vector3 lossyScale = t.lossyScale; float num = ((Mathf.Abs(lossyScale.x) > 0.0001f) ? (1f / lossyScale.x) : 1f); float num2 = ((Mathf.Abs(lossyScale.y) > 0.0001f) ? (1f / lossyScale.y) : 1f); float num3 = ((Mathf.Abs(lossyScale.z) > 0.0001f) ? (1f / lossyScale.z) : 1f); return new Vector3(num, num2, num3); } private void UpdatePose() { //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_visualRoot == (Object)null) && !((Object)(object)_player == (Object)null) && Object.op_Implicit((Object)(object)_player) && !((Object)(object)BackpackChestPlugin.Instance == (Object)null)) { Transform val = BackpackChestPlugin.Instance.FindBackBone(_player) ?? ((Component)_player).transform; if ((Object)(object)_bone != (Object)(object)val) { _bone = val; _visualRoot.transform.SetParent(_bone, false); } if (!((Object)(object)_bone == (Object)null)) { Vector3 val2 = InverseLossyScale(_bone); _visualRoot.transform.localPosition = Vector3.Scale(BackpackChestPlugin.Instance.VisualLocalOffset.Value, val2); _visualRoot.transform.localRotation = Quaternion.Euler(BackpackChestPlugin.Instance.VisualLocalEuler.Value); float value = BackpackChestPlugin.Instance.VisualScale.Value; _visualRoot.transform.localScale = Vector3.Scale(val2, Vector3.one * value); } } } private void DestroyVisual() { if ((Object)(object)_visualRoot != (Object)null) { try { Object.Destroy((Object)(object)_visualRoot); } catch { } _visualRoot = null; _bone = null; } } private static GameObject BuildVisualCloneFromPrefab(Transform prefabRoot) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_0042: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("BackpackChestVisualRoot"); for (int i = 0; i < prefabRoot.childCount; i++) { CopyVisualHierarchy(prefabRoot.GetChild(i), val.transform); } CopyVisualComponents(prefabRoot, val); val.transform.localScale = Vector3.one; return val; } private static void CopyVisualHierarchy(Transform src, Transform dstParent) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(((Object)src).name); Transform transform = val.transform; transform.SetParent(dstParent, false); transform.localPosition = src.localPosition; transform.localRotation = src.localRotation; transform.localScale = src.localScale; CopyVisualComponents(src, val); for (int i = 0; i < src.childCount; i++) { CopyVisualHierarchy(src.GetChild(i), transform); } } private static void CopyVisualComponents(Transform src, GameObject dstNode) { //IL_0064: 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_008e: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) MeshRenderer component = ((Component)src).GetComponent<MeshRenderer>(); MeshFilter component2 = ((Component)src).GetComponent<MeshFilter>(); if ((Object)(object)component != (Object)null && (Object)(object)component2 != (Object)null && (Object)(object)component2.sharedMesh != (Object)null) { MeshFilter val = dstNode.AddComponent<MeshFilter>(); val.sharedMesh = component2.sharedMesh; MeshRenderer val2 = dstNode.AddComponent<MeshRenderer>(); ((Renderer)val2).sharedMaterials = ((Renderer)component).sharedMaterials; ((Renderer)val2).shadowCastingMode = ((Renderer)component).shadowCastingMode; ((Renderer)val2).receiveShadows = ((Renderer)component).receiveShadows; ((Renderer)val2).lightProbeUsage = ((Renderer)component).lightProbeUsage; ((Renderer)val2).reflectionProbeUsage = ((Renderer)component).reflectionProbeUsage; } SkinnedMeshRenderer component3 = ((Component)src).GetComponent<SkinnedMeshRenderer>(); if ((Object)(object)component3 != (Object)null && (Object)(object)component3.sharedMesh != (Object)null) { SkinnedMeshRenderer val3 = dstNode.AddComponent<SkinnedMeshRenderer>(); val3.sharedMesh = component3.sharedMesh; ((Renderer)val3).sharedMaterials = ((Renderer)component3).sharedMaterials; ((Renderer)val3).shadowCastingMode = ((Renderer)component3).shadowCastingMode; ((Renderer)val3).receiveShadows = ((Renderer)component3).receiveShadows; ((Renderer)val3).lightProbeUsage = ((Renderer)component3).lightProbeUsage; ((Renderer)val3).reflectionProbeUsage = ((Renderer)component3).reflectionProbeUsage; } } } internal static class SEManBridge { private static readonly MethodInfo? MI_AddSE_2; private static readonly MethodInfo? MI_AddSE_4; private static readonly MethodInfo? MI_RemoveSE_2; static SEManBridge() { MethodInfo[] methods = typeof(SEMan).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (MethodInfo methodInfo in methods) { if (methodInfo.Name != "AddStatusEffect") { continue; } ParameterInfo[] parameters = methodInfo.GetParameters(); if (parameters.Length >= 2 && parameters[0].ParameterType == typeof(StatusEffect) && parameters[1].ParameterType == typeof(bool)) { if (parameters.Length == 2) { MI_AddSE_2 = methodInfo; } if (parameters.Length == 4 && parameters[2].ParameterType == typeof(int) && parameters[3].ParameterType == typeof(float)) { MI_AddSE_4 = methodInfo; } } } MethodInfo[] methods2 = typeof(SEMan).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (MethodInfo methodInfo2 in methods2) { if (!(methodInfo2.Name != "RemoveStatusEffect")) { ParameterInfo[] parameters2 = methodInfo2.GetParameters(); if (parameters2.Length == 2 && parameters2[0].ParameterType == typeof(StatusEffect) && parameters2[1].ParameterType == typeof(bool)) { MI_RemoveSE_2 = methodInfo2; break; } } } } internal static bool TryAdd(SEMan man, StatusEffect se) { try { if (MI_AddSE_2 != null) { MI_AddSE_2.Invoke(man, new object[2] { se, true }); return true; } if (MI_AddSE_4 != null) { MI_AddSE_4.Invoke(man, new object[4] { se, true, 0, 0f }); return true; } } catch { } return false; } internal static bool TryRemove(SEMan man, StatusEffect se) { try { if (MI_RemoveSE_2 != null) { MI_RemoveSE_2.Invoke(man, new object[2] { se, true }); return true; } } catch { } return false; } } internal class BackpackChestFollower : MonoBehaviour { private ZNetView? _nview; private Rigidbody? _rb; private Collider[] _colliders = Array.Empty<Collider>(); private Renderer[] _renderers = Array.Empty<Renderer>(); private bool _lastCarried; private long _lastCarrierId; private GameObject? _visualRoot; private Transform? _visualParentBone; private bool _origPersistent; private bool _origPersistentCaptured; private void Awake() { _nview = ((Component)this).GetComponent<ZNetView>(); _rb = ((Component)this).GetComponent<Rigidbody>(); _colliders = ((Component)this).GetComponentsInChildren<Collider>(true); _renderers = ((Component)this).GetComponentsInChildren<Renderer>(true); if ((Object)(object)_nview != (Object)null && _nview.IsValid()) { _origPersistent = BackpackChestPlugin.GetPersistent(_nview); _origPersistentCaptured = true; } } private void OnDestroy() { DestroyVisual(); } private void LateUpdate() { if ((Object)(object)_nview == (Object)null || !_nview.IsValid()) { return; } ZDO zDO = _nview.GetZDO(); if (zDO != null) { bool @bool = zDO.GetBool("bc_carried", false); long @long = zDO.GetLong("bc_carrier", 0L); if (@bool != _lastCarried || @long != _lastCarrierId) { ApplyLocalPresentation(@bool); _lastCarried = @bool; _lastCarrierId = @long; } if (!@bool) { DestroyVisual(); } } } private void ApplyLocalPresentation(bool carried) { //IL_0153: 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_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_nview != (Object)null && _nview.IsValid() && _origPersistentCaptured) { BackpackChestPlugin.SetPersistent(_nview, carried || _origPersistent); } if (!carried) { SetRenderersEnabled(enabled: true); Collider[] colliders = _colliders; foreach (Collider val in colliders) { if (Object.op_Implicit((Object)(object)val)) { val.enabled = true; val.isTrigger = false; } } if (Object.op_Implicit((Object)(object)_rb)) { _rb.isKinematic = false; _rb.useGravity = true; _rb.linearVelocity = Vector3.zero; _rb.angularVelocity = Vector3.zero; } DestroyVisual(); return; } SetRenderersEnabled(enabled: false); Collider[] colliders2 = _colliders; foreach (Collider val2 in colliders2) { if (Object.op_Implicit((Object)(object)val2)) { val2.enabled = false; } } if (Object.op_Implicit((Object)(object)_rb)) { _rb.linearVelocity = Vector3.zero; _rb.angularVelocity = Vector3.zero; _rb.isKinematic = true; _rb.useGravity = false; } } private void EnsureVisualForCarrier(long carrierId) { Player val = FindPlayerById(carrierId); if (!Object.op_Implicit((Object)(object)val)) { DestroyVisual(); return; } Transform val2 = BackpackChestPlugin.Instance.FindBackBone(val) ?? ((Component)val).transform; if ((Object)(object)_visualRoot != (Object)null) { if ((Object)(object)_visualParentBone != (Object)(object)val2) { _visualRoot.transform.SetParent(val2, false); _visualParentBone = val2; } ApplyVisualPose(val2); } else { _visualRoot = BuildVisualCloneFromThisChest(); ((Object)_visualRoot).name = "BackpackChestVisual"; _visualRoot.transform.SetParent(val2, false); _visualParentBone = val2; ApplyVisualPose(val2); } } private static Player? FindPlayerById(long playerId) { foreach (Player allPlayer in Player.GetAllPlayers()) { if (Object.op_Implicit((Object)(object)allPlayer) && allPlayer.GetPlayerID() == playerId) { return allPlayer; } } return null; } private static Vector3 InverseLossyScale(Transform t) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0082: 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) Vector3 lossyScale = t.lossyScale; float num = ((Mathf.Abs(lossyScale.x) > 0.0001f) ? (1f / lossyScale.x) : 1f); float num2 = ((Mathf.Abs(lossyScale.y) > 0.0001f) ? (1f / lossyScale.y) : 1f); float num3 = ((Mathf.Abs(lossyScale.z) > 0.0001f) ? (1f / lossyScale.z) : 1f); return new Vector3(num, num2, num3); } private void ApplyVisualPose(Transform bone) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_visualRoot == (Object)null)) { Vector3 val = InverseLossyScale(bone); _visualRoot.transform.localPosition = Vector3.Scale(BackpackChestPlugin.Instance.VisualLocalOffset.Value, val); _visualRoot.transform.localRotation = Quaternion.Euler(BackpackChestPlugin.Instance.VisualLocalEuler.Value); float value = BackpackChestPlugin.Instance.VisualScale.Value; _visualRoot.transform.localScale = Vector3.Scale(val, Vector3.one * value); } } private GameObject BuildVisualCloneFromThisChest() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expec