public void ProcessPacket(CreatePrebuildsRequest packet, NebulaConnection conn) { PlanetData planet = GameMain.galaxy.PlanetById(packet.PlanetId); if (planet.factory == null) { Log.Warn($"planet.factory was null create new one"); planet.factory = GameMain.data.GetOrCreateFactory(planet); } PlayerAction_Build pab = GameMain.mainPlayer.controller?.actionBuild; if (pab != null) { //Make backup of values that are overwritten List <BuildPreview> tmpList = pab.buildPreviews; bool tmpConfirm = pab.waitConfirm; UnityEngine.Vector3 tmpPos = pab.previewPose.position; UnityEngine.Quaternion tmpRot = pab.previewPose.rotation; PlanetFactory tmpFactory = (PlanetFactory)AccessTools.Field(typeof(PlayerAction_Build), "factory").GetValue(GameMain.mainPlayer.controller.actionBuild); //Create Prebuilds from incomming packet pab.buildPreviews = packet.GetBuildPreviews(); pab.waitConfirm = true; FactoryManager.EventFromServer = true; FactoryManager.EventFactory = planet.factory; pab.previewPose.position = new UnityEngine.Vector3(packet.PosePosition.x, packet.PosePosition.y, packet.PosePosition.z); pab.previewPose.rotation = new UnityEngine.Quaternion(packet.PoseRotation.x, packet.PoseRotation.y, packet.PoseRotation.z, packet.PoseRotation.w); AccessTools.Field(typeof(PlayerAction_Build), "factory").SetValue(GameMain.mainPlayer.controller.actionBuild, planet.factory); if (planet.physics == null) { planet.physics = new PlanetPhysics(planet); planet.physics.Init(); } if (AccessTools.Field(typeof(CargoTraffic), "beltRenderingBatch").GetValue(planet.factory.cargoTraffic) == null) { planet.factory.cargoTraffic.CreateRenderingBatches(); } pab.CreatePrebuilds(); FactoryManager.EventFromServer = false; FactoryManager.EventFactory = null; //Revert changes back AccessTools.Field(typeof(PlayerAction_Build), "factory").SetValue(GameMain.mainPlayer.controller.actionBuild, tmpFactory); pab.buildPreviews = tmpList; pab.waitConfirm = tmpConfirm; pab.previewPose.position = tmpPos; pab.previewPose.rotation = tmpRot; } }
public void ProcessPacket(CreatePrebuildsRequest packet, NebulaConnection conn) { PlanetData planet = GameMain.galaxy.PlanetById(packet.PlanetId); if (planet.factory == null) { // We only execute the code if the client has loaded the factory at least once. // Else it will get it once it goes to the planet for the first time. return; } PlayerAction_Build pab = GameMain.mainPlayer.controller?.actionBuild; if (pab != null) { //Make backup of values that are overwritten List <BuildPreview> tmpList = pab.buildPreviews; bool tmpConfirm = pab.waitConfirm; UnityEngine.Vector3 tmpPos = pab.previewPose.position; UnityEngine.Quaternion tmpRot = pab.previewPose.rotation; PlanetFactory tmpFactory = (PlanetFactory)AccessTools.Field(typeof(PlayerAction_Build), "factory").GetValue(GameMain.mainPlayer.controller.actionBuild); //Create Prebuilds from incomming packet pab.buildPreviews = packet.GetBuildPreviews(); pab.waitConfirm = true; FactoryManager.EventFromServer = true; FactoryManager.EventFactory = planet.factory; pab.previewPose.position = new UnityEngine.Vector3(packet.PosePosition.x, packet.PosePosition.y, packet.PosePosition.z); pab.previewPose.rotation = new UnityEngine.Quaternion(packet.PoseRotation.x, packet.PoseRotation.y, packet.PoseRotation.z, packet.PoseRotation.w); AccessTools.Field(typeof(PlayerAction_Build), "factory").SetValue(GameMain.mainPlayer.controller.actionBuild, planet.factory); pab.CreatePrebuilds(); FactoryManager.EventFromServer = false; FactoryManager.EventFactory = null; //Revert changes back AccessTools.Field(typeof(PlayerAction_Build), "factory").SetValue(GameMain.mainPlayer.controller.actionBuild, tmpFactory); pab.buildPreviews = tmpList; pab.waitConfirm = tmpConfirm; pab.previewPose.position = tmpPos; pab.previewPose.rotation = tmpRot; } }
public void ProcessPacket(CreatePrebuildsRequest packet, NebulaConnection conn) { PlanetData planet = GameMain.galaxy.PlanetById(packet.PlanetId); if (planet.factory == null) { Log.Warn($"planet.factory was null create new one"); planet.factory = GameMain.data.GetOrCreateFactory(planet); } PlayerAction_Build pab = GameMain.mainPlayer.controller?.actionBuild; if (pab != null) { //Make backup of values that are overwritten List <BuildPreview> tmpList = pab.buildPreviews; bool tmpConfirm = pab.waitConfirm; UnityEngine.Vector3 tmpPos = pab.previewPose.position; UnityEngine.Quaternion tmpRot = pab.previewPose.rotation; PlanetFactory tmpFactory = null; NearColliderLogic tmpNearcdLogic = null; PlanetPhysics tmpPlanetPhysics = null; float tmpBuildArea = GameMain.mainPlayer.mecha.buildArea; PlanetData tmpData = null; bool loadExternalPlanetData = GameMain.localPlanet != planet; //Load temporary planet data, since host is not there if (loadExternalPlanetData) { tmpFactory = (PlanetFactory)AccessTools.Field(typeof(PlayerAction_Build), "factory").GetValue(GameMain.mainPlayer.controller.actionBuild); tmpNearcdLogic = (NearColliderLogic)AccessTools.Field(typeof(PlayerAction_Build), "nearcdLogic").GetValue(GameMain.mainPlayer.controller.actionBuild); tmpPlanetPhysics = (PlanetPhysics)AccessTools.Field(typeof(PlayerAction_Build), "planetPhysics").GetValue(pab); tmpData = GameMain.mainPlayer.planetData; } //Create Prebuilds from incomming packet and prepare new position pab.buildPreviews = packet.GetBuildPreviews(); pab.waitConfirm = true; using (FactoryManager.EventFromServer.On()) { FactoryManager.EventFactory = planet.factory; pab.previewPose.position = new UnityEngine.Vector3(packet.PosePosition.x, packet.PosePosition.y, packet.PosePosition.z); pab.previewPose.rotation = new UnityEngine.Quaternion(packet.PoseRotation.x, packet.PoseRotation.y, packet.PoseRotation.z, packet.PoseRotation.w); //Check if some mandatory variables are missing if (planet.physics == null || planet.physics.colChunks == null) { planet.physics = new PlanetPhysics(planet); planet.physics.Init(); } if (BeltManager.GetCargoTraffic(planet.factory.cargoTraffic) == null) { planet.factory.cargoTraffic.CreateRenderingBatches(); } if (planet.aux == null) { planet.aux = new PlanetAuxData(planet); } //Set temporary Local Planet / Factory data that are needed for original methods CheckBuildConditions() and CreatePrebuilds() AccessTools.Field(typeof(PlayerAction_Build), "factory").SetValue(GameMain.mainPlayer.controller.actionBuild, planet.factory); AccessTools.Field(typeof(PlayerAction_Build), "planetPhysics").SetValue(GameMain.mainPlayer.controller.actionBuild, planet.physics); AccessTools.Field(typeof(PlayerAction_Build), "nearcdLogic").SetValue(GameMain.mainPlayer.controller.actionBuild, planet.physics.nearColliderLogic); AccessTools.Property(typeof(global::Player), "planetData").SetValue(GameMain.mainPlayer, planet, null); //Check if prebuilds can be build (collision check, height check, etc) GameMain.mainPlayer.mecha.buildArea = float.MaxValue; bool canBuild; using (FactoryManager.IgnoreBasicBuildConditionChecks.On()) { canBuild = pab.CheckBuildConditions(); canBuild &= CheckBuildingConnections(pab.buildPreviews, planet.factory.entityPool, planet.factory.prebuildPool); } if (canBuild) { FactoryManager.PacketAuthor = packet.AuthorId; pab.CreatePrebuilds(); FactoryManager.PacketAuthor = -1; } //Revert changes back to the original planet if (loadExternalPlanetData) { planet.physics.Free(); planet.physics = null; AccessTools.Property(typeof(global::Player), "planetData").SetValue(GameMain.mainPlayer, tmpData, null); AccessTools.Field(typeof(PlayerAction_Build), "planetPhysics").SetValue(GameMain.mainPlayer.controller.actionBuild, tmpPlanetPhysics); AccessTools.Field(typeof(PlayerAction_Build), "factory").SetValue(GameMain.mainPlayer.controller.actionBuild, tmpFactory); AccessTools.Field(typeof(PlayerAction_Build), "nearcdLogic").SetValue(GameMain.mainPlayer.controller.actionBuild, tmpNearcdLogic); } GameMain.mainPlayer.mecha.buildArea = tmpBuildArea; FactoryManager.EventFactory = null; } pab.buildPreviews = tmpList; pab.waitConfirm = tmpConfirm; pab.previewPose.position = tmpPos; pab.previewPose.rotation = tmpRot; } }
public static bool DetermineBuildPreviews_Prefix(ref PlayerAction_Build __instance) { if (__instance.handPrefabDesc == null || __instance.handPrefabDesc.minerType != EMinerType.None || __instance.player.planetData.type == EPlanetType.Gas ) { multiBuildPossible = false; } else { multiBuildPossible = true; } // As multibuild increase calculation exponentially (collision and rendering must be performed for every entity), we hijack the BuildMainLogic // and execute the relevant submethods only when needed executeBuildUpdatePreviews = true; if (IsMultiBuildRunning()) { if (lastPosition != __instance.groundSnappedPos) { lastPosition = __instance.groundSnappedPos; executeBuildUpdatePreviews = true; } else { executeBuildUpdatePreviews = false; } } else { lastPosition = Vector3.zero; } // Run the preview methods if we have changed position, if we have received a relevant keyboard input or in any case every MAX_IGNORED_TICKS ticks. executeBuildUpdatePreviews = executeBuildUpdatePreviews || VFInput._rotate || VFInput._counterRotate || ignoredTicks >= MAX_IGNORED_TICKS; bool flag; if (executeBuildUpdatePreviews) { __instance.DetermineBuildPreviews(); flag = __instance.CheckBuildConditions(); __instance.UpdatePreviews(); __instance.UpdateGizmos(); lastCursorText = __instance.cursorText; lastCursorWarning = __instance.cursorWarning; lastFlag = flag; ignoredTicks = 0; } else { __instance.cursorText = lastCursorText; __instance.cursorWarning = lastCursorWarning; flag = lastFlag; ignoredTicks++; } if (flag) { __instance.CreatePrebuilds(); } return(false); }
public void ProcessPacket(CreatePrebuildsRequest packet, NebulaConnection conn) { PlanetData planet = GameMain.galaxy.PlanetById(packet.PlanetId); if (planet.factory == null) { // We only execute the code if the client has loaded the factory at least once. // Else it will get it once it goes to the planet for the first time. return; } PlayerAction_Build pab = GameMain.mainPlayer.controller?.actionBuild; if (pab != null) { FactoryManager.TargetPlanet = packet.PlanetId; //Make backup of values that are overwritten List <BuildPreview> tmpList = pab.buildPreviews; bool tmpConfirm = pab.waitConfirm; UnityEngine.Vector3 tmpPos = pab.previewPose.position; UnityEngine.Quaternion tmpRot = pab.previewPose.rotation; PlanetFactory tmpFactory = (PlanetFactory)AccessTools.Field(typeof(PlayerAction_Build), "factory").GetValue(GameMain.mainPlayer.controller.actionBuild); PlanetPhysics tmpPlanetPhysics = (PlanetPhysics)AccessTools.Field(typeof(PlayerAction_Build), "planetPhysics").GetValue(pab); //Create Prebuilds from incomming packet pab.buildPreviews = packet.GetBuildPreviews(); pab.waitConfirm = true; using (FactoryManager.EventFromServer.On()) { FactoryManager.EventFactory = planet.factory; pab.previewPose.position = new UnityEngine.Vector3(packet.PosePosition.x, packet.PosePosition.y, packet.PosePosition.z); pab.previewPose.rotation = new UnityEngine.Quaternion(packet.PoseRotation.x, packet.PoseRotation.y, packet.PoseRotation.z, packet.PoseRotation.w); AccessTools.Field(typeof(PlayerAction_Build), "factory").SetValue(GameMain.mainPlayer.controller.actionBuild, planet.factory); //Create temporary physics for spawning building's colliders if (planet.physics == null || planet.physics.colChunks == null) { planet.physics = new PlanetPhysics(planet); planet.physics.Init(); } //Take item from the inventory if player is author of the build if (packet.AuthorId == LocalPlayer.PlayerId) { foreach (BuildPreview buildPreview in pab.buildPreviews) { if (GameMain.mainPlayer.inhandItemId == buildPreview.item.ID && GameMain.mainPlayer.inhandItemCount > 0) { GameMain.mainPlayer.UseHandItems(1); } else { int num = 1; GameMain.mainPlayer.package.TakeTailItems(ref buildPreview.item.ID, ref num, false); } } } AccessTools.Field(typeof(PlayerAction_Build), "planetPhysics").SetValue(GameMain.mainPlayer.controller.actionBuild, planet.physics); pab.CreatePrebuilds(); FactoryManager.EventFactory = null; } //Author has to call this for the continuous belt building if (packet.AuthorId == LocalPlayer.PlayerId) { pab.AfterPrebuild(); } //Revert changes back AccessTools.Field(typeof(PlayerAction_Build), "planetPhysics").SetValue(GameMain.mainPlayer.controller.actionBuild, tmpPlanetPhysics); AccessTools.Field(typeof(PlayerAction_Build), "factory").SetValue(GameMain.mainPlayer.controller.actionBuild, tmpFactory); pab.buildPreviews = tmpList; pab.waitConfirm = tmpConfirm; pab.previewPose.position = tmpPos; pab.previewPose.rotation = tmpRot; FactoryManager.TargetPlanet = -2; } }
public static bool PlayerAction_Build_BuildMainLogic_Prefix(ref PlayerAction_Build __instance) { if (__instance.handPrefabDesc == null || __instance.handPrefabDesc.minerType != EMinerType.None || __instance.player.planetData.type == EPlanetType.Gas || BlueprintManager.data.copiedBuildings.Count > 1 ) { MultiBuild.multiBuildPossible = false; } else { MultiBuild.multiBuildPossible = true; } if (MultiBuild.itemSpecificSpacing.Value && __instance.handItem != null && MultiBuild.spacingIndex != __instance.handItem.ID) { MultiBuild.spacingIndex = __instance.handItem.ID; if (!MultiBuild.spacingStore.ContainsKey(MultiBuild.spacingIndex)) { MultiBuild.spacingStore[MultiBuild.spacingIndex] = 0; } } //long dbp, cbc,up,ug; runUpdate = true; //Stopwatch timer = new Stopwatch(); //timer.Start(); __instance.DetermineBuildPreviews(); //timer.Stop(); //dbp = timer.ElapsedTicks; if (runUpdate) { //timer.Reset(); //timer.Start(); var backupMechaBuildArea = __instance.player.mecha.buildArea; if (BlueprintManager.hasData) { __instance.player.mecha.buildArea = 10000f; } if (BlueprintManager.pastedEntities.Count > 1) { lastFlag = CheckBuildConditionsFast(); } else { lastFlag = __instance.CheckBuildConditions(); } //timer.Stop(); //cbc = timer.ElapsedTicks; //timer.Reset(); //timer.Start(); __instance.UpdatePreviews(); //timer.Stop(); //up = timer.ElapsedTicks; //timer.Reset(); //timer.Start(); __instance.UpdateGizmos(); //timer.Stop(); //ug = timer.ElapsedTicks; __instance.player.mecha.buildArea = backupMechaBuildArea; lastCursorText = __instance.cursorText; lastCursorWarning = __instance.cursorWarning; //Debug.Log($"dbp: {dbp} | cbc: {cbc} | up: {up} | ug: {ug}"); } else { __instance.cursorText = lastCursorText; __instance.cursorWarning = lastCursorWarning; } if (lastFlag) { __instance.CreatePrebuilds(); if (__instance.waitConfirm && VFInput._buildConfirm.onDown) { __instance.ClearBuildPreviews(); BuildLogic.forceRecalculation = true; } } return(false); }
public static bool PlayerAction_Build_BuildMainLogic_Prefix(ref PlayerAction_Build __instance) { if (__instance.handPrefabDesc == null || __instance.handPrefabDesc.minerType != EMinerType.None || __instance.player.planetData.type == EPlanetType.Gas || BlueprintManager.data.copiedBelts.Count > 0 || BlueprintManager.data.copiedBuildings.Count > 1 ) { multiBuildPossible = false; } else { multiBuildPossible = true; } if (MultiBuild.itemSpecificSpacing.Value && __instance.handItem != null && spacingIndex != __instance.handItem.ID) { spacingIndex = __instance.handItem.ID; if (!spacingStore.ContainsKey(spacingIndex)) { spacingStore[spacingIndex] = 0; } } runUpdate = true; __instance.DetermineBuildPreviews(); if (runUpdate) { if (BlueprintManager.pastedEntities.Count > 0) { lastFlag = CheckBuildConditionsFast(); } else { lastFlag = __instance.CheckBuildConditions(); } __instance.UpdatePreviews(); __instance.UpdateGizmos(); lastCursorText = __instance.cursorText; lastCursorWarning = __instance.cursorWarning; } else { __instance.cursorText = lastCursorText; __instance.cursorWarning = lastCursorWarning; } if (lastFlag) { __instance.CreatePrebuilds(); } return(false); }
public static bool BuildMainLogic_Prefix(ref PlayerAction_Build __instance) { if (__instance.handPrefabDesc == null || __instance.handPrefabDesc.minerType != EMinerType.None || __instance.player.planetData.type == EPlanetType.Gas ) { MultiBuild.multiBuildPossible = false; } else { MultiBuild.multiBuildPossible = true; } if (MultiBuild.itemSpecificSpacing.Value && __instance.handItem != null && MultiBuild.spacingIndex != __instance.handItem.ID) { MultiBuild.spacingIndex = __instance.handItem.ID; if (!MultiBuild.spacingStore.ContainsKey(MultiBuild.spacingIndex)) { MultiBuild.spacingStore[MultiBuild.spacingIndex] = 0; } } // As multibuild increase calculation exponentially (collision and rendering must be performed for every entity), we hijack the BuildMainLogic // and execute the relevant submethods only when needed executeBuildUpdatePreviews = true; /* if (MultiBuild.IsMultiBuildRunning()) * { * if (lastPosition != __instance.groundSnappedPos) * { * lastPosition = __instance.groundSnappedPos; * executeBuildUpdatePreviews = true; * } * else * { * executeBuildUpdatePreviews = false; * } * } * else * { * lastPosition = Vector3.zero; * }*/ // Run the preview methods if we have changed position, if we have received a relevant keyboard input or in any case every MAX_IGNORED_TICKS ticks. executeBuildUpdatePreviews = true; // executeBuildUpdatePreviews || VFInput._rotate || VFInput._counterRotate || ignoredTicks >= MultiBuild.MAX_IGNORED_TICKS; bool flag; if (executeBuildUpdatePreviews) { __instance.DetermineBuildPreviews(); flag = __instance.CheckBuildConditions(); __instance.UpdatePreviews(); __instance.UpdateGizmos(); lastCursorText = __instance.cursorText; lastCursorWarning = __instance.cursorWarning; lastFlag = flag; ignoredTicks = 0; } else { __instance.cursorText = lastCursorText; __instance.cursorWarning = lastCursorWarning; flag = lastFlag; ignoredTicks++; } if (flag) { __instance.CreatePrebuilds(); if (__instance.waitConfirm && VFInput._buildConfirm.onDown) { __instance.ClearBuildPreviews(); ignoredTicks = MultiBuild.MAX_IGNORED_TICKS; } } return(false); }