diff --git a/SlayTheSpire2.LAN.Multiplayer/Helpers/LanMapDrawingsHelper.cs b/SlayTheSpire2.LAN.Multiplayer/Helpers/LanMapDrawingsHelper.cs new file mode 100644 index 0000000..2867644 --- /dev/null +++ b/SlayTheSpire2.LAN.Multiplayer/Helpers/LanMapDrawingsHelper.cs @@ -0,0 +1,9 @@ +// ReSharper disable ClassNeverInstantiated.Global + +namespace SlayTheSpire2.LAN.Multiplayer.Helpers +{ + internal class LanMapDrawingsHelper + { + public static readonly HashSet DisableDrawingHashSet = []; + } +} \ No newline at end of file diff --git a/SlayTheSpire2.LAN.Multiplayer/Patchs/NJoinFriendScreenPatch.cs b/SlayTheSpire2.LAN.Multiplayer/Patchs/NJoinFriendScreenPatch.cs index 372d53f..8f8ce15 100644 --- a/SlayTheSpire2.LAN.Multiplayer/Patchs/NJoinFriendScreenPatch.cs +++ b/SlayTheSpire2.LAN.Multiplayer/Patchs/NJoinFriendScreenPatch.cs @@ -19,7 +19,7 @@ namespace SlayTheSpire2.LAN.Multiplayer.Patchs { private static void Prefix(NJoinFriendScreen __instance) { - var lanPanel = new NinePatchRect { Name = "LanPanel" }; + var lanPanel = new NinePatchRect { Name = "LANPanel" }; __instance.AddChild(lanPanel); diff --git a/SlayTheSpire2.LAN.Multiplayer/Patchs/NMapDrawingsPatch.cs b/SlayTheSpire2.LAN.Multiplayer/Patchs/NMapDrawingsPatch.cs new file mode 100644 index 0000000..9378973 --- /dev/null +++ b/SlayTheSpire2.LAN.Multiplayer/Patchs/NMapDrawingsPatch.cs @@ -0,0 +1,23 @@ +using Godot; +using HarmonyLib; +using MegaCrit.Sts2.Core.Entities.Players; +using MegaCrit.Sts2.Core.Nodes.Screens.Map; +using SlayTheSpire2.LAN.Multiplayer.Helpers; + +// ReSharper disable UnusedMember.Global +// ReSharper disable UnusedType.Global + +namespace SlayTheSpire2.LAN.Multiplayer.Patchs +{ + [HarmonyPatch(typeof(NMapDrawings), "CreateLineForPlayer")] + internal class NMapDrawingsPatch + { + private static void Postfix(Player player, Line2D __result) + { + if (LanMapDrawingsHelper.DisableDrawingHashSet.Contains(player.NetId)) + { + __result.Visible = false; + } + } + } +} \ No newline at end of file diff --git a/SlayTheSpire2.LAN.Multiplayer/Patchs/NMultiplayerPlayerExpandedStatePatch.cs b/SlayTheSpire2.LAN.Multiplayer/Patchs/NMultiplayerPlayerExpandedStatePatch.cs new file mode 100644 index 0000000..433a19e --- /dev/null +++ b/SlayTheSpire2.LAN.Multiplayer/Patchs/NMultiplayerPlayerExpandedStatePatch.cs @@ -0,0 +1,86 @@ +using Godot; +using HarmonyLib; +using MegaCrit.Sts2.Core.Assets; +using MegaCrit.Sts2.Core.Entities.Players; +using MegaCrit.Sts2.Core.Helpers; +using MegaCrit.Sts2.Core.Nodes.Multiplayer; +using MegaCrit.Sts2.Core.Nodes.Screens.CardLibrary; +using MegaCrit.Sts2.Core.Nodes.Screens.Map; +using MegaCrit.Sts2.Core.Runs; +using SlayTheSpire2.LAN.Multiplayer.Helpers; + +// ReSharper disable UnusedMember.Global +// ReSharper disable UnusedType.Global + +namespace SlayTheSpire2.LAN.Multiplayer.Patchs +{ + [HarmonyPatch(typeof(NMultiplayerPlayerExpandedState), "_Ready")] + internal class NMultiplayerPlayerExpandedStatePatch + { + private static void Prefix(NMultiplayerPlayerExpandedState __instance, Player ____player) + { + if (____player.NetId != RunManager.Instance.NetService.NetId) + { + var lanPanel = new HBoxContainer { Name = "LANPanel" }; + __instance.AddChild(lanPanel); + + lanPanel.AnchorLeft = 0.5f; + lanPanel.AnchorTop = 0; + lanPanel.AnchorRight = 0.5f; + lanPanel.AnchorBottom = 0; + + lanPanel.OffsetLeft = -162; + lanPanel.OffsetTop = 100; + lanPanel.OffsetRight = 162; + lanPanel.OffsetBottom = 100; + + var disableDrawing = PreloadManager.Cache + .GetScene(SceneHelper.GetScenePath("screens/card_library/card_library_tickbox")) + .Instantiate(); + + if (disableDrawing is NLibraryStatTickbox cardLibraryTickBox) + { + disableDrawing.Name = "DisableDrawing"; + + lanPanel.AddChild(cardLibraryTickBox); + + cardLibraryTickBox.SetLabel("Disable drawing"); + + cardLibraryTickBox.IsTicked = LanMapDrawingsHelper.DisableDrawingHashSet.Contains(____player.NetId); + + cardLibraryTickBox.Toggled += tickBox => + { + var drawingState = Traverse.Create(NMapScreen.Instance?.Drawings) + .Method("GetDrawingStateForPlayer", ____player.NetId).GetValue(); + var drawViewport = Traverse.Create(drawingState).Field("drawViewport").GetValue(); + + if (tickBox.IsTicked) + { + if (drawViewport != null) + { + foreach (var line2D in drawViewport.GetChildren().OfType()) + { + line2D.Visible = false; + } + } + + LanMapDrawingsHelper.DisableDrawingHashSet.Add(____player.NetId); + } + else + { + if (drawViewport != null) + { + foreach (var line2D in drawViewport.GetChildren().OfType()) + { + line2D.Visible = true; + } + } + + LanMapDrawingsHelper.DisableDrawingHashSet.Remove(____player.NetId); + } + }; + } + } + } + } +} \ No newline at end of file diff --git a/SlayTheSpire2.LAN.Multiplayer/Patchs/NRestSiteRoomPatch.cs b/SlayTheSpire2.LAN.Multiplayer/Patchs/NRestSiteRoomPatch.cs new file mode 100644 index 0000000..77785a4 --- /dev/null +++ b/SlayTheSpire2.LAN.Multiplayer/Patchs/NRestSiteRoomPatch.cs @@ -0,0 +1,111 @@ +using Godot; +using HarmonyLib; +using MegaCrit.Sts2.Core.Nodes.Rooms; +using MegaCrit.Sts2.Core.Runs; + +// ReSharper disable UnusedMember.Global +// ReSharper disable UnusedType.Global + +namespace SlayTheSpire2.LAN.Multiplayer.Patchs +{ + [HarmonyPatch(typeof(NRestSiteRoom), "_Ready")] + internal class NRestSiteRoomPatch + { + private static void Prefix(NRestSiteRoom __instance, IRunState ____runState, + List ____characterContainers) + { + if (____runState.Players.Count > 4) + { + var bgContainer = __instance.GetNode("BgContainer"); + + var lastLeftCharacterUp = bgContainer.GetNode("Character_3"); + var lastLeftCharacterDown = bgContainer.GetNode("Character_1"); + + var lastRightCharacterUp = bgContainer.GetNode("Character_4"); + var lastRightCharacterDown = bgContainer.GetNode("Character_2"); + + for (var i = 4; i < ____runState.Players.Count; i++) + { + if (i % 2 == 0) + { + if (i % 4 == 0) + { + AddCharacter(bgContainer, ref lastLeftCharacterUp, ____characterContainers, i, true); + } + else + { + AddCharacter(bgContainer, ref lastLeftCharacterDown, ____characterContainers, i, true); + } + } + else + { + if (i % 4 == 1) + { + AddCharacter(bgContainer, ref lastRightCharacterUp, ____characterContainers, i, false); + } + else + { + AddCharacter(bgContainer, ref lastRightCharacterDown, ____characterContainers, i, false); + } + } + } + } + } + + private static void Postfix(NRestSiteRoom __instance, IRunState ____runState) + { + if (____runState.Players.Count > 4) + { + var bgContainer = __instance.GetNode("BgContainer"); + var restSiteBackground = bgContainer.GetChild(0); + + var lastLeftRestSite = restSiteBackground.GetNode("RestSiteLLog"); + var lastRightRestSite = restSiteBackground.GetNode("RestSiteRLog"); + + for (var i = 4; i < ____runState.Players.Count; i++) + { + if (i % 2 == 0 && i % 4 == 0) + { + AddRestSite(restSiteBackground, ref lastLeftRestSite, true); + } + else if (i % 4 == 1) + { + AddRestSite(restSiteBackground, ref lastRightRestSite, false); + } + } + } + } + + private static void AddRestSite(Node restSiteBackground, ref Node restSite, bool isLeft) + { + var nextRestSiteIndex = restSite.GetIndex() + 1; + restSite = restSite.Duplicate(); + restSiteBackground.AddChild(restSite); + restSite.MoveChild(restSite, nextRestSiteIndex); + + if (restSite is Control control) + { + control.Position = new Vector2(isLeft ? control.Position.X - 200 : control.Position.X + 200, + control.Position.Y - 50); + } + } + + private static void AddCharacter(Node bgContainer, ref Node character, List characterContainers, + int index, bool isLeft) + { + var nextCharacterIndex = character.GetIndex() + 1; + character = character.Duplicate(); + bgContainer.AddChild(character); + bgContainer.MoveChild(character, nextCharacterIndex); + + if (character is Control control) + { + control.Name = $"Character_{index + 1}"; + control.Position = new Vector2(isLeft ? control.Position.X - 200 : control.Position.X + 200, + control.Position.Y - 50); + + characterContainers.Add(control); + } + } + } +} \ No newline at end of file diff --git a/SlayTheSpire2.LAN.Multiplayer/Patchs/RunManagerPatch.cs b/SlayTheSpire2.LAN.Multiplayer/Patchs/RunManagerPatch.cs new file mode 100644 index 0000000..b2397b1 --- /dev/null +++ b/SlayTheSpire2.LAN.Multiplayer/Patchs/RunManagerPatch.cs @@ -0,0 +1,18 @@ +using HarmonyLib; +using MegaCrit.Sts2.Core.Runs; +using SlayTheSpire2.LAN.Multiplayer.Helpers; + +// ReSharper disable UnusedMember.Global +// ReSharper disable UnusedType.Global + +namespace SlayTheSpire2.LAN.Multiplayer.Patchs +{ + [HarmonyPatch(typeof(RunManager), "CleanUp")] + internal class RunManagerPatch + { + private static void Postfix() + { + LanMapDrawingsHelper.DisableDrawingHashSet.Clear(); + } + } +} \ No newline at end of file