Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of DeathHeadBatteryPlus v1.0.0
plugins/DeathHeadBatteryPlus.dll
Decompiled 5 hours agousing System; using System.Diagnostics; 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.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using Photon.Pun; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: IgnoresAccessChecksTo("")] [assembly: AssemblyCompany("Kai")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+3c6685d2be258c04809d5508067885a3078e2480")] [assembly: AssemblyProduct("DeathHeadBatteryPlus")] [assembly: AssemblyTitle("DeathHeadBatteryPlus")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace DeathHeadBatteryPlus { internal static class ConfigManager { public static float drainMultiplier; public static float jumpChargeDrainMultiplier; public static float rechargeRatioFromBaseDrain; public static float rechargeUpgradeScale; public static bool fuullCargeOnDeath; internal static ConfigEntry<float> HeadDrainMultiplier; internal static ConfigEntry<float> HeadJumpChargeDrainMultiplier; internal static ConfigEntry<float> HeadRechargeRatioFromBaseDrain; internal static ConfigEntry<float> HeadRechargeUpgradeScale; internal static ConfigEntry<bool> FullChargeOnDeath; public static void Build(ConfigFile config) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Expected O, but got Unknown //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Expected O, but got Unknown HeadDrainMultiplier = config.Bind<float>("DeathHeadBattery", "HeadDrainMultiplier", 1f, new ConfigDescription("死亡ヘッド操作中の通常消費倍率。1.0でバニラ、0.5で半分、2.0で2倍消費。", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 10f), Array.Empty<object>())); HeadJumpChargeDrainMultiplier = config.Bind<float>("DeathHeadBattery", "HeadJumpChargeDrainMultiplier", 1f, new ConfigDescription("死亡ヘッドのジャンプチャージ中に追加される消費倍率。1.0でバニラ。通常消費とは別枠。", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 10f), Array.Empty<object>())); HeadRechargeRatioFromBaseDrain = config.Bind<float>("DeathHeadBattery", "HeadRechargeRatioFromBaseDrain", 0.25f, new ConfigDescription("死亡ヘッドの回復速度。初期通常消費速度を基準に、1.0なら同速、0.5なら半分。バニラ回復は0.25相当。", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 10f), Array.Empty<object>())); HeadRechargeUpgradeScale = config.Bind<float>("DeathHeadBattery", "HeadRechargeUpgradeScale", 0.25f, new ConfigDescription("DeathHeadBatteryアップグレード1段階ごとの回復速度倍率加算。0.25なら1段階ごとに+25%。", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 10f), Array.Empty<object>())); FullChargeOnDeath = config.Bind<bool>("DeathHeadBattery", "FullChargeOnDeath", false, "死亡直後にデスヘッドバッテリーを満タンにします。"); } public static void Configinit() { drainMultiplier = HeadDrainMultiplier.Value; jumpChargeDrainMultiplier = HeadJumpChargeDrainMultiplier.Value; rechargeRatioFromBaseDrain = HeadRechargeRatioFromBaseDrain.Value; fuullCargeOnDeath = FullChargeOnDeath.Value; } } [BepInPlugin("Kai.DeathHeadBatteryPlus", "DeathHeadBatteryPlus", "1.0.1")] public class DeathHeadBatteryPlus : BaseUnityPlugin { internal static DeathHeadBatteryPlus Instance { get; private set; } internal static ManualLogSource Logger => Instance._logger; private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger; internal Harmony? Harmony { get; set; } private void Awake() { Instance = this; ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; Patch(); ConfigManager.Build(((BaseUnityPlugin)this).Config); ConfigManager.Configinit(); Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!"); } internal void Patch() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //IL_0025: Expected O, but got Unknown if (Harmony == null) { Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID); Harmony val2 = val; Harmony = val; } Harmony.PatchAll(); } } internal static class DeathHeadEnergyHelper { private const float BaseUseSeconds = 25f; private const float FirstUpgradeAddSecond = 5f; private const float UpgradeAddDecay = 0.8f; public static float GetVanillaUseSeconds(float upgradeDeathHeadBattery) { float num = 25f; float num2 = 5f; for (float num3 = upgradeDeathHeadBattery - 1f; num3 > 0f; num3 -= 1f) { num += num2; num2 *= 0.8f; } return Mathf.Max(0.01f, num); } public static float GetDrainPerSecond(float upgradeDeathHeadBattery, float multiplier) { float vanillaUseSeconds = GetVanillaUseSeconds(upgradeDeathHeadBattery); return 1f / vanillaUseSeconds * Mathf.Max(0f, multiplier); } public static float GetJumpChargeDrainPerSecond(float upgradeDeathHeadBattery, float multiplier) { float vanillaUseSeconds = GetVanillaUseSeconds(upgradeDeathHeadBattery); return 1f / vanillaUseSeconds * Mathf.Max(0f, multiplier); } public static float GetRechargePerSecond(float upgradeDeathHeadBattery, float rechargeRatioFromBaseDrain, float upgradeRechargeScale) { float num = 0.04f; float num2 = Mathf.Max(0f, rechargeRatioFromBaseDrain); float num3 = Mathf.Max(0f, upgradeRechargeScale); float num4 = 1f + Mathf.Max(0f, upgradeDeathHeadBattery - 1f) * num3; return num * num2 * num4; } } } namespace DeathHeadBatteryPlus.Patchs { [HarmonyPatch(typeof(SpectateCamera), "SetDeath")] internal static class SpectateCamera_SetDeath_DeathHeadBatteryPatch { private static void Postfix(SpectateCamera __instance) { if (ConfigManager.fuullCargeOnDeath) { PlayerAvatar val = PlayerController.instance?.playerAvatarScript; if (!((Object)(object)val == (Object)null) && val.isLocal) { __instance.headEnergy = 1f; __instance.headEnergyEnough = true; } } } } [HarmonyPatch(typeof(PunManager), "Start")] public static class PunManager_patches { private static void Postfix(PunManager __instance) { if ((Object)(object)((Component)__instance).GetComponent<DeathHeadEnagyConfigSync>() == (Object)null) { ((Component)__instance).gameObject.AddComponent<DeathHeadEnagyConfigSync>(); } } } public class DeathHeadEnagyConfigSync : MonoBehaviour { [PunRPC] public void SyncDeathHeadConfigs(float drainMultiplier, float jumpChargeDrainMultiplier, float rechargeRatioFromBaseDrain, float rechargeUpgradeScale, bool fuullCargeOnDeath) { ConfigManager.drainMultiplier = drainMultiplier; ConfigManager.jumpChargeDrainMultiplier = jumpChargeDrainMultiplier; ConfigManager.rechargeRatioFromBaseDrain = rechargeRatioFromBaseDrain; ConfigManager.rechargeUpgradeScale = rechargeUpgradeScale; ConfigManager.fuullCargeOnDeath = fuullCargeOnDeath; } } [HarmonyPatch(typeof(SemiFunc), "OnLevelGenDone")] internal static class SemiFunc_OnlevelChangePatch { public static void Postfix() { if (!SemiFunc.IsMasterClientOrSingleplayer()) { ConfigManager.Configinit(); } else if (SemiFunc.IsMultiplayer()) { PunManager.instance.photonView.RPC("SyncDeathHeadConfigs", (RpcTarget)1, new object[5] { ConfigManager.drainMultiplier, ConfigManager.jumpChargeDrainMultiplier, ConfigManager.rechargeRatioFromBaseDrain, ConfigManager.rechargeUpgradeScale, ConfigManager.fuullCargeOnDeath }); } } } [HarmonyPatch(typeof(SpectateCamera), "HeadEnergyLogic")] internal static class SpectateCamera_HeadEnergyLogic_Patch { private static readonly FieldRef<SpectateCamera, bool> HeadOverrideRef = AccessTools.FieldRefAccess<SpectateCamera, bool>("headOverride"); private static bool Prefix(SpectateCamera __instance) { PlayerAvatar val = PlayerController.instance?.playerAvatarScript; PlayerDeathHead val2 = val?.playerDeathHead; if ((Object)(object)val2 == (Object)null) { return false; } if (__instance.headEnergyPauseTimer > 0f) { __instance.headEnergyPauseTimer -= Time.deltaTime; __instance.headEnergy = Mathf.Clamp01(__instance.headEnergy); return false; } float upgradeDeathHeadBattery = val.upgradeDeathHeadBattery; if (__instance.CheckState((State)2)) { if (!HeadOverrideRef.Invoke(__instance)) { __instance.headEnergy -= Time.deltaTime * DeathHeadEnergyHelper.GetDrainPerSecond(upgradeDeathHeadBattery, ConfigManager.drainMultiplier); if (val2.spectatedJumpCharging) { __instance.headEnergy -= Time.deltaTime * DeathHeadEnergyHelper.GetJumpChargeDrainPerSecond(upgradeDeathHeadBattery, ConfigManager.jumpChargeDrainMultiplier); } } __instance.headEnergyEnough = false; } else if (__instance.CheckState((State)1)) { __instance.headEnergy += Time.deltaTime * DeathHeadEnergyHelper.GetRechargePerSecond(upgradeDeathHeadBattery, ConfigManager.rechargeRatioFromBaseDrain, ConfigManager.rechargeUpgradeScale); __instance.headEnergyEnough = __instance.headEnergy >= 0.25f; } __instance.headEnergy = Mathf.Clamp01(__instance.headEnergy); return false; } } }