public static void CheckAfter(BuildTool_BlueprintPaste __instance, ref bool __result, ref bool __state)
        {
            if (__result)
            {
                return;
            }
            if (!BlueprintCopyExtension.isEnabled || !__state)
            {
                return;
            }
            if (!__instance.cannotBuild || reformPreviews.Count <= 0)
            {
                return;
            }

            if (NebulaModAPI.IsMultiplayerActive && NebulaModAPI.MultiplayerSession.Factories.IsIncomingRequest.Value)
            {
                return;
            }

            BPGratBox box = ReformBPUtils.GetBoundingRange(__instance.planet, __instance.actionBuild.planetAux, new int[0], 0, reformPreviews, reformPreviews[0].longitude);

            bool allOk = true;

            for (int i = 0; i < __instance.bpCursor; i++)
            {
                BuildPreview preview = __instance.bpPool[i];
                if (preview.condition == EBuildCondition.NeedGround)
                {
                    Vector3 pos = (preview.lpos + preview.lpos2) * 0.5f;

                    if (box.InGratBox(pos))
                    {
                        preview.condition = EBuildCondition.Ok;
                    }
                }

                if (preview.condition != EBuildCondition.Ok && preview.condition != EBuildCondition.NotEnoughItem)
                {
                    allOk = false;
                }
            }

            if (allOk)
            {
                __result = true;
            }
        }
Esempio n. 2
0
        public static bool CreateBox(BuildTool_BlueprintCopy __instance)
        {
            __instance.curActiveAreaGratBoxCursor = 0;

            CopyToTempArray(__instance);
            CopyReforms();

            BPGratBox gratbox = ReformBPUtils.GetBoundingRange(__instance.planet, __instance.actionBuild.planetAux, __instance._tmp_selected_ids, __instance._tmp_selected_cnt, tmpReformList, __instance.divideLineRad);

            if (__instance.selectedObjIds.Count > 0 || reformSelection.Count > 0)
            {
                float longitudeRadPerGrid = BlueprintUtils.GetLongitudeRadPerGrid(gratbox.startLatitudeRad, __instance.segment);
                float latitudeRadPerGrid  = BlueprintUtils.GetLatitudeRadPerGrid(__instance.segment);
                float extend_lng_grid     = Math.Max(3f - Mathf.RoundToInt(gratbox.width / longitudeRadPerGrid) / 2, 1f);
                float extend_lat_grid     = Math.Max(3f - Mathf.RoundToInt(gratbox.height / latitudeRadPerGrid) / 2, 1f);
                gratbox = BlueprintUtils.GetExtendedGratBox(gratbox, extend_lng_grid, extend_lat_grid);
                __instance.curActiveAreaGratBoxCursor = BlueprintUtils.SplitGratBoxInTropicAreas(gratbox, __instance.tropicGratBoxRadRangeArr, __instance.displayGratBoxArr, __instance.segment);


                Array.Clear(__instance._tmp_selected_ids, 0, __instance._tmp_selected_ids.Length);
            }

            return(false);
        }
