Decompiled source of PiShock v1.1.0

PiShock/PiShock.dll

Decompiled 10 months ago
using System;
using System.Diagnostics;
using System.Net.Http;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Text;
using System.Threading.Tasks;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using PiShock.Patches;
using Unity.Netcode;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("PiShockMod")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PiShockMod")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("3fc9a04f-6d2d-4ab4-80aa-4a6f5a54e823")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace PiShock
{
	internal class PiShockAPI
	{
		private string apiEndpoint = "https://do.pishock.com/api/apioperate/";

		public string username { private get; set; }

		public string apiKey { private get; set; }

		public string code { private get; set; }

		public string senderName { private get; set; }

		public async Task SendHttp(int op, int intensity, int duration)
		{
			HttpClient client = new HttpClient();
			try
			{
				var requestData = new
				{
					Username = username,
					Name = senderName,
					Code = code,
					Intensity = intensity,
					Duration = duration,
					APIKey = apiKey,
					Op = op
				};
				var requestDataBeep = new
				{
					Username = username,
					Name = senderName,
					Code = code,
					Duration = duration,
					APIKey = apiKey,
					Op = op
				};
				string jsonBody = "";
				string operation = "";
				switch (op)
				{
				case 0:
					jsonBody = JsonConvert.SerializeObject((object)requestData);
					operation = "shock";
					break;
				case 1:
					jsonBody = JsonConvert.SerializeObject((object)requestData);
					operation = "vibrate";
					break;
				case 2:
					jsonBody = JsonConvert.SerializeObject((object)requestDataBeep);
					operation = "beep";
					break;
				}
				HttpContent content = (HttpContent)new StringContent(jsonBody, Encoding.UTF8, "application/json");
				try
				{
					HttpResponseMessage response = await client.PostAsync(apiEndpoint, content);
					if (response.IsSuccessStatusCode)
					{
						PiShockPlugin.Instance.OnSuccess(operation, intensity, duration);
						return;
					}
					string responseContent = await response.Content.ReadAsStringAsync();
					PiShockPlugin.Instance.OnError(response.StatusCode, response.ReasonPhrase, responseContent);
				}
				finally
				{
					((IDisposable)content)?.Dispose();
				}
			}
			finally
			{
				((IDisposable)client)?.Dispose();
			}
		}

		public async Task Shock(int intensity, int duration)
		{
			await SendHttp(0, intensity, duration);
		}

		public async Task Vibrate(int intensity, int duration)
		{
			await SendHttp(1, intensity, duration);
		}

		public async Task Beep(int duration)
		{
			await SendHttp(2, 0, duration);
		}
	}
	[BepInPlugin("PiShock", "PiShock", "1.1.0")]
	public class PiShockPlugin : BaseUnityPlugin
	{
		private const string modGUID = "PiShock";

		private const string modName = "PiShock";

		private const string modVersion = "1.1.0";

		private readonly Harmony harmony = new Harmony("PiShock");

		internal readonly string pishockLogId = "PiShock (Lethal company)";

		internal static PiShockPlugin Instance;

		internal ManualLogSource mls;

		internal ConfigEntry<string> PiShockUsername;

		internal ConfigEntry<string> PiShockAPIKey;

		internal ConfigEntry<string> PiShockShockerShareCode;

		internal ConfigEntry<bool> shockOnDeath;

		internal ConfigEntry<bool> shockOnDamage;

		internal ConfigEntry<bool> shockOnFired;

		internal ConfigEntry<bool> shockBasedOnHealth;

		internal ConfigEntry<int> maxIntensity;

		internal ConfigEntry<int> minIntensity;

		internal ConfigEntry<int> intensityDeath;

		internal ConfigEntry<int> intensityFired;

		internal ConfigEntry<int> duration;

		internal ConfigEntry<int> durationDeath;

		internal ConfigEntry<int> durationFired;

		internal ConfigEntry<bool> testMode;

		internal ConfigEntry<bool> vibrateOnly;

		internal ConfigEntry<bool> enableInterval;

		internal ConfigEntry<int> interval;

		internal DateTime lastShock;

		private bool DidDeath = false;

		private bool DidFired = false;

		private void Awake()
		{
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Expected O, but got Unknown
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_016e: Expected O, but got Unknown
			//IL_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a2: Expected O, but got Unknown
			//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d6: Expected O, but got Unknown
			//IL_01ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0209: Expected O, but got Unknown
			//IL_0232: Unknown result type (might be due to invalid IL or missing references)
			//IL_023c: Expected O, but got Unknown
			//IL_0265: Unknown result type (might be due to invalid IL or missing references)
			//IL_026f: Expected O, but got Unknown
			mls = Logger.CreateLogSource("PiShock");
			mls.LogMessage((object)"PiShock 1.1.0 - by TRIPPYTRASH");
			PiShockUsername = ((BaseUnityPlugin)this).Config.Bind<string>("PiShock API Authentication", "PiShockUsername", "", (ConfigDescription)null);
			PiShockAPIKey = ((BaseUnityPlugin)this).Config.Bind<string>("PiShock API Authentication", "PiShockAPIKey", "", (ConfigDescription)null);
			PiShockShockerShareCode = ((BaseUnityPlugin)this).Config.Bind<string>("PiShock API Authentication", "PiShockShockerCode", "", "The share code for your PiShock shocker");
			shockOnDamage = ((BaseUnityPlugin)this).Config.Bind<bool>("Shocking Events", "shockOnDamage", true, "Get shocked when you take damage");
			shockOnDeath = ((BaseUnityPlugin)this).Config.Bind<bool>("Shocking Events", "shockOnDeath", true, "Get shocked when you die");
			shockOnFired = ((BaseUnityPlugin)this).Config.Bind<bool>("Shocking Events", "shockOnFired", true, "Get shocked when you do not reach the quota");
			shockBasedOnHealth = ((BaseUnityPlugin)this).Config.Bind<bool>("Shocking Events", "shockBasedOnHealth", false, "Enable to calculate shock intensity based on remaining health instead of the damage taken (shockOnDeath must be enabled)");
			minIntensity = ((BaseUnityPlugin)this).Config.Bind<int>("Intensity Sliders", "minimum", 1, new ConfigDescription("Minimum intensity of shock/vibration", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 100), Array.Empty<object>()));
			maxIntensity = ((BaseUnityPlugin)this).Config.Bind<int>("Intensity Sliders", "maximum", 5, new ConfigDescription("Maximum intensity of shock/vibration", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 100), Array.Empty<object>()));
			intensityDeath = ((BaseUnityPlugin)this).Config.Bind<int>("Intensity Sliders", "intensityDeath", 10, new ConfigDescription("Intensity of shock/vibration when you die", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 100), Array.Empty<object>()));
			intensityFired = ((BaseUnityPlugin)this).Config.Bind<int>("Intensity Sliders", "intensityFired", 10, new ConfigDescription("Intensity of shock/vibration when you do not reach the quota", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 100), Array.Empty<object>()));
			duration = ((BaseUnityPlugin)this).Config.Bind<int>("Durations Sliders", "duration", 1, new ConfigDescription("General duration of shock/vibration", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 10), Array.Empty<object>()));
			durationDeath = ((BaseUnityPlugin)this).Config.Bind<int>("Durations Sliders", "durationDeath", 1, new ConfigDescription("Duration of shock/vibration when you die", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 10), Array.Empty<object>()));
			durationFired = ((BaseUnityPlugin)this).Config.Bind<int>("Durations Sliders", "durationFired", 2, new ConfigDescription("Duration of shock/vibration when you do not reach the quota", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 10), Array.Empty<object>()));
			testMode = ((BaseUnityPlugin)this).Config.Bind<bool>("Misc", "testMode", false, "Only beeps and a test beep upon launch");
			vibrateOnly = ((BaseUnityPlugin)this).Config.Bind<bool>("Misc", "vibrateOnly", false, "Use vibration instead of shock");
			enableInterval = ((BaseUnityPlugin)this).Config.Bind<bool>("Misc", "enableInterval", true, "Should there be a delay between shocks? (makes constant damage like bees bearable)");
			interval = ((BaseUnityPlugin)this).Config.Bind<int>("Misc", "damageInterval", 10, "Interval between damage shocks (enable interval must = true)");
			lastShock = DateTime.Now;
			mls.LogMessage((object)("Running for user: " + PiShockUsername.Value));
			harmony.PatchAll(typeof(PiShockPlugin));
			harmony.PatchAll(typeof(PlayerControllerBPatch));
			harmony.PatchAll(typeof(StartOfRoundPatch));
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			if (testMode.Value)
			{
				DoOperation(0, 1);
			}
		}

		public void OnSuccess(string operation, int intensity, int duration)
		{
			if (operation == "beep")
			{
				mls.LogMessage((object)$"Sent {operation} to {PiShockUsername.Value} for {duration} second(s)");
				return;
			}
			mls.LogMessage((object)$"Sent {operation} {intensity} to {PiShockUsername.Value} for {duration} second(s)");
		}

		public void OnError(object StatusCode, object ReasonPhrase, object responseContent)
		{
			mls.LogWarning((object)$"Error: {StatusCode} = {ReasonPhrase}");
			mls.LogWarning((object)$"Response Content: {responseContent}");
		}

		internal void DoDamage(int dmg, int health)
		{
			TimeSpan timeSpan = DateTime.Now - lastShock;
			if (enableInterval.Value && timeSpan < TimeSpan.FromSeconds(interval.Value))
			{
				((BaseUnityPlugin)this).Logger.LogDebug((object)("Didn't shock due to interval. LastShock; " + lastShock.ToLongTimeString()));
				return;
			}
			int intensity = Mathf.Clamp(dmg, minIntensity.Value, maxIntensity.Value);
			int num = 100 - health;
			int intensity2 = Mathf.Clamp(num, minIntensity.Value, maxIntensity.Value);
			if (shockBasedOnHealth.Value)
			{
				mls.LogInfo((object)("Shocking based on health for " + intensity2));
				DoOperation(intensity2, duration.Value);
			}
			else if (shockOnDamage.Value)
			{
				mls.LogInfo((object)("Shocking based on damage for " + intensity));
				DoOperation(intensity, duration.Value);
			}
			lastShock = DateTime.Now;
		}

		internal void DoDeath()
		{
			if (!DidDeath && shockOnDeath.Value)
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Death shock");
				DoOperation(intensityDeath.Value, durationDeath.Value);
				DidDeath = true;
				Task.Run(async delegate
				{
					await Task.Delay(20000);
					DidDeath = false;
				});
			}
		}

		internal void DoFired()
		{
			if (!DidFired)
			{
				Task.Run(async delegate
				{
					await Task.Delay(15000);
					mls.LogInfo((object)"Fired Shock");
					DoOperation(intensityFired.Value, durationFired.Value);
				});
				DidFired = true;
				Task.Run(async delegate
				{
					await Task.Delay(durationFired.Value * 1000);
					DidFired = false;
				});
			}
		}

		private async void DoOperation(int intensity, int duration)
		{
			mls.LogDebug((object)"Running DoOperation for shocker code");
			PiShockAPI user = new PiShockAPI
			{
				username = PiShockUsername.Value,
				apiKey = PiShockAPIKey.Value,
				code = PiShockShockerShareCode.Value,
				senderName = pishockLogId
			};
			if (testMode.Value)
			{
				await user.Beep(1);
			}
			else if (vibrateOnly.Value)
			{
				await user.Vibrate(intensity, duration);
				mls.LogDebug((object)"VIB ONLY");
			}
			else
			{
				await user.Shock(intensity, duration);
			}
		}
	}
}
namespace PiShock.Patches
{
	internal class PlayerControllerBPatch
	{
		[HarmonyPatch(typeof(PlayerControllerB), "KillPlayer")]
		[HarmonyPostfix]
		private static void DeathPatch(ref PlayerControllerB __instance)
		{
			if (((NetworkBehaviour)__instance).IsOwner)
			{
				PiShockPlugin.Instance.DoDeath();
			}
		}

		[HarmonyPatch(typeof(PlayerControllerB), "DamagePlayer")]
		[HarmonyPostfix]
		private static void DamagePatch(int ___health, int damageNumber)
		{
			PiShockPlugin.Instance.DoDamage(damageNumber, ___health);
		}
	}
	internal class StartOfRoundPatch
	{
		[HarmonyPatch(typeof(StartOfRound), "FirePlayersAfterDeadlineClientRpc")]
		[HarmonyPostfix]
		private static void FirePlayersAfterDeadlinePatch()
		{
			PiShockPlugin.Instance.DoFired();
		}
	}
}