public void CreatePodGroup()
 {
     if (pawnList != null && pawnList.Count > 0)
     {
         for (int i = 0; i < pawnList.Count; i++)
         {
             Pawn p     = pawnList[i];
             Pawn mount = null;
             if (ModCheck.Validate.GiddyUp.Core_IsInitialized())
             {
                 mount = ModCheck.GiddyUp.GetMount(p);
                 ModCheck.GiddyUp.ForceDismount(p);
             }
             Thing           pod  = ThingMaker.MakeThing(TorannMagicDefOf.TM_LightPod, null);
             CompLaunchable  podL = pod.TryGetComp <CompLaunchable>();
             CompTransporter podT = podL.Transporter;
             GenSpawn.Spawn(pod, p.Position, p.Map, WipeMode.Vanish);
             podT.groupID = 12;
             p.DeSpawn();
             if (mount != null)
             {
                 mount.DeSpawn();
                 podT.innerContainer.TryAddOrTransfer(mount);
             }
             podT.innerContainer.TryAddOrTransfer(p);
             podTList.Add(podT);
             pods.Add(pod);
         }
     }
 }
Example #2
0
 public static bool HasJobOnTransporter(Pawn pawn, CompTransporter transporter)
 {
     return(transporter != null &&
            !transporter.parent.IsForbidden(pawn) &&
            transporter.AnythingLeftToLoad &&
            pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation) &&
            pawn.CanReach(transporter.parent, PathEndMode.Touch, pawn.NormalMaxDanger(), false, TraverseMode.ByPawn) &&
            FindThingToLoad(pawn, transporter) != null);
 }
        protected void NotifyAddedAndMergedWith(Thing item, int mergedCount)
        {
            CompTransporter compTransporter = this.owner as CompTransporter;

            if (compTransporter != null)
            {
                compTransporter.Notify_ThingAddedAndMergedWith(item, mergedCount);
            }
        }
Example #4
0
        public static Job JobOnTransporter(Pawn p, CompTransporter transporter)
        {
            Thing thing           = FindThingToLoad(p, transporter);
            Job   job             = new Job(BillyJobDefOf.BillyTransportHaulToTransporter, thing, transporter.parent);
            int   countToTransfer = TransferableUtility.TransferableMatchingDesperate(thing, transporter.leftToLoad).CountToTransfer;

            job.count           = Mathf.Min(countToTransfer, thing.stackCount);
            job.ignoreForbidden = true;
            return(job);
        }
Example #5
0
        protected override void Impact(Thing hitThing)
        {
            ThingDef def = this.def;

            if (!this.initialized)
            {
                this.pawn = this.launcher as Pawn;
                this.map  = this.pawn.Map;
                CompAbilityUserMagic   comp        = pawn.GetComp <CompAbilityUserMagic>();
                MagicPowerSkill        pwr         = pawn.GetComp <CompAbilityUserMagic>().MagicData.MagicPowerSkill_LightSkip.FirstOrDefault((MagicPowerSkill x) => x.label == "TM_LightSkip_pwr");
                ModOptions.SettingsRef settingsRef = new ModOptions.SettingsRef();
                pwrVal         = pwr.level;
                this.arcaneDmg = comp.arcaneDmg;
                if (settingsRef.AIHardMode && !pawn.IsColonist)
                {
                    pwrVal = 1;
                    verVal = 1;
                }
                this.draftFlag   = this.pawn.drafter != null ? this.pawn.Drafted : false;
                this.initialized = true;
            }

            if (!launchedFlag)
            {
                Pawn pawnToSkip = this.pawn;
                Pawn mount      = null;
                ModOptions.Constants.SetPawnInFlight(true);
                if (ModCheck.Validate.GiddyUp.Core_IsInitialized())
                {
                    mount = ModCheck.GiddyUp.GetMount(this.pawn);
                    ModCheck.GiddyUp.ForceDismount(pawn);
                }
                Thing           pod  = ThingMaker.MakeThing(TorannMagicDefOf.TM_LightPod, null);
                CompLaunchable  podL = pod.TryGetComp <CompLaunchable>();
                CompTransporter podT = podL.Transporter;
                GenSpawn.Spawn(pod, pawnToSkip.Position, pawnToSkip.Map, WipeMode.Vanish);
                podT.groupID = 11;
                pawnToSkip.DeSpawn();
                if (mount != null)
                {
                    mount.DeSpawn();
                    podT.innerContainer.TryAddOrTransfer(mount);
                }
                podT.innerContainer.TryAddOrTransfer(pawnToSkip);
                GlobalTargetInfo gti = new GlobalTargetInfo(base.Position, base.Map, false);
                LaunchLightPod(pod, podT, gti.Tile, gti.Cell);
                launchedFlag = true;
            }

            if (launchedFlag)
            {
                this.age++;
                this.Destroy(DestroyMode.Vanish);
            }
        }
