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);
}
}
}
}