public static void Prefix(ref Func <List <FloatMenuOption> > recipeOptionsMaker, BillStack __instance) { inDoListing = true; lastBillStack = __instance; if (!Ad2Mod.settings.useRightClickMenu) { return; } var list = recipeOptionsMaker(); recipeOptionsMaker = delegate { var newList = new List <FloatMenuOption>(); foreach (var opt in list) { var recipe = Ad2.GetRecipeByLabel(opt.Label); if (recipe == null || !Ad2.IsNewRecipe(recipe)) { newList.Add(opt); } } return(newList); }; }
// Token: 0x06000042 RID: 66 RVA: 0x00004C04 File Offset: 0x00002E04 private static bool ChkDuplication(Pawn pawn, RecipeDef recipedef) { bool flag; if (pawn == null) { flag = (null != null); } else { BillStack billStack = pawn.BillStack; flag = ((billStack?.Bills) != null); } if (flag && pawn.BillStack.Bills.Count > 0) { foreach (Bill bill in pawn.BillStack.Bills) { if ((bill?.recipe) != null && bill.recipe == recipedef) { return(true); } } return(false); } return(false); }
public static Bill DrawListing(BillStack billStack, Rect rect, Func <List <FloatMenuOption> > recipeOptionsMaker, ScrollView scrollView) { Bill result = null; GUI.BeginGroup(rect); Text.Font = GameFont.Small; if (billStack.Count < 10) { Rect rect2 = new Rect(0f, 0f, 150f, 29f); if (Widgets.TextButton(rect2, "AddBill".Translate(), true, false)) { Find.WindowStack.Add(new FloatMenu(recipeOptionsMaker(), false)); } } Text.Anchor = TextAnchor.UpperLeft; GUI.color = Color.white; Rect viewRect = new Rect(0f, 35f, rect.width, rect.height - 35f); scrollView.Begin(viewRect); float num = 0f; for (int i = 0; i < billStack.Count; i++) { Bill bill = billStack[i]; Rect rect3 = BillDrawer.DrawProductionBill(billStack, bill, 0f, num, scrollView.ViewWidth, i); if (!bill.DeletedOrDereferenced && rect3.Contains(Event.current.mousePosition)) { result = bill; } num += rect3.height + 6f; } scrollView.End(num + 60f); GUI.EndGroup(); return(result); }
}//end JobOnThing() /// <summary> /// Checks if a pawn can be assigned to a bill based on factors including PawnRestrictions, workSkills, etc. /// If a bill passes all the checks, it's assigned as the ActiveBill in the billProcessor. /// </summary> /// <param name="p"></param> /// <param name="grower"></param> /// <param name="reason"></param> /// <returns></returns> public Bill GetBillPawnCanDo(Pawn p, Building_GrowerBase_WorkTable grower, out string reason) { reason = GenericFailReasonTrans; BillStack bills = grower.billStack; LocalTargetInfo target = grower; //loop through bills for (int i = 0; i < bills.Count; i++) { Bill_Production theBill = bills[i] as Bill_Production; if (!PawnCanDoThisBill(p, theBill, target, out reason)) { continue; } //check if cached ingredients search found ingredients for this bill Thing cachedThing; grower.billProc.ingredientsAvailableNow.TryGetValue(theBill.GetUniqueLoadID(), out cachedThing); if (cachedThing == null) { QEEMod.TryLog("GetBillPawnCanDo - no ingredients available"); reason = NoIngredientsTrans; continue; } grower.billProc.ActiveBill = theBill; QEEMod.TryLog(p.LabelShort + " can do bill " + theBill.GetUniqueLoadID()); return(theBill); } return(null); } //end GetBillPawnCanDo()
public static int?GetIndexFor(BillStack bs) { List <KeyValuePair <KeyValuePair <int, WeakReference <Bill> >, WeakReference <BillStack> > > removalList = new List <KeyValuePair <KeyValuePair <int, WeakReference <Bill> >, WeakReference <BillStack> > >(); int?res = null; foreach (var val in billstackReferenceHeap) { if (val.Value.IsAlive) { if (val.Value.Equals(bs)) { res = val.Key.Key; break; } } else { removalList.Add(val); } } foreach (var val in removalList) { billstackReferenceHeap.Remove(val); } return(res); }
private static Bill DoListing(BillStack __instance, Rect rect, Func <Dictionary <string, List <FloatMenuOption> > > labeledSortingActions, ref Vector2 scrollPosition, ref float viewHeight) { Bill result = null; GUI.BeginGroup(rect); Text.Font = GameFont.Small; if (__instance.Count < 15) { var rect2 = new Rect(0f, 0f, 150f, 29f); if (Widgets.ButtonText(rect2, "AddBill".Translate())) { // Outfitter Code var items = labeledSortingActions.Invoke().Keys.Select( label => { var fmo = labeledSortingActions.Invoke()[label]; return(Tools.MakeMenuItemForLabel(label, fmo)); }).ToList(); Tools.LabelMenu = new FloatMenuLabels(items); Find.WindowStack.Add(Tools.LabelMenu); } UIHighlighter.HighlightOpportunity(rect2, "AddBill"); } Text.Anchor = TextAnchor.UpperLeft; GUI.color = Color.white; var outRect = new Rect(0f, 35f, rect.width, (float)(rect.height - 35.0)); var viewRect = new Rect(0f, 0f, (float)(outRect.width - 16.0), viewHeight); Widgets.BeginScrollView(outRect, ref scrollPosition, viewRect); var num = 0f; for (var i = 0; i < __instance.Count; i++) { var bill = __instance.Bills[i]; var rect3 = bill.DoInterface(0f, num, viewRect.width, i); if (!bill.DeletedOrDereferenced && Mouse.IsOver(rect3)) { result = bill; } num = (float)(num + (rect3.height + 6.0)); } if (Event.current.type == EventType.Layout) { viewHeight = (float)(num + 60.0); } Widgets.EndScrollView(); GUI.EndGroup(); DoBwmPostfix?.Invoke(ref rect); return(result); }
public void GetObjectData(object obj, SerializationInfo info, StreamingContext context) { Bill b = (Bill)obj; BillStack st = b.billStack; info.AddValue("bill_stack", st); info.AddValue("recipedef", b.recipe.defName); }
public static void Postfix(ref BillStack __instance, ref Rect rect) { var workTable = __instance.billGiver as Building_WorkTable; if (workTable == null) { return; } var gap = 4f; var buttonWidth = 70f; var rectCopyAll = new Rect(rect.xMin + 154f, rect.yMin, buttonWidth, 29f); var billCopyPasteHandler = Main.Instance.BillCopyPasteHandler; if (workTable.BillStack != null && workTable.BillStack.Count > 0) { if (Widgets.ButtonText(rectCopyAll, "IW.CopyAllLabel".Translate())) { billCopyPasteHandler.DoCopy(workTable); } TooltipHandler.TipRegion(rectCopyAll, "IW.CopyAllTip".Translate()); } if (!billCopyPasteHandler.CanPasteInto(workTable)) { return; } var rectPaste = new Rect(rectCopyAll); rectPaste.xMin += buttonWidth + gap; rectPaste.xMax += buttonWidth + gap; if (Widgets.ButtonText(rectPaste, billCopyPasteHandler.IsMultipleBillsCopied() ? "IW.PasteAllLabel".Translate() : "IW.Paste".Translate())) { billCopyPasteHandler.DoPasteInto(workTable, false); } TooltipHandler.TipRegion(rectPaste, "IW.PasteAllTip".Translate()); var oldFont = Text.Font; Text.Font = GameFont.Tiny; var rectLink = new Rect(rectPaste); rectLink.xMin += buttonWidth + gap; rectLink.xMax += buttonWidth + gap; if (Widgets.ButtonText(rectLink, "IW.PasteLinkLabel".Translate())) { billCopyPasteHandler.DoPasteInto(workTable, true); } TooltipHandler.TipRegion(rectLink, "IW.PasteLinkTip".Translate()); Text.Font = oldFont; }
static void AddBillPostfix(BillStack __instance, Bill bill) { IBillGiverExtension extension = __instance.billGiver as IBillGiverExtension; if (extension != null) { extension.Notify_BillAdded(bill); } }
public void GetObjectData(object obj, SerializationInfo info, StreamingContext context) { BillStack bs = (BillStack)obj; Thing t = bs.billGiver as Thing; IntVec3 thingPos = t.PositionHeld; info.AddValue("billgiverID", t.ThingID); info.AddValue("thingPos", thingPos); }
public Pawn_HealthTracker(Pawn pawn) { this.pawn = pawn; this.hediffSet = new HediffSet(pawn); this.capacities = new PawnCapacitiesHandler(pawn); this.summaryHealth = new SummaryHealthHandler(pawn); this.surgeryBills = new BillStack(pawn); this.immunity = new ImmunityHandler(pawn); }
public Pawn_HealthTracker_CantHeal(Pawn pawn) : base(pawn) { this.pawn = pawn; hediffSet = new HediffSet(pawn); capacities = new PawnCapacitiesHandler(pawn); summaryHealth = new SummaryHealthHandler(pawn); surgeryBills = new BillStack(pawn); immunity = new ImmunityHandler(pawn); beCarriedByCaravanIfSick = pawn.RaceProps.Humanlike; }
public static void FindBillAndChangeRepeatCount(BillStack billStack, RecipeDef currentRecipe) { if (billStack != null && billStack.Bills != null) { var billrepeater = billStack.Bills.OfType <Bill_Production>().ToList().Find(b => b.ShouldDoNow() && b.recipe == currentRecipe); if (billrepeater != null && billrepeater.repeatMode == BillRepeatModeDefOf.RepeatCount) { billrepeater.repeatCount -= 1; } } }
public static void RemoveAt(BillStack stack, int index) { avoid_loop_internal = true; try { stack.Delete(stack.Bills[index]); } finally { avoid_loop_internal = false; } }
public static void ReorderAt(BillStack stack, int index, int offset) { avoid_loop_internal = true; try { stack.Reorder(stack.Bills[index], offset); } finally { avoid_loop_internal = false; } }
public static bool Reorder(ref Bill bill, BillStack __instance, int offset) { if (avoid_loop_internal) { return(true); } else { ReorderAt(__instance, __instance.Bills.IndexOf(bill), offset); return(false); } }
public static bool Delete(ref Bill bill, BillStack __instance) { if (avoid_loop_internal) { return(true); } else { RemoveAt(__instance, __instance.Bills.IndexOf(bill)); return(false); } }
private Job GetMedicalBillJob(Pawn meeseeks, CompMeeseeksMemory memory, SavedJob savedJob, SavedTargetInfo jobTarget, ref JobAvailability jobAvailabilty) { Bill_Medical bill = jobTarget.bill as Bill_Medical; Job job = null; if (jobTarget != null && jobTarget.HasThing && !jobTarget.ThingDestroyed && jobTarget.Thing is Pawn && !(jobTarget.Thing as Pawn).Dead) { Pawn targetPawn = jobTarget.Thing as Pawn; if (targetPawn == null || targetPawn.Dead || !bill.CompletableEver) { bill.deleted = true; jobAvailabilty = JobAvailability.Complete; } else { MeeseeksBillStorage billStorage = Current.Game.World.GetComponent <MeeseeksBillStorage>(); BillStack billStack = targetPawn.BillStack; jobAvailabilty = JobAvailability.Delayed; if (targetPawn.UsableForBillsAfterFueling() && meeseeks.CanReserve(targetPawn, 1, -1, null, true)) { List <ThingCount> chosenIngredients = new List <ThingCount>(); // Screw you I need this function bool result = (bool)typeof(WorkGiver_DoBill).GetMethod("TryFindBestBillIngredients", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, new object[] { bill, meeseeks, targetPawn, chosenIngredients }); if (result) { Job haulOffJob; job = WorkGiver_DoBill.TryStartNewDoBillJob(meeseeks, bill, targetPawn, chosenIngredients, out haulOffJob); bill.billStack.billGiver = targetPawn as IBillGiver; } if (job == null) { jobAvailabilty = JobAvailability.Delayed; } else { jobAvailabilty = JobAvailability.Available; } } } } else { bill.deleted = true; jobAvailabilty = JobAvailability.Complete; } return(job); }
public Bill DrawListing(BillStack billStack, Rect rect, Func <List <FloatMenuOption> > recipeOptionsMaker, ref Vector2 scrollPosition, ref float viewHeight) { Bill result = null; GUI.BeginGroup(rect); Text.Font = GameFont.Small; Rect rect2 = new Rect(0f, 0f, 150f, 29f); if (billStack.Count < 10) { if (Widgets.TextButton(rect2, "AddBill".Translate(), true, false)) { Find.WindowStack.Add(new FloatMenu(recipeOptionsMaker(), false)); } } else { GUI.color = new Color(1f, 1f, 1f, 0.3f); Button.TextButton(rect2, "AddBill".Translate(), true, false, false); } Text.Anchor = TextAnchor.UpperLeft; GUI.color = Color.white; Rect outRect = new Rect(0f, 35f, rect.width, rect.height - 35f); Rect viewRect = new Rect(0f, 0f, outRect.width - 16f, viewHeight); Widgets.BeginScrollView(outRect, ref scrollPosition, viewRect); float num = 0f; for (int i = 0; i < billStack.Count; i++) { Bill bill = billStack[i]; Rect rect3 = BillDrawer.DrawMedicalBill(billStack, bill, 0f, num, viewRect.width, i); if (!bill.DeletedOrDereferenced && rect3.Contains(Event.current.mousePosition)) { result = bill; } num += rect3.height; if (i < billStack.Count - 1) { num += 6f; } } if (Event.current.type == EventType.Layout) { viewHeight = num; } Widgets.EndScrollView(); GUI.EndGroup(); return(result); }
static void Postfix(BillStack __instance) { if (Multiplayer.game == null) { return; } if (Scribe.mode == LoadSaveMode.PostLoadInit) { foreach (var bill in __instance.bills) { ScribeUtil.sharedCrossRefs.RegisterLoaded(bill); } } }
static void Prefix(BillStack __instance) { if (Multiplayer.game == null) { return; } foreach (var bill in __instance.bills) { if (!bill.CompletableEver) { ScribeUtil.sharedCrossRefs.Unregister(bill); } } }
public static void AddBMGUI(float width, BillStack billstack, Bill bill) { if (!bill.recipe.IsSurgery) { //Color baseColor = new Color(1f, 0.7f, 0.7f, 0.7f); Color baseColor = Color.white; //float offset = Controller.Settings.BillBMPos; var rectBM = new Rect(width - (24f + 150f), 0f, 24f, 24f); Texture2D BMTex = BMBillUtility.GetBillBMTex(billstack.billGiver as Thing, bill); if (Widgets.ButtonImage(rectBM, BMTex, baseColor, baseColor * GenUI.SubtleMouseoverColor)) { BMBillUtility.SetBillBMVal(billstack.billGiver as Thing, bill); SoundDefOf.Click.PlayOneShotOnCamera(); } } }
public static void Postfix(Bill_Production __instance, ctx __state, ref BillStack ___billStack) { if (__state.repeatCount != __instance.repeatCount) { int b = __instance.repeatCount; __instance.repeatCount = __state.repeatCount; BillRepeatModeUtilityPatch.SetBillRepeatCount(__instance, b); } if (__state.targetCount != __instance.targetCount) { int b = __instance.targetCount; __instance.targetCount = __state.targetCount; BillRepeatModeUtilityPatch.SetBillTargetCount(__instance, b); } }
private static Bill DoBillListingSMU(BillStack billStack, Rect rect, Func <List <FloatMenuOption> > recipeOptionsMakerStandard, Func <List <FloatMenuOption> > recipeOptionsMakerAdvanced, ref Vector2 scrollPosition, ref float viewHeight) { Bill result = null; GUI.BeginGroup(rect); Text.Font = GameFont.Small; if (billStack.Count < 15) { Rect rect2 = new Rect(0f, 0f, 160f, 29f); if (Widgets.ButtonText(rect2, "AddStandardSurgery".Translate(), true, false, true)) { Find.WindowStack.Add(new FloatMenu(recipeOptionsMakerStandard())); } Rect rect3 = new Rect(170f, 0f, 160f, 29f); if (Widgets.ButtonText(rect3, "AddAdvancedSurgery".Translate(), true, false, true)) { Find.WindowStack.Add(new FloatMenu(recipeOptionsMakerAdvanced())); } } Text.Anchor = TextAnchor.UpperLeft; GUI.color = Color.white; Rect outRect = new Rect(0f, 35f, rect.width, rect.height - 35f); Rect viewRect = new Rect(0f, 0f, outRect.width - 16f, viewHeight); Widgets.BeginScrollView(outRect, ref scrollPosition, viewRect); float num = 0f; List <Bill> bills = typeof(BillStack).GetField("bills", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(billStack) as List <Bill>; for (int i = 0; i < billStack.Count; i++) { Bill bill = bills[i]; Rect rect3 = bill.DoInterface(0f, num, viewRect.width, i); if (!bill.DeletedOrDereferenced && Mouse.IsOver(rect3)) { result = bill; } num += rect3.height + 6f; } if (Event.current.type == EventType.Layout) { viewHeight = num + 60f; } Widgets.EndScrollView(); GUI.EndGroup(); return(result); }
public static bool BillStack_AddBill_Prefix(BillStack __instance, Bill bill) { var customizableBill = bill as Bill_Customizer; if (customizableBill != null) { var worker = customizableBill.Worker; worker.billStack = __instance; if (!worker.OnAddBill()) { return(false); } } return(true); }
static void ReorderBillInStack(BillStack stack, int from, int to) { if (to >= stack.Count) { to = stack.Count - 1; } if (from == to) { return; } var bill = stack[from]; var offset = to - from; stack.Reorder(bill, offset); }
} //end UpdateDesiredRequests /// <summary> /// Updates the _activeBill variable from the billID. Should only need to be called when loading a save. /// </summary> public void UpdateActiveBill() { BillStack bills = (observedThingHolder as IBillGiver)?.BillStack; if (bills == null) { return; } foreach (Bill_Production curBill in bills) { if (curBill.GetUniqueLoadID() == _activeBillID) { _activeBill = curBill; } } }
public static void CheckBillBMValues(CompBestMix CBM, Thing billGiver, List <string> BillModes) { if (BillModes != null) { if (BillModes.Count > 0) { List <string> newBillModes = new List <string>(); List <string> billIDs = new List <string>(); BillStack billStack = (billGiver as IBillGiver)?.BillStack; if (billStack != null) { List <Bill> bills = billStack?.Bills; if (bills.Count > 0) { foreach (Bill bill in bills) { string id = bill?.GetUniqueLoadID(); if (id != null) { billIDs.AddDistinct <string>(id); } } } } foreach (string BillMode in BillModes) { if ((billIDs.Contains(BillValuePart(BillMode)))) { newBillModes.AddDistinct <string>(BillMode); } } CBM.BillBMModes = newBillModes; //newBillModes.Clear(); //billIDs.Clear(); } } else { CBM.BillBMModes = new List <string>(); } }
public object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector) { string recipeDefName = info.GetString("recipedef"); BillStack st = (BillStack)info.GetValue("bill_stack", typeof(BillStack)); RimLog.Message("bill lacks pawn restriction in surrogate!"); RimLog.Message("billstack is null ? " + (st == null ? "yes" : "no")); RimLog.Message("bill giver as thing : " + (st.billGiver as Thing)); RimLog.Message("bill giver def as thing : " + (st.billGiver as Thing).def); foreach (var rec in (st.billGiver as Thing).def.recipes) { if (rec.defName == recipeDefName) { return(BillUtility.MakeNewBill(rec)); } } RimLog.Message("could not make bill!"); return(null); }
public void SaveBill(Bill originalBill) { if (IsTracked(originalBill)) { return; } Bill duplicateBill = originalBill.Clone(); duplicateBill.InitializeAfterClone(); BillStack billStack = new BillStack(originalBill.billStack.billGiver); billStack.AddBill(duplicateBill); MeeseeksBillKnowledge newBillKnowledge = new MeeseeksBillKnowledge(); newBillKnowledge.originalBill = originalBill; newBillKnowledge.billStack = billStack; newBillKnowledge.billGiver = billStack.billGiver as Thing; bills.Add(newBillKnowledge); }