private static int TransferableCountHauledByOthers(Pawn pawn, TransferableOneWay transferable, Lord lord)
        {
            if (!transferable.HasAnyThing)
            {
                Log.Warning("Can't determine transferable count hauled by others because transferable has 0 things.", false);
                return(0);
            }
            List <Pawn> allPawnsSpawned = lord.Map.mapPawns.AllPawnsSpawned;
            int         num             = 0;

            for (int i = 0; i < allPawnsSpawned.Count; i++)
            {
                Pawn pawn2 = allPawnsSpawned[i];
                if (pawn2 != pawn)
                {
                    if (pawn2.CurJob != null && pawn2.CurJob.def == JobDefOf_Ships.PrepareCaravan_GatheringShip && pawn2.CurJob.lord == lord)
                    {
                        Thing toHaul = ((JobDriver_PrepareCaravan_GatheringShip)pawn2.jobs.curDriver).ToHaul;
                        if (transferable.things.Contains(toHaul) || TransferableUtility.TransferAsOne(transferable.AnyThing, toHaul, TransferAsOneMode.PodsOrCaravanPacking))
                        {
                            num += toHaul.stackCount;
                        }
                    }
                }
            }
            return(num);
        }
Exemple #2
0
        private static int TransferableCountHauledByOthers(Pawn pawn, TransferableOneWay transferable, CompTransporter transporter)
        {
            if (!transferable.HasAnyThing)
            {
                Log.Warning("BillyCaravan: Can't determine transferable count hauled by others because transferable has 0 things.");
                return(0);
            }
            if (transporter == null)
            {
                Log.Warning("BillyCaravan: transporter is null in count hauled by others.");
                return(0);
            }
            List <Pawn> allPawnsSpawned = transporter.Map.mapPawns.AllPawnsSpawned;
            int         num             = 0;

            for (int i = 0; i < allPawnsSpawned.Count; i++)
            {
                Pawn pawn2 = allPawnsSpawned[i];
                if (pawn2 != pawn)
                {
                    if (pawn2.CurJob != null && pawn2.CurJob.def == BillyJobDefOf.BillyTransportHaulToTransporter && pawn2.CurJob.targetB.Thing == transporter.parent)
                    {
                        Thing toHaul = pawn2.CurJob.targetA.Thing;
                        if (transferable.things.Contains(toHaul) || TransferableUtility.TransferAsOne(transferable.AnyThing, toHaul))
                        {
                            num += toHaul.stackCount;
                        }
                    }
                }
            }
            return(num);
        }
Exemple #3
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);
                    }
                }
            }
        }
        private static int TransferableCountHauledByOthersForPacking(VehiclePawn vehicle, Pawn pawn, TransferableOneWay transferable)
        {
            List <Pawn> allPawnsSpawned = vehicle.Map.mapPawns.FreeColonistsAndPrisonersSpawned;
            int         num             = 0;

            for (int i = 0; i < allPawnsSpawned.Count; i++)
            {
                Pawn pawn2 = allPawnsSpawned[i];
                if (pawn2 != pawn && pawn2.CurJob != null && pawn2.CurJob.def == JobDefOf_Vehicles.CarryItemToVehicle)
                {
                    if (pawn2.jobs.curDriver is JobDriver_GiveToVehicle driver)
                    {
                        Thing toHaul = driver.Item;
                        if (toHaul != null && transferable.things.Contains(toHaul) || TransferableUtility.TransferAsOne(transferable.AnyThing, toHaul, TransferAsOneMode.PodsOrCaravanPacking))
                        {
                            num += toHaul.stackCount;
                        }
                    }
                }
            }
            return(num);
        }
