Decompiled source of AbuseForge v1.0.0

AbuseForge.dll

Decompiled 2 months ago
using System;
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 BepInEx;
using BepInEx.Configuration;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using Bloodstone.API;
using Bloodstone.Hooks;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using ProjectM;
using ProjectM.Network;
using Stunlock.Core;
using Unity.Collections;
using Unity.Entities;

[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("AbuseForge")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Created with VRising.ModTemplate, you should edit this.")]
[assembly: AssemblyFileVersion("0.1.10.0")]
[assembly: AssemblyInformationalVersion("0.1.10+1.Branch.main.Sha.c33d0879382e1a0da34861ec55914ba7e637a80e")]
[assembly: AssemblyProduct("AbuseForge")]
[assembly: AssemblyTitle("AbuseForge")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.1.10.0")]
[module: UnverifiableCode]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace AbuseForge
{
	public static class AbuseForgeBuffSystem
	{
		public static bool BuffPlayer(Entity character, Entity user, PrefabGUID buffPrefab, int durationSeconds = -1, bool persistThroughDeath = false)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: 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_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: 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_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: 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_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: 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_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: 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_008e: 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_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: 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_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: 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_00f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: 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_0127: 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_012e: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Unknown result type (might be due to invalid IL or missing references)
			//IL_013d: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Unknown result type (might be due to invalid IL or missing references)
			//IL_017f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_019a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
			EntityManager entityManager = VWorld.Server.EntityManager;
			DebugEventsSystem existingSystemManaged = VWorld.Server.GetExistingSystemManaged<DebugEventsSystem>();
			if (existingSystemManaged == null)
			{
				return false;
			}
			if (TryGetBuff(entityManager, character, buffPrefab, out var _))
			{
				return false;
			}
			ApplyBuffDebugEvent val = default(ApplyBuffDebugEvent);
			val.BuffPrefabGUID = buffPrefab;
			ApplyBuffDebugEvent val2 = val;
			FromCharacter val3 = default(FromCharacter);
			val3.User = user;
			val3.Character = character;
			FromCharacter val4 = val3;
			existingSystemManaged.ApplyBuff(val4, val2);
			if (TryGetBuff(entityManager, character, buffPrefab, out var outBuffEntity2))
			{
				if (((EntityManager)(ref entityManager)).HasComponent<CreateGameplayEventsOnSpawn>(outBuffEntity2))
				{
					((EntityManager)(ref entityManager)).RemoveComponent<CreateGameplayEventsOnSpawn>(outBuffEntity2);
				}
				if (((EntityManager)(ref entityManager)).HasComponent<GameplayEventListeners>(outBuffEntity2))
				{
					((EntityManager)(ref entityManager)).RemoveComponent<GameplayEventListeners>(outBuffEntity2);
				}
				if (persistThroughDeath)
				{
					((EntityManager)(ref entityManager)).AddComponentData<Buff_Persists_Through_Death>(outBuffEntity2, default(Buff_Persists_Through_Death));
					if (((EntityManager)(ref entityManager)).HasComponent<RemoveBuffOnGameplayEvent>(outBuffEntity2))
					{
						((EntityManager)(ref entityManager)).RemoveComponent<RemoveBuffOnGameplayEvent>(outBuffEntity2);
					}
					if (((EntityManager)(ref entityManager)).HasComponent<RemoveBuffOnGameplayEventEntry>(outBuffEntity2))
					{
						((EntityManager)(ref entityManager)).RemoveComponent<RemoveBuffOnGameplayEventEntry>(outBuffEntity2);
					}
				}
				if (durationSeconds > 0 && ((EntityManager)(ref entityManager)).HasComponent<LifeTime>(outBuffEntity2))
				{
					LifeTime componentData = ((EntityManager)(ref entityManager)).GetComponentData<LifeTime>(outBuffEntity2);
					componentData.Duration = durationSeconds;
					((EntityManager)(ref entityManager)).SetComponentData<LifeTime>(outBuffEntity2, componentData);
				}
				else if (durationSeconds == 0 && ((EntityManager)(ref entityManager)).HasComponent<LifeTime>(outBuffEntity2))
				{
					LifeTime componentData2 = ((EntityManager)(ref entityManager)).GetComponentData<LifeTime>(outBuffEntity2);
					componentData2.Duration = -1f;
					componentData2.EndAction = (LifeTimeEndAction)0;
					((EntityManager)(ref entityManager)).SetComponentData<LifeTime>(outBuffEntity2, componentData2);
					if (((EntityManager)(ref entityManager)).HasComponent<RemoveBuffOnGameplayEvent>(outBuffEntity2))
					{
						((EntityManager)(ref entityManager)).RemoveComponent<RemoveBuffOnGameplayEvent>(outBuffEntity2);
					}
					if (((EntityManager)(ref entityManager)).HasComponent<RemoveBuffOnGameplayEventEntry>(outBuffEntity2))
					{
						((EntityManager)(ref entityManager)).RemoveComponent<RemoveBuffOnGameplayEventEntry>(outBuffEntity2);
					}
				}
				return true;
			}
			return false;
		}

		public static void Unbuff(Entity character, PrefabGUID buffPrefab)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: 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_000e: 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)
			EntityManager entityManager = VWorld.Server.EntityManager;
			if (TryGetBuff(entityManager, character, buffPrefab, out var outBuffEntity))
			{
				((EntityManager)(ref entityManager)).DestroyEntity(outBuffEntity);
			}
		}

		private static bool TryGetBuff(EntityManager em, Entity character, PrefabGUID buffGUID, out Entity outBuffEntity)
		{
			//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_000e: 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_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_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			outBuffEntity = Entity.Null;
			if (!((EntityManager)(ref em)).HasComponent<BuffBuffer>(character))
			{
				return false;
			}
			DynamicBuffer<BuffBuffer> buffer = ((EntityManager)(ref em)).GetBuffer<BuffBuffer>(character, false);
			for (int i = 0; i < buffer.Length; i++)
			{
				BuffBuffer val = buffer[i];
				if (((PrefabGUID)(ref val.PrefabGuid)).Equals(buffGUID))
				{
					outBuffEntity = buffer[i].Entity;
					return true;
				}
			}
			return false;
		}
	}
	public static class AbuseForgeManager
	{
		private static readonly HashSet<AbusePlayer> QueuedUnstucks = new HashSet<AbusePlayer>();

		public static void HandleOnPlayerUnstuck(AbusePlayer player, Entity killEventEntity)
		{
			//IL_0014: 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_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_006c: 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_00d6: 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_00ba: 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)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			EntityManager em = VWorld.Server.EntityManager;
			if (((EntityManager)(ref em)).Exists(killEventEntity))
			{
				((EntityManager)(ref em)).DestroyEntity(killEventEntity);
			}
			if (!player.IsAlive())
			{
				return;
			}
			if (QueuedUnstucks.Contains(player))
			{
				SendChatMessage(em, player.User, "<color=yellow>You are already queued to unstuck!</color>");
				return;
			}
			int value = UnstuckConfig.UnstuckKillDelay.Value;
			if (UnstuckConfig.UseStunBuff.Value)
			{
				PrefabGUID buffPrefab = default(PrefabGUID);
				((PrefabGUID)(ref buffPrefab))..ctor(-704735901);
				AbuseForgeBuffSystem.BuffPlayer(player.Character, player.User, buffPrefab, value);
			}
			SendChatMessage(em, player.User, $"<color=red>You will be killed in {value} second(s)!</color>");
			QueuedUnstucks.Add(player);
			AbuseStopwatchScheduler.RunActionOnceAfterDelay(delegate
			{
				//IL_0033: 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_003f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0044: Unknown result type (might be due to invalid IL or missing references)
				//IL_004b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0050: Unknown result type (might be due to invalid IL or missing references)
				//IL_0055: Unknown result type (might be due to invalid IL or missing references)
				//IL_005a: 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_0062: Unknown result type (might be due to invalid IL or missing references)
				//IL_0067: 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_0071: 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_0091: 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_009b: Unknown result type (might be due to invalid IL or missing references)
				//IL_00af: 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_00b9: 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_00c3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d3: 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_00dc: 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)
				QueuedUnstucks.Remove(player);
				if (player.IsAlive())
				{
					EntityArchetype val = ((EntityManager)(ref em)).CreateArchetype((ComponentType[])(object)new ComponentType[3]
					{
						ComponentType.ReadWrite<KillEvent>(),
						ComponentType.ReadWrite<FromCharacter>(),
						ComponentType.ReadWrite<CanFly>()
					});
					Entity val2 = ((EntityManager)(ref em)).CreateEntity(val);
					((EntityManager)(ref em)).SetComponentData<FromCharacter>(val2, new FromCharacter
					{
						User = player.User,
						Character = player.Character
					});
					NetworkId componentData = ((EntityManager)(ref em)).GetComponentData<NetworkId>(player.Character);
					((EntityManager)(ref em)).SetComponentData<KillEvent>(val2, new KillEvent
					{
						Filter = (KillWhoFilter)0,
						TargetNetworkId = componentData,
						Who = (KillWho)4
					});
				}
			}, value);
		}

		private static void SendChatMessage(EntityManager em, Entity userEntity, string message)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: 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_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_001c: Unknown result type (might be due to invalid IL or missing references)
			if (((EntityManager)(ref em)).HasComponent<User>(userEntity))
			{
				User componentData = ((EntityManager)(ref em)).GetComponentData<User>(userEntity);
				ServerChatUtils.SendSystemMessageToClient(em, componentData, message);
			}
		}
	}
	[BepInPlugin("AbuseForge", "AbuseForge", "1.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[Reloadable]
	public class AbuseForgePlugin : BasePlugin
	{
		public static ManualLogSource LoggerInstance;

		private Harmony _harmony;

		public static Stopwatch RealTimeWatch;

		private ConfigFile _specialConfig;

		public override void Load()
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Expected O, but got Unknown
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Expected O, but got Unknown
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Expected O, but got Unknown
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Expected O, but got Unknown
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Expected O, but got Unknown
			LoggerInstance = ((BasePlugin)this).Log;
			string text = Path.Combine(Paths.ConfigPath, "AbuseForge");
			Directory.CreateDirectory(text);
			string text2 = Path.Combine(text, "UnstuckAbuse.cfg");
			_specialConfig = new ConfigFile(text2, true);
			UnstuckConfig.Initialize(_specialConfig);
			ManualLogSource log = ((BasePlugin)this).Log;
			bool flag = default(bool);
			BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(52, 2, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[AbuseForge] Loaded. ");
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("UnstuckKillDelay=");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(UnstuckConfig.UnstuckKillDelay.Value);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral(", ");
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("UseStunBuff=");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<bool>(UnstuckConfig.UseStunBuff.Value);
			}
			log.LogInfo(val);
			GameFrame.Initialize();
			GameFrame.OnUpdate += new GameFrameUpdateEventHandler(OnGameFrameUpdate);
			RealTimeWatch = new Stopwatch();
			RealTimeWatch.Start();
			_harmony = new Harmony("AbuseForgeStandalone");
			_harmony.PatchAll();
			Chat.OnChatMessage += new ChatEventHandler(HandleChatCommand);
			((BasePlugin)this).Log.LogInfo((object)"[AbuseForge] Load complete.");
		}

		public override bool Unload()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			Chat.OnChatMessage -= new ChatEventHandler(HandleChatCommand);
			GameFrame.OnUpdate -= new GameFrameUpdateEventHandler(OnGameFrameUpdate);
			GameFrame.Uninitialize();
			RealTimeWatch?.Stop();
			RealTimeWatch = null;
			Harmony harmony = _harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
			((BasePlugin)this).Log.LogInfo((object)"[AbuseForge] Unloaded.");
			return true;
		}

		private void OnGameFrameUpdate()
		{
			AbuseStopwatchScheduler.Tick();
		}

		private void HandleChatCommand(VChatEvent ev)
		{
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Expected O, but got Unknown
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			if (!ev.Message.Equals("!AbuseForge", StringComparison.OrdinalIgnoreCase) || !ev.User.IsAdmin)
			{
				return;
			}
			try
			{
				_specialConfig.Reload();
				_specialConfig.Save();
				UnstuckConfig.Initialize(_specialConfig);
				VExtensions.SendSystemMessage(ev.User, "<color=#00FF00>AbuseForge config reloaded successfully!</color>");
				((BasePlugin)this).Log.LogInfo((object)"[AbuseForge] Config reloaded via !AbuseForge.");
			}
			catch (Exception ex)
			{
				VExtensions.SendSystemMessage(ev.User, "<color=#FF0000>AbuseForge config reload failed:</color> " + ex.Message);
				ManualLogSource log = ((BasePlugin)this).Log;
				bool flag = default(bool);
				BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(35, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Error reloading AbuseForge config: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				log.LogError(val);
			}
		}
	}
	public class AbusePlayer
	{
		public Entity User;

		public Entity Character;

		private static readonly Dictionary<Entity, AbusePlayer> s_cache = new Dictionary<Entity, AbusePlayer>();

		private EntityManager em => VWorld.Server.EntityManager;

		private AbusePlayer(Entity userEntity, Entity characterEntity)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_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)
			User = userEntity;
			Character = characterEntity;
		}

		public bool IsAlive()
		{
			//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_000b: 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_0026: 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_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_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: 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)
			EntityManager val = em;
			if (!((EntityManager)(ref val)).Exists(Character))
			{
				return false;
			}
			val = em;
			if (!((EntityManager)(ref val)).HasComponent<Health>(Character))
			{
				return false;
			}
			val = em;
			Health componentData = ((EntityManager)(ref val)).GetComponentData<Health>(Character);
			return componentData.Value > 0f;
		}

		public void LogToConsole(string message)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Expected O, but got Unknown
			//IL_002e: 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)
			ManualLogSource loggerInstance = AbuseForgePlugin.LoggerInstance;
			if (loggerInstance != null)
			{
				bool flag = default(bool);
				BepInExMessageLogInterpolatedStringHandler val = new BepInExMessageLogInterpolatedStringHandler(32, 3, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(message);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" (UserEntity=");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Entity>(User);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(", CharacterEntity=");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Entity>(Character);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(")");
				}
				loggerInstance.LogMessage(val);
			}
		}

		public static AbusePlayer FromUser(Entity userEntity)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: 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_0027: 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_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: 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_0067: 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_0089: Unknown result type (might be due to invalid IL or missing references)
			EntityManager entityManager = VWorld.Server.EntityManager;
			if (!((EntityManager)(ref entityManager)).Exists(userEntity))
			{
				return null;
			}
			if (s_cache.TryGetValue(userEntity, out var value))
			{
				return value;
			}
			if (!((EntityManager)(ref entityManager)).HasComponent<User>(userEntity))
			{
				return null;
			}
			User componentData = ((EntityManager)(ref entityManager)).GetComponentData<User>(userEntity);
			Entity entity = componentData.LocalCharacter._Entity;
			if (!((EntityManager)(ref entityManager)).Exists(entity))
			{
				return null;
			}
			AbusePlayer abusePlayer = new AbusePlayer(userEntity, entity);
			s_cache[userEntity] = abusePlayer;
			return abusePlayer;
		}
	}
	public static class AbuseScheduler
	{
		private class ScheduledAction
		{
			public float TimeToRun;

			public Action Action;
		}

		private static readonly List<ScheduledAction> _actions = new List<ScheduledAction>();

		private static float _currentTime = 0f;

		public static void UpdateScheduler(float deltaTime)
		{
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Expected O, but got Unknown
			_currentTime += deltaTime;
			bool flag = default(bool);
			for (int num = _actions.Count - 1; num >= 0; num--)
			{
				if (_currentTime >= _actions[num].TimeToRun)
				{
					try
					{
						_actions[num].Action?.Invoke();
					}
					catch (Exception ex)
					{
						ManualLogSource loggerInstance = AbuseForgePlugin.LoggerInstance;
						if (loggerInstance != null)
						{
							BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(24, 1, ref flag);
							if (flag)
							{
								((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[AbuseScheduler] Error: ");
								((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
							}
							loggerInstance.LogError(val);
						}
					}
					_actions.RemoveAt(num);
				}
			}
		}

		public static void RunActionOnceAfterDelay(Action action, float delaySeconds)
		{
			_actions.Add(new ScheduledAction
			{
				TimeToRun = _currentTime + delaySeconds,
				Action = action
			});
		}
	}
	public static class AbuseStopwatchScheduler
	{
		private class ScheduledAction
		{
			public double RunAt;

			public Action Action;
		}

		private static readonly List<ScheduledAction> _actions = new List<ScheduledAction>();

		public static void Tick()
		{
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Expected O, but got Unknown
			if (AbuseForgePlugin.RealTimeWatch == null)
			{
				return;
			}
			double totalSeconds = AbuseForgePlugin.RealTimeWatch.Elapsed.TotalSeconds;
			bool flag = default(bool);
			for (int num = _actions.Count - 1; num >= 0; num--)
			{
				if (totalSeconds >= _actions[num].RunAt)
				{
					try
					{
						_actions[num].Action?.Invoke();
					}
					catch (Exception ex)
					{
						ManualLogSource loggerInstance = AbuseForgePlugin.LoggerInstance;
						if (loggerInstance != null)
						{
							BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(38, 1, ref flag);
							if (flag)
							{
								((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[StopwatchScheduler] Error in action: ");
								((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
							}
							loggerInstance.LogError(val);
						}
					}
					_actions.RemoveAt(num);
				}
			}
		}

		public static void RunActionOnceAfterDelay(Action action, double delaySeconds)
		{
			if (AbuseForgePlugin.RealTimeWatch != null)
			{
				double totalSeconds = AbuseForgePlugin.RealTimeWatch.Elapsed.TotalSeconds;
				double runAt = totalSeconds + delaySeconds;
				_actions.Add(new ScheduledAction
				{
					RunAt = runAt,
					Action = action
				});
			}
		}
	}
	[HarmonyPatch(typeof(KillEventSystem), "OnUpdate")]
	public static class KillEventSystemPatch
	{
		[HarmonyPrefix]
		public static void Prefix(KillEventSystem __instance)
		{
			//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_0009: 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_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_001c: 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_0025: 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_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_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: 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_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			EntityManager entityManager = ((ComponentSystemBase)__instance).EntityManager;
			EntityQuery query = __instance._Query;
			NativeArray<Entity> val = ((EntityQuery)(ref query)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2));
			Enumerator<Entity> enumerator = val.GetEnumerator();
			while (enumerator.MoveNext())
			{
				Entity current = enumerator.Current;
				if (((EntityManager)(ref entityManager)).Exists(current) && !((EntityManager)(ref entityManager)).HasComponent<CanFly>(current) && ((EntityManager)(ref entityManager)).HasComponent<FromCharacter>(current))
				{
					FromCharacter componentData = ((EntityManager)(ref entityManager)).GetComponentData<FromCharacter>(current);
					AbusePlayer abusePlayer = AbusePlayer.FromUser(componentData.User);
					if (abusePlayer != null)
					{
						AbuseForgeManager.HandleOnPlayerUnstuck(abusePlayer, current);
					}
				}
			}
			val.Dispose();
		}
	}
	public static class UnstuckConfig
	{
		public static ConfigEntry<int> UnstuckKillDelay;

		public static ConfigEntry<bool> UseStunBuff;

		public static void Initialize(ConfigFile config)
		{
			UnstuckKillDelay = config.Bind<int>("UnstuckAbuse", "UnstuckKillDelay", 5, "Seconds to wait before killing the player after they initiate unstuck.");
			UseStunBuff = config.Bind<bool>("UnstuckAbuse", "UseStunBuff", true, "If true, apply a stun buff to the player during the unstuck countdown.");
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "AbuseForge";

		public const string PLUGIN_NAME = "AbuseForge";

		public const string PLUGIN_VERSION = "0.1.10";
	}
}