diff --git a/ServerSideMap/ExplorationDatabase.cs b/ServerSideMap/ExplorationDatabase.cs index add5ed7..fec3a8f 100644 --- a/ServerSideMap/ExplorationDatabase.cs +++ b/ServerSideMap/ExplorationDatabase.cs @@ -43,6 +43,7 @@ public static ZPackage PackPins(List pins) z.Write(pin.Checked); } z.SetPos(0); + Utility.Log("Packing pins: " + pins.Count); return z; } @@ -82,14 +83,15 @@ public static PinData ConvertPin(Minimap.PinData pin) }; } - public static ZPackage PackPin(PinData pin) + public static ZPackage PackPin(PinData pin, bool skipSetPos = false) { var z = new ZPackage(); z.Write(pin.Name); z.Write(pin.Pos); z.Write((int) pin.Type); z.Write(pin.Checked); - z.SetPos(0); + if(!skipSetPos) + z.SetPos(0); return z; } @@ -122,6 +124,18 @@ public static void RemovePinSimilar(PinData needle) } } + public static void SetPinState(PinData needle, bool state) + { + foreach (var pin in Pins) + { + if (ArePinsSimilar(pin, needle)) + { + pin.Checked = state; + return; + } + } + } + public static bool ArePinsSimilar(PinData pin1, PinData pin2) { return pin1.Name == pin2.Name && pin1.Type == pin2.Type && pin1.Pos.Equals(pin2.Pos); @@ -129,6 +143,8 @@ public static bool ArePinsSimilar(PinData pin1, PinData pin2) public static void SetMapData(ZPackage mapData) { + Pins.Clear(); + var version = mapData.ReadInt(); var mapSize = mapData.ReadInt(); diff --git a/ServerSideMap/ExplorationMapSync.cs b/ServerSideMap/ExplorationMapSync.cs index f42f2e1..ad483c7 100644 --- a/ServerSideMap/ExplorationMapSync.cs +++ b/ServerSideMap/ExplorationMapSync.cs @@ -10,6 +10,8 @@ public static class ExplorationMapSync public static void OnClientExplore(ZRpc client, int x, int y) { + if (!Store.IsSharingMap()) return; + ExplorationDatabase.SetExplored(x, y); var znet = Traverse.Create(typeof(ZNet)).Field("m_instance").GetValue() as ZNet; var mPeers = Traverse.Create((znet)).Field("m_peers").GetValue() as List; @@ -51,6 +53,7 @@ private static void Postfix(int x, int y, bool __result) if (_blockExplore) return; + if (!Store.IsSharingMap()) return; if (_ZNet.IsServer(_ZNet._instance)) { OnClientExplore(null, x, y); diff --git a/ServerSideMap/InitialMapSync.cs b/ServerSideMap/InitialMapSync.cs index 9f46567..ab5aa84 100644 --- a/ServerSideMap/InitialMapSync.cs +++ b/ServerSideMap/InitialMapSync.cs @@ -11,6 +11,8 @@ public class InitialMapSync public static void OnReceiveMapDataInitial(ZRpc client, ZPackage mapData) { + if (!Store.IsSharingMap()) return; + mapData.SetPos(0); var chunk = mapData.ReadInt(); @@ -61,6 +63,8 @@ public static void OnReceiveMapDataInitial(ZRpc client, ZPackage mapData) public static void OnClientInitialData(ZRpc client, ZPackage mapData) { + if (!Store.IsSharingMap()) return; + mapData.SetPos(0); var chunk = mapData.ReadInt(); @@ -80,6 +84,8 @@ private class ZnetPatchRPC_PeerInfo // ReSharper disable once InconsistentNaming private static void Postfix(ZRpc rpc, ZNet __instance) { + if (!Store.IsSharingMap()) return; + if (__instance.IsServer()) { SendChunkToClient(rpc, 0); @@ -131,6 +137,8 @@ private class MinimapPatchSetMapData // ReSharper disable once InconsistentNaming private static void Postfix(Minimap __instance) { + if (!Store.IsSharingMap()) return; + if (_ZNet.IsServer(_ZNet._instance)) { SendChunkToClient(null, 0); diff --git a/ServerSideMap/InitialPinSync.cs b/ServerSideMap/InitialPinSync.cs index 3f6a215..1de2628 100644 --- a/ServerSideMap/InitialPinSync.cs +++ b/ServerSideMap/InitialPinSync.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using BepInEx.Configuration; using HarmonyLib; namespace ServerSideMap @@ -7,9 +8,12 @@ public class InitialPinSync { public static void OnReceiveInitialDataPin(ZRpc client, ZPackage pinData) { - // SendPinsToServer(client); + Store.ServerPinShare = true; + + if (!Store.IsSharingPin()) return; + var pins = ExplorationDatabase.UnpackPins(pinData); Utility.Log("Client received initial pin data by server. Pins: " + pins.Count); @@ -20,8 +24,16 @@ public static void OnReceiveInitialDataPin(ZRpc client, ZPackage pinData) private static void ClientAppendPins() { + if (!Store.IsSharingPin()) return; + + Utility.Log("ClientAppendPins " + ExplorationDatabase.ClientPins.Count); foreach (var pin in ExplorationDatabase.ClientPins) { + var mapPin = PinSync.GetMapPin(pin); + if (mapPin != null) + { + _Minimap.RemovePin(_Minimap._instance, mapPin); + } _Minimap.AddPin(_Minimap._instance, pin.Pos, pin.Type, pin.Name, false, pin.Checked); } } @@ -29,11 +41,12 @@ private static void ClientAppendPins() public static void OnClientInitialDataPin(ZRpc client, ZPackage pinData) { Utility.Log("Server received initial pin data by client"); - } private static void SendPinsToClient(ZRpc client) { + if (!Store.IsSharingPin()) return; + var z = ExplorationDatabase.PackPins(ExplorationDatabase.GetPins()); if (client == null) diff --git a/ServerSideMap/PinSync.cs b/ServerSideMap/PinSync.cs index 87cbfe6..4f4396f 100644 --- a/ServerSideMap/PinSync.cs +++ b/ServerSideMap/PinSync.cs @@ -7,10 +7,13 @@ namespace ServerSideMap public class PinSync { private static Minimap.PinData CurrentPin = null; + private static Minimap.PinData LatestClosestPin = null; public static void OnClientAddPin(ZRpc client, ZPackage pinData) { + if (!Store.IsSharingPin()) return; + var znet = Traverse.Create(typeof(ZNet)).Field("m_instance").GetValue() as ZNet; var mPeers = Traverse.Create((znet)).Field("m_peers").GetValue() as List; @@ -34,6 +37,8 @@ public static void OnClientAddPin(ZRpc client, ZPackage pinData) public static void OnServerAddPin(ZRpc client, ZPackage pinData) { + if (!Store.IsSharingPin()) return; + var pin = ExplorationDatabase.UnpackPin(pinData); _Minimap.AddPin(_Minimap._instance, pin.Pos, pin.Type, pin.Name, false, pin.Checked); @@ -45,6 +50,8 @@ public static void OnServerAddPin(ZRpc client, ZPackage pinData) public static void OnClientRemovePin(ZRpc client, ZPackage pinData) { + if (!Store.IsSharingPin()) return; + var znet = Traverse.Create(typeof(ZNet)).Field("m_instance").GetValue() as ZNet; var mPeers = Traverse.Create((znet)).Field("m_peers").GetValue() as List; @@ -68,8 +75,9 @@ public static void OnClientRemovePin(ZRpc client, ZPackage pinData) public static void OnServerRemovePin(ZRpc client, ZPackage pinData) { + if (!Store.IsSharingPin()) return; + Utility.Log("Client deleted pin by server"); - var pin = ExplorationDatabase.UnpackPin(pinData); @@ -89,8 +97,58 @@ public static void OnServerRemovePin(ZRpc client, ZPackage pinData) return; } _Minimap.RemovePin(_Minimap._instance, mapPin); + } + + public static void OnClientCheckPin(ZRpc client, ZPackage data) + { + if (!Store.IsSharingPin()) return; + + Utility.Log("Server checked pin by client"); - + var pin = ExplorationDatabase.UnpackPin(data); + var state = data.ReadBool(); + + ExplorationDatabase.SetPinState(pin, state); + + var znet = Traverse.Create(typeof(ZNet)).Field("m_instance").GetValue() as ZNet; + var mPeers = Traverse.Create((znet)).Field("m_peers").GetValue() as List; + foreach (var peer in mPeers) + { + if (peer.IsReady()) + { + if (peer.m_rpc == client) + { + continue; + } + var z = ExplorationDatabase.PackPin(pin, true); + z.Write(state); + peer.m_rpc.Invoke("OnServerCheckPin", (object) z); + } + } + } + + public static void OnServerCheckPin(ZRpc client, ZPackage data) + { + if (!Store.IsSharingPin()) return; + + Utility.Log("Client checked pin by server"); + + var pin = ExplorationDatabase.UnpackPin(data); + var state = data.ReadBool(); + + foreach (var clientPin in ExplorationDatabase.ClientPins) + { + if (ExplorationDatabase.ArePinsSimilar(clientPin, pin)) + { + clientPin.Checked = state; + var mapPin = GetMapPin(clientPin); + if (mapPin != null) + { + mapPin.m_checked = state; + } + break; + } + } } [HarmonyPatch(typeof (Minimap), "ShowPinNameInput")] @@ -105,9 +163,14 @@ private static void Postfix(Minimap __instance, Minimap.PinData pin) public static void SendPinToServer(Minimap.PinData pin) { + if (!Store.IsSharingPin()) return; + var convertedPin = ExplorationDatabase.ConvertPin(pin); var data = ExplorationDatabase.PackPin(convertedPin); + pin.m_save = false; + ExplorationDatabase.ClientPins.Add(convertedPin); + if (!_ZNet.IsServer(_ZNet._instance)) { _ZNet.GetServerRPC(_ZNet._instance).Invoke("OnClientAddPin", data); @@ -120,8 +183,9 @@ public static void SendPinToServer(Minimap.PinData pin) public static void RemovePinFromServer(PinData pin) { - var convertedPin = pin; - var data = ExplorationDatabase.PackPin(convertedPin); + if (!Store.IsSharingPin()) return; + + var data = ExplorationDatabase.PackPin(pin); if (!_ZNet.IsServer(_ZNet._instance)) { @@ -129,7 +193,25 @@ public static void RemovePinFromServer(PinData pin) } else { - OnClientAddPin(null, data); + OnClientRemovePin(null, data); + } + } + + public static void CheckPinOnServer(PinData pin, bool state) + { + if (!Store.IsSharingPin()) return; + + var data = ExplorationDatabase.PackPin(pin, true); + data.Write(state); + data.SetPos(0); + + if (!_ZNet.IsServer(_ZNet._instance)) + { + _ZNet.GetServerRPC(_ZNet._instance).Invoke("OnClientCheckPin", data); + } + else + { + OnClientCheckPin(null, data); } } @@ -183,12 +265,43 @@ public static PinData GetClientPin(Minimap.PinData needle) return null; } + // public void OnMapLeftClick() + // { + // ZLog.Log((object) "Left click"); + // Minimap.PinData closestPin = this.GetClosestPin(this.ScreenToWorldPoint(Input.get_mousePosition()), this.m_removeRadius * (this.m_largeZoom * 2f)); + // if (closestPin == null) + // return; + // closestPin.m_checked = !closestPin.m_checked; + // } + + [HarmonyPatch(typeof (Minimap), "OnMapLeftClick")] + private class MinimapPatchOnMapLeftClick + { + // ReSharper disable once InconsistentNaming + private static void Postfix(Minimap __instance) + { + if (LatestClosestPin == null) return; + + var clientPin = GetClientPin(LatestClosestPin); + + if (clientPin == null) return; + + clientPin.Checked = LatestClosestPin.m_checked; + + CheckPinOnServer(clientPin, clientPin.Checked); + } + } + [HarmonyPatch(typeof (Minimap), "GetClosestPin", typeof(Vector3), typeof(float))] private class MinimapPatchGetClosestPin { // ReSharper disable once InconsistentNaming private static void Postfix(Minimap __instance, ref Minimap.PinData __result, Vector3 pos, float radius) { + if (!Store.IsSharingPin()) return; + + LatestClosestPin = __result; + var pinData = (PinData) null; var num1 = 999999f; foreach (var p in ExplorationDatabase.ClientPins) @@ -202,10 +315,12 @@ private static void Postfix(Minimap __instance, ref Minimap.PinData __result, Ve } if (pinData == null) return; + var pin = GetMapPin(pinData); if (__result == null) { __result = pin; + LatestClosestPin = pin; return; } @@ -213,11 +328,12 @@ private static void Postfix(Minimap __instance, ref Minimap.PinData __result, Ve if (distance > num1) { __result = pin; + LatestClosestPin = pin; } } } - [HarmonyPatch(typeof (Minimap), "RemovePin")] + [HarmonyPatch(typeof (Minimap), "RemovePin", typeof(Minimap.PinData))] private class MinimapPatchRemovePin { // ReSharper disable once InconsistentNaming diff --git a/ServerSideMap/ServerSideMap.cs b/ServerSideMap/ServerSideMap.cs index f2aea20..5c9c6e9 100644 --- a/ServerSideMap/ServerSideMap.cs +++ b/ServerSideMap/ServerSideMap.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Reflection; using BepInEx; +using BepInEx.Configuration; using HarmonyLib; @@ -14,6 +15,9 @@ void Awake() { var harmony = new Harmony("eu.mydayyy.plugins.serversidemap"); Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string) null); + + Store.EnableMapShare = Config.Bind("General", "EnableMapShare", true, "Client: Whether or not to participate in sharing the map. Server: Whether or not to allow map sharing"); + Store.EnablePinShare = Config.Bind("General", "EnableMarkerShare", false, "Client: Whether or not to participate in sharing markers. Server: Whether or not to allow marker sharing"); } [HarmonyPatch(typeof (ZNet), "OnNewConnection")] @@ -26,21 +30,29 @@ private static void Postfix(ZNetPeer peer, ZNet __instance) { Utility.Log("Registered Server Events"); - peer.m_rpc.Register("OnClientExplore", new Action(ExplorationMapSync.OnClientExplore)); - peer.m_rpc.Register("OnClientInitialData", new Action(InitialMapSync.OnClientInitialData)); + if(Store.IsSharingMap()) { + peer.m_rpc.Register("OnClientExplore", new Action(ExplorationMapSync.OnClientExplore)); + peer.m_rpc.Register("OnClientInitialData", new Action(InitialMapSync.OnClientInitialData)); + } + peer.m_rpc.Register("OnClientInitialDataPin", new Action(InitialPinSync.OnClientInitialDataPin)); peer.m_rpc.Register("OnClientAddPin", new Action(PinSync.OnClientAddPin)); peer.m_rpc.Register("OnClientRemovePin", new Action(PinSync.OnClientRemovePin)); + peer.m_rpc.Register("OnClientCheckPin", new Action(PinSync.OnClientCheckPin)); } else { Utility.Log("Registered Client Events"); - peer.m_rpc.Register("OnReceiveMapData", new Action(ExplorationDatabase.OnReceiveMapData)); - peer.m_rpc.Register("OnReceiveMapDataInitial", new Action(InitialMapSync.OnReceiveMapDataInitial)); + if(Store.IsSharingMap()) { + peer.m_rpc.Register("OnReceiveMapData", new Action(ExplorationDatabase.OnReceiveMapData)); + peer.m_rpc.Register("OnReceiveMapDataInitial", new Action(InitialMapSync.OnReceiveMapDataInitial)); + } + peer.m_rpc.Register("OnReceiveInitialDataPin", new Action(InitialPinSync.OnReceiveInitialDataPin)); peer.m_rpc.Register("OnServerAddPin", new Action(PinSync.OnServerAddPin)); peer.m_rpc.Register("OnServerRemovePin", new Action(PinSync.OnServerRemovePin)); + peer.m_rpc.Register("OnServerCheckPin", new Action(PinSync.OnServerCheckPin)); } } } diff --git a/ServerSideMap/ServerSideMap.csproj b/ServerSideMap/ServerSideMap.csproj index 77a259d..079d7bf 100644 --- a/ServerSideMap/ServerSideMap.csproj +++ b/ServerSideMap/ServerSideMap.csproj @@ -65,6 +65,7 @@ + diff --git a/ServerSideMap/Store.cs b/ServerSideMap/Store.cs new file mode 100644 index 0000000..d9ecfe9 --- /dev/null +++ b/ServerSideMap/Store.cs @@ -0,0 +1,22 @@ +using BepInEx.Configuration; + +namespace ServerSideMap +{ + public static class Store + { + public static ConfigEntry EnableMapShare; + public static ConfigEntry EnablePinShare; + + public static bool ServerPinShare = false; + + public static bool IsSharingMap() + { + return EnableMapShare.Value; + } + + public static bool IsSharingPin() + { + return (ServerPinShare || _ZNet.IsServer(_ZNet._instance)) && EnablePinShare.Value; + } + } +} \ No newline at end of file diff --git a/ServerSideMap/_ZNet.cs b/ServerSideMap/_ZNet.cs index ae3c632..82d28bf 100644 --- a/ServerSideMap/_ZNet.cs +++ b/ServerSideMap/_ZNet.cs @@ -17,6 +17,7 @@ private static void Postfix(ZNet __instance) _instance = __instance; var l = BepInEx.Logging.Logger.CreateLogSource("ServerSideMap"); l.LogInfo("ZNet awake"); + Store.ServerPinShare = false; } }