Esempio n. 3
0
        static IEnumerable <CodeInstruction> AddMoreData(IEnumerable <CodeInstruction> instructions, ILGenerator generator)
        {
            CodeMatcher matcher = new CodeMatcher(instructions, generator)
                                  .MatchForward(true,
                                                new CodeMatch(OpCodes.Ldarg_S),
                                                new CodeMatch(OpCodes.Ldc_I4_0)
                                                ).Advance(3);

            Label contLabel = (Label)matcher.Operand;

            //allow generation when there is no buildings
            matcher.Advance(-3)
            .SetAndAdvance(OpCodes.Pop, null)
            .InsertAndAdvance(Transpilers.EmitDelegate <Func <bool> >(() => BlueprintCopyExtension.isEnabled && BlueprintCopyExtension.reformSelection.Count > 0))
            .InsertAndAdvance(new CodeInstruction(OpCodes.Brtrue, contLabel))
            .InsertAndAdvance(new CodeInstruction(OpCodes.Ldarg_S, 4))
            .InsertAndAdvance(new CodeInstruction(OpCodes.Ldc_I4_0));


            //Replace function call to include foundations
            matcher.MatchForward(false,
                                 new CodeMatch(OpCodes.Call, AccessTools.Method(typeof(BlueprintUtils), nameof(BlueprintUtils.GetBoundingRange))))
            .SetInstruction(Transpilers.EmitDelegate <Func <PlanetData, PlanetAuxData, int[], int, float, BPGratBox> >((data, auxData, arg3, i, f) =>
            {
                BlueprintCopyExtension.CopyReforms();
                return(ReformBPUtils.GetBoundingRange(data, auxData, arg3, i, BlueprintCopyExtension.tmpReformList, f));
            }));

            //Add initialization
            matcher.MatchForward(false,
                                 new CodeMatch(OpCodes.Ldarg_0),
                                 new CodeMatch(OpCodes.Ldloc_S),
                                 new CodeMatch(OpCodes.Newarr),
                                 new CodeMatch(OpCodes.Stfld)
                                 ).Advance(1)
            .InsertAndAdvance(Transpilers.EmitDelegate <Action <BlueprintData> >(data =>
            {
                if (BlueprintCopyExtension.isEnabled && !UndoManager.IgnoreAllEvents.Value)
                {
                    data.reforms = new ReformData[BlueprintCopyExtension.reformSelection.Count];

                    int i = 0;
                    foreach (var kv in BlueprintCopyExtension.reformSelection)
                    {
                        data.reforms[i]           = kv.Value;
                        data.reforms[i].areaIndex = -1;
                        i++;
                    }
                }
                else
                {
                    data.reforms = new ReformData[0];
                }
            }))
            .InsertAndAdvance(new CodeInstruction(OpCodes.Ldarg_0));

            //Just to anchor
            matcher.MatchForward(true,
                                 new CodeMatch(OpCodes.Call,
                                               AccessTools.Method(typeof(BlueprintUtils), nameof(BlueprintUtils.GetLongitudeSegmentCount), new[] { typeof(Vector3), typeof(int) })),
                                 new CodeMatch(OpCodes.Stloc_S),
                                 new CodeMatch(OpCodes.Ldloc_S),
                                 new CodeMatch(OpCodes.Ldloc_S),
                                 new CodeMatch(OpCodes.Call,
                                               AccessTools.Method(typeof(BlueprintUtils), nameof(BlueprintUtils.GetLongitudeRadPerGrid), new[] { typeof(int), typeof(int) })));

            // add my code
            matcher.MatchForward(false,
                                 new CodeMatch(OpCodes.Ldc_I4_0),
                                 new CodeMatch(OpCodes.Stloc_S))
            .Advance(1)
            .InsertAndAdvance(new CodeInstruction(OpCodes.Ldarg_0))
            .InsertAndAdvance(new CodeInstruction(OpCodes.Ldloc_S, 18))
            .InsertAndAdvance(new CodeInstruction(OpCodes.Ldloc_S, 17))
            .InsertAndAdvance(new CodeInstruction(OpCodes.Ldloc_S, 7))
            .InsertAndAdvance(new CodeInstruction(OpCodes.Ldloc_S, 20))
            .InsertAndAdvance(new CodeInstruction(OpCodes.Ldloc_S, 11))
            .InsertAndAdvance(new CodeInstruction(OpCodes.Ldloc_S, 19))
            .InsertAndAdvance(Transpilers.EmitDelegate <AddAction>(
                                  (blueprint, bpgratBox, i, array, longitudeRadPerGrid, latitudeRadPerGrid, longitudeSegmentCount) =>
            {
                if (!BlueprintCopyExtension.isEnabled)
                {
                    return;
                }
                if (UndoManager.IgnoreAllEvents.Value)
                {
                    return;
                }

                for (int j = 0; j < BlueprintCopyExtension.reformSelection.Count; j++)
                {
                    if (blueprint.reforms[j].areaIndex >= 0)
                    {
                        continue;
                    }

                    ReformData data = blueprint.reforms[j];

                    if (!(bpgratBox.y - 1E-05f <= data.latitude) || !(data.latitude <= bpgratBox.w + 1E-05f))
                    {
                        continue;
                    }

                    blueprint.reforms[j].areaIndex      = i;
                    blueprint.reforms[j].localLongitude = (data.longitude - array[i].x) / longitudeRadPerGrid;
                    blueprint.reforms[j].localLatitude  = (data.latitude - array[i].y) / latitudeRadPerGrid;

                    if (blueprint.reforms[j].localLongitude < -0.5001f)
                    {
                        blueprint.reforms[j].localLongitude += longitudeSegmentCount * 5;
                    }
                }
            }));

            //Add null check to buildings iteration
            matcher.MatchForward(true,
                                 new CodeMatch(OpCodes.Ldc_I4_0),
                                 new CodeMatch(OpCodes.Newarr),
                                 new CodeMatch(OpCodes.Stfld))
            .Advance(8)
            .CreateLabel(out Label exitLabel)
            .Advance(-2)
            .InsertAndAdvance(new CodeInstruction(OpCodes.Pop))
            .InsertAndAdvance(new CodeInstruction(OpCodes.Ldarg_2))
            .InsertAndAdvance(new CodeInstruction(OpCodes.Brfalse, exitLabel))
            .InsertAndAdvance(new CodeInstruction(OpCodes.Ldloc_S, 21));


            return(matcher.InstructionEnumeration());
        }