public static void Prefix(Designator_Build __instance, ThingDef ___stuffDef) { stuffDef = ___stuffDef; }
public static Rot4 PlacingRot(this Designator_Build designator) => (Rot4)placingRotInfo.GetValue(designator);
static bool Prefix(Designator_Build __instance, Event ev) { if (entDefFI == null) { entDefFI = typeof(Designator_Build).GetField("entDef", BindingFlags.NonPublic | BindingFlags.Instance); stuffDefFI = typeof(Designator_Build).GetField("stuffDef", BindingFlags.NonPublic | BindingFlags.Instance); writeStuffFI = typeof(Designator_Build).GetField("writeStuff", BindingFlags.NonPublic | BindingFlags.Instance); } Map map = Find.CurrentMap; ThingDef thingDef = entDefFI.GetValue(__instance) as ThingDef; if (thingDef == null || !thingDef.MadeFromStuff || !WorldComp.HasInfiniteStorages(map)) { return(true); } List <FloatMenuOption> list = new List <FloatMenuOption>(); foreach (ThingDef current in map.resourceCounter.AllCountedAmounts.Keys) { if (current.IsStuff && current.stuffProps.CanMake(thingDef) && (DebugSettings.godMode || map.listerThings.ThingsOfDef(current).Count > 0)) { ThingDef localStuffDef = current; string labelCap = localStuffDef.LabelCap; list.Add(new FloatMenuOption(labelCap, delegate { __instance.ProcessInput(ev); Find.DesignatorManager.Select(__instance); stuffDefFI.SetValue(__instance, current); writeStuffFI.SetValue(__instance, true); }, MenuOptionPriority.Default, null, null, 0f, null, null)); } } foreach (Building_InfiniteStorage storage in WorldComp.GetInfiniteStorages(map)) { if (storage.Spawned) { foreach (Thing t in storage.StoredThings) { ThingDef current = t.def; if (current.IsStuff && current.stuffProps.CanMake(thingDef) && (DebugSettings.godMode || t.stackCount > 0)) { string labelCap = current.LabelCap; list.Add(new FloatMenuOption(labelCap, delegate { __instance.ProcessInput(ev); Find.DesignatorManager.Select(__instance); stuffDefFI.SetValue(__instance, current); writeStuffFI.SetValue(__instance, true); }, MenuOptionPriority.Default, null, null, 0f, null, null)); } } } } if (list.Count == 0) { Messages.Message("NoStuffsToBuildWith".Translate(), MessageTypeDefOf.RejectInput); } else { FloatMenu floatMenu = new FloatMenu(list); floatMenu.vanishIfMouseDistant = true; Find.WindowStack.Add(floatMenu); Find.DesignatorManager.Select(__instance); } return(false); }
// constructor from Designator_Build, links to constructor from ThingDef. public Designator_SubCategoryItem(Designator_Build designator, Designator_SubCategory subCategory) : base(designator.PlacingDef) { this.subCategory = subCategory; }
//protected override void DrawPlaceMouseAttachments(float curX, ref float curY) public static void Postfix(Designator_Build __instance, float curX, ref float curY) { List <TerrainDef> neededBridges = new List <TerrainDef>(); ThingDef stuff = __instance.StuffDef; DesignationDragger dragger = Find.DesignatorManager.Dragger; IEnumerable <IntVec3> cells = dragger.Dragging ? dragger.DragCells : GenAdj.OccupiedRect(UI.MouseCell(), __instance.PlacingRot(), __instance.PlacingDef.Size).Cells; foreach (IntVec3 dragPos in cells) { if (PlaceBridges.GetNeededBridge(__instance.PlacingDef, dragPos, __instance.Map, stuff) is TerrainDef tdef) { neededBridges.Add(tdef); } } if (neededBridges.Count == 0) { return; } Dictionary <ThingDef, int> bridgeTotalCost = new Dictionary <ThingDef, int>(); float work = 0; foreach (TerrainDef bridgeDef in neededBridges) { work += bridgeDef.GetStatValueAbstract(StatDefOf.WorkToBuild); if (bridgeDef.costList != null) { foreach (ThingDefCountClass bridgeCost in bridgeDef.costList) { bridgeTotalCost.TryGetValue(bridgeCost.thingDef, out int costCount); bridgeTotalCost[bridgeCost.thingDef] = costCount + bridgeCost.count; } } } if (bridgeTotalCost.Count == 0) { string label = $"{StatDefOf.WorkToBuild.LabelCap}: {work.ToStringWorkAmount()} ({TerrainDefOf.Bridge.LabelCap})"; //Not bridgeCostDef.LabelCap Text.Font = GameFont.Small; Text.Anchor = TextAnchor.MiddleLeft; Widgets.Label(new Rect(curX + 29f, curY, 999f, 29f), label); //private const float DragPriceDrawNumberX curY += 29f; Text.Anchor = TextAnchor.UpperLeft; } foreach (var(bridgeCostDef, bridgeCostCount) in bridgeTotalCost.Select(x => (x.Key, x.Value))) { Widgets.ThingIcon(new Rect(curX, curY, 27f, 27f), bridgeCostDef); string label = $"{bridgeCostCount} ({TerrainDefOf.Bridge.LabelCap})"; //Not bridgeCostDef.LabelCap //This doesn't account for normal building cost + under bridge cost, but what can you do if (__instance.Map.resourceCounter.GetCount(bridgeCostDef) < bridgeCostCount) { GUI.color = Color.red; label = label + " (" + "NotEnoughStoredLower".Translate() + ")"; } Text.Font = GameFont.Small; Text.Anchor = TextAnchor.MiddleLeft; Widgets.Label(new Rect(curX + 29f, curY, 999f, 29f), label); //private const float DragPriceDrawNumberX curY += 29f; Text.Anchor = TextAnchor.UpperLeft; } GUI.color = Color.white; }
public static void Prefix(Designator_Build __instance) { stuffDef = __instance.StuffDef; designating = true; }
public bool BuildingDesignatorControl() { if (Find.CurrentMap == null || Find.DesignatorManager == null) { return(true); } var Dem = Find.DesignatorManager.SelectedDesignator; if (Dem != null && Dem is Designator_Build) { if (Event.current.type == EventType.MouseDown && Event.current.button == 2) { //Better than UI.mousecell MiddleClickCell = Find.CameraDriver.MapPosition; } //Middle click to select designator if (Event.current.type == EventType.MouseUp && Event.current.button == 2 && MiddleClickCell == Find.CameraDriver.MapPosition) { Thing targetThing = null; IntVec3 UICell = UI.MouseCell(); Map map = Find.CurrentMap; if (map == null) { return(false); } if (!UICell.InBounds(map)) { return(false); } //Search for blueprints if (targetThing == null) { targetThing = UICell.GetFirstThing <Blueprint>(map); } //Search for frames if (targetThing == null) { targetThing = UICell.GetFirstThing <Frame>(map); } //Search for Buildings if (targetThing == null) { targetThing = UICell.GetFirstBuilding(map); } //Can't find things if (targetThing == null) { //SoundDefOf.ClickReject.PlayOneShotOnCamera(); Event.current.Use(); return(false); } //Find designator Designator_Build Desig = null; Desig = BuildCopyCommandUtility.FindAllowedDesignator(targetThing.def); if (Desig == null && (targetThing is Blueprint || targetThing is Frame)) { Desig = BuildCopyCommandUtility.FindAllowedDesignator(targetThing.def.entityDefToBuild); } if ((targetThing.def.BuildableByPlayer || targetThing.def.entityDefToBuild?.BuildableByPlayer == true) && Desig != null) { //Set stuff if (targetThing.Stuff != null) { Desig.SetStuffDef(targetThing.Stuff); } if ((targetThing as Blueprint_Build)?.stuffToUse != null) { Desig.SetStuffDef((targetThing as Blueprint_Build).stuffToUse); } if ((targetThing as Blueprint_Install)?.Stuff != null) { Desig.SetStuffDef((targetThing as Blueprint_Install).Stuff); } if ((targetThing as Frame)?.Stuff != null) { Desig.SetStuffDef((targetThing as Frame).Stuff); } Find.DesignatorManager.Select(Desig); SoundDefOf.Click.PlayOneShotOnCamera(); } else { //SoundDefOf.ClickReject.PlayOneShotOnCamera(); } Event.current.Use(); return(false); } //Cancel drag //First, absorb Right click event, handle it manually if (Event.current.type == EventType.MouseDown && Event.current.button == 1) { Event.current.Use(); } if (IsCancelDragging) { GenUI.DrawMouseAttachment(CancelIcon, string.Empty, 0); } if (Input.GetMouseButton(1)) { if (IsCancelDragging) { //RenderCancelHighlights(); } else { //Start cancel dragging IsCancelDragging = true; DragStart = UI.MouseCell(); SoundDefOf.Click.PlayOneShotOnCamera(null); } } //Right click up else if (Event.current.type == EventType.MouseUp && Event.current.button == 1) { IsCancelDragging = false; selectedThings.Clear(); Event.current.Use(); if (selectedThings.Any()) { selectedThings.Do(delegate(Thing t) { t.Destroy(DestroyMode.Cancel); }); SoundDefOf.Designate_Cancel.PlayOneShotOnCamera(); } else { SoundDefOf.CancelMode.PlayOneShotOnCamera(null); Find.DesignatorManager.Deselect(); return(false); } } //While cancel dragging, left click to abort if (Event.current.type == EventType.MouseDown && Event.current.button == 0 && IsCancelDragging) { selectedThings.Clear(); IsCancelDragging = false; SoundDefOf.CancelMode.PlayOneShotOnCamera(null); Find.DesignatorManager.Deselect(); Event.current.Use(); return(false); } //Drag to place blueprints var BuildDesignator = (Designator_Build)Dem; if (BuildDesignator.DraggableDimensions != 0) { return(true); } if (Event.current.type == EventType.MouseDown && Event.current.button == 0) { PreviousCell = IntVec3.Invalid; ClickedFlag = true; Event.current.Use(); } if (Event.current.type == EventType.MouseUp && Event.current.button == 0) { PreviousCell = IntVec3.Invalid; ClickedFlag = false; Event.current.Use(); } if (Input.GetMouseButton(0) && !Mouse.IsInputBlockedNow && PreviousCell != UI.MouseCell() && ClickedFlag) { var acceptanceReport = BuildDesignator.CanDesignateCell(UI.MouseCell()); if (DebugSettings.godMode && acceptanceReport.Accepted) //Handle god mode { Traverse t = Traverse.Create(BuildDesignator); BuildableDef entDef = t.Field("entDef").GetValue <BuildableDef>(); Rot4 rot = t.Field("placingRot").GetValue <Rot4>(); CellRect cellRect = GenAdj.OccupiedRect(UI.MouseCell(), rot, entDef.Size); foreach (IntVec3 c in cellRect) { var thinglist = c.GetThingList(Find.CurrentMap); for (int i = 0; i < thinglist.Count; i++) { var thing3 = thinglist[i]; if (!GenConstruct.CanPlaceBlueprintOver(entDef, thing3.def)) { acceptanceReport = new AcceptanceReport("SpaceAlreadyOccupied_DevFail"); } } } } if (acceptanceReport.Accepted) { BuildDesignator.DesignateSingleCell(UI.MouseCell()); BuildDesignator.Finalize(true); } else { //If this is first cell clicked if (PreviousCell == IntVec3.Invalid) { Messages.Message(acceptanceReport.Reason, MessageTypeDefOf.SilentInput, false); BuildDesignator.Finalize(false); } } PreviousCell = UI.MouseCell(); //Event.current.Use(); } return(false); } else //This is not Building designator { IsCancelDragging = false; return(true); } }
public static bool VehicleMaterialOnBuildGizmo(Vector2 topLeft, float maxWidth, BuildableDef ___entDef, ref GizmoResult __result, Designator_Build __instance) { if (___entDef is VehicleBuildDef def) { __result = RenderHelper.GizmoOnGUIWithMaterial(__instance, new Rect(topLeft.x, topLeft.y, __instance.GetWidth(maxWidth), 75f), def); if (def.MadeFromStuff) { Designator_Dropdown.DrawExtraOptionsIcon(topLeft, __instance.GetWidth(maxWidth)); } return(false); } return(true); }
public static void Postfix(Designator_Build __instance, ref string __result) { try { BuildableDef entDef = Traverse.Create(__instance)?.Field("entDef")?.GetValue <BuildableDef>(); ThingDef stuffDef = Traverse.Create(__instance)?.Field("stuffDef")?.GetValue <ThingDef>(); string walkspeed = ""; string fertility = ""; string beauty = ""; string cleanliness = ""; //FertileFields terraforming if (MoreInfoBox.fertileFields) { entDef = TryGetFertileFieldsTerrainDef(entDef); } if (entDef is TerrainDef) { if (entDef.passability != Traversability.Impassable) { walkspeed = "MIB.Speed".Translate(SpeedPercentString(entDef.pathCost)); } else { walkspeed = "MIB.Impassable".Translate(); } if (entDef.fertility > 0) { fertility = "MIB.Fertility".Translate(entDef.fertility.ToStringPercent()); } } if (entDef.HasStat(StatDefOf.Beauty)) { beauty = "MIB.Beauty".Translate(entDef.GetStat(stuffDef, StatDefOf.Beauty).ToStringByStyle(ToStringStyle.Integer)); } if (entDef.HasStat(StatDefOf.Cleanliness)) { cleanliness = "MIB.Cleanliness".Translate(entDef.GetStat(stuffDef, StatDefOf.Cleanliness).ToStringByStyle(ToStringStyle.FloatOne)); } //extra linebreak bool extraLineBreak = Text.Font == GameFont.Tiny; if (extraLineBreak) { var tmp = Text.Font; Text.Font = GameFont.Small; extraLineBreak = Text.CalcHeight(__instance.LabelCap, ArchitectCategoryTab.InfoRect.width - 7 * 2) > 25; Text.Font = tmp; } __result = (extraLineBreak ? "\n" : "") + walkspeed + fertility + beauty + cleanliness + "\n" + __result; } catch (Exception e) { Log.Error(e.ToString()); } }