Example #6
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            int transportersGroup = pawn.mindState.duty.transportersGroup;

            TransporterUtility.GetTransportersInGroup(transportersGroup, pawn.Map, tmpTransporters);
            for (int i = 0; i < tmpTransporters.Count; i++)
            {
                CompTransporter transporter = tmpTransporters[i];
                if (BillyLoadTransporterUtility.HasJobOnTransporter(pawn, transporter))
                {
                    return(BillyLoadTransporterUtility.JobOnTransporter(pawn, transporter));
                }
            }
            return(null);
        }
Example #7
0
 public static void NoLaunchGroupForSRTS(ref IEnumerable<Gizmo> __result, CompTransporter __instance)
 {
   if (__instance.parent.def.GetCompProperties<CompProperties_LaunchableSRTS>() != null)
   {
     List<Gizmo> gizmos = __result.ToList();
     for (int i = gizmos.Count - 1; i >= 0; i--)
     {
       if ((gizmos[i] as Command_Action)?.defaultLabel == "CommandSelectPreviousTransporter".Translate() || (gizmos[i] as Command_Action)?.defaultLabel == "CommandSelectAllTransporters".Translate() ||
           (gizmos[i] as Command_Action)?.defaultLabel == "CommandSelectNextTransporter".Translate())
       {
         gizmos.Remove(gizmos[i]);
       }
     }
     __result = gizmos;
   }
 }
        private void TransferTransporterItems(Building_PocketDimensionEntranceBase otherSide)
        {
            CompTransporter transporter = this.GetComp <CompTransporter>();

            if (transporter != null)
            {
                Thing first = transporter.innerContainer.FirstOrFallback();

                if (first != null)
                {
                    GenSpawn.Spawn(first, otherSide.InteractionCell, otherSide.Map, WipeMode.Vanish);
                }
                else if (transporter.LoadingInProgressOrReadyToLaunch && !transporter.AnyInGroupHasAnythingLeftToLoad)
                {
                    transporter.CancelLoad();
                }
            }
        }
        public static Thing DropShuttle_NewTemp(List <ActiveDropPodInfo> pods, Map map, IntVec3 cell, Faction faction = null)
        {
            RemovePawnsFromWorldPawns(pods);
            Thing thing = QuestGen_Shuttle.GenerateShuttle(faction, null, null, acceptColonists: false, onlyAcceptColonists: false, onlyAcceptHealthy: false, 0, dropEverythingIfUnsatisfied: false, leaveImmediatelyWhenSatisfied: false, dropEverythingOnArrival: true);

            thing.TryGetComp <CompShuttle>().hideControls = true;
            CompTransporter compTransporter = thing.TryGetComp <CompTransporter>();

            for (int i = 0; i < pods.Count; i++)
            {
                compTransporter.innerContainer.TryAddRangeOrTransfer(pods[i].innerContainer);
            }
            if (!cell.IsValid)
            {
                cell = DropCellFinder.GetBestShuttleLandingSpot(map, Faction.OfPlayer, out var _);
            }
            GenPlace.TryPlaceThing(SkyfallerMaker.MakeSkyfaller(ThingDefOf.ShuttleIncoming, thing), cell, map, ThingPlaceMode.Near);
            return(thing);
        }
        public void LaunchLightPod(Thing pod, CompTransporter compTransporter, int destinationTile, IntVec3 destinationCell)
        {
            Map           map                = this.Map;
            int           groupID            = compTransporter.groupID;
            ThingOwner    directlyHeldThings = compTransporter.GetDirectlyHeldThings();
            ActiveDropPod activeDropPod      = (ActiveDropPod)ThingMaker.MakeThing(ThingDefOf.ActiveDropPod);

            activeDropPod.Contents = new ActiveDropPodInfo();
            activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer(directlyHeldThings, canMergeWithExistingStacks: true, destroyLeftover: true);
            WorldTransport.TM_DropPodLeaving obj = (WorldTransport.TM_DropPodLeaving)SkyfallerMaker.MakeSkyfaller(TorannMagicDefOf.TM_LightPodLeaving, activeDropPod);
            obj.groupID         = groupID;
            obj.destinationTile = destinationTile;
            obj.arrivalAction   = null;
            obj.arrivalCell     = destinationCell;
            obj.draftFlag       = this.draftFlag;
            compTransporter.CleanUpLoadingVars(map);
            compTransporter.parent.Destroy();
            GenSpawn.Spawn(obj, compTransporter.parent.Position, map);
        }
        protected void NotifyAdded(Thing item)
        {
            if (ThingOwnerUtility.ShouldAutoExtinguishInnerThings(this.owner) && item.HasAttachment(ThingDefOf.Fire))
            {
                item.GetAttachment(ThingDefOf.Fire).Destroy(DestroyMode.Vanish);
            }
            if (ThingOwnerUtility.ShouldRemoveDesignationsOnAddedThings(this.owner))
            {
                List <Map> maps = Find.Maps;
                for (int i = 0; i < maps.Count; i++)
                {
                    maps[i].designationManager.RemoveAllDesignationsOn(item, false);
                }
            }
            CompTransporter compTransporter = this.owner as CompTransporter;

            if (compTransporter != null)
            {
                compTransporter.Notify_ThingAdded(item);
            }
            Caravan caravan = this.owner as Caravan;

            if (caravan != null)
            {
                caravan.Notify_PawnAdded((Pawn)item);
            }
            Pawn_ApparelTracker pawn_ApparelTracker = this.owner as Pawn_ApparelTracker;

            if (pawn_ApparelTracker != null)
            {
                pawn_ApparelTracker.Notify_ApparelAdded((Apparel)item);
            }
            Pawn_EquipmentTracker pawn_EquipmentTracker = this.owner as Pawn_EquipmentTracker;

            if (pawn_EquipmentTracker != null)
            {
                pawn_EquipmentTracker.Notify_EquipmentAdded((ThingWithComps)item);
            }
            this.NotifyColonistBarIfColonistCorpse(item);
        }
