public void Launch(int destinationTile, TransportPodsArrivalAction arrivalAction) { ActiveDropPod activeDropPod = (ActiveDropPod)ThingMaker.MakeThing(ThingDefOf.ActiveDropPod); activeDropPod.Contents = new ActiveDropPodInfo(); activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer(caravan.GetDirectlyHeldThings(), true, true); TravelingTransportPods travelingTransportPods = (TravelingTransportPods)WorldObjectMaker.MakeWorldObject(WorldObjectDefOf.TravelingShuttle); travelingTransportPods.Tile = Tile; travelingTransportPods.SetFaction(Faction.OfPlayer); travelingTransportPods.destinationTile = destinationTile; travelingTransportPods.arrivalAction = arrivalAction; travelingTransportPods.AddPod(activeDropPod.Contents, false); Find.WorldObjects.Add(travelingTransportPods); caravan.Destroy(); settlementFC.shuttleUsesRemaining -= cost; }
private void CallShuttleToCaravan(Pawn caller, Faction faction, bool free) { Caravan caravan = caller.GetCaravan(); int maxLaunchDistance = ThingDefOf.Shuttle.GetCompProperties <CompProperties_Launchable>().fixedLaunchDistanceMax; CameraJumper.TryJump(CameraJumper.GetWorldTarget(caravan)); Find.WorldSelector.ClearSelection(); int caravanTile = caravan.Tile; Find.WorldTargeter.BeginTargeting_NewTemp(ChoseWorldTarget, canTargetTiles: true, CompLaunchable.TargeterMouseAttachment, closeWorldTabWhenFinished: false, delegate { GenDraw.DrawWorldRadiusRing(caravanTile, maxLaunchDistance); }, (GlobalTargetInfo target) => CompLaunchable.TargetingLabelGetter(target, caravanTile, maxLaunchDistance, Gen.YieldSingle(caravan), Launch, null)); bool ChoseWorldTarget(GlobalTargetInfo target) { return(CompLaunchable.ChoseWorldTarget(target, caravan.Tile, Gen.YieldSingle(caravan), maxLaunchDistance, Launch, null)); } void Launch(int tile, TransportPodsArrivalAction arrivalAction) { ActiveDropPodInfo activeDropPodInfo = new ActiveDropPodInfo(); activeDropPodInfo.innerContainer.TryAddRangeOrTransfer(CaravanInventoryUtility.AllInventoryItems(caravan)); activeDropPodInfo.innerContainer.TryAddRangeOrTransfer(caravan.GetDirectlyHeldThings()); caravan.Destroy(); TravelingTransportPods travelingTransportPods = (TravelingTransportPods)WorldObjectMaker.MakeWorldObject(WorldObjectDefOf.TravelingShuttle); travelingTransportPods.Tile = caravan.Tile; travelingTransportPods.SetFaction(Faction.OfPlayer); travelingTransportPods.destinationTile = tile; travelingTransportPods.arrivalAction = arrivalAction; travelingTransportPods.AddPod(activeDropPodInfo, justLeftTheMap: true); Find.WorldObjects.Add(travelingTransportPods); Find.WorldTargeter.StopTargeting(); caller.royalty.GetPermit(def, faction).Notify_Used(); if (!free) { caller.royalty.TryRemoveFavor(faction, def.royalAid.favorCost); } } }
public override void Apply(GlobalTargetInfo target) { Caravan caravan = parent.pawn.GetCaravan(); Map targetMap = (target.WorldObject as MapParent)?.Map; IntVec3 targetCell = IntVec3.Invalid; List <Pawn> list = PawnsToSkip().ToList(); if (parent.pawn.Spawned) { foreach (Pawn item in list) { parent.AddEffecterToMaintain(EffecterDefOf.Skip_Entry.Spawn(item, item.Map), item.Position, 60); } SoundDefOf.Psycast_Skip_Pulse.PlayOneShot(new TargetInfo(target.Cell, parent.pawn.Map)); } if (ShouldEnterMap(target)) { Pawn pawn = AlliedPawnOnMap(targetMap); if (pawn != null) { targetCell = pawn.Position; } else { targetCell = parent.pawn.Position; } } if (targetCell.IsValid) { foreach (Pawn item2 in list) { if (item2.Spawned) { item2.teleporting = true; item2.ExitMap(allowedToJoinOrCreateCaravan: false, Rot4.Invalid); AbilityUtility.DoClamor(item2.Position, Props.clamorRadius, parent.pawn, Props.clamorType); item2.teleporting = false; } CellFinder.TryFindRandomSpawnCellForPawnNear_NewTmp(targetCell, targetMap, out var result, 4, (IntVec3 cell) => cell != targetCell && cell.GetRoom(targetMap) == targetCell.GetRoom(targetMap)); GenSpawn.Spawn(item2, result, targetMap); if (item2.drafter != null && item2.IsColonistPlayerControlled) { item2.drafter.Drafted = true; } item2.stances.stunner.StunFor_NewTmp(Props.stunTicks.RandomInRange, parent.pawn, addBattleLog: false); item2.Notify_Teleported(); if (item2.IsPrisoner) { item2.guest.WaitInsteadOfEscapingForDefaultTicks(); } parent.AddEffecterToMaintain(EffecterDefOf.Skip_ExitNoDelay.Spawn(item2, item2.Map), item2.Position, 60); SoundDefOf.Psycast_Skip_Exit.PlayOneShot(new TargetInfo(result, item2.Map)); if ((item2.IsColonist || item2.RaceProps.packAnimal) && item2.Map.IsPlayerHome) { item2.inventory.UnloadEverything = true; } } caravan?.Destroy(); return; } Caravan caravan2 = target.WorldObject as Caravan; if (caravan2 != null && caravan2.Faction == parent.pawn.Faction) { if (caravan != null) { caravan.pawns.TryTransferAllToContainer(caravan2.pawns); caravan2.Notify_Merged(new List <Caravan> { caravan }); caravan.Destroy(); return; } foreach (Pawn item3 in list) { caravan2.AddPawn(item3, addCarriedPawnToWorldPawnsIfAny: true); item3.ExitMap(allowedToJoinOrCreateCaravan: false, Rot4.Invalid); AbilityUtility.DoClamor(item3.Position, Props.clamorRadius, parent.pawn, Props.clamorType); } return; } if (caravan != null) { caravan.Tile = target.Tile; caravan.pather.StopDead(); return; } CaravanMaker.MakeCaravan(list, parent.pawn.Faction, target.Tile, addToWorldPawnsIfNotAlready: false); foreach (Pawn item4 in list) { item4.ExitMap(allowedToJoinOrCreateCaravan: false, Rot4.Invalid); } }
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."); } 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, this.BaseFuelPerTile), 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, this.BaseFuelPerTile), 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.Destroyed) { cafr.Destroy(); } TravelingSRTS travelingTransportPods = (TravelingSRTS)WorldObjectMaker.MakeWorldObject(DefDatabase <WorldObjectDef> .GetNamed("TravelingSRTS", true)); travelingTransportPods.Tile = cafr.Tile; travelingTransportPods.SetFaction(Faction.OfPlayer); travelingTransportPods.destinationTile = destinationTile; travelingTransportPods.arrivalAction = arrivalAction; travelingTransportPods.flyingThing = this.parent; Find.WorldObjects.Add((WorldObject)travelingTransportPods); travelingTransportPods.AddPod(activeDropPod.Contents, true); activeDropPod.Contents = (ActiveDropPodInfo)null; activeDropPod.Destroy(DestroyMode.Vanish); Find.WorldTargeter.StopTargeting(); } } }