Decompiled source of RemovePlayerPlacements v0.0.2

RemovePlayerPlacements/RemovePlayerPlacements.dll

Decompiled 2 months ago
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using GameEvent;
using HarmonyLib;
using RemovePlayerPlacements.Patches;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("RemovePlayerPlacements")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("RemovePlayerPlacements")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("d9a26543-7813-4d2e-b35f-39ec1985059a")]
[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 RemovePlayerPlacements
{
	public class PieceDestroyedEventListener : IGameEventListener
	{
		void IGameEventListener.handleEvent(GameEvent e)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			DestroyPieceEvent val = (DestroyPieceEvent)e;
			Placeable piece = val.Piece;
			int playerNetworkNumber = val.PlayerNetworkNumber;
			ManualLogSource mls = RemovePlayerPlacementsBase.Instance.mls;
			string[] obj = new string[7]
			{
				playerNetworkNumber.ToString(),
				" destroyed ",
				piece.Name,
				" at ",
				null,
				null,
				null
			};
			Vector2 originalPosition = piece.OriginalPosition;
			obj[4] = ((object)(Vector2)(ref originalPosition)).ToString();
			obj[5] = " in orientation ";
			Quaternion originalRotation = piece.OriginalRotation;
			obj[6] = ((object)(Quaternion)(ref originalRotation)).ToString();
			mls.LogInfo((object)string.Concat(obj));
			Placement placement = null;
			int num = -1;
			foreach (int key in RemovePlayerPlacementsBase.Instance.playerPlacements.Keys)
			{
				foreach (Placement item in RemovePlayerPlacementsBase.Instance.playerPlacements[key])
				{
					if (((object)item.placedObject).Equals((object?)piece))
					{
						placement = item;
						num = key;
						break;
					}
				}
				if (placement != null)
				{
					break;
				}
			}
			if (num > 0)
			{
				RemovePlayerPlacementsBase.Instance.playerPlacements[num].Remove(placement);
			}
			else
			{
				RemovePlayerPlacementsBase.Instance.mls.LogWarning((object)"Destroyed gameobject could not be found in any list.");
			}
		}
	}
	public class Placement
	{
		public Placeable placedObject;

		public bool destroyed;

		public int id;

		public Vector2 originalPosition;

		public Quaternion originalRotation;

		public PlayerReference playerRef;

		public Placement(Placeable placedObject, int id, Vector2 originalPosition, Quaternion originalRotation, bool destroyed = false, PlayerReference playerRef = null)
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: 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: Unknown result type (might be due to invalid IL or missing references)
			this.placedObject = placedObject;
			this.id = id;
			this.originalPosition = originalPosition;
			this.originalRotation = originalRotation;
			this.playerRef = playerRef;
			this.destroyed = destroyed;
		}
	}
	public class PlayerReference
	{
		public string name;

		public int playerNumber;

		public Color color;

		public PlayerReference(string name, int playerNumber, Color color)
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			this.name = name;
			this.playerNumber = playerNumber;
			this.color = color;
		}
	}
	[BepInPlugin("RPP", "Remove Player Placements", "0.0.2")]
	public class RemovePlayerPlacementsBase : BaseUnityPlugin
	{
		private const string modGUID = "RPP";

		private const string modName = "Remove Player Placements";

		private const string modVersion = "0.0.2";

		public Dictionary<int, List<Placement>> playerPlacements = new Dictionary<int, List<Placement>>();

		private static Harmony harmony = new Harmony("RPP");

		public static RemovePlayerPlacementsBase Instance;

		internal ManualLogSource mls;

		private const KeyCode reverseKey = 313;

		private bool indication;

		private List<GameObject> highlights = new List<GameObject>();

		public GamePhase gamePhase = (GamePhase)1;

		private Character[] characters;

		private int offsetIndex = 0;

		private int lastOffsetIndex = 0;

		private void Awake()
		{
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			mls = Logger.CreateLogSource("RPP");
			Instance.mls.LogInfo((object)"Plugin loaded.");
		}

		private void Start()
		{
			GameEventManager.ChangeListener<PiecePlacedEvent>((IGameEventListener)(object)new PiecePlacedEventListener(), true);
			GameEventManager.ChangeListener<DestroyPieceEvent>((IGameEventListener)(object)new PieceDestroyedEventListener(), true);
			GameEventManager.ChangeListener<StartPhaseEvent>((IGameEventListener)(object)new StartPhaseEventListener(), true);
		}

		private void Update()
		{
			if (InTreehouse() || !LobbyManager.instance.IsHost)
			{
				return;
			}
			if (Input.GetKeyDown((KeyCode)313))
			{
				offsetIndex = 0;
			}
			if (Input.GetKey((KeyCode)313))
			{
				ShowIndicator();
				int num = -1;
				for (int i = 1; i <= 9; i++)
				{
					if (Input.GetKeyDown((KeyCode)(48 + i)))
					{
						num = i;
						break;
					}
				}
				if (num >= 0)
				{
					Rollback(num);
				}
				float axis = Input.GetAxis("Mouse ScrollWheel");
				if (axis == 0f)
				{
					return;
				}
				int num2 = ((!(axis < 0f)) ? 1 : (-1));
				int num3 = 0;
				foreach (List<Placement> value in playerPlacements.Values)
				{
					num3 = Mathf.Max(num3, value.Count);
				}
				offsetIndex += num2;
				offsetIndex = Mathf.Clamp(offsetIndex, -1 * num3 + 1, 0);
				if (offsetIndex != lastOffsetIndex)
				{
					HideIndicator();
					ShowIndicator();
				}
				lastOffsetIndex = offsetIndex;
			}
			else
			{
				HideIndicator();
			}
		}

		private void ShowIndicator()
		{
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			if (indication)
			{
				return;
			}
			characters = Object.FindObjectsOfType<Character>();
			foreach (int key in playerPlacements.Keys)
			{
				List<Placement> list = playerPlacements[key];
				if (list.Count != 0)
				{
					int index = Mathf.Clamp(list.Count - 1 + offsetIndex, 0, list.Count - 1);
					Placement placement = list[index];
					if ((Object)(object)placement.placedObject != (Object)null && (Object)(object)((Component)placement.placedObject).gameObject != (Object)null)
					{
						Highlight(((Component)placement.placedObject).gameObject, "(" + key + ") " + placement.playerRef.name, placement.playerRef.color);
					}
				}
			}
			indication = true;
		}

		private void HideIndicator()
		{
			if (!indication)
			{
				return;
			}
			foreach (GameObject highlight in highlights)
			{
				if ((Object)(object)highlight != (Object)null)
				{
					Object.Destroy((Object)(object)highlight);
				}
			}
			indication = false;
		}

		public void Highlight(GameObject go, string hint, Color color)
		{
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)go == (Object)null))
			{
				GameObject copiedNameTag = GetCopiedNameTag();
				highlights.Add(copiedNameTag);
				copiedNameTag.transform.SetParent((Transform)null);
				copiedNameTag.transform.position = go.transform.position;
				Text componentInChildren = copiedNameTag.GetComponentInChildren<Text>();
				if ((Object)(object)componentInChildren != (Object)null)
				{
					componentInChildren.text = hint;
					((Graphic)componentInChildren).color = color;
				}
				else
				{
					((BaseUnityPlugin)this).Logger.LogError((object)"NameTag does not have a UnityEngine.UI.Text component.");
				}
			}
		}

		public GameObject GetCopiedNameTag()
		{
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Invalid comparison between Unknown and I4
			Character val = null;
			Character[] array = characters;
			foreach (Character val2 in array)
			{
				if (val2.AssociatedGamePlayer.networkNumber == 1)
				{
					val = val2;
				}
			}
			if ((Object)(object)val == (Object)null)
			{
				return null;
			}
			Transform val3 = (((int)gamePhase == 3) ? ((Component)val.AssociatedGamePlayer.CursorInstance.nameTag).transform : ((Component)val).gameObject.transform.Find("NameTag"));
			return Object.Instantiate<GameObject>(((Component)val3).gameObject);
		}

		public bool InTreehouse()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			Scene activeScene = SceneManager.GetActiveScene();
			return ((Scene)(ref activeScene)).name == "TreeHouseLobby";
		}

		public void Unhighlight(GameObject go)
		{
			Transform val = go.transform.Find("WorldSpaceCanvas");
			if ((Object)(object)val != (Object)null)
			{
				Object.Destroy((Object)(object)((Component)val).gameObject);
			}
		}

		public void Rollback(int playerId)
		{
			if (!playerPlacements.ContainsKey(playerId))
			{
				return;
			}
			List<Placement> list = playerPlacements[playerId];
			if (list.Count == 0)
			{
				return;
			}
			int index = Mathf.Clamp(list.Count - 1 + offsetIndex, 0, list.Count - 1);
			Placement placement = list[index];
			if (placement.destroyed)
			{
				if (((NetworkManager)LobbyManager.instance).client != null)
				{
				}
			}
			else if (!((Object)(object)placement.placedObject == (Object)null) && !((Object)(object)((Component)placement.placedObject).gameObject == (Object)null))
			{
				list.Remove(placement);
				placement.placedObject.DestroySelf(false, true, true);
				mls.LogInfo((object)("Removed  placed block " + placement.id + " of player " + placement.playerRef.name + " (" + playerId + ")"));
				HideIndicator();
				ShowIndicator();
			}
		}
	}
	internal class StartPhaseEventListener : IGameEventListener
	{
		public void handleEvent(GameEvent e)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Invalid comparison between Unknown and I4
			if (e is StartPhaseEvent)
			{
				StartPhaseEvent val = (StartPhaseEvent)e;
				RemovePlayerPlacementsBase.Instance.gamePhase = val.Phase;
				if ((int)val.Phase == 1)
				{
					RemovePlayerPlacementsBase.Instance.playerPlacements.Clear();
				}
			}
		}
	}
}
namespace RemovePlayerPlacements.Patches
{
	public class PiecePlacedEventListener : IGameEventListener
	{
		void IGameEventListener.handleEvent(GameEvent e)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			PiecePlacedEvent val = (PiecePlacedEvent)e;
			Placeable placedBlock = val.PlacedBlock;
			int playerNumber = val.PlayerNumber;
			if (playerNumber != 0 && !placedBlock.Name.Equals("Bomb Mini") && !placedBlock.Name.Equals("3x3 Bomb") && !placedBlock.Name.Equals("Bomb Mega"))
			{
				ManualLogSource mls = RemovePlayerPlacementsBase.Instance.mls;
				string[] obj = new string[7]
				{
					playerNumber.ToString(),
					" placed ",
					placedBlock.Name,
					" at ",
					null,
					null,
					null
				};
				Vector2 originalPosition = placedBlock.OriginalPosition;
				obj[4] = ((object)(Vector2)(ref originalPosition)).ToString();
				obj[5] = " in orientation ";
				Quaternion originalRotation = placedBlock.OriginalRotation;
				obj[6] = ((object)(Quaternion)(ref originalRotation)).ToString();
				mls.LogInfo((object)string.Concat(obj));
				LobbyPlayer lobbyPlayer = LobbyManager.instance.GetLobbyPlayer(playerNumber);
				PlayerReference playerRef = new PlayerReference(lobbyPlayer.playerName, playerNumber, lobbyPlayer.NetworkPlayerColor);
				Placement item = new Placement(placedBlock, placedBlock.ID, placedBlock.OriginalPosition, placedBlock.OriginalRotation, destroyed: false, playerRef);
				if (!RemovePlayerPlacementsBase.Instance.playerPlacements.ContainsKey(playerNumber))
				{
					RemovePlayerPlacementsBase.Instance.playerPlacements.Add(playerNumber, new List<Placement>());
				}
				RemovePlayerPlacementsBase.Instance.playerPlacements[playerNumber].Add(item);
			}
		}
	}
}