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);
        }
Esempio n. 2
0
        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);
                    }
                }
            }
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
 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);
 }
Esempio n. 5
0
 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);
        }