private void AddItemsToTransferables() { foreach (Thing item in TransporterUtility.AllSendableItems(transporters, map)) { AddToTransferables(item); } }
protected override Job TryGiveJob(Pawn pawn) { int transportersGroup = pawn.mindState.duty.transportersGroup; List <Pawn> allPawnsSpawned = pawn.Map.mapPawns.AllPawnsSpawned; for (int i = 0; i < allPawnsSpawned.Count; i++) { if (allPawnsSpawned[i] != pawn && allPawnsSpawned[i].CurJobDef == JobDefOf.HaulToTransporter) { CompTransporter transporter = ((JobDriver_HaulToTransporter)allPawnsSpawned[i].jobs.curDriver).Transporter; if (transporter != null && transporter.groupID == transportersGroup) { return(null); } } } TransporterUtility.GetTransportersInGroup(transportersGroup, pawn.Map, tmpTransporters); CompTransporter compTransporter = FindMyTransporter(tmpTransporters, pawn); tmpTransporters.Clear(); if (compTransporter == null || !pawn.CanReach(compTransporter.parent, PathEndMode.Touch, Danger.Deadly)) { return(null); } return(JobMaker.MakeJob(JobDefOf.EnterTransporter, compTransporter.parent)); }
private void InitializeLoading() { if (!shuttle.TryGetComp <CompTransporter>().LoadingInProgressOrReadyToLaunch) { TransporterUtility.InitiateLoading(Gen.YieldSingle(shuttle.TryGetComp <CompTransporter>())); } }
private void AddPawnsToTransferables() { foreach (Pawn item in TransporterUtility.AllSendablePawns(transporters, map)) { AddToTransferables(item); } }
public List <CompTransporter> TransportersInGroup(Map map) { if (!LoadingInProgressOrReadyToLaunch) { return(null); } TransporterUtility.GetTransportersInGroup(groupID, map, tmpTransportersInGroup); return(tmpTransportersInGroup); }
public void TryRemoveLord(Map map) { if (LoadingInProgressOrReadyToLaunch) { Lord lord = TransporterUtility.FindLord(groupID, map); if (lord != null) { map.lordManager.RemoveLord(lord); } } }
protected override Job TryGiveJob(Pawn pawn) { TransporterUtility.GetTransportersInGroup(pawn.mindState.duty.transportersGroup, pawn.Map, tmpTransporters); for (int i = 0; i < tmpTransporters.Count; i++) { CompTransporter transporter = tmpTransporters[i]; if (LoadTransportersJobUtility.HasJobOnTransporter(pawn, transporter)) { return(LoadTransportersJobUtility.JobOnTransporter(pawn, transporter)); } } return(null); }
protected override Job TryGiveJob(Pawn pawn) { int transportersGroup = pawn.mindState.duty.transportersGroup; TransporterUtility.GetTransportersInGroup(transportersGroup, pawn.Map, JobGiver_EnterTransporter.tmpTransporters); CompTransporter compTransporter = this.FindMyTransporter(JobGiver_EnterTransporter.tmpTransporters, pawn); if (compTransporter != null && pawn.CanReserveAndReach(compTransporter.parent, PathEndMode.Touch, Danger.Deadly, 1, -1, null, false)) { return(new Job(JobDefOf.EnterTransporter, compTransporter.parent)); } return(null); }
private void LoadInstantly() { TransporterUtility.InitiateLoading(transporters); int i; for (i = 0; i < transferables.Count; i++) { TransferableUtility.Transfer(transferables[i].things, transferables[i].CountToTransfer, delegate(Thing splitPiece, IThingHolder originalThing) { transporters[i % transporters.Count].GetDirectlyHeldThings().TryAdd(splitPiece); }); } }
public override IEnumerable <Gizmo> CompGetGizmosExtra() { foreach (Gizmo item in base.CompGetGizmosExtra()) { yield return(item); } if (ShowLoadingGizmos) { if (Autoloadable) { Command_Toggle command_Toggle = new Command_Toggle(); command_Toggle.defaultLabel = "CommandAutoloadTransporters".Translate(); command_Toggle.defaultDesc = "CommandAutoloadTransportersDesc".Translate(); command_Toggle.icon = AutoloadToggleTex; command_Toggle.isActive = () => autoload; command_Toggle.toggleAction = delegate { autoload = !autoload; if (autoload && !LoadingInProgressOrReadyToLaunch) { TransporterUtility.InitiateLoading(Gen.YieldSingle(Transporter)); } CheckAutoload(); }; yield return(command_Toggle); } if (!IsMissionShuttle) { Command_Action command_Action = new Command_Action(); command_Action.defaultLabel = "CommandSendShuttle".Translate(); command_Action.defaultDesc = "CommandSendShuttleDesc".Translate(); command_Action.icon = SendCommandTex; command_Action.alsoClickIfOtherInGroupClicked = false; command_Action.action = delegate { Send(); }; if (!LoadingInProgressOrReadyToLaunch || !AllRequiredThingsLoaded) { command_Action.Disable("CommandSendShuttleFailMissingRequiredThing".Translate()); } yield return(command_Action); } } foreach (Gizmo questRelatedGizmo in QuestUtility.GetQuestRelatedGizmos(parent)) { yield return(questRelatedGizmo); } }
public List <CompTransporter> TransportersInGroup(Map map) { List <CompTransporter> result; if (!this.LoadingInProgressOrReadyToLaunch) { result = null; } else { TransporterUtility.GetTransportersInGroup(this.groupID, map, CompTransporter.tmpTransportersInGroup); result = CompTransporter.tmpTransportersInGroup; } return(result); }
public override IEnumerable <FloatMenuOption> CompMultiSelectFloatMenuOptions(List <Pawn> selPawns) { tmpAllowedPawns.Clear(); string text = "EnterShuttle".Translate(); for (int i = 0; i < selPawns.Count; i++) { if (selPawns[i].CanReach(parent, PathEndMode.Touch, Danger.Deadly)) { tmpAllowedPawns.Add(selPawns[i]); } } if (!tmpAllowedPawns.Any()) { yield return(new FloatMenuOption(text + " (" + "NoPath".Translate() + ")", null)); yield break; } for (int num = tmpAllowedPawns.Count - 1; num >= 0; num--) { if (!IsAllowedNow(tmpAllowedPawns[num])) { tmpAllowedPawns.RemoveAt(num); } } if (!tmpAllowedPawns.Any()) { yield return(new FloatMenuOption(text + " (" + "NotAllowed".Translate() + ")", null)); yield break; } yield return(new FloatMenuOption(text, delegate { if (!LoadingInProgressOrReadyToLaunch) { TransporterUtility.InitiateLoading(Gen.YieldSingle(Transporter)); } for (int j = 0; j < tmpAllowedPawns.Count; j++) { Pawn pawn = tmpAllowedPawns[j]; if (pawn.CanReach(parent, PathEndMode.Touch, Danger.Deadly) && !pawn.Downed && !pawn.Dead && pawn.Spawned) { Job job = JobMaker.MakeJob(JobDefOf.EnterTransporter, parent); tmpAllowedPawns[j].jobs.TryTakeOrderedJob(job); } } })); }
protected override void LeaveMap() { if (this.alreadyLeft) { base.LeaveMap(); return; } if (this.groupID < 0) { Log.Error("Drop pod left the map, but its group ID is " + this.groupID); this.Destroy(DestroyMode.Vanish); return; } if (this.destinationTile < 0) { Log.Error("Drop pod left the map, but its destination tile is " + this.destinationTile); this.Destroy(DestroyMode.Vanish); return; } Lord lord = TransporterUtility.FindLord(this.groupID, base.Map); if (lord != null) { base.Map.lordManager.RemoveLord(lord); } TravelingTransportPods travelingTransportPods = (TravelingTransportPods)WorldObjectMaker.MakeWorldObject(WorldObjectDefOf.TravelingTransportPods); travelingTransportPods.Tile = base.Map.Tile; travelingTransportPods.SetFaction(Faction.OfPlayer); travelingTransportPods.destinationTile = this.destinationTile; travelingTransportPods.destinationCell = this.destinationCell; travelingTransportPods.arriveMode = this.arriveMode; travelingTransportPods.attackOnArrival = this.attackOnArrival; Find.WorldObjects.Add(travelingTransportPods); DropPodLeaving.tmpActiveDropPods.Clear(); DropPodLeaving.tmpActiveDropPods.AddRange(base.Map.listerThings.ThingsInGroup(ThingRequestGroup.ActiveDropPod)); for (int i = 0; i < DropPodLeaving.tmpActiveDropPods.Count; i++) { DropPodLeaving dropPodLeaving = DropPodLeaving.tmpActiveDropPods[i] as DropPodLeaving; if (dropPodLeaving != null && dropPodLeaving.groupID == this.groupID) { dropPodLeaving.alreadyLeft = true; travelingTransportPods.AddPod(dropPodLeaving.Contents, true); dropPodLeaving.Contents = null; dropPodLeaving.Destroy(DestroyMode.Vanish); } } }
protected override void LeaveMap() { if (alreadyLeft || !createWorldObject) { base.LeaveMap(); return; } if (groupID < 0) { Log.Error("Drop pod left the map, but its group ID is " + groupID); Destroy(); return; } if (destinationTile < 0) { Log.Error("Drop pod left the map, but its destination tile is " + destinationTile); Destroy(); return; } Lord lord = TransporterUtility.FindLord(groupID, base.Map); if (lord != null) { base.Map.lordManager.RemoveLord(lord); } TravelingTransportPods travelingTransportPods = (TravelingTransportPods)WorldObjectMaker.MakeWorldObject(worldObjectDef ?? WorldObjectDefOf.TravelingTransportPods); travelingTransportPods.Tile = base.Map.Tile; travelingTransportPods.SetFaction(Faction.OfPlayer); travelingTransportPods.destinationTile = destinationTile; travelingTransportPods.arrivalAction = arrivalAction; Find.WorldObjects.Add(travelingTransportPods); tmpActiveDropPods.Clear(); tmpActiveDropPods.AddRange(base.Map.listerThings.ThingsInGroup(ThingRequestGroup.ActiveDropPod)); for (int i = 0; i < tmpActiveDropPods.Count; i++) { DropPodLeaving dropPodLeaving = tmpActiveDropPods[i] as DropPodLeaving; if (dropPodLeaving != null && dropPodLeaving.groupID == groupID) { dropPodLeaving.alreadyLeft = true; travelingTransportPods.AddPod(dropPodLeaving.Contents, justLeftTheMap: true); dropPodLeaving.Contents = null; dropPodLeaving.Destroy(); } } }
protected override Job TryGiveJob(Pawn pawn) { int transportersGroup = pawn.mindState.duty.transportersGroup; TransporterUtility.GetTransportersInGroup(transportersGroup, pawn.Map, JobGiver_EnterTransporter.tmpTransporters); CompTransporter compTransporter = this.FindMyTransporter(JobGiver_EnterTransporter.tmpTransporters, pawn); Job result; if (compTransporter == null || !pawn.CanReach(compTransporter.parent, PathEndMode.Touch, Danger.Deadly, false, TraverseMode.ByPawn)) { result = null; } else { result = new Job(JobDefOf.EnterTransporter, compTransporter.parent); } return(result); }
public static void SendAway(Thing shuttle, bool dropEverything) { CompShuttle compShuttle = shuttle.TryGetComp <CompShuttle>(); CompTransporter compTransporter = shuttle.TryGetComp <CompTransporter>(); if (shuttle.Spawned) { if (dropEverything && compTransporter.LoadingInProgressOrReadyToLaunch) { compTransporter.CancelLoad(); } if (!compTransporter.LoadingInProgressOrReadyToLaunch) { TransporterUtility.InitiateLoading(Gen.YieldSingle(compTransporter)); } compShuttle.Send(); } else if (shuttle.ParentHolder is Thing && ((Thing)shuttle.ParentHolder).def == ThingDefOf.ShuttleIncoming) { compShuttle.leaveASAP = true; } }
public override void CompTick() { base.CompTick(); if (parent.IsHashIntervalTick(120)) { CheckAutoload(); } if (parent.Spawned && dropEverythingOnArrival && parent.IsHashIntervalTick(60)) { if (Transporter.innerContainer.Any()) { Thing thing = Transporter.innerContainer[0]; IntVec3 dropLoc = parent.Position + IntVec3.South; Pawn pawn; if (Transporter.innerContainer.TryDrop_NewTmp(thing, dropLoc, parent.Map, ThingPlaceMode.Near, out Thing _, null, (IntVec3 c) => ((pawn = (Transporter.innerContainer[0] as Pawn)) == null || !pawn.Downed || c.GetFirstPawn(parent.Map) == null) ? true : false, playDropSound: false)) { Transporter.Notify_ThingRemoved(thing); } } else { TransporterUtility.InitiateLoading(Gen.YieldSingle(Transporter)); Send(); } } if (leaveASAP && parent.Spawned) { if (!LoadingInProgressOrReadyToLaunch) { TransporterUtility.InitiateLoading(Gen.YieldSingle(Transporter)); } Send(); } if (leaveImmediatelyWhenSatisfied && AllRequiredThingsLoaded) { Send(); } }
public override void CompTick() { base.CompTick(); if (parent.IsHashIntervalTick(120)) { CheckAutoload(); } if (parent.Spawned && (dropEverythingOnArrival || (sendAwayIfQuestFinished != null && sendAwayIfQuestFinished.Historical)) && parent.IsHashIntervalTick(60)) { OffloadShuttleOrSend(); } if (leaveASAP && parent.Spawned) { if (!LoadingInProgressOrReadyToLaunch) { TransporterUtility.InitiateLoading(Gen.YieldSingle(Transporter)); } Send(); } if (leaveAfterTicks > 0 && parent.Spawned && !IsMissionShuttle) { leaveAfterTicks--; if (leaveAfterTicks == 0) { if (!LoadingInProgressOrReadyToLaunch) { TransporterUtility.InitiateLoading(Gen.YieldSingle(Transporter)); } Send(); } } Pawn pawn; if (!IsMissionShuttle && !dropEverythingOnArrival && ((leaveImmediatelyWhenSatisfied && AllRequiredThingsLoaded) || (!sendAwayIfAllDespawned.NullOrEmpty() && sendAwayIfAllDespawned.All((Thing p) => !p.Spawned && ((pawn = p as Pawn) == null || pawn.CarriedBy == null))) || (sendAwayIfAllPawnsLeftToLoadAreNotOfFaction != null && requiredPawns.All((Pawn p) => Transporter.innerContainer.Contains(p) || p.Faction != sendAwayIfAllPawnsLeftToLoadAreNotOfFaction)))) { Send(); } }
public override IEnumerable <FloatMenuOption> CompFloatMenuOptions(Pawn selPawn) { if (selPawn.CanReach(parent, PathEndMode.Touch, Danger.Deadly)) { string text = "EnterShuttle".Translate(); if (!IsAllowed(selPawn)) { yield return(new FloatMenuOption(text + " (" + "NotAllowed".Translate() + ")", null)); } else { yield return(new FloatMenuOption(text, delegate { if (!LoadingInProgressOrReadyToLaunch) { TransporterUtility.InitiateLoading(Gen.YieldSingle(Transporter)); } Job job = JobMaker.MakeJob(JobDefOf.EnterTransporter, parent); selPawn.jobs.TryTakeOrderedJob(job); })); } } }
private bool TryAccept() { List <Pawn> pawnsFromTransferables = TransferableUtility.GetPawnsFromTransferables(transferables); if (!CheckForErrors(pawnsFromTransferables)) { return(false); } if (LoadingInProgressOrReadyToLaunch) { AssignTransferablesToRandomTransporters(); TransporterUtility.MakeLordsAsAppropriate(pawnsFromTransferables, transporters, map); List <Pawn> allPawnsSpawned = map.mapPawns.AllPawnsSpawned; for (int i = 0; i < allPawnsSpawned.Count; i++) { if (allPawnsSpawned[i].CurJobDef == JobDefOf.HaulToTransporter && transporters.Contains(((JobDriver_HaulToTransporter)allPawnsSpawned[i].jobs.curDriver).Transporter)) { allPawnsSpawned[i].jobs.EndCurrentJob(JobCondition.InterruptForced); } } } else { TransporterUtility.InitiateLoading(transporters); AssignTransferablesToRandomTransporters(); TransporterUtility.MakeLordsAsAppropriate(pawnsFromTransferables, transporters, map); if (transporters[0].Props.max1PerGroup) { Messages.Message("MessageTransporterSingleLoadingProcessStarted".Translate(), transporters[0].parent, MessageTypeDefOf.TaskCompletion, historical: false); } else { Messages.Message("MessageTransportersLoadingProcessStarted".Translate(), transporters[0].parent, MessageTypeDefOf.TaskCompletion, historical: false); } } return(true); }
private void CalculateAndRecacheTransferables() { transferables = new List <TransferableOneWay>(); AddPawnsToTransferables(); AddItemsToTransferables(); if (CanChangeAssignedThingsAfterStarting && LoadingInProgressOrReadyToLaunch) { for (int i = 0; i < transporters.Count; i++) { for (int j = 0; j < transporters[i].innerContainer.Count; j++) { AddToTransferables(transporters[i].innerContainer[j]); } } foreach (Thing item in TransporterUtility.ThingsBeingHauledTo(transporters, map)) { AddToTransferables(item); } } pawnsTransfer = new TransferableOneWayWidget(null, null, null, "FormCaravanColonyThingCountTip".Translate(), drawMass: true, IgnorePawnsInventoryMode.IgnoreIfAssignedToUnload, includePawnsMassInMassUsage: true, () => MassCapacity - MassUsage, 0f, ignoreSpawnedCorpseGearAndInventoryMass: false, map.Tile, drawMarketValue: true, drawEquippedWeapon: true, drawNutritionEatenPerDay: true, drawItemNutrition: false, drawForagedFoodPerDay: true); CaravanUIUtility.AddPawnsSections(pawnsTransfer, transferables); itemsTransfer = new TransferableOneWayWidget(transferables.Where((TransferableOneWay x) => x.ThingDef.category != ThingCategory.Pawn), null, null, "FormCaravanColonyThingCountTip".Translate(), drawMass: true, IgnorePawnsInventoryMode.IgnoreIfAssignedToUnload, includePawnsMassInMassUsage: true, () => MassCapacity - MassUsage, 0f, ignoreSpawnedCorpseGearAndInventoryMass: false, map.Tile, drawMarketValue: true, drawEquippedWeapon: false, drawNutritionEatenPerDay: false, drawItemNutrition: true, drawForagedFoodPerDay: false, drawDaysUntilRot: true); CountToTransferChanged(); }
private void CheckAutoload() { if (!autoload || !LoadingInProgressOrReadyToLaunch || !parent.Spawned) { return; } tmpRequiredItems.Clear(); tmpRequiredItems.AddRange(requiredItems); tmpRequiredPawns.Clear(); tmpRequiredPawns.AddRange(requiredPawns); ThingOwner innerContainer = Transporter.innerContainer; for (int i = 0; i < innerContainer.Count; i++) { Pawn pawn = innerContainer[i] as Pawn; if (pawn != null) { tmpRequiredPawns.Remove(pawn); continue; } int num = innerContainer[i].stackCount; for (int j = 0; j < tmpRequiredItems.Count; j++) { if (tmpRequiredItems[j].ThingDef == innerContainer[i].def) { int num2 = Mathf.Min(tmpRequiredItems[j].Count, num); if (num2 > 0) { tmpRequiredItems[j] = tmpRequiredItems[j].WithCount(tmpRequiredItems[j].Count - num2); num -= num2; } } } } for (int num3 = tmpRequiredItems.Count - 1; num3 >= 0; num3--) { if (tmpRequiredItems[num3].Count <= 0) { tmpRequiredItems.RemoveAt(num3); } } if (tmpRequiredItems.Any() || tmpRequiredPawns.Any()) { if (Transporter.leftToLoad != null) { Transporter.leftToLoad.Clear(); } tmpAllSendablePawns.Clear(); tmpAllSendablePawns.AddRange(TransporterUtility.AllSendablePawns(TransportersInGroup, parent.Map)); tmpAllSendableItems.Clear(); tmpAllSendableItems.AddRange(TransporterUtility.AllSendableItems(TransportersInGroup, parent.Map)); tmpAllSendableItems.AddRange(TransporterUtility.ThingsBeingHauledTo(TransportersInGroup, parent.Map)); tmpRequiredPawnsPossibleToSend.Clear(); for (int k = 0; k < tmpRequiredPawns.Count; k++) { if (tmpAllSendablePawns.Contains(tmpRequiredPawns[k])) { TransferableOneWay transferableOneWay = new TransferableOneWay(); transferableOneWay.things.Add(tmpRequiredPawns[k]); Transporter.AddToTheToLoadList(transferableOneWay, 1); tmpRequiredPawnsPossibleToSend.Add(tmpRequiredPawns[k]); } } for (int l = 0; l < tmpRequiredItems.Count; l++) { if (tmpRequiredItems[l].Count <= 0) { continue; } int num4 = 0; for (int m = 0; m < tmpAllSendableItems.Count; m++) { if (tmpAllSendableItems[m].def == tmpRequiredItems[l].ThingDef) { num4 += tmpAllSendableItems[m].stackCount; } } if (num4 <= 0) { continue; } TransferableOneWay transferableOneWay2 = new TransferableOneWay(); for (int n = 0; n < tmpAllSendableItems.Count; n++) { if (tmpAllSendableItems[n].def == tmpRequiredItems[l].ThingDef) { transferableOneWay2.things.Add(tmpAllSendableItems[n]); } } int count = Mathf.Min(tmpRequiredItems[l].Count, num4); Transporter.AddToTheToLoadList(transferableOneWay2, count); } TransporterUtility.MakeLordsAsAppropriate(tmpRequiredPawnsPossibleToSend, TransportersInGroup, parent.Map); tmpAllSendablePawns.Clear(); tmpAllSendableItems.Clear(); tmpRequiredItems.Clear(); tmpRequiredPawns.Clear(); tmpRequiredPawnsPossibleToSend.Clear(); } else { if (Transporter.leftToLoad != null) { Transporter.leftToLoad.Clear(); } TransporterUtility.MakeLordsAsAppropriate(tmpRequiredPawnsPossibleToSend, TransportersInGroup, parent.Map); } }
public override IEnumerable <Gizmo> CompGetGizmosExtra() { foreach (Gizmo item in base.CompGetGizmosExtra()) { yield return(item); } CompShuttle shuttleComp = parent.TryGetComp <CompShuttle>(); if (LoadingInProgressOrReadyToLaunch && CanTryLaunch) { Command_Action command_Action = new Command_Action(); command_Action.defaultLabel = "CommandLaunchGroup".Translate(); command_Action.defaultDesc = "CommandLaunchGroupDesc".Translate(); command_Action.icon = LaunchCommandTex; command_Action.alsoClickIfOtherInGroupClicked = false; if (shuttleComp != null && shuttleComp.IsMissionShuttle && !shuttleComp.AllRequiredThingsLoaded) { command_Action.Disable("ShuttleRequiredItemsNotSatisfied".Translate()); } command_Action.action = delegate { if (AnyInGroupHasAnythingLeftToLoad) { Find.WindowStack.Add(Dialog_MessageBox.CreateConfirmation("ConfirmSendNotCompletelyLoadedPods".Translate(FirstThingLeftToLoadInGroup.LabelCapNoCount, FirstThingLeftToLoadInGroup), StartChoosingDestination)); } else if (shuttleComp != null && shuttleComp.IsMissionShuttle) { TransportPodsArrivalAction_Shuttle arrivalAction = new TransportPodsArrivalAction_Shuttle((MapParent)shuttleComp.missionShuttleTarget) { missionShuttleHome = shuttleComp.missionShuttleHome, missionShuttleTarget = shuttleComp.missionShuttleTarget, sendAwayIfQuestFinished = shuttleComp.sendAwayIfQuestFinished, questTags = parent.questTags }; TryLaunch((parent.Tile == shuttleComp.missionShuttleTarget.Tile) ? shuttleComp.missionShuttleHome.Tile : shuttleComp.missionShuttleTarget.Tile, arrivalAction); } else { StartChoosingDestination(); } }; if (!AllInGroupConnectedToFuelingPort) { command_Action.Disable("CommandLaunchGroupFailNotConnectedToFuelingPort".Translate()); } else if (!AllFuelingPortSourcesInGroupHaveAnyFuel) { command_Action.Disable("CommandLaunchGroupFailNoFuel".Translate()); } else if (AnyInGroupIsUnderRoof) { command_Action.Disable("CommandLaunchGroupFailUnderRoof".Translate()); } yield return(command_Action); } if (shuttleComp == null || !shuttleComp.permitShuttle) { yield break; } yield return(new Command_Action { defaultLabel = "CommandShuttleDismiss".Translate(), defaultDesc = "CommandShuttleDismissDesc".Translate(), icon = DismissTex, alsoClickIfOtherInGroupClicked = false, action = delegate { Transporter.innerContainer.TryDropAll(parent.Position, parent.Map, ThingPlaceMode.Near); if (!LoadingInProgressOrReadyToLaunch) { TransporterUtility.InitiateLoading(Gen.YieldSingle(Transporter)); } shuttleComp.Send(); } }); }
private void OffloadShuttleOrSend() { Thing thingToDrop = null; float num = 0f; for (int i = 0; i < Transporter.innerContainer.Count; i++) { Thing thing = Transporter.innerContainer[i]; float num2 = GetDropPriority(thing); if (num2 > num) { thingToDrop = thing; num = num2; } } if (thingToDrop != null) { IntVec3 dropLoc = parent.Position + DropoffSpotOffset; if (!Transporter.innerContainer.TryDrop_NewTmp(thingToDrop, dropLoc, parent.Map, ThingPlaceMode.Near, out var _, null, delegate(IntVec3 c) { if (c.Fogged(parent.Map)) { return(false); } Pawn pawn2; return(((pawn2 = thingToDrop as Pawn) == null || !pawn2.Downed || c.GetFirstPawn(parent.Map) == null) ? true : false); }, playDropSound: false)) { return; } Transporter.Notify_ThingRemoved(thingToDrop); droppedOnArrival.Add(thingToDrop); Pawn pawn; if ((pawn = thingToDrop as Pawn) != null) { if (pawn.IsColonist && pawn.Spawned && !parent.Map.IsPlayerHome) { pawn.drafter.Drafted = true; } if (pawn.guest != null && pawn.guest.IsPrisoner) { pawn.guest.WaitInsteadOfEscapingForDefaultTicks(); } } } else { if (!Transporter.LoadingInProgressOrReadyToLaunch) { TransporterUtility.InitiateLoading(Gen.YieldSingle(Transporter)); } if (!stayAfterDroppedEverythingOnArrival || (sendAwayIfQuestFinished != null && sendAwayIfQuestFinished.Historical)) { Send(); } else { dropEverythingOnArrival = false; } } float GetDropPriority(Thing t) { if (droppedOnArrival.Contains(t)) { return(0f); } Pawn p; if ((p = t as Pawn) != null) { Lord lord = p.GetLord(); LordToil_EnterShuttleOrLeave lordToil_EnterShuttleOrLeave; if (lord?.CurLordToil != null && (lordToil_EnterShuttleOrLeave = lord.CurLordToil as LordToil_EnterShuttleOrLeave) != null && lordToil_EnterShuttleOrLeave.shuttle == parent) { return(0f); } LordToil_LoadAndEnterTransporters lordToil_LoadAndEnterTransporters; if (lord?.CurLordToil != null && (lordToil_LoadAndEnterTransporters = lord.CurLordToil as LordToil_LoadAndEnterTransporters) != null && lordToil_LoadAndEnterTransporters.transportersGroup == parent.TryGetComp <CompTransporter>().groupID) { return(0f); } if (!p.AnimalOrWildMan()) { return(1f); } return(0.5f); } return(0.25f); } }