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));
        }
Exemplo n.º 3
0
 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);
     }
 }
Exemplo n.º 5
0
 public List <CompTransporter> TransportersInGroup(Map map)
 {
     if (!LoadingInProgressOrReadyToLaunch)
     {
         return(null);
     }
     TransporterUtility.GetTransportersInGroup(groupID, map, tmpTransportersInGroup);
     return(tmpTransportersInGroup);
 }
Exemplo n.º 6
0
 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);
                });
            }
        }
Exemplo n.º 10
0
 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);
     }
 }
Exemplo n.º 11
0
        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);
        }
Exemplo n.º 12
0
        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);
                    }
                }
            }));
        }
Exemplo n.º 13
0
        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);
                }
            }
        }
Exemplo n.º 14
0
        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;
            }
        }
Exemplo n.º 17
0
 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();
     }
 }
Exemplo n.º 18
0
        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();
            }
        }
Exemplo n.º 19
0
 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);
             }));
         }
     }
 }
Exemplo n.º 20
0
        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);
        }
Exemplo n.º 21
0
 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();
 }
Exemplo n.º 22
0
        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);
            }
        }
Exemplo n.º 23
0
        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();
                }
            });
        }
Exemplo n.º 24
0
        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);
            }
        }