diff --git a/NebulaHost/PacketProcessors/Factory/Entity/BuildEntityRequestProcessor.cs b/NebulaHost/PacketProcessors/Factory/Entity/BuildEntityRequestProcessor.cs index 14fd0ab00..ddc121806 100644 --- a/NebulaHost/PacketProcessors/Factory/Entity/BuildEntityRequestProcessor.cs +++ b/NebulaHost/PacketProcessors/Factory/Entity/BuildEntityRequestProcessor.cs @@ -1,4 +1,5 @@ -using NebulaModel.Attributes; +using HarmonyLib; +using NebulaModel.Attributes; using NebulaModel.Logger; using NebulaModel.Networking; using NebulaModel.Packets.Factory; @@ -31,6 +32,11 @@ public void ProcessPacket(BuildEntityRequest packet, NebulaConnection conn) planet.audio = new PlanetAudio(planet); planet.audio.Init(); + + if (AccessTools.Field(typeof(CargoTraffic), "beltRenderingBatch").GetValue(planet.factory.cargoTraffic) == null) + { + planet.factory.cargoTraffic.CreateRenderingBatches(); + } } planet.factory.BuildFinally(GameMain.mainPlayer, packet.PrebuildId); diff --git a/NebulaHost/PacketProcessors/Planet/PlanetDataRequestProcessor.cs b/NebulaHost/PacketProcessors/Planet/PlanetDataRequestProcessor.cs index 8139016e7..e79fbec8f 100644 --- a/NebulaHost/PacketProcessors/Planet/PlanetDataRequestProcessor.cs +++ b/NebulaHost/PacketProcessors/Planet/PlanetDataRequestProcessor.cs @@ -1,4 +1,5 @@ -using NebulaModel.Attributes; +using HarmonyLib; +using NebulaModel.Attributes; using NebulaModel.Logger; using NebulaModel.Networking; using NebulaModel.Packets.Planet; @@ -33,6 +34,11 @@ public void ProcessPacket(PlanetDataRequest packet, NebulaConnection conn) planet.aux = new PlanetAuxData(planet); planetAlgorithm.GenerateTerrain(planet.mod_x, planet.mod_y); planetAlgorithm.CalcWaterPercent(); + + //Load planet meshes and register callback to unload unneccessary stuff + planet.wanted = true; + planet.onLoaded += OnActivePlanetLoaded; + PlanetModelingManager.modPlanetReqList.Enqueue(planet); } if (planet.factory == null) @@ -53,5 +59,11 @@ public void ProcessPacket(PlanetDataRequest packet, NebulaConnection conn) conn.SendPacket(new PlanetDataResponse(planetDataToReturn)); } + + public void OnActivePlanetLoaded(PlanetData planet) + { + planet.Unload(); + planet.onLoaded -= OnActivePlanetLoaded; + } } } diff --git a/NebulaPatcher/NebulaPatcher.csproj b/NebulaPatcher/NebulaPatcher.csproj index 12453fa77..f6d638a5e 100644 --- a/NebulaPatcher/NebulaPatcher.csproj +++ b/NebulaPatcher/NebulaPatcher.csproj @@ -46,6 +46,7 @@ + diff --git a/NebulaPatcher/Patches/Dynamic/GameData_Patch.cs b/NebulaPatcher/Patches/Dynamic/GameData_Patch.cs index 5b4d6b685..7e4a5b0a0 100644 --- a/NebulaPatcher/Patches/Dynamic/GameData_Patch.cs +++ b/NebulaPatcher/Patches/Dynamic/GameData_Patch.cs @@ -165,5 +165,26 @@ public static void OnDraw_Prefix() SimulatedWorld.OnDronesDraw(); } } + + [HarmonyPrefix] + [HarmonyPatch("LeaveStar")] + public static void LeaveStar_Prefix(GameData __instance) + { + //Client should unload all factories once they leave the star system + if (SimulatedWorld.Initialized && !LocalPlayer.IsMasterClient) + { + for (int i = 0; i < __instance.localStar.planetCount; i++) + { + if (__instance.localStar.planets != null && __instance.localStar.planets[i] != null) + { + if (__instance.localStar.planets[i].factory != null) + { + __instance.localStar.planets[i].factory.Free(); + __instance.localStar.planets[i].factory = null; + } + } + } + } + } } } diff --git a/NebulaPatcher/Patches/Dynamic/PlanetData_Patch.cs b/NebulaPatcher/Patches/Dynamic/PlanetData_Patch.cs new file mode 100644 index 000000000..7ea26fe72 --- /dev/null +++ b/NebulaPatcher/Patches/Dynamic/PlanetData_Patch.cs @@ -0,0 +1,75 @@ +using HarmonyLib; +using NebulaWorld; + +namespace NebulaPatcher.Patches.Dynamic +{ + [HarmonyPatch(typeof(PlanetData))] + class PlanetData_Patch + { + [HarmonyPrefix] + [HarmonyPatch("UnloadMeshes")] + public static bool UnloadMeshes_Prefix(PlanetData __instance) + { + //Host should not unload planet meshes, since he need to permorm all terrain operations + if (SimulatedWorld.Initialized && LocalPlayer.IsMasterClient) + { + //Do not unload meshes, just hide them so it is not visible + UnloadVisuals(__instance); + return false; + } + + return true; + } + + [HarmonyPrefix] + [HarmonyPatch("UnloadData")] + public static bool UnloadData_Prefix() + { + //Host should not unload planet data, since he need to permorm all operations from users + if (SimulatedWorld.Initialized && LocalPlayer.IsMasterClient) + { + return false; + } + + return true; + } + + public static void UnloadVisuals(PlanetData __instance) + { + if (__instance.gameObject != null) + { + __instance.gameObject.SetActive(false); + } + if (__instance.terrainMaterial != null) + { + UnityEngine.Object.Destroy(__instance.terrainMaterial); + __instance.terrainMaterial = null; + } + if (__instance.oceanMaterial != null) + { + UnityEngine.Object.Destroy(__instance.oceanMaterial); + __instance.oceanMaterial = null; + } + if (__instance.atmosMaterial != null) + { + UnityEngine.Object.Destroy(__instance.atmosMaterial); + __instance.atmosMaterial = null; + } + if (__instance.minimapMaterial != null) + { + UnityEngine.Object.Destroy(__instance.minimapMaterial); + __instance.minimapMaterial = null; + } + if (__instance.reformMaterial0 != null) + { + UnityEngine.Object.Destroy(__instance.reformMaterial0); + __instance.reformMaterial0 = null; + } + if (__instance.reformMaterial1 != null) + { + UnityEngine.Object.Destroy(__instance.reformMaterial1); + __instance.reformMaterial1 = null; + } + } + } +} diff --git a/NebulaPatcher/Patches/Transpilers/PlayerAction_Build_Patch.cs b/NebulaPatcher/Patches/Transpilers/PlayerAction_Build_Patch.cs index 95d7fdb29..1892c599c 100644 --- a/NebulaPatcher/Patches/Transpilers/PlayerAction_Build_Patch.cs +++ b/NebulaPatcher/Patches/Transpilers/PlayerAction_Build_Patch.cs @@ -73,6 +73,27 @@ static IEnumerable CheckBuildConditions_Transpiler(ILGenerator } } + //Apply Ignoring if inserter match the planet grid check + for (i = 5; i < codes.Count - 2; i++) + { + if (codes[i].opcode == OpCodes.Brfalse && + codes[i + 1].opcode == OpCodes.Ldloca_S && + codes[i - 1].opcode == OpCodes.Ldloc_S && + codes[i - 2].opcode == OpCodes.Stfld && + codes[i - 3].opcode == OpCodes.Call && + codes[i - 4].opcode == OpCodes.Ldfld && + codes[i - 5].opcode == OpCodes.Ldloc_3 && + codes[i + 2].opcode == OpCodes.Ldloc_3) + { + Label targetLabel = (Label)codes[i].operand; + codes.InsertRange(i+1, new CodeInstruction[] { + new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(FactoryManager), "get_IgnoreBasicBuildConditionChecks")), + new CodeInstruction(OpCodes.Brtrue_S, targetLabel), + }); + break; + } + } + //Apply ignoring of 3 ground checks for (i = 9; i < codes.Count - 4; i++) {