Exemple #5
0
        public bool MatchesThing(Thing thing)
        {
            //быстрая проверка
            if (thing == null)
            {
                //Log.Message(" ? thing == null");
                return(false);
            }
            if (DefName != thing.def.defName)
            {
                //Log.Message(" ? DefName != thing.def.defName" + (DefName ?? "null") + " " + (thing.def.defName ?? "null"));
                return(false);
            }

            var testThing = CreateTrade(thing, 1);

            //общая проверка
            if (testThing.StuffName != StuffName
                )
            {
                //Log.Message(" ? testThing.StuffName != StuffName " + (StuffName ?? "null") + " " + (testThing.StuffName ?? "null"));
                return(false);
            }
            if (testThing.Quality < Quality
                )
            {
                //Log.Message(" ? testThing.Quality < Quality " + Quality + " " + testThing.Quality);
                return(false);
            }
            if (testThing.WornByCorpse && !WornByCorpse
                )
            {
                //Log.Message(" ? testThing.WornByCorpse && !WornByCorpse " + WornByCorpse + " " + testThing.WornByCorpse);
                return(false);
            }

            //в зависимости от Concrete
            int hitPrecent = (testThing.HitPoints + 1) * 100 / testThing.MaxHitPoints;

            if (Concrete)
            {
                if (hitPrecent < HitPoints * 100 / MaxHitPoints)
                {
                    //Log.Message(" ? hitPrecent < HitPoints * 100 / MaxHitPoints");
                    return(false);
                }
            }
            else
            if (hitPrecent < HitPoints)
            {
                //Log.Message(" ? hitPrecent < HitPoints");
                return(false);
            }

            //Проверка схожести средствами игры, для надёжности и идентификации индивидуальности пешек
            if (Concrete)
            {
                //Log.Message(DataThing.def.defName + " ? " + thing.def.defName + " " + TransferableUtility.TransferAsOne(thing, DataThing).ToString());
                return(TransferableUtility.TransferAsOne(thing, DataThing, TransferAsOneMode.Normal));
            }
            else
            {
                return(true);
            }
        }
Exemple #6
0
        public static Thing FindThingToLoad(Pawn p, CompTransporter transporter)
        {
            neededThings.Clear();
            neededThingDefs.Clear();
            List <TransferableOneWay> transferables = transporter.leftToLoad;

            if (transferables != null)
            {
                for (int i = 0; i < transferables.Count; i++)
                {
                    TransferableOneWay transferableOneWay = transferables[i];
                    if (CountLeftToTransfer(p, transferableOneWay, transporter) > 0)
                    {
                        for (int j = 0; j < transferableOneWay.things.Count; j++)
                        {
                            Thing t = transferableOneWay.things[j];
                            neededThings.Add(t);
                            if (t.def.category == ThingCategory.Item)
                            {
                                neededThingDefs.Add(t.def);
                            }
                        }
                    }
                }
            }
            if (!neededThings.Any <Thing>())
            {
                return(null);
            }
            Predicate <Thing> validator = (Thing x) => neededThings.Contains(x) && p.CanReserve(x, 1, -1, null, false);
            Thing             thing     = FindClosestReachable(p, validator);

            if (thing == null)
            {
                foreach (Thing current in neededThings)
                {
                    Pawn pawn = current as Pawn;
                    if (pawn != null && (!pawn.IsColonist || pawn.Downed) && p.CanReserveAndReach(pawn, PathEndMode.Touch, Danger.Deadly, 1, -1, null, false))
                    {
                        return(pawn);
                    }
                }
            }
            if (neededThingDefs.Any <ThingDef>())
            {
                if (thing == null)
                {
                    Predicate <Thing> validator2 = (Thing x) => neededThings.Contains(x);
                    if (FindClosestReachable(p, validator2) != null)
                    {
                        return(null);                                             // there is something left to haul, but someone else has reserved it
                    }
                }
                if (thing == null)
                {
                    // some things are missing or unreachable. We'll see if we can find some suitable substitute
                    Predicate <Thing> validator3 = (Thing x) =>
                    {
                        if (x is Pawn || x.def.category != ThingCategory.Item || !neededThingDefs.Contains(x.def) || !p.CanReserve(x, 1, -1, null, false))
                        {
                            return(false);
                        }
                        foreach (Thing t in neededThings)
                        {
                            if (TransferableUtility.TransferAsOne(t, x))
                            {
                                return(true);
                            }
                        }
                        return(false);
                    };
                    thing = FindClosestReachable(p, validator3);
                }
            }
            neededThings.Clear();
            neededThingDefs.Clear();
            return(thing);
        }