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; } }
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); }
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()); }