Example #12
0
        public static Thing DropShuttle(List <ActiveDropPodInfo> pods, Map map, IntVec3 cell, Faction faction = null)
        {
            ByakheeArrivalActionUtility.RemovePawnsFromWorldPawns(pods);
            Thing           thing           = QuestGen_Shuttle.GenerateShuttle(faction, null, null, false, false, false, 0, false, false, true, false, null, null, -1, null, false, true, false, false);
            TransportShip   transportShip   = TransportShipMaker.MakeTransportShip(TransportShipDefOf.Ship_Shuttle, null, thing);
            CompTransporter compTransporter = thing.TryGetComp <CompTransporter>();

            for (int i = 0; i < pods.Count; i++)
            {
                compTransporter.innerContainer.TryAddRangeOrTransfer(pods[i].innerContainer, true, false);
            }
            if (!cell.IsValid)
            {
                cell = DropCellFinder.GetBestShuttleLandingSpot(map, Faction.OfPlayer);
            }
            transportShip.ArriveAt(cell, map.Parent);
            transportShip.AddJobs(new ShipJobDef[]
            {
                ShipJobDefOf.Unload,
                ShipJobDefOf.FlyAway
            });
            return(thing);
        }
Example #13
0
        public static IEnumerable <Gizmo> BoardTransporterInProgress(IEnumerable <Gizmo> __result, CompTransporter __instance)
        {
            IEnumerator <Gizmo> enumerator = __result.GetEnumerator();

            while (enumerator.MoveNext())
            {
                var element = enumerator.Current;
                if (__instance.LoadingInProgressOrReadyToLaunch && (element as Command_Action)?.icon == CancelLoadCommandTex)
                {
                    yield return(element);

                    List <CompTransporter> transporterGroup = __instance.TransportersInGroup(__instance.parent.Map);
                    yield return(new Command_ReloadTransporters
                    {
                        defaultLabel = transporterGroup.Count > 1 ? "CommandReloadTransporter".Translate(transporterGroup.Count) : "CommandReloadTransporterSingle".Translate(),
                        defaultDesc = "CommandReloadTransporterDesc".Translate(),
                        icon = LoadCommandTex,
                        transComp = __instance,
                        transporters = transporterGroup
                    });

                    continue;
                }
                yield return(element);
            }
        }
