public static Tradeable TradeableMatching(Thing thing, List <Tradeable> tradeables) { Tradeable result; if (thing == null || tradeables == null) { result = null; } else { for (int i = 0; i < tradeables.Count; i++) { Tradeable tradeable = tradeables[i]; if (tradeable.HasAnyThing) { TransferAsOneMode mode = (!tradeable.TraderWillTrade) ? TransferAsOneMode.InactiveTradeable : TransferAsOneMode.Normal; if (TransferableUtility.TransferAsOne(thing, tradeable.AnyThing, mode)) { return(tradeable); } } } result = null; } return(result); }
private void CheckReassign(Tradeable tradeable, Transactor side) { List <Thing> things = side == Transactor.Colony ? tradeable.thingsColony : tradeable.thingsTrader; for (int j = things.Count - 1; j >= 1; j--) { Thing thing = things[j]; TransferAsOneMode mode = tradeable.TraderWillTrade ? TransferAsOneMode.Normal : TransferAsOneMode.InactiveTradeable; if (recacheThings.Contains(thing)) { if (!TransferableUtility.TransferAsOne(tradeable.AnyThing, thing, mode)) { things.RemoveAt(j); } else { AddToTradeables(thing, side); } } } }
public static bool TransferAsOne(Thing a, Thing b, TransferAsOneMode mode) { if (a == b) { return(true); } if (a.def != b.def) { return(false); } a = a.GetInnerIfMinified(); b = b.GetInnerIfMinified(); if (a.def.tradeNeverStack || b.def.tradeNeverStack) { return(false); } if (!CanStack(a) || !CanStack(b)) { return(false); } if (a.def != b.def || a.Stuff != b.Stuff) { return(false); } if (mode == TransferAsOneMode.PodsOrCaravanPacking) { float num = -1f; CompRottable compRottable = a.TryGetComp <CompRottable>(); if (compRottable != null) { num = compRottable.RotProgressPct; } float num2 = -1f; CompRottable compRottable2 = b.TryGetComp <CompRottable>(); if (compRottable2 != null) { num2 = compRottable2.RotProgressPct; } if (Mathf.Abs(num - num2) > 0.1f) { return(false); } } if (a is Corpse && b is Corpse) { Pawn innerPawn = ((Corpse)a).InnerPawn; Pawn innerPawn2 = ((Corpse)b).InnerPawn; if (innerPawn.def != innerPawn2.def) { return(false); } if (innerPawn.kindDef != innerPawn2.kindDef) { return(false); } if (innerPawn.RaceProps.Humanlike || innerPawn2.RaceProps.Humanlike) { return(false); } if ((innerPawn.Name != null && !innerPawn.Name.Numerical) || (innerPawn2.Name != null && !innerPawn2.Name.Numerical)) { return(false); } return(true); } if (a.def.category == ThingCategory.Pawn) { if (b.def != a.def) { return(false); } Pawn pawn = (Pawn)a; Pawn pawn2 = (Pawn)b; if (pawn.kindDef != pawn2.kindDef) { return(false); } if (pawn.gender != pawn2.gender) { return(false); } if (pawn.ageTracker.CurLifeStageIndex != pawn2.ageTracker.CurLifeStageIndex) { return(false); } if (Mathf.Abs(pawn.ageTracker.AgeBiologicalYearsFloat - pawn2.ageTracker.AgeBiologicalYearsFloat) > 1f) { return(false); } return(true); } Apparel apparel = a as Apparel; Apparel apparel2 = b as Apparel; if (apparel != null && apparel2 != null && apparel.WornByCorpse != apparel2.WornByCorpse) { return(false); } if (mode != TransferAsOneMode.InactiveTradeable && a.def.useHitPoints && Mathf.Abs(a.HitPoints - b.HitPoints) >= 10) { return(false); } QualityCategory qc; QualityCategory qc2; if (a.TryGetQuality(out qc) && b.TryGetQuality(out qc2) && qc != qc2) { return(false); } if (a.def.category == ThingCategory.Item) { return(a.CanStackWith(b)); } if (a.def.category == ThingCategory.Building) { return(true); } Log.Error("Unknown TransferAsOne pair: " + a + ", " + b); return(false); }
public static TransferableOneWay TransferableMatchingDesperate(Thing thing, List <TransferableOneWay> transferables, TransferAsOneMode mode) { if (thing == null || transferables == null) { return(null); } for (int i = 0; i < transferables.Count; i++) { TransferableOneWay transferableOneWay = transferables[i]; if (transferableOneWay.HasAnyThing && transferableOneWay.things.Contains(thing)) { return(transferableOneWay); } } for (int j = 0; j < transferables.Count; j++) { TransferableOneWay transferableOneWay2 = transferables[j]; if (transferableOneWay2.HasAnyThing && TransferAsOne(thing, transferableOneWay2.AnyThing, mode)) { return(transferableOneWay2); } } for (int k = 0; k < transferables.Count; k++) { TransferableOneWay transferableOneWay3 = transferables[k]; if (transferableOneWay3.HasAnyThing && transferableOneWay3.ThingDef == thing.def) { return(transferableOneWay3); } } return(null); }
public static T TransferableMatching <T>(Thing thing, List <T> transferables, TransferAsOneMode mode) where T : Transferable { if (thing == null || transferables == null) { return((T)null); } for (int i = 0; i < transferables.Count; i++) { T result = transferables[i]; if (result.HasAnyThing && TransferAsOne(thing, result.AnyThing, mode)) { return(result); } } return((T)null); }
public static bool TransferAsOne(Thing a, Thing b, TransferAsOneMode mode) { bool result; if (a == b) { result = true; } else if (a.def != b.def) { result = false; } else { a = a.GetInnerIfMinified(); b = b.GetInnerIfMinified(); if (a.def.tradeNeverStack || b.def.tradeNeverStack) { result = false; } else if (!TransferableUtility.CanStack(a) || !TransferableUtility.CanStack(b)) { result = false; } else if (a.def != b.def || a.Stuff != b.Stuff) { result = false; } else { if (mode == TransferAsOneMode.PodsOrCaravanPacking) { float num = -1f; CompRottable compRottable = a.TryGetComp <CompRottable>(); if (compRottable != null) { num = compRottable.RotProgressPct; } float num2 = -1f; CompRottable compRottable2 = b.TryGetComp <CompRottable>(); if (compRottable2 != null) { num2 = compRottable2.RotProgressPct; } if (Mathf.Abs(num - num2) > 0.1f) { return(false); } } if (a is Corpse && b is Corpse) { Pawn innerPawn = ((Corpse)a).InnerPawn; Pawn innerPawn2 = ((Corpse)b).InnerPawn; result = (innerPawn.def == innerPawn2.def && innerPawn.kindDef == innerPawn2.kindDef && !innerPawn.RaceProps.Humanlike && !innerPawn2.RaceProps.Humanlike && (innerPawn.Name == null || innerPawn.Name.Numerical) && (innerPawn2.Name == null || innerPawn2.Name.Numerical)); } else if (a.def.category == ThingCategory.Pawn) { if (b.def != a.def) { result = false; } else { Pawn pawn = (Pawn)a; Pawn pawn2 = (Pawn)b; result = (pawn.kindDef == pawn2.kindDef && pawn.gender == pawn2.gender && pawn.ageTracker.CurLifeStageIndex == pawn2.ageTracker.CurLifeStageIndex && Mathf.Abs(pawn.ageTracker.AgeBiologicalYearsFloat - pawn2.ageTracker.AgeBiologicalYearsFloat) <= 1f); } } else { Apparel apparel = a as Apparel; Apparel apparel2 = b as Apparel; if (apparel != null && apparel2 != null) { if (apparel.WornByCorpse != apparel2.WornByCorpse) { return(false); } } if (mode != TransferAsOneMode.InactiveTradeable && a.def.useHitPoints && Mathf.Abs(a.HitPoints - b.HitPoints) >= 10) { result = false; } else { QualityCategory qualityCategory; QualityCategory qualityCategory2; if (a.TryGetQuality(out qualityCategory) && b.TryGetQuality(out qualityCategory2)) { if (qualityCategory != qualityCategory2) { return(false); } } if (a.def.category == ThingCategory.Item) { result = a.CanStackWith(b); } else if (a.def.category == ThingCategory.Building) { result = true; } else { Log.Error(string.Concat(new object[] { "Unknown TransferAsOne pair: ", a, ", ", b }), false); result = false; } } } } } return(result); }
public static T TransferableMatching <T>(Thing thing, List <T> transferables, TransferAsOneMode mode) where T : Transferable { T result; if (thing == null || transferables == null) { result = (T)((object)null); } else { for (int i = 0; i < transferables.Count; i++) { T result2 = transferables[i]; if (result2.HasAnyThing) { if (TransferableUtility.TransferAsOne(thing, result2.AnyThing, mode)) { return(result2); } } } result = (T)((object)null); } return(result); }