using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using Diversity.Monsters;
using Diversity.Patches;
using Diversity.Player;
using GameNetcodeStuff;
using HarmonyLib;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Events;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("Diversity")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Diversity")]
[assembly: AssemblyCopyright("Copyright © 2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("6163c54c-2d5b-4683-ac86-9337d16cc4fd")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
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;
}
}
}
namespace Diversity
{
public class Configuration
{
public static ConfigEntry<bool> spiderRevamp;
public static ConfigEntry<float> spiderSlowAmount;
public static ConfigEntry<bool> crawlerRevamp;
public static ConfigEntry<float> crawlerSlowAmount;
public static ConfigEntry<bool> centipedeRevamp;
public static ConfigEntry<int> clickAmount;
public static ConfigEntry<bool> playerRegen;
public static ConfigEntry<bool> playerDying;
public static void Load()
{
spiderRevamp = Diversity.config.Bind<bool>("Monster", "SpiderRevamp", true, "Should spider revamp be enabled?");
spiderSlowAmount = Diversity.config.Bind<float>("Monster", "SpiderSlow", 0.8f, "How much slown should spiders be on hit?");
crawlerRevamp = Diversity.config.Bind<bool>("Monster", "CrawlerRevamp", true, "Should crawler revamp be enabled?");
crawlerSlowAmount = Diversity.config.Bind<float>("Monster", "CrawlerSlow", 0.9f, "How much slown should crawlers be on hit?");
centipedeRevamp = Diversity.config.Bind<bool>("Monster", "CentipedeRevamp", true, "Should centipede revamp be enabled?");
clickAmount = Diversity.config.Bind<int>("Monster", "ClickAmount", 25, "How many times should you have to click to remove the centipede from someone's head?");
playerRegen = Diversity.config.Bind<bool>("Player", "PlayerRegen", false, "Should players be able to regen?");
playerDying = Diversity.config.Bind<bool>("Player", "PlayerDying", false, "Should a custom player dying sound be enabled?");
}
}
public class Content
{
public class CustomItem
{
public string name = "";
public string itemPath = "";
public string infoPath = "";
public Action<Item> itemAction = delegate
{
};
public bool enabled = true;
public CustomItem(string name, string itemPath, string infoPath, Action<Item> action = null)
{
this.name = name;
this.itemPath = itemPath;
this.infoPath = infoPath;
if (action != null)
{
itemAction = action;
}
}
public static CustomItem Add(string name, string itemPath, string infoPath = null, Action<Item> action = null)
{
return new CustomItem(name, itemPath, infoPath, action);
}
}
public class CustomShopItem : CustomItem
{
public int itemPrice;
public CustomShopItem(string name, string itemPath, string infoPath = null, int itemPrice = 0, Action<Item> action = null)
: base(name, itemPath, infoPath, action)
{
this.itemPrice = itemPrice;
}
public static CustomShopItem Add(string name, string itemPath, string infoPath = null, int itemPrice = 0, Action<Item> action = null, bool enabled = true)
{
return new CustomShopItem(name, itemPath, infoPath, itemPrice, action)
{
enabled = enabled
};
}
}
public static AssetBundle MainAssets;
public static List<CustomItem> customItems;
public static Dictionary<string, GameObject> Prefabs = new Dictionary<string, GameObject>();
public static void TryLoadAssets()
{
if ((Object)(object)MainAssets == (Object)null)
{
MainAssets = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "diversity"));
Diversity.mls.LogInfo((object)"Loaded asset bundle");
}
}
public static void Load()
{
TryLoadAssets();
customItems = new List<CustomItem> { CustomShopItem.Add("Bandages", "assets/custom/diversity/bandage.prefab", "assets/custom/diversity/bandageinfo.json", 25) };
foreach (CustomItem customItem in customItems)
{
if (customItem.enabled)
{
Item val = MainAssets.LoadAsset<Item>(customItem.itemPath);
if (customItem is CustomShopItem)
{
TerminalNode val2 = MainAssets.LoadAsset<TerminalNode>(customItem.infoPath);
Diversity.mls.LogInfo((object)$"Registering shop item {customItem.name} with price {((CustomShopItem)customItem).itemPrice}");
Items.RegisterShopItem(val, (TerminalNode)null, (TerminalNode)null, val2, ((CustomShopItem)customItem).itemPrice);
}
}
}
Diversity.mls.LogInfo((object)"Custom content loaded!");
}
}
[BepInPlugin("Chaos.Diversity", "Diversity", "1.0.2")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Diversity : BaseUnityPlugin
{
private const string modGUID = "Chaos.Diversity";
private const string modName = "Diversity";
private const string modVersion = "1.0.2";
private readonly Harmony harmony = new Harmony("Chaos.Diversity");
public static Diversity Instance;
public static ManualLogSource mls;
public static ConfigFile config;
private void Awake()
{
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Expected O, but got Unknown
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
mls = ((BaseUnityPlugin)this).Logger;
config = ((BaseUnityPlugin)this).Config;
Configuration.Load();
Content.TryLoadAssets();
GameObject val = new GameObject("Diversity");
val.AddComponent<DiversityBehaviour>();
((Object)val).hideFlags = (HideFlags)61;
Object.DontDestroyOnLoad((Object)(object)val);
mls.LogInfo((object)"Diversity GameObject created.");
harmony.PatchAll(typeof(Diversity));
harmony.PatchAll(typeof(PlayerControllerBPatch));
harmony.PatchAll(typeof(SandSpiderAIPatch));
harmony.PatchAll(typeof(CrawlerAIPatch));
mls.LogInfo((object)"Diversity started.");
}
}
public class DiversityBehaviour : MonoBehaviour
{
public void Update()
{
SandSpiderAI[] array = (SandSpiderAI[])(object)Object.FindObjectsOfType(typeof(SandSpiderAI));
if (Configuration.spiderRevamp.Value)
{
SandSpiderAI[] array2 = array;
foreach (SandSpiderAI val in array2)
{
if ((Object)(object)((Component)val).gameObject.GetComponent<SpiderRevamp>() == (Object)null)
{
((Component)val).gameObject.AddComponent<SpiderRevamp>();
Diversity.mls.LogInfo((object)("Added SpiderRevamp to: " + ((Object)((Component)val).gameObject).name));
}
}
}
CrawlerAI[] array3 = (CrawlerAI[])(object)Object.FindObjectsOfType(typeof(CrawlerAI));
if (Configuration.crawlerRevamp.Value)
{
CrawlerAI[] array4 = array3;
foreach (CrawlerAI val2 in array4)
{
if ((Object)(object)((Component)val2).gameObject.GetComponent<CrawlerRevamp>() == (Object)null)
{
((Component)val2).gameObject.AddComponent<CrawlerRevamp>();
Diversity.mls.LogInfo((object)("Added CrawlerRevamp to: " + ((Object)((Component)val2).gameObject).name));
}
}
}
PlayerControllerB[] array5 = (PlayerControllerB[])(object)Object.FindObjectsOfType(typeof(PlayerControllerB));
if (Configuration.playerDying.Value)
{
PlayerControllerB[] array6 = array5;
foreach (PlayerControllerB val3 in array6)
{
if ((Object)(object)((Component)val3).gameObject.GetComponent<PlayerDying>() == (Object)null)
{
((Component)val3).gameObject.AddComponent<PlayerDying>();
Diversity.mls.LogInfo((object)("Added PlayerDying to: " + ((Object)((Component)val3).gameObject).name));
}
}
}
CentipedeAI[] array7 = (CentipedeAI[])(object)Object.FindObjectsOfType(typeof(CentipedeAI));
if (!Configuration.centipedeRevamp.Value)
{
return;
}
CentipedeAI[] array8 = array7;
foreach (CentipedeAI val4 in array8)
{
if ((Object)(object)((Component)val4).gameObject.GetComponent<CentipedeRevamp>() == (Object)null)
{
((Component)val4).gameObject.AddComponent<CentipedeRevamp>();
Diversity.mls.LogInfo((object)("Added CentipedeRevamp to: " + ((Object)((Component)val4).gameObject).name));
}
}
}
}
}
namespace Diversity.Player
{
internal class PlayerDying : MonoBehaviour
{
private PlayerControllerB player;
private AudioSource audio;
private GameObject obj;
private void Start()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
obj = new GameObject("DyingAudio");
player = ((Component)this).gameObject.GetComponent<PlayerControllerB>();
obj.transform.SetParent(((Component)player.thisPlayerBody).gameObject.transform);
audio = obj.gameObject.AddComponent<AudioSource>();
((Behaviour)audio).enabled = false;
audio.loop = true;
audio.playOnAwake = true;
audio.clip = Content.MainAssets.LoadAsset<AudioClip>("assets/custom/diversity/audio/player/dying.mp3");
audio.spatialBlend = 1f;
audio.minDistance = 5f;
audio.maxDistance = 15f;
audio.volume = 1f;
audio.rolloffMode = (AudioRolloffMode)1;
audio.bypassEffects = true;
audio.bypassListenerEffects = true;
}
}
}
namespace Diversity.Patches
{
internal class CrawlerAIPatch
{
private static CrawlerRevamp crawler;
[HarmonyPatch(typeof(CrawlerAI), "HitEnemy")]
[HarmonyPrefix]
public static void Slow(CrawlerAI __instance)
{
crawler = ((Component)__instance).GetComponent<CrawlerRevamp>();
if (Object.op_Implicit((Object)(object)crawler) && !crawler.onCooldown)
{
crawler.hasBeenhit = true;
crawler.onCooldown = true;
crawler.previousAgentSpeed = ((EnemyAI)__instance).agent.speed;
crawler.previousAgentAcceleration = ((EnemyAI)__instance).agent.acceleration;
crawler.currentAgentSpeed = ((EnemyAI)__instance).agent.speed;
crawler.currentAgentAcceleration = ((EnemyAI)__instance).agent.acceleration;
Diversity.mls.LogInfo((object)"Crawler hit!");
}
}
}
[HarmonyPatch(typeof(PlayerControllerB))]
public class PlayerControllerBPatch
{
private static AudioSource audio;
[HarmonyPatch("Update")]
[HarmonyPostfix]
private static void regenDisabled(ref float ___healthRegenerateTimer)
{
if (!Configuration.playerRegen.Value)
{
___healthRegenerateTimer = 1f;
}
}
[HarmonyPatch(typeof(PlayerControllerB), "Update")]
[HarmonyPostfix]
private static void Dying(PlayerControllerB __instance, ref int ___health)
{
if (!Object.op_Implicit((Object)(object)((Component)__instance.thisPlayerBody).transform.Find("DyingAudio")) || !Configuration.playerDying.Value)
{
return;
}
audio = ((Component)((Component)__instance.thisPlayerBody).transform.Find("DyingAudio")).GetComponent<AudioSource>();
if (Object.op_Implicit((Object)(object)audio))
{
if (___health < 20)
{
((Behaviour)audio).enabled = true;
}
else
{
((Behaviour)audio).enabled = false;
}
}
}
}
[HarmonyPatch(typeof(SandSpiderAI))]
internal class SandSpiderAIPatch
{
private static SpiderRevamp spider;
[HarmonyPatch(typeof(SandSpiderAI), "HitEnemy")]
[HarmonyPrefix]
public static void Slow(SandSpiderAI __instance)
{
spider = ((Component)__instance).GetComponent<SpiderRevamp>();
if (Object.op_Implicit((Object)(object)spider) && !spider.onCooldown)
{
spider.hasBeenhit = true;
spider.onCooldown = true;
spider.previousAgentSpeed = ((EnemyAI)__instance).agent.speed;
spider.previousSpiderSpeed = __instance.spiderSpeed;
spider.currentAgentSpeed = ((EnemyAI)__instance).agent.speed;
spider.currentSpiderSpeed = __instance.spiderSpeed;
Diversity.mls.LogInfo((object)"Spider hit!");
}
}
}
}
namespace Diversity.Monsters
{
public class CentipedeRevamp : MonoBehaviour
{
private CentipedeAI centipede;
private InteractTrigger centipedeInteractTrigger;
public int clicks;
private void Start()
{
//IL_0030: 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_00ad: Unknown result type (might be due to invalid IL or missing references)
//IL_00b7: Expected O, but got Unknown
centipede = ((Component)this).gameObject.GetComponent<CentipedeAI>();
GameObject val = Object.Instantiate<GameObject>(Content.MainAssets.LoadAsset<GameObject>("assets/custom/centipede/interactobject.prefab"), new Vector3(0f, 0f, 0f), Quaternion.identity);
val.GetComponent<NetworkObject>().Spawn(true);
Diversity.mls.LogInfo((object)"Loaded centipede prefab!");
val.transform.SetParent(((Component)this).transform);
Diversity.mls.LogInfo((object)"Appended centipede prefab!");
centipedeInteractTrigger = val.GetComponent<InteractTrigger>();
Diversity.mls.LogInfo((object)"InteractTrigger fetched!");
centipedeInteractTrigger.interactable = true;
centipedeInteractTrigger.onInteract = new InteractEvent();
((UnityEvent<PlayerControllerB>)(object)centipedeInteractTrigger.onInteract).AddListener((UnityAction<PlayerControllerB>)Free);
}
public void Free(PlayerControllerB player)
{
Diversity.mls.LogInfo((object)"Player interacted with a centipede!");
}
private void Update()
{
if (Object.op_Implicit((Object)(object)centipede) && (Object)(object)centipede.clingingToPlayer != (Object)null)
{
Diversity.mls.LogInfo((object)"Centipede latched on head!!");
}
}
}
public class CrawlerRevamp : MonoBehaviour
{
private CrawlerAI crawler;
private static float slowAmount = Configuration.crawlerSlowAmount.Value;
private static float timeElapsed = 0f;
private static float cooldown = 0f;
public bool onCooldown = false;
public bool hasBeenhit = false;
public float previousAgentSpeed = 0f;
public float previousAgentAcceleration = 0f;
public float currentAgentSpeed = 0f;
public float currentAgentAcceleration = 0f;
private void Start()
{
crawler = ((Component)this).gameObject.GetComponent<CrawlerAI>();
}
private void Update()
{
if (!Object.op_Implicit((Object)(object)crawler))
{
return;
}
if (hasBeenhit)
{
if (timeElapsed < 2f)
{
currentAgentSpeed = Mathf.Lerp(currentAgentSpeed - currentAgentSpeed * slowAmount, previousAgentSpeed, timeElapsed / 2f);
currentAgentAcceleration = Mathf.Lerp(currentAgentAcceleration - currentAgentAcceleration * slowAmount, previousAgentAcceleration + 5f, timeElapsed / 2f);
timeElapsed += Time.deltaTime;
Diversity.mls.LogInfo((object)("Time elapsed: " + timeElapsed));
}
else
{
currentAgentSpeed = previousAgentSpeed;
currentAgentAcceleration = previousAgentAcceleration;
}
if (currentAgentSpeed == previousAgentSpeed)
{
hasBeenhit = false;
}
((EnemyAI)crawler).agent.speed = currentAgentSpeed;
((EnemyAI)crawler).agent.acceleration = currentAgentAcceleration;
}
if (onCooldown)
{
cooldown += Time.deltaTime;
}
if (onCooldown && cooldown > 2f && hasBeenhit)
{
Diversity.mls.LogInfo((object)"Crawler debuff hit is over.");
hasBeenhit = false;
timeElapsed = 0f;
}
if (onCooldown && cooldown > 3f)
{
Diversity.mls.LogInfo((object)"Crawler debuff cooldown is over.");
onCooldown = false;
cooldown = 0f;
}
}
}
public class SpiderRevamp : MonoBehaviour
{
private SandSpiderAI spider;
private static float slowAmount = Configuration.spiderSlowAmount.Value;
private static float timeElapsed = 0f;
private static float cooldown = 0f;
public bool onCooldown = false;
public bool hasBeenhit = false;
public float previousAgentSpeed = 0f;
public float previousSpiderSpeed = 0f;
public float currentAgentSpeed = 0f;
public float currentSpiderSpeed = 0f;
private void Start()
{
spider = ((Component)this).gameObject.GetComponent<SandSpiderAI>();
}
private void Update()
{
if (!Object.op_Implicit((Object)(object)spider))
{
return;
}
if (hasBeenhit)
{
if (timeElapsed < 1f)
{
currentSpiderSpeed = Mathf.Lerp(currentSpiderSpeed - currentSpiderSpeed * slowAmount, previousSpiderSpeed, timeElapsed / 1f);
currentAgentSpeed = Mathf.Lerp(currentAgentSpeed - currentAgentSpeed * slowAmount, previousAgentSpeed, timeElapsed / 1f);
timeElapsed += Time.deltaTime;
Diversity.mls.LogInfo((object)("Time elapsed: " + timeElapsed));
}
else
{
currentSpiderSpeed = previousSpiderSpeed;
currentAgentSpeed = previousAgentSpeed;
}
if (currentSpiderSpeed == previousSpiderSpeed)
{
hasBeenhit = false;
}
spider.spiderSpeed = currentSpiderSpeed;
((EnemyAI)spider).agent.speed = currentAgentSpeed;
if (currentSpiderSpeed > 0f)
{
((EnemyAI)spider).creatureAnimator.SetBool("moving", true);
}
else
{
((EnemyAI)spider).creatureAnimator.SetBool("moving", false);
}
}
if (onCooldown)
{
cooldown += Time.deltaTime;
}
if (onCooldown && cooldown > 1f && hasBeenhit)
{
Diversity.mls.LogInfo((object)"Spider debuff hit is over.");
hasBeenhit = false;
timeElapsed = 0f;
}
if (onCooldown && cooldown > 3f)
{
Diversity.mls.LogInfo((object)"Spider debuff cooldown is over.");
onCooldown = false;
cooldown = 0f;
}
}
}
}
namespace Diversity.Items
{
public class Bandages : GrabbableObject
{
private PlayerControllerB previousPlayerHeldBy;
public override void ItemActivate(bool used, bool buttonDown = true)
{
((GrabbableObject)this).ItemActivate(used, buttonDown);
if (((NetworkBehaviour)this).IsOwner)
{
Heal();
}
}
public override void EquipItem()
{
((GrabbableObject)this).EquipItem();
if ((Object)(object)base.playerHeldBy != (Object)null)
{
previousPlayerHeldBy = base.playerHeldBy;
}
}
private void Heal()
{
previousPlayerHeldBy.health = Mathf.Clamp(previousPlayerHeldBy.health + 20, 0, 100);
((GrabbableObject)this).DestroyObjectInHand(previousPlayerHeldBy);
}
}
}