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); }
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); }
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); }
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); } }
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); }