public static void parrot_designate_single_cell(IntVec3 c, ThingDef stuffDef, Rot4 placingRot, BuildableDef entDef) { use_native = true; try { var designator = BuildCopyCommandUtility.FindAllowedDesignator(entDef, false); designator.SetStuffDef(stuffDef); designator.GetType().GetField("placingRot", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(designator, placingRot); designator.DesignateSingleCell(c); } finally { use_native = false; } }
private bool DoWork(Slate slate) { Map map = slate.Get <Map>("map"); if (map == null) { return(false); } float x2 = slate.Get("points", 0f); SimpleCurve value = pointsToMaxItemMarketValueCurve.GetValue(slate); float num = maxMarketValueFactor.GetValue(slate) ?? 1f; float maxMarketValue = value.Evaluate(x2) * num; SimpleCurve value2 = pointsToRequiredWorkCurve.GetValue(slate); float randomInRange = (workAmountRandomFactorRange.GetValue(slate) ?? FloatRange.One).RandomInRange; float num2 = value2.Evaluate(x2) * randomInRange; tmpCandidates.Clear(); for (int j = 0; j < allWorkTables.Count; j++) { if (BuildCopyCommandUtility.FindAllowedDesignator(allWorkTables[j]) == null) { continue; } List <RecipeDef> recipes = allWorkTables[j].AllRecipes; for (int i = 0; i < recipes.Count; i++) { if (!recipes[i].AvailableNow || !recipes[i].products.Any() || recipes[i].PotentiallyMissingIngredients(null, map).Any()) { continue; } foreach (ThingDef stuff in recipes[i].products[0].thingDef.MadeFromStuff ? GenStuff.AllowedStuffsFor(recipes[i].products[0].thingDef) : Gen.YieldSingle <ThingDef>(null)) { if (stuff != null && (!map.listerThings.ThingsOfDef(stuff).Any() || stuff.stuffProps.commonality < minStuffCommonality.GetValue(slate))) { continue; } int num3 = 0; if (stuff != null) { List <Thing> list = map.listerThings.ThingsOfDef(stuff); for (int k = 0; k < list.Count; k++) { num3 += list[k].stackCount; } } float num4 = recipes[i].WorkAmountTotal(stuff); if (!(num4 > 0f)) { continue; } int num5 = Mathf.FloorToInt(num2 / num4); if (stuff != null) { IngredientCount ingredientCount = recipes[i].ingredients.Where((IngredientCount x) => x.filter.Allows(stuff)).MaxByWithFallback((IngredientCount x) => x.CountRequiredOfFor(stuff, recipes[i])); num5 = Mathf.Min(num5, Mathf.FloorToInt((float)num3 / (float)ingredientCount.CountRequiredOfFor(stuff, recipes[i]))); } if (num5 > 0) { tmpCandidates.Add(new Pair <ThingStuffPair, int>(new ThingStuffPair(recipes[i].products[0].thingDef, stuff), recipes[i].products[0].count * num5)); } } } } tmpCandidates.RemoveAll((Pair <ThingStuffPair, int> x) => x.Second <= 0); tmpCandidates.RemoveAll((Pair <ThingStuffPair, int> x) => StatDefOf.MarketValue.Worker.GetValueAbstract(x.First.thing, x.First.stuff) > maxMarketValue); if (!tmpCandidates.Any()) { return(false); } Pair <ThingStuffPair, int> pair = tmpCandidates.RandomElement(); int num6 = Mathf.Min(Mathf.RoundToInt(maxMarketValue / StatDefOf.MarketValue.Worker.GetValueAbstract(pair.First.thing, pair.First.stuff)), pair.Second); float randomInRange2 = (productionItemCountRandomFactorRange.GetValue(slate) ?? FloatRange.One).RandomInRange; num6 = Mathf.RoundToInt((float)num6 * randomInRange2); num6 = Mathf.Max(num6, 1); slate.Set(storeProductionItemDefAs.GetValue(slate), pair.First.thing); slate.Set(storeProductionItemStuffAs.GetValue(slate), pair.First.stuff); slate.Set(storeProductionItemCountAs.GetValue(slate), num6); string value3 = storeProductionItemLabelAs.GetValue(slate); if (!string.IsNullOrEmpty(value3)) { slate.Set(value3, GenLabel.ThingLabel(pair.First.thing, pair.First.stuff, num6)); } return(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); } }