Example #14
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);
        }
        public void TryLaunch(int destinationTile, TransportPodsArrivalAction arrivalAction, Caravan cafr = null)
        {
            if (cafr == null && !this.parent.Spawned)
            {
                Log.Error("Tried to launch " + (object)this.parent + ", but it's unspawned.", false);
            }
            else
            {
                if (this.parent.Spawned && !this.LoadingInProgressOrReadyToLaunch || (!this.AllInGroupConnectedToFuelingPort || !this.AllFuelingPortSourcesInGroupHaveAnyFuel))
                {
                    return;
                }
                if (cafr == null)
                {
                    Map map = this.parent.Map;
                    int num = Find.WorldGrid.TraversalDistanceBetween(map.Tile, destinationTile, true, int.MaxValue);
                    if (num > this.MaxLaunchDistance)
                    {
                        return;
                    }
                    this.Transporter.TryRemoveLord(map);
                    int             groupId           = this.Transporter.groupID;
                    float           amount            = Mathf.Max(CompLaunchableSRTS.FuelNeededToLaunchAtDist((float)num), 1f);
                    CompTransporter comp1             = this.FuelingPortSource.TryGetComp <CompTransporter>();
                    Building        fuelingPortSource = this.FuelingPortSource;
                    if (fuelingPortSource != null)
                    {
                        fuelingPortSource.TryGetComp <CompRefuelable>().ConsumeFuel(amount);
                    }
                    ThingOwner directlyHeldThings = comp1.GetDirectlyHeldThings();

                    // Neceros Edit
                    Thing thing = ThingMaker.MakeThing(ThingDef.Named(parent.def.defName), (ThingDef)null);
                    thing.SetFactionDirect(Faction.OfPlayer);
                    thing.Rotation = this.FuelingPortSource.Rotation;
                    CompRefuelable comp2 = thing.TryGetComp <CompRefuelable>();
                    comp2.GetType().GetField("fuel", BindingFlags.Instance | BindingFlags.NonPublic).SetValue((object)comp2, (object)fuelingPortSource.TryGetComp <CompRefuelable>().Fuel);
                    comp2.TargetFuelLevel = fuelingPortSource.TryGetComp <CompRefuelable>().TargetFuelLevel;
                    thing.stackCount      = 1;
                    directlyHeldThings.TryAddOrTransfer(thing, true);

                    // Neceros Edit
                    ActiveDropPod activeDropPod = (ActiveDropPod)ThingMaker.MakeThing(ThingDef.Named(parent.def.defName + "_Active"), null);
                    activeDropPod.Contents = new ActiveDropPodInfo();
                    activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer((IEnumerable <Thing>)directlyHeldThings, true, true);

                    // Neceros Edit
                    SRTSLeaving srtsLeaving = (SRTSLeaving)SkyfallerMaker.MakeSkyfaller(ThingDef.Named(parent.def.defName + "_Leaving"), (Thing)activeDropPod);
                    srtsLeaving.rotation        = this.FuelingPortSource.Rotation;
                    srtsLeaving.groupID         = groupId;
                    srtsLeaving.destinationTile = destinationTile;
                    srtsLeaving.arrivalAction   = arrivalAction;
                    comp1.CleanUpLoadingVars(map);
                    IntVec3 position = fuelingPortSource.Position;
                    SRTSStatic.SRTSDestroy((Thing)fuelingPortSource, DestroyMode.Vanish);
                    GenSpawn.Spawn((Thing)srtsLeaving, position, map, WipeMode.Vanish);
                    CameraJumper.TryHideWorld();
                }
                else
                {
                    int num = Find.WorldGrid.TraversalDistanceBetween(this.carr.Tile, destinationTile, true, int.MaxValue);
                    if (num > this.MaxLaunchDistance)
                    {
                        return;
                    }
                    float amount = Mathf.Max(CompLaunchableSRTS.FuelNeededToLaunchAtDist((float)num), 1f);
                    if (this.FuelingPortSource != null)
                    {
                        this.FuelingPortSource.TryGetComp <CompRefuelable>().ConsumeFuel(amount);
                    }
                    ThingOwner <Pawn> directlyHeldThings = (ThingOwner <Pawn>)cafr.GetDirectlyHeldThings();
                    Thing             thing = null;
                    foreach (Pawn pawn in directlyHeldThings.InnerListForReading)
                    {
                        Pawn_InventoryTracker inventory = pawn.inventory;
                        for (int index = 0; index < inventory.innerContainer.Count; ++index)
                        {
                            // Neceros Edit
                            if (inventory.innerContainer[index].TryGetComp <CompLaunchableSRTS>() != null)
                            {
                                thing = inventory.innerContainer[index];
                                inventory.innerContainer[index].holdingOwner.Remove(inventory.innerContainer[index]);
                                break;
                            }
                        }
                    }
                    /*Add caravan items to SRTS - SmashPhil */
                    foreach (Pawn p in directlyHeldThings.InnerListForReading)
                    {
                        p.inventory.innerContainer.InnerListForReading.ForEach(x => AddThingsToSRTS(x));
                        p.inventory.innerContainer.Clear();
                    }

                    ThingOwner <Thing> thingOwner = new ThingOwner <Thing>();
                    foreach (Pawn pawn in directlyHeldThings.AsEnumerable <Pawn>().ToList <Pawn>())
                    {
                        thingOwner.TryAddOrTransfer((Thing)pawn, true);
                    }
                    if (thing != null && thing.holdingOwner == null)
                    {
                        thingOwner.TryAddOrTransfer(thing, false);
                    }

                    // Neceros Edit
                    ActiveDropPod activeDropPod = (ActiveDropPod)ThingMaker.MakeThing(ThingDef.Named(parent.def.defName + "_Active"), (ThingDef)null);
                    activeDropPod.Contents = new ActiveDropPodInfo();
                    activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer((IEnumerable <Thing>)thingOwner, true, true);
                    activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer((IEnumerable <Thing>)thingsInsideShip, true, true);
                    thingsInsideShip.Clear();

                    cafr.RemoveAllPawns();
                    if (cafr.Spawned)
                    {
                        Find.WorldObjects.Remove((WorldObject)cafr);
                    }
                    TravelingTransportPods travelingTransportPods = (TravelingTransportPods)WorldObjectMaker.MakeWorldObject(DefDatabase <WorldObjectDef> .GetNamed("TravelingSRTS", true));
                    travelingTransportPods.Tile = cafr.Tile;
                    travelingTransportPods.SetFaction(Faction.OfPlayer);
                    travelingTransportPods.destinationTile = destinationTile;
                    travelingTransportPods.arrivalAction   = arrivalAction;
                    Find.WorldObjects.Add((WorldObject)travelingTransportPods);
                    travelingTransportPods.AddPod(activeDropPod.Contents, true);
                    activeDropPod.Contents = (ActiveDropPodInfo)null;
                    activeDropPod.Destroy(DestroyMode.Vanish);
                    Find.WorldTargeter.StopTargeting();
                }
            }
        }
