Decompiled source of LandMine v1.0.0

REPO_LandMine.dll

Decompiled 3 weeks ago
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Photon.Pun;
using REPOLib.Modules;
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("REPO_LindMine")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("微软中国")]
[assembly: AssemblyProduct("REPO_LindMine")]
[assembly: AssemblyCopyright("Copyright © 微软中国 2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("152f1952-fb63-4bba-8df8-c78766c08abd")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace REPO_LindMine;

[BepInPlugin("com.Xiaohai.REPO.LindMine", "REPO.LindMine", "1.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Plugin : BaseUnityPlugin
{
	public AudioClip mineBeep;

	public GameObject landMindPrefeb;

	public const string version = "1.0.0";

	public static Plugin instance;

	public static ManualLogSource logger;

	public ConfigEntry<int> landMineAmout;

	public ConfigEntry<int> landMinePlayerDamage;

	public ConfigEntry<int> landMineEnemyDamage;

	public ConfigEntry<float> explodeSize;

	public ConfigEntry<bool> DetectEnemyCollider;

	private void Awake()
	{
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		instance = this;
		logger = ((BaseUnityPlugin)this).Logger;
		logger.LogInfo((object)"地雷MOD加载成功,版本:1.0.0");
		new Harmony("com.Xiaohai.REPO.LindMine").PatchAll();
		LoadAB();
		LoadConfig();
	}

	private void LoadAB()
	{
		string location = Assembly.GetExecutingAssembly().Location;
		string directoryName = Path.GetDirectoryName(location);
		string text = Path.Combine(directoryName, "LandMine");
		AssetBundle val = AssetBundle.LoadFromFile(text);
		mineBeep = val.LoadAsset<AudioClip>("MineBeep.ogg");
		if ((Object)(object)mineBeep == (Object)null)
		{
			Debug.LogError((object)"加载音频资源 MineBeep.ogg 失败");
		}
		landMindPrefeb = val.LoadAsset<GameObject>("LandMine.prefab");
		if ((Object)(object)landMindPrefeb == (Object)null)
		{
			Debug.LogError((object)"加载预制体 LandMine.prefab 失败");
		}
		landMindPrefeb.AddComponent<LandMine>();
		NetworkPrefabs.RegisterNetworkPrefab(landMindPrefeb);
		Utilities.FixAudioMixerGroups(landMindPrefeb);
	}

	private void LoadConfig()
	{
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		//IL_0033: Expected O, but got Unknown
		//IL_0060: Unknown result type (might be due to invalid IL or missing references)
		//IL_006a: Expected O, but got Unknown
		//IL_0097: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a1: 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
		//IL_010f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0119: Expected O, but got Unknown
		landMineAmout = ((BaseUnityPlugin)this).Config.Bind<int>("深陷雷区", "地雷数量/", 25, new ConfigDescription("landMine Amout", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 150), Array.Empty<object>()));
		landMinePlayerDamage = ((BaseUnityPlugin)this).Config.Bind<int>("深陷雷区", "玩家伤害", 80, new ConfigDescription("landMine Player Damage", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 999), Array.Empty<object>()));
		landMineEnemyDamage = ((BaseUnityPlugin)this).Config.Bind<int>("深陷雷区", "怪物伤害", 30, new ConfigDescription("landMine Enemy Damage", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 999), Array.Empty<object>()));
		DetectEnemyCollider = ((BaseUnityPlugin)this).Config.Bind<bool>("深陷雷区", "检测敌人碰撞体/Detect Enemy Collider?", true, new ConfigDescription("Detect Enemy Collider", (AcceptableValueBase)(object)new AcceptableValueList<bool>(new bool[2] { true, false }), Array.Empty<object>()));
		explodeSize = ((BaseUnityPlugin)this).Config.Bind<float>("深陷雷区", "地雷爆炸范围", 1.5f, new ConfigDescription("explode Size", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 10f), Array.Empty<object>()));
	}
}
[HarmonyPatch(typeof(LevelGenerator))]
public class LevelGeneratorPatch
{
	[HarmonyPostfix]
	[HarmonyPatch("GenerateDone")]
	private static void AfterLevelGenerated(LevelGenerator __instance)
	{
		//IL_0080: Unknown result type (might be due to invalid IL or missing references)
		//IL_0085: Unknown result type (might be due to invalid IL or missing references)
		//IL_0060: Unknown result type (might be due to invalid IL or missing references)
		//IL_0065: Unknown result type (might be due to invalid IL or missing references)
		if (!SemiFunc.IsMasterClientOrSingleplayer() || Plugin.instance.landMineAmout.Value <= 0 || !ShouldRunCustomLogic())
		{
			return;
		}
		int value = Plugin.instance.landMineAmout.Value;
		int i;
		for (i = 0; i < value; i++)
		{
			if (SemiFunc.IsMultiplayer())
			{
				PhotonNetwork.Instantiate(((Object)Plugin.instance.landMindPrefeb).name, GetRandomPoint(), Quaternion.identity, (byte)0, (object[])null);
			}
			else
			{
				Object.Instantiate<GameObject>(Plugin.instance.landMindPrefeb, GetRandomPoint(), Quaternion.identity);
			}
		}
		Plugin.logger.LogInfo((object)$"地雷数量: 应生成{value},实际生成{i}");
	}

