예제 #1
0
        public static void PasteInsertersOnly(BlueprintData data, Vector3 targetPos, float yaw, int pasteIndex = 0, bool connectToPasted = false)
        {
            PlayerAction_Build actionBuild = GameMain.data.mainPlayer.controller.actionBuild;
            var backupMechaBuildArea       = actionBuild.player.mecha.buildArea;

            actionBuild.player.mecha.buildArea = 10000f;

            Vector2 targetSpr = targetPos.ToSpherical();

            ConcurrentQueue <InserterCopy> inserterQueue = new ConcurrentQueue <InserterCopy>(data.copiedInserters);

            Util.Parallelize((threadIndex) =>
            {
                while (inserterQueue.TryDequeue(out InserterCopy inserter))
                {
                    var pastedEntity = ConcurrentPasteInserter(threadIndex, inserter, yaw, pasteIndex, connectToPasted);
                    BuildLogic.CheckBuildConditionsWorker(_abs[threadIndex], pastedEntity.buildPreview);
                }
            });

            actionBuild.player.mecha.buildArea = backupMechaBuildArea;
        }
예제 #2
0
        public static void Paste(BlueprintData data, Vector3 targetPos, float yaw, bool pasteInserters = true, int pasteIndex = 0)
        {
            PlayerAction_Build actionBuild = GameMain.data.mainPlayer.controller.actionBuild;
            var backupMechaBuildArea       = actionBuild.player.mecha.buildArea;

            actionBuild.player.mecha.buildArea = 10000f;

            Vector2 targetSpr = targetPos.ToSpherical();

            ConcurrentQueue <BuildingCopy> buildingsQueue = new ConcurrentQueue <BuildingCopy>(data.copiedBuildings);

            Util.Parallelize((int threadIndex) =>
            {
                while (buildingsQueue.TryDequeue(out BuildingCopy building))
                {
                    var pastedEntity = ConcurrentPasteBuilding(threadIndex, building, targetSpr, yaw, pasteIndex);

                    lock (actionBuild.nearcdLogic)
                    {
                        actionBuild.nearcdLogic.ActiveEntityBuildCollidersInArea(pastedEntity.pose.position, 5f);
                    }
                }
            });

            buildingsQueue = new ConcurrentQueue <BuildingCopy>(data.copiedBuildings);
            Util.Parallelize((int threadIndex) =>
            {
                while (buildingsQueue.TryDequeue(out BuildingCopy building))
                {
                    int pasteId      = PASTE_INDEX_MULTIPLIER * pasteIndex + building.originalId;
                    var pastedEntity = BlueprintManager.pastedEntities[pasteId];

                    ConcurrentConnectBuildings(threadIndex, pastedEntity);
                    BuildLogic.CheckBuildConditionsWorker(_abs[threadIndex], pastedEntity.buildPreview);
                }
            });

            ConcurrentQueue <BeltCopy> beltsQueue = new ConcurrentQueue <BeltCopy>(data.copiedBelts);

            Util.Parallelize((int threadIndex) =>
            {
                while (beltsQueue.TryDequeue(out BeltCopy belt))
                {
                    var pastedEntity = ConcurrentPasteBelt(threadIndex, belt, targetSpr, yaw, pasteIndex);
                }
            });

            // after creating the belt previews this restore the correct connection to other belts and buildings
            beltsQueue = new ConcurrentQueue <BeltCopy>(data.copiedBelts);
            Util.Parallelize((int threadIndex) =>
            {
                while (beltsQueue.TryDequeue(out BeltCopy belt))
                {
                    int pasteId      = PASTE_INDEX_MULTIPLIER * pasteIndex + belt.originalId;
                    var pastedEntity = BlueprintManager.pastedEntities[pasteId];

                    ConcurrentConnectBelt(threadIndex, pastedEntity);
                    BuildLogic.CheckBuildConditionsWorker(_abs[threadIndex], pastedEntity.buildPreview);
                }
            });

            if (pasteInserters)
            {
                ConcurrentQueue <InserterCopy> inserterQueue = new ConcurrentQueue <InserterCopy>(data.copiedInserters);
                Util.Parallelize((threadIndex) =>
                {
                    while (inserterQueue.TryDequeue(out InserterCopy inserter))
                    {
                        var pastedEntity = ConcurrentPasteInserter(threadIndex, inserter, yaw, pasteIndex);
                        BuildLogic.CheckBuildConditionsWorker(_abs[threadIndex], pastedEntity.buildPreview);
                    }
                });
            }

            actionBuild.player.mecha.buildArea = backupMechaBuildArea;
        }