using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text.Json; using BepInEx; using BepInEx.Configuration; using BepInEx.Core.Logging.Interpolation; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using BepInEx.Unity.IL2CPP.Utils.Collections; using DropTeleportBound.Data; using DropTeleportBound.Services; using HarmonyLib; using Il2CppSystem.Collections.Generic; using Microsoft.CodeAnalysis; using Network.Systems; using ProjectM; using ProjectM.Network; using ProjectM.Physics; using ProjectM.Scripting; using ProjectM.Shared; using Stunlock.Core; using Unity.Collections; using Unity.Entities; using Unity.Scenes; using UnityEngine; using VampireCommandFramework; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("DropTeleportBound")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("Server-side V Rising mod that helps players handle teleport-bound items before using Vampire Waygates")] [assembly: AssemblyFileVersion("1.0.1.0")] [assembly: AssemblyInformationalVersion("1.0.1")] [assembly: AssemblyProduct("DropTeleportBound")] [assembly: AssemblyTitle("DropTeleportBound")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.1.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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 DropTeleportBound { internal static class Core { private static World _server; private static bool _hasInitialized; private static MonoBehaviour monoBehaviour; public static World Server { get { if (_server == null) { _server = GetWorld("Server"); } return _server; } } public static EntityManager EntityManager => Server.EntityManager; public static bool IsServer => Application.productName == "VRisingServer"; public static GameDataSystem GameDataSystem => Server.GetExistingSystemManaged(); public static ServerScriptMapper ServerScriptMapper { get; internal set; } public static ServerGameSettingsSystem ServerGameSettingsSystem { get; internal set; } public static ManualLogSource Log => Plugin.PluginLog; private static World GetWorld(string name) { Enumerator enumerator = World.s_AllWorlds.GetEnumerator(); while (enumerator.MoveNext()) { World current = enumerator.Current; if (current.Name == name) { return current; } } return null; } public static void LogException(Exception e, [CallerMemberName] string caller = null) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown ManualLogSource log = Log; bool flag = default(bool); BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(52, 5, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Failure in "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(caller); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\nMessage: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(e.Message); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" Inner: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(e.InnerException?.Message); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\n\nStack: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(e.StackTrace); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\nInner Stack: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(e.InnerException?.StackTrace); } log.LogError(val); } internal static void InitializeAfterLoaded() { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown if (!_hasInitialized) { ServerScriptMapper = Server.GetExistingSystemManaged(); ServerGameSettingsSystem = Server.GetExistingSystemManaged(); _hasInitialized = true; ManualLogSource log = Log; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(11, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("InitializeAfterLoaded"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" completed."); } log.LogInfo(val); } } public static Coroutine StartCoroutine(IEnumerator routine) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown if ((Object)(object)monoBehaviour == (Object)null) { GameObject val = new GameObject("DropTeleportBound"); monoBehaviour = (MonoBehaviour)(object)val.AddComponent(); Object.DontDestroyOnLoad((Object)(object)val); } return monoBehaviour.StartCoroutine(CollectionExtensions.WrapToIl2Cpp(routine)); } public static void StopCoroutine(Coroutine coroutine) { if (!((Object)(object)monoBehaviour == (Object)null)) { monoBehaviour.StopCoroutine(coroutine); } } } internal static class Helper { private static readonly PrefabGUID AB_Interact_UseWaypoint_Blocked_AbilityGroup = new PrefabGUID(-1696712851); private static readonly PrefabGUID Buff_InCombat_PvPVampire = new PrefabGUID(697095869); public static bool TryGetBlockedWaypointUser(EntityManager entityManager, Entity character, out Entity userEntity) { //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_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000d: 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_0034: 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_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006a: 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_008c: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: 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_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: 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_00e8: 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) userEntity = Entity.Null; if (character == Entity.Null || !((EntityManager)(ref entityManager)).Exists(character)) { return false; } if (!((EntityManager)(ref entityManager)).HasComponent(character)) { return false; } if (!((EntityManager)(ref entityManager)).HasComponent(character)) { return false; } Interactor componentData = ((EntityManager)(ref entityManager)).GetComponentData(character); if (!((PrefabGUID)(ref componentData.InteractAbilityGuid)).Equals(AB_Interact_UseWaypoint_Blocked_AbilityGroup)) { return false; } if (!IsWaypointTarget(entityManager, componentData.Target)) { return false; } if (!IsTargetBeingInteracted(entityManager, componentData.Target)) { return false; } PlayerCharacter componentData2 = ((EntityManager)(ref entityManager)).GetComponentData(character); userEntity = componentData2.UserEntity; if (userEntity == Entity.Null || !((EntityManager)(ref entityManager)).Exists(userEntity)) { return false; } return ((EntityManager)(ref entityManager)).HasComponent(userEntity); } public static bool HasPvPCombatBuff(EntityManager entityManager, Entity character) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) if (character == Entity.Null || !((EntityManager)(ref entityManager)).Exists(character)) { return false; } return BuffUtility.HasBuff(entityManager, character, PrefabIdentifier.op_Implicit(Buff_InCombat_PvPVampire)); } private static bool IsWaypointTarget(EntityManager entityManager, Entity target) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) if (target == Entity.Null || !((EntityManager)(ref entityManager)).Exists(target)) { return false; } return ((EntityManager)(ref entityManager)).HasComponent(target) || ((EntityManager)(ref entityManager)).HasComponent(target); } private static bool IsTargetBeingInteracted(EntityManager entityManager, Entity target) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) if (target == Entity.Null || !((EntityManager)(ref entityManager)).Exists(target)) { return false; } if (!((EntityManager)(ref entityManager)).HasComponent(target)) { return false; } InteractedUpon componentData = ((EntityManager)(ref entityManager)).GetComponentData(target); return componentData.Interacting; } public static string GetSteamId(EntityManager entityManager, Entity userEntity) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) if (userEntity == Entity.Null || !((EntityManager)(ref entityManager)).Exists(userEntity)) { return string.Empty; } if (!((EntityManager)(ref entityManager)).HasComponent(userEntity)) { return string.Empty; } return ((EntityManager)(ref entityManager)).GetComponentData(userEntity).PlatformId.ToString(); } public static bool TryGetInventoryEntities(EntityManager entityManager, Entity character, out NativeList inventoryEntities) { //IL_0002: 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_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_002d: 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_003c: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) inventoryEntities = default(NativeList); if (character == Entity.Null || !((EntityManager)(ref entityManager)).Exists(character)) { return false; } inventoryEntities = new NativeList(AllocatorHandle.op_Implicit((Allocator)2)); InventoryUtilities.TryGetInventoryEntities(entityManager, character, ref inventoryEntities); return inventoryEntities.IsCreated; } public static void ForEachInventoryItem(EntityManager entityManager, Entity character, Func visitor) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: 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) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002a: 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_004c: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0081: 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) if (!TryGetInventoryEntities(entityManager, character, out var inventoryEntities)) { return; } try { NativeArray val2 = default(NativeArray); InventoryBuffer item = default(InventoryBuffer); for (int i = 0; i < inventoryEntities.Length; i++) { Entity val = inventoryEntities[i]; if (val == Entity.Null || !((EntityManager)(ref entityManager)).Exists(val) || !InventoryUtilities._TryGetInventoryFromInventoryEntity(entityManager, val, ref val2)) { continue; } try { for (int j = 0; j < val2.Length; j++) { if (InventoryUtilities.TryGetItemAtSlot(val2, j, ref item) && !visitor(new InventoryItemContext(val, j, item))) { return; } } } finally { val2.Dispose(); } } } finally { inventoryEntities.Dispose(); } } public static void NotifyUser(EntityManager entityManager, Entity userEntity, string message) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_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_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) if (!(userEntity == Entity.Null) && ((EntityManager)(ref entityManager)).Exists(userEntity) && ((EntityManager)(ref entityManager)).HasComponent(userEntity)) { User componentData = ((EntityManager)(ref entityManager)).GetComponentData(userEntity); FixedString512Bytes val = default(FixedString512Bytes); ((FixedString512Bytes)(ref val))..ctor(message); ServerChatUtils.SendSystemMessageToClient(entityManager, componentData, ref val); } } } [BepInPlugin("DropTeleportBound", "DropTeleportBound", "1.0.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BasePlugin { internal static Harmony Harmony; internal static ManualLogSource PluginLog; internal static ConfigFile PluginConfig; internal static ConfigEntry AutoDropOnTeleportBoundItems; internal static ConfigEntry PreventAutoDropInPvPCombat; internal static ConfigEntry NotifyWhenAutoDropEnabled; internal static ConfigEntry NotifyWhenAutoDropDisabled; public override void Load() { //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Expected O, but got Unknown //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Expected O, but got Unknown if (!(Application.productName != "VRisingServer")) { PluginLog = ((BasePlugin)this).Log; PluginConfig = ((BasePlugin)this).Config; AutoDropOnTeleportBoundItems = ((BasePlugin)this).Config.Bind("AutoDrop", "AutoDropOnTeleportBoundItems", true, "Enable the waypoint auto-drop feature for teleport-bound items."); PreventAutoDropInPvPCombat = ((BasePlugin)this).Config.Bind("AutoDrop", "PreventAutoDropInPvPCombat", true, "Prevent auto-drop while the player has the PvP combat buff."); NotifyWhenAutoDropEnabled = ((BasePlugin)this).Config.Bind("Notify", "NotifyWhenAutoDropEnabled", true, "Send a message when teleport-bound items are automatically dropped."); NotifyWhenAutoDropDisabled = ((BasePlugin)this).Config.Bind("Notify", "NotifyWhenAutoDropDisabled", true, "Send a notification when waypoint teleport is blocked and auto-drop is disabled for the player."); PlayerSettingService.Load(); ManualLogSource log = ((BasePlugin)this).Log; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(27, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Plugin "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("DropTeleportBound"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" version "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("1.0.1"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" is loaded!"); } log.LogInfo(val); Harmony = new Harmony("DropTeleportBound"); Harmony.PatchAll(Assembly.GetExecutingAssembly()); CommandRegistry.RegisterAll(); } } public override bool Unload() { PlayerSettingService.Save(); CommandRegistry.UnregisterAssembly(); Harmony harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } return true; } } public static class MyPluginInfo { public const string PLUGIN_GUID = "DropTeleportBound"; public const string PLUGIN_NAME = "DropTeleportBound"; public const string PLUGIN_VERSION = "1.0.1"; } } namespace DropTeleportBound.Services { internal static class DropTeleportBoundService { private static readonly Dictionary _commandCooldowns = new Dictionary(); private static readonly TimeSpan CommandCooldown = TimeSpan.FromSeconds(3.0); public static DropTeleportBoundResult TryDropTeleportBoundItems(Entity userEntity, Entity character) { //IL_0025: 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_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) try { if (!ServerSettingsService.IsTeleportBoundItemsEnabled()) { return DropTeleportBoundResult.Ok(ServerSettingsService.TeleportBoundItemsDisabledMessage, default(DropTeleportBoundStats)); } return DropTeleportBoundItems(Core.EntityManager, Core.GameDataSystem.ItemHashLookupMap, userEntity, character); } catch (Exception e) { Core.LogException(e, "TryDropTeleportBoundItems"); return DropTeleportBoundResult.Fail("An error occurred while dropping teleport-bound items."); } } public static DropTeleportBoundStats TryAutoDropTeleportBoundItems(Entity userEntity, Entity character) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) try { if (!ServerSettingsService.IsTeleportBoundItemsEnabled()) { return default(DropTeleportBoundStats); } EntityManager entityManager = Core.EntityManager; if (!ValidateEntities(entityManager, userEntity, character, out var _)) { return default(DropTeleportBoundStats); } return DropItems(entityManager, Core.GameDataSystem.ItemHashLookupMap, userEntity, character); } catch (Exception e) { Core.LogException(e, "TryAutoDropTeleportBoundItems"); return default(DropTeleportBoundStats); } } public static bool HasTeleportBoundItems(Entity character) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) try { if (!ServerSettingsService.IsTeleportBoundItemsEnabled()) { return false; } EntityManager entityManager = Core.EntityManager; if (character == Entity.Null || !((EntityManager)(ref entityManager)).Exists(character)) { return false; } return HasTeleportBoundItems(entityManager, Core.GameDataSystem.ItemHashLookupMap, character); } catch (Exception e) { Core.LogException(e, "HasTeleportBoundItems"); return false; } } private static DropTeleportBoundResult DropTeleportBoundItems(EntityManager entityManager, NativeParallelHashMap itemDataMap, Entity userEntity, Entity character) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_007c: 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_007e: Unknown result type (might be due to invalid IL or missing references) if (!ValidateEntities(entityManager, userEntity, character, out var errorMessage)) { return DropTeleportBoundResult.Fail(errorMessage); } if (IsCommandOnCooldown(userEntity, out var secondsLeft)) { return DropTeleportBoundResult.Fail($"Please wait {secondsLeft}s before using this command again."); } _commandCooldowns[userEntity] = DateTime.UtcNow; DropTeleportBoundStats stats = DropItems(entityManager, itemDataMap, userEntity, character); if (stats.DroppedStacks <= 0) { return DropTeleportBoundResult.Ok("No teleport-bound items found.", stats); } return DropTeleportBoundResult.Ok("Dropped teleport-bound items.", stats); } private static DropTeleportBoundStats DropItems(EntityManager entityManager, NativeParallelHashMap itemDataMap, Entity userEntity, Entity character) { //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_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: 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_001c: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) int scannedSlots = 0; int matchedStacks = 0; int droppedStacks = 0; int droppedAmount = 0; Helper.ForEachInventoryItem(entityManager, character, delegate(InventoryItemContext context) { //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_001f: 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_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_0075: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) scannedSlots++; InventoryBuffer item = context.Item; ItemData val = default(ItemData); if (!itemDataMap.TryGetValue(item.ItemType, ref val)) { return true; } if (!ShouldDrop(val.ItemCategory)) { return true; } matchedStacks++; if (CreateDropInventoryItemEvent(entityManager, userEntity, character, context.InventoryEntity, context.Slot)) { droppedStacks++; droppedAmount += item.Amount; } return true; }); return new DropTeleportBoundStats(scannedSlots, matchedStacks, droppedStacks, droppedAmount); } private static bool HasTeleportBoundItems(EntityManager entityManager, NativeParallelHashMap itemDataMap, Entity character) { //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_0015: 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) bool found = false; Helper.ForEachInventoryItem(entityManager, character, delegate(InventoryItemContext context) { //IL_0003: 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_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) InventoryBuffer item = context.Item; ItemData val = default(ItemData); if (!itemDataMap.TryGetValue(item.ItemType, ref val)) { return true; } if (!ShouldDrop(val.ItemCategory)) { return true; } found = true; return false; }); return found; } private static bool CreateDropInventoryItemEvent(EntityManager entityManager, Entity userEntity, Entity character, Entity inventoryEntity, int slot) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_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_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) if (inventoryEntity == Entity.Null || !((EntityManager)(ref entityManager)).Exists(inventoryEntity)) { return false; } if (!((EntityManager)(ref entityManager)).HasComponent(inventoryEntity)) { return false; } NetworkId componentData = ((EntityManager)(ref entityManager)).GetComponentData(inventoryEntity); Entity val = ((EntityManager)(ref entityManager)).CreateEntity((ComponentType[])(object)new ComponentType[3] { ComponentType.ReadWrite(), ComponentType.ReadWrite(), ComponentType.ReadWrite() }); ((EntityManager)(ref entityManager)).SetComponentData(val, new FromCharacter { User = userEntity, Character = character }); ((EntityManager)(ref entityManager)).SetComponentData(val, new DropInventoryItemEvent { Inventory = componentData, SlotIndex = slot }); return true; } private static bool ValidateEntities(EntityManager entityManager, Entity userEntity, Entity character, out string errorMessage) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0035: 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_004f: 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_007b: Unknown result type (might be due to invalid IL or missing references) errorMessage = string.Empty; if (userEntity == Entity.Null || !((EntityManager)(ref entityManager)).Exists(userEntity)) { errorMessage = "User entity is not available."; return false; } if (!((EntityManager)(ref entityManager)).HasComponent(userEntity)) { errorMessage = "User component is not available."; return false; } if (character == Entity.Null || !((EntityManager)(ref entityManager)).Exists(character)) { errorMessage = "Character entity is not available."; return false; } if (!((EntityManager)(ref entityManager)).HasComponent(character)) { errorMessage = "PlayerCharacter component is not available."; return false; } return true; } private static bool IsCommandOnCooldown(Entity userEntity, out int secondsLeft) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) secondsLeft = 0; if (!_commandCooldowns.TryGetValue(userEntity, out var value)) { return false; } TimeSpan timeSpan = CommandCooldown - (DateTime.UtcNow - value); if (timeSpan <= TimeSpan.Zero) { return false; } secondsLeft = Math.Max(1, (int)Math.Ceiling(timeSpan.TotalSeconds)); return true; } private static bool ShouldDrop(ItemCategory category) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) if (HasCategory(category, (ItemCategory)2048)) { return false; } return HasCategory(category, (ItemCategory)512); } private static bool HasCategory(ItemCategory category, ItemCategory flag) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Unknown result type (might be due to invalid IL or missing references) return (ItemCategory)(category & flag) == flag; } } internal static class PlayerSettingService { private static readonly string CONFIG_DIR = Path.Combine(Paths.ConfigPath, "DropTeleportBound"); private static readonly string CONFIG_FILE = Path.Combine(CONFIG_DIR, "players_setting.json"); private static AutoDropBoundPreferenceData _data = new AutoDropBoundPreferenceData(); public static bool IsEnabled(string steamId) { return !string.IsNullOrWhiteSpace(steamId) && _data.EnabledPlayers.Contains(steamId); } public static bool SetEnabled(string steamId, bool enabled) { if (string.IsNullOrWhiteSpace(steamId)) { return false; } bool flag = (enabled ? _data.EnabledPlayers.Add(steamId) : _data.EnabledPlayers.Remove(steamId)); if (flag) { Save(); } return flag; } public static void Load() { try { Directory.CreateDirectory(CONFIG_DIR); if (!File.Exists(CONFIG_FILE)) { Save(); return; } string json = File.ReadAllText(CONFIG_FILE); _data = JsonSerializer.Deserialize(json) ?? new AutoDropBoundPreferenceData(); AutoDropBoundPreferenceData data = _data; if (data.EnabledPlayers == null) { HashSet hashSet = (data.EnabledPlayers = new HashSet()); } } catch (Exception e) { Core.LogException(e, "Load"); _data = new AutoDropBoundPreferenceData(); } } public static void Save() { try { Directory.CreateDirectory(CONFIG_DIR); string contents = JsonSerializer.Serialize(_data, new JsonSerializerOptions { WriteIndented = true }); File.WriteAllText(CONFIG_FILE, contents); } catch (Exception e) { Core.LogException(e, "Save"); } } } internal static class ServerSettingsService { public static string TeleportBoundItemsDisabledMessage => "This server allows teleporting with teleport-bound items. You can use waygates normally."; public static bool IsTeleportBoundItemsEnabled() { try { if (Core.ServerGameSettingsSystem == null) { Core.InitializeAfterLoaded(); } return Core.ServerGameSettingsSystem._Settings.TeleportBoundItems; } catch (Exception e) { Core.LogException(e, "IsTeleportBoundItemsEnabled"); return true; } } } internal static class WaypointAutoDropService { private static readonly Dictionary _autoDropCooldowns = new Dictionary(); private static readonly Dictionary _notifyCooldowns = new Dictionary(); private static readonly Dictionary _lastCastSnapshots = new Dictionary(); private static readonly Dictionary _pendingDrops = new Dictionary(); private static DateTime _nextScanTime = DateTime.MinValue; private static readonly TimeSpan ScanInterval = TimeSpan.FromSeconds(0.1); private const double AutoDropDelaySeconds = 0.1; private const int AutoDropCooldownSeconds = 2; private const int NotifyCooldownSeconds = 3; private static bool _scannerStopped; public static void Update(TeleportIncorrectPositionSystem system) { //IL_006a: 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_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: 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_0089: 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_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) if (!Plugin.AutoDropOnTeleportBoundItems.Value) { StopScanner(); return; } if (!ServerSettingsService.IsTeleportBoundItemsEnabled()) { StopScanner(); return; } _scannerStopped = false; DateTime utcNow = DateTime.UtcNow; if (utcNow < _nextScanTime) { return; } _nextScanTime = utcNow + ScanInterval; NativeArray val = default(NativeArray); try { EntityManager entityManager = ((ComponentSystemBase)system).EntityManager; EntityQuery _query_524969957_ = system.__query_524969957_0; val = ((EntityQuery)(ref _query_524969957_)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2)); for (int i = 0; i < val.Length; i++) { HandlePlayer(entityManager, val[i], utcNow); } ProcessPendingDrops(entityManager, utcNow); CleanupCachedState(entityManager, utcNow); } catch (Exception e) { Core.LogException(e, "Update"); } finally { if (val.IsCreated) { val.Dispose(); } } } private static void HandlePlayer(EntityManager entityManager, Entity character, DateTime now) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_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_0046: 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_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) if (character == Entity.Null || !((EntityManager)(ref entityManager)).Exists(character) || !((EntityManager)(ref entityManager)).HasComponent(character)) { return; } AbilityBar_Shared componentData = ((EntityManager)(ref entityManager)).GetComponentData(character); CastSnapshot value = CastSnapshot.From(componentData); CastSnapshot value2; bool flag = _lastCastSnapshots.TryGetValue(character, out value2); Entity userEntity = Entity.Null; bool flag2 = flag && value.HasChangedFrom(value2) && Helper.TryGetBlockedWaypointUser(entityManager, character, out userEntity); _lastCastSnapshots[character] = value; if (!flag2) { return; } string steamId = Helper.GetSteamId(entityManager, userEntity); if (string.IsNullOrWhiteSpace(steamId)) { return; } if (PlayerSettingService.IsEnabled(steamId)) { if (IsAutoDropOnCooldown(userEntity, now)) { return; } if (ShouldPreventAutoDropInPvPCombat(entityManager, character)) { if (Plugin.NotifyWhenAutoDropDisabled.Value && !IsNotifyOnCooldown(userEntity, now) && DropTeleportBoundService.HasTeleportBoundItems(character)) { SendCombatBlockedNotification(entityManager, userEntity, now); } } else { QueueAutoDrop(character, userEntity, steamId, now); } } else if (Plugin.NotifyWhenAutoDropDisabled.Value && !IsNotifyOnCooldown(userEntity, now) && DropTeleportBoundService.HasTeleportBoundItems(character)) { SendDisabledAutoDropNotification(entityManager, userEntity, now); } } private static void QueueAutoDrop(Entity character, Entity userEntity, string steamId, DateTime now) { //IL_001b: 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) DateTime executeAt = now + TimeSpan.FromSeconds(0.1); _pendingDrops[character] = new PendingDrop(userEntity, steamId, executeAt); } private static void ProcessPendingDrops(EntityManager entityManager, DateTime now) { //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_005c: 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_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) if (_pendingDrops.Count == 0) { return; } List list = new List(); foreach (KeyValuePair pendingDrop in _pendingDrops) { Entity key = pendingDrop.Key; PendingDrop value = pendingDrop.Value; if (!(now < value.ExecuteAt)) { list.Add(key); ExecutePendingDrop(entityManager, key, value, now); } } for (int i = 0; i < list.Count; i++) { _pendingDrops.Remove(list[i]); } } private static void ExecutePendingDrop(EntityManager entityManager, Entity character, PendingDrop pendingDrop, DateTime now) { //IL_0003: 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_001a: 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_0029: 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_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: 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_0113: Unknown result type (might be due to invalid IL or missing references) Entity userEntity = pendingDrop.UserEntity; if (ServerSettingsService.IsTeleportBoundItemsEnabled() && !(character == Entity.Null) && ((EntityManager)(ref entityManager)).Exists(character) && !(userEntity == Entity.Null) && ((EntityManager)(ref entityManager)).Exists(userEntity) && ((EntityManager)(ref entityManager)).HasComponent(userEntity) && PlayerSettingService.IsEnabled(pendingDrop.SteamId) && !IsAutoDropOnCooldown(userEntity, now) && !ShouldPreventAutoDropInPvPCombat(entityManager, character) && Helper.TryGetBlockedWaypointUser(entityManager, character, out var userEntity2) && !(userEntity2 != userEntity) && DropTeleportBoundService.TryAutoDropTeleportBoundItems(userEntity, character).DroppedStacks > 0) { _autoDropCooldowns[userEntity] = now; if (Plugin.NotifyWhenAutoDropEnabled.Value) { Helper.NotifyUser(entityManager, userEntity, "Auto-dropped teleport-bound items.\nUse .tpb off to disable auto-drop."); } } } private static void SendDisabledAutoDropNotification(EntityManager entityManager, Entity userEntity, DateTime now) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) _notifyCooldowns[userEntity] = now; Helper.NotifyUser(entityManager, userEntity, "You are carrying teleport-bound items.\nUse .throw to drop them, or use .tpb on to enable auto-drop."); } private static void SendCombatBlockedNotification(EntityManager entityManager, Entity userEntity, DateTime now) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) _notifyCooldowns[userEntity] = now; Helper.NotifyUser(entityManager, userEntity, "Auto-drop is blocked while in combat.\nUse .throw to drop teleport-bound items manually."); } private static bool IsAutoDropOnCooldown(Entity userEntity, DateTime now) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) if (!_autoDropCooldowns.TryGetValue(userEntity, out var value)) { return false; } return now - value < TimeSpan.FromSeconds(2.0); } private static bool IsNotifyOnCooldown(Entity userEntity, DateTime now) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) if (!_notifyCooldowns.TryGetValue(userEntity, out var value)) { return false; } return now - value < TimeSpan.FromSeconds(3.0); } private static bool ShouldPreventAutoDropInPvPCombat(EntityManager entityManager, Entity character) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) return Plugin.PreventAutoDropInPvPCombat.Value && Helper.HasPvPCombatBuff(entityManager, character); } private static void CleanupCachedState(EntityManager entityManager, DateTime now) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) CleanupDateTimeDictionary(entityManager, _autoDropCooldowns, now, TimeSpan.FromMinutes(5.0), 256); CleanupDateTimeDictionary(entityManager, _notifyCooldowns, now, TimeSpan.FromMinutes(5.0), 256); CleanupCastSnapshots(entityManager); CleanupPendingDrops(entityManager, now); } private static void CleanupCastSnapshots(EntityManager entityManager) { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) if (_lastCastSnapshots.Count < 512) { return; } List list = new List(); foreach (KeyValuePair lastCastSnapshot in _lastCastSnapshots) { if (lastCastSnapshot.Key == Entity.Null || !((EntityManager)(ref entityManager)).Exists(lastCastSnapshot.Key)) { list.Add(lastCastSnapshot.Key); } } for (int i = 0; i < list.Count; i++) { _lastCastSnapshots.Remove(list[i]); } } private static void CleanupPendingDrops(EntityManager entityManager, DateTime now) { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) if (_pendingDrops.Count < 256) { return; } List list = new List(); foreach (KeyValuePair pendingDrop in _pendingDrops) { if (pendingDrop.Key == Entity.Null || !((EntityManager)(ref entityManager)).Exists(pendingDrop.Key) || now - pendingDrop.Value.ExecuteAt > TimeSpan.FromSeconds(10.0)) { list.Add(pendingDrop.Key); } } for (int i = 0; i < list.Count; i++) { _pendingDrops.Remove(list[i]); } } private static void CleanupDateTimeDictionary(EntityManager entityManager, Dictionary dictionary, DateTime now, TimeSpan maxAge, int threshold) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) if (dictionary.Count < threshold) { return; } List list = new List(); foreach (KeyValuePair item in dictionary) { if (item.Key == Entity.Null || !((EntityManager)(ref entityManager)).Exists(item.Key) || now - item.Value > maxAge) { list.Add(item.Key); } } for (int i = 0; i < list.Count; i++) { dictionary.Remove(list[i]); } } private static void StopScanner() { if (!_scannerStopped) { ClearCachedState(); _scannerStopped = true; } } private static void ClearCachedState() { _autoDropCooldowns.Clear(); _notifyCooldowns.Clear(); _lastCastSnapshots.Clear(); _pendingDrops.Clear(); _nextScanTime = DateTime.MinValue; } } } namespace DropTeleportBound.Patches { [HarmonyPatch(typeof(SceneSectionStreamingSystem), "ShutdownAsynchrnonousStreamingSupport")] public static class InitializationPatch { [HarmonyPostfix] public static void OneShot_AfterLoad_InitializationPatch() { if (Core.IsServer) { Core.InitializeAfterLoaded(); Harmony harmony = Plugin.Harmony; if (harmony != null) { harmony.Unpatch((MethodBase)typeof(SceneSectionStreamingSystem).GetMethod("ShutdownAsynchrnonousStreamingSupport"), typeof(InitializationPatch).GetMethod("OneShot_AfterLoad_InitializationPatch")); } } } } [HarmonyPatch(typeof(TeleportIncorrectPositionSystem), "OnUpdate")] internal static class WaypointAutoDropScannerPatch { [HarmonyPostfix] private static void Postfix(TeleportIncorrectPositionSystem __instance) { WaypointAutoDropService.Update(__instance); } } } namespace DropTeleportBound.Data { internal sealed class AutoDropBoundPreferenceData { public HashSet EnabledPlayers { get; set; } = new HashSet(); } internal readonly struct DropTeleportBoundResult { public bool Success { get; } public string Message { get; } public DropTeleportBoundStats Stats { get; } private DropTeleportBoundResult(bool success, string message, DropTeleportBoundStats stats) { Success = success; Message = message; Stats = stats; } public static DropTeleportBoundResult Ok(string message, DropTeleportBoundStats stats) { return new DropTeleportBoundResult(success: true, message, stats); } public static DropTeleportBoundResult Fail(string message) { return new DropTeleportBoundResult(success: false, message, default(DropTeleportBoundStats)); } } internal readonly struct DropTeleportBoundStats { public int ScannedSlots { get; } public int MatchedStacks { get; } public int DroppedStacks { get; } public int DroppedAmount { get; } public DropTeleportBoundStats(int scannedSlots, int matchedStacks, int droppedStacks, int droppedAmount) { ScannedSlots = scannedSlots; MatchedStacks = matchedStacks; DroppedStacks = droppedStacks; DroppedAmount = droppedAmount; } } internal readonly struct PendingDrop { public Entity UserEntity { get; } public string SteamId { get; } public DateTime ExecuteAt { get; } public PendingDrop(Entity userEntity, string steamId, DateTime executeAt) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) UserEntity = userEntity; SteamId = steamId; ExecuteAt = executeAt; } } internal readonly struct CastSnapshot { private readonly int _castStartedCounter; private readonly int _castCompletedCounter; private readonly int _serverCastCounter; private readonly int _serverInterruptCounter; private CastSnapshot(int castStartedCounter, int castCompletedCounter, int serverCastCounter, int serverInterruptCounter) { _castStartedCounter = castStartedCounter; _castCompletedCounter = castCompletedCounter; _serverCastCounter = serverCastCounter; _serverInterruptCounter = serverInterruptCounter; } public static CastSnapshot From(AbilityBar_Shared abilityBar) { //IL_0001: 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_000d: 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) return new CastSnapshot(abilityBar.CastStartedCounter, abilityBar.CastCompletedCounter, abilityBar.ServerCastCounter, abilityBar.ServerInterruptCounter); } public bool HasChangedFrom(CastSnapshot other) { return _castStartedCounter != other._castStartedCounter || _castCompletedCounter != other._castCompletedCounter || _serverCastCounter != other._serverCastCounter || _serverInterruptCounter != other._serverInterruptCounter; } } internal readonly struct InventoryItemContext { public Entity InventoryEntity { get; } public int Slot { get; } public InventoryBuffer Item { get; } public InventoryItemContext(Entity inventoryEntity, int slot, InventoryBuffer item) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) InventoryEntity = inventoryEntity; Slot = slot; Item = item; } } } namespace DropTeleportBound.Commands { [CommandGroup("tpbound", "tpb")] internal static class AutoDropTeleportBoundCommands { [Command("on", null, null, "Enable automatic dropping of teleport-bound items when using waygates.", null, false)] public static void AutoDropBoundOnCommand(ChatCommandContext ctx) { string steamId; if (!Plugin.AutoDropOnTeleportBoundItems.Value) { ctx.Reply("Auto-drop is currently disabled by the server.\nUse .throw to drop teleport-bound items manually."); } else if (!ServerSettingsService.IsTeleportBoundItemsEnabled()) { ctx.Reply(ServerSettingsService.TeleportBoundItemsDisabledMessage); } else if (TryGetSteamId(ctx, out steamId)) { PlayerSettingService.SetEnabled(steamId, enabled: true); ctx.Reply("Auto-drop for teleport-bound items is now enabled."); } } [Command("off", null, null, "Disable automatic dropping of teleport-bound items when using waygates.", null, false)] public static void AutoDropBoundOffCommand(ChatCommandContext ctx) { string steamId; if (!Plugin.AutoDropOnTeleportBoundItems.Value) { ctx.Reply("Auto-drop is currently disabled by the server.\nUse .throw to drop teleport-bound items manually."); } else if (!ServerSettingsService.IsTeleportBoundItemsEnabled()) { ctx.Reply(ServerSettingsService.TeleportBoundItemsDisabledMessage); } else if (TryGetSteamId(ctx, out steamId)) { PlayerSettingService.SetEnabled(steamId, enabled: false); ctx.Reply("Auto-drop for teleport-bound items is now disabled."); } } [Command("status", null, null, "Check whether automatic dropping of teleport-bound items is enabled.", null, false)] public static void AutoDropBoundStatusCommand(ChatCommandContext ctx) { if (TryGetSteamId(ctx, out var steamId)) { bool flag = PlayerSettingService.IsEnabled(steamId); bool value = Plugin.AutoDropOnTeleportBoundItems.Value; bool flag2 = ServerSettingsService.IsTeleportBoundItemsEnabled(); string text = (flag ? "Enabled" : "Disabled"); string text2 = (value ? "Enabled" : "Disabled"); string text3 = (flag2 ? "Does not allow teleporting with teleport-bound items." : "Allows teleporting with teleport-bound items."); ctx.Reply("Teleport-bound item drop status\nYour auto-drop setting: " + text + "\nGlobal auto-drop setting: " + text2 + "\nServer teleport-bound rule: " + text3); } } private static bool TryGetSteamId(ChatCommandContext ctx, out string steamId) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) steamId = Helper.GetSteamId(Core.EntityManager, ctx.Event.SenderUserEntity); if (!string.IsNullOrWhiteSpace(steamId)) { return true; } ctx.Reply("Unable to read your SteamID."); return false; } } internal static class DropTeleportBoundCommands { [Command("throw", "dropbound", null, "Drop all items that cannot be teleported through waygates.", null, false)] public static void DropBoundCommand(ChatCommandContext ctx) { //IL_0007: 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) ctx.Reply(DropTeleportBoundService.TryDropTeleportBoundItems(ctx.Event.SenderUserEntity, ctx.Event.SenderCharacterEntity).Message); } } }