Example #16
0
        public void DetermineReferences()
        {
            referencedThings.Clear();
            foreach (Thing item in map.designationManager.allDesignations.Select((Designation des) => des.target.Thing))
            {
                referencedThings.Add(item);
            }
            foreach (Thing item2 in map.reservationManager.AllReservedThings())
            {
                referencedThings.Add(item2);
            }
            List <Pawn> allPawnsSpawned = map.mapPawns.AllPawnsSpawned;

            for (int i = 0; i < allPawnsSpawned.Count; i++)
            {
                Job curJob = allPawnsSpawned[i].jobs.curJob;
                if (curJob != null)
                {
                    if (curJob.targetA.HasThing)
                    {
                        referencedThings.Add(curJob.targetA.Thing);
                    }
                    if (curJob.targetB.HasThing)
                    {
                        referencedThings.Add(curJob.targetB.Thing);
                    }
                    if (curJob.targetC.HasThing)
                    {
                        referencedThings.Add(curJob.targetC.Thing);
                    }
                }
            }
            List <Thing> list = map.listerThings.ThingsInGroup(ThingRequestGroup.Projectile);

            for (int j = 0; j < list.Count; j++)
            {
                Projectile projectile = (Projectile)list[j];
                if (projectile.usedTarget.HasThing)
                {
                    referencedThings.Add(projectile.usedTarget.Thing);
                }
                if (projectile.intendedTarget.HasThing)
                {
                    referencedThings.Add(projectile.intendedTarget.Thing);
                }
            }
            List <Lord> lords = map.lordManager.lords;

            for (int k = 0; k < lords.Count; k++)
            {
                LordJob_FormAndSendCaravan lordJob_FormAndSendCaravan = lords[k].LordJob as LordJob_FormAndSendCaravan;
                if (lordJob_FormAndSendCaravan == null)
                {
                    continue;
                }
                for (int l = 0; l < lordJob_FormAndSendCaravan.transferables.Count; l++)
                {
                    TransferableOneWay transferableOneWay = lordJob_FormAndSendCaravan.transferables[l];
                    for (int m = 0; m < transferableOneWay.things.Count; m++)
                    {
                        referencedThings.Add(transferableOneWay.things[m]);
                    }
                }
            }
            List <Thing> list2 = map.listerThings.ThingsInGroup(ThingRequestGroup.Transporter);

            for (int n = 0; n < list2.Count; n++)
            {
                CompTransporter compTransporter = list2[n].TryGetComp <CompTransporter>();
                if (compTransporter.leftToLoad == null)
                {
                    continue;
                }
                for (int num = 0; num < compTransporter.leftToLoad.Count; num++)
                {
                    TransferableOneWay transferableOneWay2 = compTransporter.leftToLoad[num];
                    for (int num2 = 0; num2 < transferableOneWay2.things.Count; num2++)
                    {
                        referencedThings.Add(transferableOneWay2.things[num2]);
                    }
                }
            }
        }
Example #17
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);
        }
