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