using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.SceneManagement;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("EveryEnemyInA5MeterRadiusExplodes")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Explodes Every Enemy In A 5 Meter Radius")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("EveryEnemyInA5MeterRadiusExplodes")]
[assembly: AssemblyTitle("EveryEnemyInA5MeterRadiusExplodes")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace EveryEnemyInA5MeterRadiusExplodes
{
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "EveryEnemyInA5MeterRadiusExplodes";
public const string PLUGIN_NAME = "EveryEnemyInA5MeterRadiusExplodes";
public const string PLUGIN_VERSION = "1.0.0";
}
}
namespace EveryEnemyExplodesInA5MeterRadius
{
[BepInPlugin("EveryEnemyInA5MeterRadiusExplodes", "EveryEnemyInA5MeterRadiusExplodes", "1.0.0")]
public class Plugin : BaseUnityPlugin
{
public enum ExplosionType
{
MinosPrime,
RocketHarmless,
Wave,
Landmine,
Big,
Ferryman,
Mindflayer,
Lightning,
Sand,
HammerWeak,
MaliciousRailcannon,
WaveSisyphus,
LightningStrikeExplosive,
Default,
SisyphusPrime,
Gutterman,
WaveEnemy,
Super,
Harmless,
SisyphusPrimeCharged,
LightningNoLightning
}
public ConfigEntry<float> radius;
public ConfigEntry<bool> IncludeEverything;
public ConfigEntry<string> explosionPath;
public GameObject Kaboom;
public ConfigEntry<float> cooldownTime;
public ConfigEntry<bool> canHitGameObjectMoreThenOnce;
public ConfigEntry<bool> RandomTime;
public ConfigEntry<int> limit;
public ConfigEntry<bool> JustDupeIt;
public ConfigEntry<bool> JustKillThem;
public ConfigEntry<bool> DestroyThem;
public ConfigEntry<bool> IncludePlayer;
public ConfigEntry<bool> ShowSphere;
private float nextExplosionTime;
public List<GameObject> alreadyExplodedGameObjects = new List<GameObject>();
private GameObject sphereVisualization;
private Material PreviewMat;
public ConfigEntry<ExplosionType> type;
public static string GetExplosionPath(ExplosionType type)
{
switch (type)
{
case ExplosionType.MinosPrime:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Minos Prime.prefab";
case ExplosionType.RocketHarmless:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Rocket Harmless.prefab";
case ExplosionType.Wave:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Wave.prefab";
case ExplosionType.Landmine:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Landmine.prefab";
case ExplosionType.Big:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Big.prefab";
case ExplosionType.Ferryman:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Ferryman.prefab";
case ExplosionType.Mindflayer:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Mindflayer.prefab";
case ExplosionType.Lightning:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Lightning.prefab";
case ExplosionType.Sand:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Sand.prefab";
case ExplosionType.HammerWeak:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Hammer Weak.prefab";
case ExplosionType.MaliciousRailcannon:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Malicious Railcannon.prefab";
case ExplosionType.WaveSisyphus:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Wave Sisyphus.prefab";
case ExplosionType.LightningStrikeExplosive:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Lightning Strike Explosive.prefab";
case ExplosionType.Default:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion.prefab";
case ExplosionType.SisyphusPrime:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Sisyphus Prime.prefab";
case ExplosionType.Gutterman:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Gutterman.prefab";
case ExplosionType.WaveEnemy:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Wave Enemy.prefab";
case ExplosionType.Super:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Super.prefab";
case ExplosionType.Harmless:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Harmless.prefab";
case ExplosionType.SisyphusPrimeCharged:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Sisyphus Prime Charged.prefab";
case ExplosionType.LightningNoLightning:
return "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Lightning - No Lightning.prefab";
default:
Debug.LogError((object)"nothing lol");
return null;
}
}
private void Start()
{
radius = ((BaseUnityPlugin)this).Config.Bind<float>("ExplosionSettings", "Radius", 5f, (ConfigDescription)null);
limit = ((BaseUnityPlugin)this).Config.Bind<int>("ExplosionSettings", "Limit", 0, "Limits the amount of targets (0 = infinite)");
cooldownTime = ((BaseUnityPlugin)this).Config.Bind<float>("ExplosionSettings", "Cooldown Time", 2f, (ConfigDescription)null);
canHitGameObjectMoreThenOnce = ((BaseUnityPlugin)this).Config.Bind<bool>("ExplosionSettings", "Can Hit Gameobjects more then once", true, "When disabled, it can only explode gameobjects once");
RandomTime = ((BaseUnityPlugin)this).Config.Bind<bool>("ExplosionSettings", "random time", false, (ConfigDescription)null);
type = ((BaseUnityPlugin)this).Config.Bind<ExplosionType>("ExplosionSettings", "Preset explosions", ExplosionType.Big, "Only use in game");
type.SettingChanged += Type_SettingChanged;
explosionPath = ((BaseUnityPlugin)this).Config.Bind<string>("ExplosionSettings", "Explosion Path", "Assets/Prefabs/Attacks and Projectiles/Explosions/Explosion Big.prefab", (ConfigDescription)null);
explosionPath.SettingChanged += ExplosionPath_SettingChanged;
IncludeEverything = ((BaseUnityPlugin)this).Config.Bind<bool>("BehaviorToggles", "Include Everything", false, (ConfigDescription)null);
IncludePlayer = ((BaseUnityPlugin)this).Config.Bind<bool>("BehaviorToggles", "Include Player", false, (ConfigDescription)null);
JustDupeIt = ((BaseUnityPlugin)this).Config.Bind<bool>("BehaviorToggles", "Duplicate them", false, "Duplicates the objects instead of exploding them");
DestroyThem = ((BaseUnityPlugin)this).Config.Bind<bool>("BehaviorToggles", "destroy them", false, "destroy the objects instead of exploding them (DONT ENABLE THIS)");
JustKillThem = ((BaseUnityPlugin)this).Config.Bind<bool>("BehaviorToggles", "InstaKill enemies", false, "instakills the enemies instead of exploding them");
ShowSphere = ((BaseUnityPlugin)this).Config.Bind<bool>("BehaviorToggles", "Show Sphere", false, "Shows a sphere representing the explosion radius");
nextExplosionTime = Time.time;
((MonoBehaviour)this).StartCoroutine(LoadKaboom());
SceneManager.sceneLoaded += SceneManager_sceneLoaded;
}
private void ExplosionPath_SettingChanged(object sender, EventArgs e)
{
((MonoBehaviour)this).StartCoroutine(LoadKaboom());
}
private void Type_SettingChanged(object sender, EventArgs e)
{
explosionPath.Value = GetExplosionPath(type.Value);
}
private void CreateSphereVisualization()
{
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Expected O, but got Unknown
//IL_0082: 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_00d3: 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)
sphereVisualization = GameObject.CreatePrimitive((PrimitiveType)0);
sphereVisualization.SetActive(false);
((Object)sphereVisualization).name = "ExplosionRadiusSphere";
Object.Destroy((Object)(object)sphereVisualization.GetComponent<Collider>());
Renderer component = sphereVisualization.GetComponent<Renderer>();
if ((Object)(object)PreviewMat == (Object)null)
{
Material val = new Material(Shader.Find("Standard"));
val.color = new Color(1f, 0f, 0f, 0.3f);
component.material = val;
}
else
{
component.material = PreviewMat;
}
MeshFilter component2 = sphereVisualization.GetComponent<MeshFilter>();
Mesh mesh = component2.mesh;
Vector3[] normals = mesh.normals;
for (int i = 0; i < normals.Length; i++)
{
normals[i] = -normals[i];
}
mesh.normals = normals;
for (int j = 0; j < mesh.subMeshCount; j++)
{
int[] triangles = mesh.GetTriangles(j);
for (int k = 0; k < triangles.Length; k += 3)
{
int num = triangles[k];
triangles[k] = triangles[k + 1];
triangles[k + 1] = num;
}
mesh.SetTriangles(triangles, j);
}
}
private void SceneManager_sceneLoaded(Scene arg0, LoadSceneMode arg1)
{
alreadyExplodedGameObjects.Clear();
if ((Object)(object)Kaboom == (Object)null)
{
((MonoBehaviour)this).StartCoroutine(LoadKaboom());
}
if ((Object)(object)PreviewMat == (Object)null)
{
((MonoBehaviour)this).StartCoroutine(loadPrevMat());
}
if ((Object)(object)sphereVisualization == (Object)null)
{
CreateSphereVisualization();
}
}
public IEnumerator loadPrevMat()
{
AsyncOperationHandle<Material> operationHandle = Addressables.LoadAssetAsync<Material>((object)"Assets/Materials/Preview Object.mat");
yield return (object)new WaitUntil((Func<bool>)(() => operationHandle.IsDone));
PreviewMat = operationHandle.Result;
}
private void UpdateSphereVisualization(Vector3 center)
{
//IL_001d: 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_0045: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)sphereVisualization != (Object)null)
{
sphereVisualization.transform.position = center;
sphereVisualization.transform.localScale = Vector3.one * (radius.Value * 2f);
sphereVisualization.SetActive(ShowSphere.Value);
}
else
{
Debug.Log((object)"no spher");
}
}
private void FixedUpdate()
{
//IL_000e: 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_0226: Unknown result type (might be due to invalid IL or missing references)
//IL_0232: Unknown result type (might be due to invalid IL or missing references)
//IL_028d: Unknown result type (might be due to invalid IL or missing references)
//IL_0292: Unknown result type (might be due to invalid IL or missing references)
//IL_032d: Unknown result type (might be due to invalid IL or missing references)
//IL_0332: Unknown result type (might be due to invalid IL or missing references)
//IL_0305: Unknown result type (might be due to invalid IL or missing references)
//IL_0311: Unknown result type (might be due to invalid IL or missing references)
Transform transform = ((Component)MonoSingleton<NewMovement>.Instance).transform;
UpdateSphereVisualization(transform.position);
if ((Object)(object)Kaboom == (Object)null || Time.time < nextExplosionTime)
{
return;
}
List<Collider> list = Physics.OverlapSphere(transform.position, radius.Value).ToList();
if (list.Count <= 0 || !(Time.timeScale > 0f))
{
return;
}
int num = 0;
int num2 = ((limit.Value > 0) ? Mathf.Clamp(limit.Value, 1, list.Count) : list.Count);
foreach (Collider item in list)
{
if (num >= num2)
{
break;
}
if (alreadyExplodedGameObjects.Contains(((Component)item).gameObject) && !canHitGameObjectMoreThenOnce.Value)
{
continue;
}
if (JustKillThem.Value)
{
if (Object.op_Implicit((Object)(object)((Component)item).gameObject.GetComponent<EnemyIdentifier>()))
{
((Component)item).gameObject.GetComponent<EnemyIdentifier>().InstaKill();
}
}
else if ((Object.op_Implicit((Object)(object)((Component)item).gameObject.GetComponent<EnemyIdentifier>()) && !((Component)item).gameObject.GetComponent<EnemyIdentifier>().dead && !((Component)item).gameObject.GetComponent<EnemyIdentifier>().blessed && (Object)(object)((Component)item).gameObject.GetComponent<EnemyIdentifier>().idol == (Object)null && ((Object)(object)((Component)item).gameObject.GetComponent<EnemyIdentifier>().spider == (Object)null || ((Object)(object)((Component)item).gameObject.GetComponent<EnemyIdentifier>().spider != (Object)null && ((Component)item).gameObject.GetComponent<EnemyIdentifier>().isGasolined))) || IncludeEverything.Value)
{
if (JustDupeIt.Value)
{
Object.Instantiate<GameObject>(((Component)item).gameObject, ((Component)item).transform.position, ((Component)item).transform.rotation);
}
else if (DestroyThem.Value)
{
if (IsParentOfPlayer(((Component)item).gameObject.transform))
{
continue;
}
Object.Destroy((Object)(object)((Component)item).gameObject);
}
else
{
Object.Instantiate<GameObject>(Kaboom, ((Component)item).transform.position, Quaternion.identity);
alreadyExplodedGameObjects.Add(((Component)item).gameObject);
}
num++;
}
else if (Object.op_Implicit((Object)(object)((Component)item).gameObject.GetComponent<NewMovement>()) && IncludePlayer.Value)
{
if (JustDupeIt.Value)
{
Object.Instantiate<GameObject>(((Component)item).gameObject, ((Component)item).transform.position, ((Component)item).transform.rotation);
}
else
{
Object.Instantiate<GameObject>(Kaboom, ((Component)item).transform.position, Quaternion.identity);
alreadyExplodedGameObjects.Add(((Component)item).gameObject);
}
num++;
}
}
float num3 = (RandomTime.Value ? Random.Range(0f, cooldownTime.Value) : cooldownTime.Value);
nextExplosionTime = Time.time + num3;
}
private bool IsParentOfPlayer(Transform child)
{
Transform transform = ((Component)MonoSingleton<NewMovement>.Instance).transform;
Transform parent = child.parent;
while ((Object)(object)parent != (Object)null || (Object)(object)parent == (Object)(object)transform)
{
parent = parent.parent;
}
return (Object)(object)parent != (Object)null;
}
private IEnumerator LoadKaboom()
{
AsyncOperationHandle<GameObject> asyncOperationHandle = Addressables.LoadAssetAsync<GameObject>((object)explosionPath.Value);
yield return (object)new WaitUntil((Func<bool>)(() => asyncOperationHandle.IsDone));
Debug.Log((object)"got it");
Kaboom = asyncOperationHandle.Result;
}
}
}