Example #18
0
        public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            CompTransporter transporter = t.TryGetComp <CompTransporter>();

            return(BillyLoadTransporterUtility.JobOnTransporter(pawn, transporter));
        }
        // Token: 0x060028DA RID: 10458 RVA: 0x001352F0 File Offset: 0x001336F0
        public void TryLaunch(int destinationTile, TransportPodsArrivalAction arrivalAction, Caravan cafr = null)
        {
            //Log.Warning("CARR:" + this.carr+"/"+cafr);
            if (cafr == null)
            {
                if (!this.parent.Spawned)
                {
                    Log.Error("Tried to launch " + this.parent + ", but it's unspawned.", false);
                    return;
                }
            }

            /*
             * List<CompTransporter> transportersInGroup = this.TransportersInGroup;
             * if (transportersInGroup == null)
             * {
             *  Log.Error("Tried to launch " + this.parent + ", but it's not in any group.", false);
             *  return;
             * }
             */
            if (this.parent.Spawned)
            {
                if (!this.LoadingInProgressOrReadyToLaunch)
                {
                    return;
                }
            }
            if (!this.AllInGroupConnectedToFuelingPort || !this.AllFuelingPortSourcesInGroupHaveAnyFuel)
            {
                return;
            }
            if (cafr == null)
            {
                Map map = this.parent.Map;
                int num = Find.WorldGrid.TraversalDistanceBetween(map.Tile, destinationTile, true, int.MaxValue);
                if (num > this.MaxLaunchDistance)
                {
                    return;
                }
                this.Transporter.TryRemoveLord(map);
                int   groupID = this.Transporter.groupID;
                float amount  = Mathf.Max(CompLaunchableHelicopter.FuelNeededToLaunchAtDist((float)num), 1f);
                //for (int i = 0; i < transportersInGroup.Count; i++)

                CompTransporter compTransporter   = this.FuelingPortSource.TryGetComp <CompTransporter>(); //transportersInGroup[i];
                Building        fuelingPortSource = this.FuelingPortSource;                                //compTransporter.Launchable.FuelingPortSource;
                if (fuelingPortSource != null)
                {
                    fuelingPortSource.TryGetComp <CompRefuelable>().ConsumeFuel(amount);
                }
                ThingOwner directlyHeldThings = compTransporter.GetDirectlyHeldThings();

                Thing helicopter = ThingMaker.MakeThing(ThingDef.Named("Building_Helicopter"));
                helicopter.SetFactionDirect(Faction.OfPlayer);

                CompRefuelable compr  = helicopter.TryGetComp <CompRefuelable>();
                Type           tcr    = compr.GetType();
                FieldInfo      finfos = tcr.GetField("fuel", BindingFlags.NonPublic | BindingFlags.Instance);
                finfos.SetValue(compr, fuelingPortSource.TryGetComp <CompRefuelable>().Fuel);

                compr.TargetFuelLevel = fuelingPortSource.TryGetComp <CompRefuelable>().TargetFuelLevel;

                helicopter.stackCount = 1;
                directlyHeldThings.TryAddOrTransfer(helicopter);

                ActiveDropPod activeDropPod = (ActiveDropPod)ThingMaker.MakeThing(ThingDef.Named("ActiveHelicopter"), null);
                activeDropPod.Contents = new ActiveDropPodInfo();
                activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer(directlyHeldThings, true, true);
                HelicopterLeaving dropPodLeaving = (HelicopterLeaving)SkyfallerMaker.MakeSkyfaller(ThingDef.Named("HelicopterLeaving"), activeDropPod);
                dropPodLeaving.groupID         = groupID;
                dropPodLeaving.destinationTile = destinationTile;
                dropPodLeaving.arrivalAction   = arrivalAction;
                compTransporter.CleanUpLoadingVars(map);
                //compTransporter.parent
                IntVec3 poc = fuelingPortSource.Position;
                // fuelingPortSource.Destroy(DestroyMode.Vanish);
                HelicopterStatic.HelicopterDestroy(fuelingPortSource, DestroyMode.Vanish);
                GenSpawn.Spawn(dropPodLeaving, poc, map, WipeMode.Vanish);

                CameraJumper.TryHideWorld();
            }
            else
            {
                int num = Find.WorldGrid.TraversalDistanceBetween(carr.Tile, destinationTile, true, int.MaxValue);
                if (num > this.MaxLaunchDistance)
                {
                    return;
                }
                float amount = Mathf.Max(CompLaunchableHelicopter.FuelNeededToLaunchAtDist((float)num), 1f);
                if (FuelingPortSource != null)
                {
                    FuelingPortSource.TryGetComp <CompRefuelable>().ConsumeFuel(amount);
                }


                ThingOwner <Pawn> directlyHeldThings = (ThingOwner <Pawn>)cafr.GetDirectlyHeldThings();
                Thing             helicopter         = null;
                foreach (Pawn pawn in directlyHeldThings.InnerListForReading)
                {
                    Pawn_InventoryTracker pinv = pawn.inventory;
                    for (int i = 0; i < pinv.innerContainer.Count; i++)
                    {
                        if (pinv.innerContainer[i].def.defName == ("Building_Helicopter"))
                        {
                            helicopter = pinv.innerContainer[i];
                            pinv.innerContainer[i].holdingOwner.Remove(pinv.innerContainer[i]);

                            break;
                        }
                    }
                }

                ThingOwner <Thing> finalto = new ThingOwner <Thing>();
                List <Pawn>        lpto    = directlyHeldThings.AsEnumerable <Pawn>().ToList();
                foreach (Pawn p in lpto)
                {
                    finalto.TryAddOrTransfer(p);
                }


                if (helicopter != null)
                {
                    // Log.Warning("TRY ADD"+helicopter);
                    if (helicopter.holdingOwner == null)
                    {
                        //Log.Warning("NULL");
                        //directlyHeldThings.
                        finalto.TryAddOrTransfer(helicopter, false);
                    }
                }


                ActiveDropPod activeDropPod = (ActiveDropPod)ThingMaker.MakeThing(ThingDef.Named("ActiveHelicopter"), null);
                activeDropPod.Contents = new ActiveDropPodInfo();
                activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer(
                    //directlyHeldThings
                    finalto, true, true);

                cafr.RemoveAllPawns();
                if (cafr.Spawned)
                {
                    Find.WorldObjects.Remove(cafr);
                }

                TravelingTransportPods travelingTransportPods = (TravelingTransportPods)WorldObjectMaker.MakeWorldObject(DefDatabase <WorldObjectDef> .GetNamed("TravelingHelicopters", true));
                travelingTransportPods.Tile = cafr.Tile;
                travelingTransportPods.SetFaction(Faction.OfPlayer);
                travelingTransportPods.destinationTile = destinationTile;
                travelingTransportPods.arrivalAction   = arrivalAction;
                Find.WorldObjects.Add(travelingTransportPods);
                travelingTransportPods.AddPod(activeDropPod.Contents, true);
                activeDropPod.Contents = null;
                activeDropPod.Destroy(DestroyMode.Vanish);
                // CameraJumper.TryHideWorld();
                Find.WorldTargeter.StopTargeting();
            }
        }
        public override void SpawnSetup(Map map, bool respawningAfterLoad)
        {
            base.SpawnSetup(map, respawningAfterLoad);

            Logger.MessageFormat(this, "Spawning");

            compCreator     = this.GetComp <CompPocketDimensionCreator>();
            compTransporter = this.GetComp <CompTransporter>();

            if (mapSize == 0)
            {
                mapSize = 1;
            }

            if (fuel >= 1.0f)
            {
                if (compCreator != null)
                {
                    compCreator.AddComponents((int)Mathf.Round(fuel));
                    fuel = 0.0f;

                    if (compCreator.SupplyCount > desiredComponentCount)
                    {
                        int amountToRefund = compCreator.SupplyCount - desiredComponentCount;
                        if (compCreator.ConsumeComponents(amountToRefund))
                        {
                            ThingDef thingToRefundDef = compCreator.Props.componentDef;

                            RefundComponents(thingToRefundDef, amountToRefund);
                        }
                    }
                }
                else
                {
                    ThingDef thingToRefundDef = ThingDefOf.ComponentSpacer;

                    int amountToRefund = (int)Mathf.Round(fuel);
                    fuel = 0.0f;

                    RefundComponents(thingToRefundDef, amountToRefund);
                }
            }

            // Reconfigure runtime-set comp property values
            SetDesiredMapSize(desiredMapSize);

            if (MapCreated)
            {
                MapParent_PocketDimension dimensionMapParent = PocketDimensionUtility.GetMapParent(this.dimensionSeed);

                // Looks like we just got installed somewhere. Make sure map tile is the same as our current tile
                if (this.Map != null && dimensionMapParent != null)
                {
                    dimensionMapParent.Tile = this.Map.Parent.Tile;
                }
            }
            else
            {
                if (compCreator != null && compCreator.Props.preMadeMapSize > 0)
                {
                    SetDesiredMapSize(compCreator.Props.preMadeMapSize);
                    mapSize = desiredMapSize;
                    CreateMap(this.MapDiameter);
                }
            }
        }