	public static Vector3 GetRandomPoint()
	{
		//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_0036: Unknown result type (might be due to invalid IL or missing references)
		//IL_0037: 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_00f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_0041: 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_00ed: 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_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_0086: Unknown result type (might be due to invalid IL or missing references)
		//IL_00aa: 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_00b5: 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_00b7: Unknown result type (might be due to invalid IL or missing references)
		LevelPoint[] array = Object.FindObjectsOfType<LevelPoint>();
		if (array.Length == 0)
		{
			return Vector3.zero;
		}
		Transform transform = ((Component)array[Random.Range(0, array.Length)]).transform;
		Vector3 position = transform.position;
		Vector3 val = position;
		for (int i = 0; (float)i < 5f; i++)
		{
			if (!HasMineInArea(val, 0.5f))
			{
				return val;
			}
			float num = ((i % 2 == 0) ? 1.5f : (-1.5f));
			float num2 = ((i % 3 == 0) ? 1.5f : (-1.5f));
			val = position + new Vector3((i % 2 == 0) ? num : 0f, 0f, (i % 2 != 0) ? num2 : 0f);
			Debug.DrawLine(position, val, Color.yellow, 2f);
		}
		Debug.LogWarning((object)"无法找到无地雷位置,返回原始点");
		return position;
	}

	private static bool HasMineInArea(Vector3 position, float radius)
	{
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		Collider[] array = (Collider[])(object)new Collider[10];
		int num = Physics.OverlapSphereNonAlloc(position, radius, array);
		for (int i = 0; i < num; i++)
		{
			if (((Component)array[i]).gameObject.activeInHierarchy && (Object)(object)((Component)array[i]).GetComponentInParent<LandMine>() != (Object)null)
			{
				return true;
			}
		}
		return false;
	}

	private static bool ShouldRunCustomLogic()
	{
		RunManager instance = RunManager.instance;
		return (Object)(object)instance != (Object)null && instance.levels.Contains(instance.levelCurrent) && (Object)(object)instance.levelCurrent != (Object)(object)instance.levelTutorial && (Object)(object)instance.levelCurrent != (Object)(object)instance.levelShop && (Object)(object)instance.levelCurrent != (Object)(object)instance.levelLobbyMenu;
	}
}
internal class LandMine : MonoBehaviour
{
	private ParticleScriptExplosion particle;

	private float beepTimer = 0f;

	private AudioSource audio;

	private Light beepLight;

	private void Start()
	{
		particle = ((Component)this).gameObject.GetComponent<ParticleScriptExplosion>();
		if ((Object)(object)particle == (Object)null)
		{
			Debug.LogError((object)"ParticlePrefabExplosion 组件缺失!", (Object)(object)this);
			return;
		}
		beepTimer = Time.time;
		beepLight = ((Component)this).gameObject.GetComponentInChildren<Light>();
		audio = ((Component)this).gameObject.GetComponentInChildren<AudioSource>();
		if ((Object)(object)audio == (Object)null)
		{
			Debug.LogError((object)"AudioSource 组件缺失!", (Object)(object)this);
		}
		else
		{
			audio.clip = Plugin.instance.mineBeep;
		}
	}

	private void OnTriggerExit(Collider other)
	{
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		bool value = Plugin.instance.DetectEnemyCollider.Value;
		bool flag = true;
		Enemy componentInChildren = ((Component)((Component)other).transform.parent.parent).GetComponentInChildren<Enemy>();
		PlayerAvatar componentInParent = ((Component)other).GetComponentInParent<PlayerAvatar>();
		if (!value && !flag)
		{
			Plugin.logger.LogInfo((object)"全局开关关闭,不触发任何爆炸");
			return;
		}
		bool flag2 = (Object)(object)componentInChildren != (Object)null;
		bool flag3 = (Object)(object)componentInParent != (Object)null;
		if ((flag2 || flag3) && (!flag2 || value))
		{
			particle.Spawn(((Component)this).transform.position, Plugin.instance.explodeSize.Value, Plugin.instance.landMinePlayerDamage.Value, Plugin.instance.landMineEnemyDamage.Value, 1f, false, false, 1f);
			Object.Destroy((Object)(object)((Component)this).gameObject);
		}
	}

	private void Update()
	{
		if (Time.time - beepTimer >= 3f)
		{
			audio.Play();
			((Component)beepLight).gameObject.SetActive(true);
			beepTimer = Time.time;
		}
		if (!audio.isPlaying)
		{
			((Component)beepLight).gameObject.SetActive(false);
		}
	}

	private void OnDestroy()
	{
		if ((Object)(object)beepLight != (Object)null)
		{
			Object.Destroy((Object)(object)((Component)beepLight).gameObject);
		}
		if ((Object)(object)audio != (Object)null)
		{
			audio.Stop();
			Object.Destroy((Object)(object)audio);
		}
		if ((Object)(object)particle != (Object)null)
		{
			Object.Destroy((Object)(object)particle);
		}
	}
}