Example #21
0
        private void TryLaunchBombRun(int destTile, Pair <IntVec3, IntVec3> targetPoints, IEnumerable <IntVec3> bombCells, MapParent mapParent)
        {
            if (!this.parent.Spawned)
            {
                Log.Error("Tried to launch " + this.parent + ", but it's unspawned.");
                return;
            }

            if (!CompLauncher.LoadingInProgressOrReadyToLaunch || !CompLauncher.AllInGroupConnectedToFuelingPort || !CompLauncher.AllFuelingPortSourcesInGroupHaveAnyFuel)
            {
                return;
            }

            Map map = this.parent.Map;
            int num = Find.WorldGrid.TraversalDistanceBetween(map.Tile, destTile);

            if (num > CompLauncher.MaxLaunchDistance)
            {
                return;
            }
            CompLauncher.Transporter.TryRemoveLord(map);
            int             groupID        = CompLauncher.Transporter.groupID;
            float           amount         = Mathf.Max(CompLaunchableSRTS.FuelNeededToLaunchAtDist((float)num, this.parent.GetComp <CompLaunchableSRTS>().BaseFuelPerTile), 1f);
            CompTransporter comp1          = CompLauncher.FuelingPortSource.TryGetComp <CompTransporter>();
            Building        fuelPortSource = CompLauncher.FuelingPortSource;

            if (fuelPortSource != null)
            {
                fuelPortSource.TryGetComp <CompRefuelable>().ConsumeFuel(amount);
            }
            ThingOwner directlyHeldThings = comp1.GetDirectlyHeldThings();

            Thing thing = ThingMaker.MakeThing(ThingDef.Named(parent.def.defName), null);

            thing.SetFactionDirect(Faction.OfPlayer);
            thing.Rotation = CompLauncher.FuelingPortSource.Rotation;
            CompRefuelable comp2 = thing.TryGetComp <CompRefuelable>();

            comp2.GetType().GetField("fuel", BindingFlags.Instance | BindingFlags.NonPublic).SetValue((object)comp2, (object)fuelPortSource.TryGetComp <CompRefuelable>().Fuel);
            comp2.TargetFuelLevel = fuelPortSource.TryGetComp <CompRefuelable>().TargetFuelLevel;
            thing.stackCount      = 1;
            directlyHeldThings.TryAddOrTransfer(thing, true);

            ActiveDropPod activeDropPod = (ActiveDropPod)ThingMaker.MakeThing(ThingDef.Named(parent.def.defName + "_Active"), null);

            activeDropPod.Contents = new ActiveDropPodInfo();
            activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer((IEnumerable <Thing>)directlyHeldThings, true, true);

            SRTSLeaving srtsLeaving = (SRTSLeaving)SkyfallerMaker.MakeSkyfaller(ThingDef.Named(parent.def.defName + "_Leaving"), (Thing)activeDropPod);

            srtsLeaving.rotation        = CompLauncher.FuelingPortSource.Rotation;
            srtsLeaving.groupID         = groupID;
            srtsLeaving.destinationTile = destTile;
            srtsLeaving.arrivalAction   = new SRTSArrivalActionBombRun(mapParent, targetPoints, bombCells, this.bombType, map, CompLauncher.FuelingPortSource.Position);

            comp1.CleanUpLoadingVars(map);
            IntVec3 position = fuelPortSource.Position;

            SRTSStatic.SRTSDestroy((Thing)fuelPortSource, DestroyMode.Vanish);
            GenSpawn.Spawn((Thing)srtsLeaving, position, map, WipeMode.Vanish);
            CameraJumper.TryHideWorld();
        }
        public static IEnumerable <Gizmo> BoardTransporterInProgress(IEnumerable <Gizmo> __result, CompTransporter __instance)
        {
            List <CompTransporter> transporterGroup = __instance.TransportersInGroup(__instance.parent.Map);

            if (__instance.LoadingInProgressOrReadyToLaunch && !transporterGroup.NullOrEmpty())
            {
                yield return(new Command_ReloadTransporters
                {
                    defaultLabel = transporterGroup.Count > 1 ? "CommandReloadTransporter".Translate(transporterGroup.Count) : "CommandReloadTransporterSingle".Translate(),
                    defaultDesc = "CommandReloadTransporterDesc".Translate(),
                    icon = LoadCommandTex,
                    transComp = __instance,
                    transporters = transporterGroup
                });
            }
            foreach (Gizmo gizmo in __result)
            {
                yield return(gizmo);
            }
        }
        public void DetermineReferences()
        {
            this.referencedThings.Clear();
            foreach (Thing current in from des in this.map.designationManager.allDesignations
                     select des.target.Thing)
            {
                this.referencedThings.Add(current);
            }
            foreach (Thing current2 in this.map.reservationManager.AllReservedThings())
            {
                this.referencedThings.Add(current2);
            }
            List <Pawn> allPawnsSpawned = this.map.mapPawns.AllPawnsSpawned;

            for (int i = 0; i < allPawnsSpawned.Count; i++)
            {
                Pawn pawn   = allPawnsSpawned[i];
                Job  curJob = pawn.jobs.curJob;
                if (curJob != null)
                {
                    if (curJob.targetA.HasThing)
                    {
                        this.referencedThings.Add(curJob.targetA.Thing);
                    }
                    if (curJob.targetB.HasThing)
                    {
                        this.referencedThings.Add(curJob.targetB.Thing);
                    }
                    if (curJob.targetC.HasThing)
                    {
                        this.referencedThings.Add(curJob.targetC.Thing);
                    }
                }
            }
            List <Lord> lords = this.map.lordManager.lords;

            for (int j = 0; j < lords.Count; j++)
            {
                LordJob_FormAndSendCaravan lordJob_FormAndSendCaravan = lords[j].LordJob as LordJob_FormAndSendCaravan;
                if (lordJob_FormAndSendCaravan != null)
                {
                    for (int k = 0; k < lordJob_FormAndSendCaravan.transferables.Count; k++)
                    {
                        TransferableOneWay transferableOneWay = lordJob_FormAndSendCaravan.transferables[k];
                        for (int l = 0; l < transferableOneWay.things.Count; l++)
                        {
                            this.referencedThings.Add(transferableOneWay.things[l]);
                        }
                    }
                }
            }
            List <Thing> list = this.map.listerThings.ThingsInGroup(ThingRequestGroup.Transporter);

            for (int m = 0; m < list.Count; m++)
            {
                CompTransporter compTransporter = list[m].TryGetComp <CompTransporter>();
                if (compTransporter.leftToLoad != null)
                {
                    for (int n = 0; n < compTransporter.leftToLoad.Count; n++)
                    {
                        TransferableOneWay transferableOneWay2 = compTransporter.leftToLoad[n];
                        for (int num = 0; num < transferableOneWay2.things.Count; num++)
                        {
                            this.referencedThings.Add(transferableOneWay2.things[num]);
                        }
                    }
                }
            }
        }
Example #24
0
 public static int CountLeftToTransfer(Pawn pawn, TransferableOneWay transferable, CompTransporter transporter)
 {
     if (transferable.CountToTransfer <= 0 || !transferable.HasAnyThing)
     {
         return(0);
     }
     return(Mathf.Max(transferable.CountToTransfer - TransferableCountHauledByOthers(pawn, transferable, transporter), 0));
 }