private void TryLaunch(GlobalTargetInfo target, PawnsArrivalModeDef arriveMode, bool attackOnArrival) { Cthulhu.Utility.DebugReport("TryLaunch Called"); if (!parent.Spawned) { Log.Error("Tried to launch " + parent + ", but it's unspawned."); return; } List <CompTransporterPawn> transportersInGroup = TransportersInGroup; if (transportersInGroup == null) { Log.Error("Tried to launch " + parent + ", but it's not in any group."); return; } if (!LoadingInProgressOrReadyToLaunch) { Cthulhu.Utility.DebugReport("TryLaunch Failed"); return; } Map map = parent.Map; var num = Find.WorldGrid.TraversalDistanceBetween(map.Tile, target.Tile); if (num > MaxLaunchDistance) { Cthulhu.Utility.DebugReport("TryLaunch Failed #2"); return; } Transporter.TryRemoveLord(map); var groupID = Transporter.groupID; for (var i = 0; i < transportersInGroup.Count; i++) { Cthulhu.Utility.DebugReport("Transporter Outspawn Attempt"); CompTransporterPawn compTransporter = transportersInGroup[i]; Cthulhu.Utility.DebugReport("Transporter Outspawn " + compTransporter.parent.Label); var pawnFlyerLeaving = (PawnFlyersLeaving)ThingMaker.MakeThing(PawnFlyerDef.leavingDef); pawnFlyerLeaving.groupID = groupID; pawnFlyerLeaving.pawnFlyer = parent as PawnFlyer; pawnFlyerLeaving.destinationTile = target.Tile; pawnFlyerLeaving.destinationCell = target.Cell; pawnFlyerLeaving.arriveMode = arriveMode; pawnFlyerLeaving.attackOnArrival = attackOnArrival; ThingOwner innerContainer = compTransporter.GetDirectlyHeldThings(); pawnFlyerLeaving.Contents = new ActiveDropPodInfo(); innerContainer.TryTransferAllToContainer(pawnFlyerLeaving.Contents.innerContainer); //pawnFlyerLeaving.Contents.innerContainer. //TryAddMany(innerContainer); innerContainer.Clear(); compTransporter.CleanUpLoadingVars(map); compTransporter.parent.DeSpawn(); pawnFlyerLeaving.Contents.innerContainer.TryAdd(compTransporter.parent); GenSpawn.Spawn(pawnFlyerLeaving, compTransporter.parent.Position, map); } }
public void TryLaunch(int destinationTile, TransportPodsArrivalAction arrivalAction) { if (!parent.Spawned) { Log.Error(string.Concat("Tried to launch ", parent, ", but it's unspawned.")); return; } List <CompTransporter> transportersInGroup = TransportersInGroup; if (transportersInGroup == null) { Log.Error(string.Concat("Tried to launch ", parent, ", but it's not in any group.")); } else { if (!LoadingInProgressOrReadyToLaunch || !AllInGroupConnectedToFuelingPort || !AllFuelingPortSourcesInGroupHaveAnyFuel) { return; } Map map = parent.Map; int num = Find.WorldGrid.TraversalDistanceBetween(map.Tile, destinationTile); CompShuttle compShuttle = parent.TryGetComp <CompShuttle>(); if (num <= MaxLaunchDistance || (compShuttle != null && compShuttle.IsMissionShuttle)) { Transporter.TryRemoveLord(map); int groupID = Transporter.groupID; float amount = Mathf.Max(FuelNeededToLaunchAtDist(num), 1f); compShuttle?.SendLaunchedSignals(transportersInGroup); for (int i = 0; i < transportersInGroup.Count; i++) { CompTransporter compTransporter = transportersInGroup[i]; compTransporter.Launchable.FuelingPortSource?.TryGetComp <CompRefuelable>().ConsumeFuel(amount); ThingOwner directlyHeldThings = compTransporter.GetDirectlyHeldThings(); ActiveDropPod activeDropPod = (ActiveDropPod)ThingMaker.MakeThing(ThingDefOf.ActiveDropPod); activeDropPod.Contents = new ActiveDropPodInfo(); activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer(directlyHeldThings, canMergeWithExistingStacks: true, destroyLeftover: true); DropPodLeaving obj = (DropPodLeaving)SkyfallerMaker.MakeSkyfaller(Props.skyfallerLeaving ?? ThingDefOf.DropPodLeaving, activeDropPod); obj.groupID = groupID; obj.destinationTile = destinationTile; obj.arrivalAction = arrivalAction; obj.worldObjectDef = ((compShuttle != null) ? WorldObjectDefOf.TravelingShuttle : WorldObjectDefOf.TravelingTransportPods); compTransporter.CleanUpLoadingVars(map); compTransporter.parent.Destroy(); GenSpawn.Spawn(obj, compTransporter.parent.Position, map); } CameraJumper.TryHideWorld(); } } }
public void TryLaunch(int destinationTile, TransportPodsArrivalAction arrivalAction) { if (!parent.Spawned) { Log.Error("Tried to launch " + parent + ", but it's unspawned."); } else { List <CompTransporter> transportersInGroup = TransportersInGroup; if (transportersInGroup == null) { Log.Error("Tried to launch " + parent + ", but it's not in any group."); } else if (LoadingInProgressOrReadyToLaunch && AllInGroupConnectedToFuelingPort && AllFuelingPortSourcesInGroupHaveAnyFuel) { Map map = parent.Map; int num = Find.WorldGrid.TraversalDistanceBetween(map.Tile, destinationTile); if (num <= MaxLaunchDistance) { Transporter.TryRemoveLord(map); int groupID = Transporter.groupID; float amount = Mathf.Max(FuelNeededToLaunchAtDist((float)num), 1f); for (int i = 0; i < transportersInGroup.Count; i++) { CompTransporter compTransporter = transportersInGroup[i]; compTransporter.Launchable.FuelingPortSource?.TryGetComp <CompRefuelable>().ConsumeFuel(amount); ThingOwner directlyHeldThings = compTransporter.GetDirectlyHeldThings(); ActiveDropPod activeDropPod = (ActiveDropPod)ThingMaker.MakeThing(ThingDefOf.ActiveDropPod); activeDropPod.Contents = new ActiveDropPodInfo(); activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer(directlyHeldThings, canMergeWithExistingStacks: true, destroyLeftover: true); DropPodLeaving dropPodLeaving = (DropPodLeaving)SkyfallerMaker.MakeSkyfaller(ThingDefOf.DropPodLeaving, activeDropPod); dropPodLeaving.groupID = groupID; dropPodLeaving.destinationTile = destinationTile; dropPodLeaving.arrivalAction = arrivalAction; compTransporter.CleanUpLoadingVars(map); compTransporter.parent.Destroy(); GenSpawn.Spawn(dropPodLeaving, compTransporter.parent.Position, map); } CameraJumper.TryHideWorld(); } } } }
//private bool ChoseWorldTarget(GlobalTargetInfo target) //{ // Utility.DebugReport("ChooseWorldTarget Called"); // if (!LoadingInProgressOrReadyToLaunch) // { // return true; // } // if (!target.IsValid) // { // Messages.Message("MessageTransportPodsDestinationIsInvalid".Translate(), MessageTypeDefOf.RejectInput); // return false; // } // var num = Find.WorldGrid.TraversalDistanceBetween(parent.Map.Tile, target.Tile); // if (num > MaxLaunchDistance) // { // //Messages.Message("MessageTransportPodsDestinationIsTooFar".Translate(new object[] // //{ // // CompLaunchable.FuelNeededToLaunchAtDist((float)num).ToString("0.#") // //}), MessageTypeDefOf.RejectInput); // return false; // } // if (target.WorldObject is MapParent {HasMap: true} mapParent) // { // var myMap = parent.Map; // var map = mapParent.Map; // Current.Game.CurrentMap = map; // var arg_139_0 = Find.Targeter; // void ActionWhenFinished() // { // if (Find.Maps.Contains(myMap)) // { // Current.Game.CurrentMap = myMap; // } // } // arg_139_0.BeginTargeting(TargetingParameters.ForDropPodsDestination(), delegate(LocalTargetInfo x) // { // if (!LoadingInProgressOrReadyToLaunch) // { // Utility.DebugReport("ChooseTarget Exited - LoadingInProgressOrReadyToLaunch"); // return; // } // TryLaunch(x.ToGlobalTargetInfo(map), PawnsArrivalModeDefOf.EdgeDrop, false); // }, null, ActionWhenFinished, TargeterMouseAttachment); // return true; // } // if (target.WorldObject is Settlement && target.WorldObject.Faction != Faction.OfPlayer) // { // Find.WorldTargeter.closeWorldTabWhenFinished = false; // var list = new List<FloatMenuOption>(); // if (!target.WorldObject.Faction.HostileTo(Faction.OfPlayer)) // { // list.Add(new FloatMenuOption("VisitFactionBase".Translate( // target.WorldObject.Label // ), delegate // { // if (!LoadingInProgressOrReadyToLaunch) // { // return; // } // TryLaunch(target, PawnsArrivalModeDefOf.EdgeDrop, false); // CameraJumper.TryHideWorld(); // })); // } // list.Add(new FloatMenuOption("DropAtEdge".Translate(), delegate // { // if (!LoadingInProgressOrReadyToLaunch) // { // return; // } // TryLaunch(target, PawnsArrivalModeDefOf.EdgeDrop, true); // CameraJumper.TryHideWorld(); // })); // list.Add(new FloatMenuOption("DropInCenter".Translate(), delegate // { // if (!LoadingInProgressOrReadyToLaunch) // { // return; // } // TryLaunch(target, PawnsArrivalModeDefOf.CenterDrop, true); // CameraJumper.TryHideWorld(); // })); // Find.WindowStack.Add(new FloatMenu(list)); // return true; // } // Messages.Message("MessageTransportPodsDestinationIsInvalid".Translate(), MessageTypeDefOf.RejectInput); // return false; // //this.TryLaunch(target, PawnsArrivalModeDefOf.Undecided, false); // //return true; //} public void TryLaunch(int destinationTile, TransportPodsArrivalAction arrivalAction) { Utility.DebugReport("TryLaunch Called"); if (!parent.Spawned) { Log.Error("Tried to launch " + parent + ", but it's unspawned."); return; } var transportersInGroup = TransportersInGroup; if (transportersInGroup == null) { Log.Error("Tried to launch " + parent + ", but it's not in any group."); return; } if (!LoadingInProgressOrReadyToLaunch) { Utility.DebugReport("TryLaunch Failed"); return; } var map = parent.Map; var num = Find.WorldGrid.TraversalDistanceBetween(map.Tile, destinationTile); if (num > MaxLaunchDistance) { Utility.DebugReport("TryLaunch Failed #2"); return; } Transporter.TryRemoveLord(map); var groupID = Transporter.groupID; foreach (var compTransporterPawn in transportersInGroup) { var compTransporter = compTransporterPawn; var originalPawn = (Pawn)compTransporter.parent; var oldPosition = compTransporter.parent.Position; ActiveDropPod activeDropPod = (ActiveDropPod)ThingMaker.MakeThing(ThingDefOf.ActiveDropPod, null); activeDropPod.Contents = new ActiveDropPodInfo(); activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer(compTransporter.GetDirectlyHeldThings(), true, true); FlyShipLeaving flyShipLeaving = (FlyShipLeaving)SkyfallerMaker.MakeSkyfaller(PawnFlyerDef.leavingDef ?? ThingDefOf.DropPodLeaving, activeDropPod); flyShipLeaving.groupID = groupID; flyShipLeaving.destinationTile = destinationTile; flyShipLeaving.arrivalAction = arrivalAction; flyShipLeaving.worldObjectDef = PawnFlyerDef.travelingDef; //flyShipLeaving.worldObjectDef = WorldObjectDefOf.TravelingTransportPods; compTransporter.CleanUpLoadingVars(map); //compTransporter.parent.Destroy(DestroyMode.Vanish); compTransporterPawn.parent.DeSpawn(); flyShipLeaving.Contents.innerContainer.TryAddOrTransfer(originalPawn); GenSpawn.Spawn(flyShipLeaving, oldPosition, map, WipeMode.Vanish); //Utility.DebugReport("Transporter Outspawn Attempt"); //var compTransporter = compTransporterPawn; //Utility.DebugReport("Transporter Outspawn " + compTransporter.parent.Label); //var pawnFlyerLeaving = (Skyfaller) ThingMaker.MakeThing(PawnFlyerDef.leavingDef); //pawnFlyerLeaving.groupID = groupID; //pawnFlyerLeaving.pawnFlyer = parent as PawnFlyer; //pawnFlyerLeaving.destinationTile = target.Tile; //pawnFlyerLeaving.destinationCell = target.Cell; //pawnFlyerLeaving.arriveMode = arriveMode; //pawnFlyerLeaving.attackOnArrival = attackOnArrival; //var innerContainer = compTransporter.GetDirectlyHeldThings(); //pawnFlyerLeaving.Contents = new ActiveDropPodInfo(); //innerContainer.TryTransferAllToContainer(pawnFlyerLeaving.Contents.innerContainer); ////pawnFlyerLeaving.Contents.innerContainer. //TryAddMany(innerContainer); //innerContainer.Clear(); //compTransporter.CleanUpLoadingVars(map); //compTransporter.parent.DeSpawn(); //pawnFlyerLeaving.Contents.innerContainer.TryAdd(compTransporter.parent); //GenSpawn.Spawn(pawnFlyerLeaving, compTransporter.parent.Position, map); } CameraJumper.TryHideWorld(); }
public void Send() { if (!ModLister.RoyaltyInstalled) { Log.ErrorOnce("Shuttle is a Royalty-specific game system. If you want to use this code please check ModLister.RoyaltyInstalled before calling it. See rules on the Ludeon forum for more info.", 8811221); } else { if (sending) { return; } if (!parent.Spawned) { Log.Error("Tried to send " + parent + ", but it's unspawned."); return; } List <CompTransporter> transportersInGroup = TransportersInGroup; if (transportersInGroup == null) { Log.Error("Tried to send " + parent + ", but it's not in any group."); } else { if (!LoadingInProgressOrReadyToLaunch) { return; } if (!AllRequiredThingsLoaded) { if (dropEverythingIfUnsatisfied) { Transporter.CancelLoad(); } else if (dropNonRequiredIfUnsatisfied) { for (int i = 0; i < transportersInGroup.Count; i++) { for (int num = transportersInGroup[i].innerContainer.Count - 1; num >= 0; num--) { Thing thing = transportersInGroup[i].innerContainer[num]; Pawn pawn; if (!IsRequired(thing) && (requiredColonistCount <= 0 || (pawn = (thing as Pawn)) == null || !pawn.IsColonist)) { transportersInGroup[i].innerContainer.TryDrop(thing, ThingPlaceMode.Near, out Thing _); } } } } } sending = true; bool allRequiredThingsLoaded = AllRequiredThingsLoaded; Map map = parent.Map; Transporter.TryRemoveLord(map); string signalPart = allRequiredThingsLoaded ? "SentSatisfied" : "SentUnsatisfied"; for (int j = 0; j < transportersInGroup.Count; j++) { QuestUtility.SendQuestTargetSignals(transportersInGroup[j].parent.questTags, signalPart, transportersInGroup[j].parent.Named("SUBJECT"), transportersInGroup[j].innerContainer.ToList().Named("SENT")); } List <Pawn> list = new List <Pawn>(); for (int k = 0; k < transportersInGroup.Count; k++) { CompTransporter compTransporter = transportersInGroup[k]; for (int num2 = transportersInGroup[k].innerContainer.Count - 1; num2 >= 0; num2--) { Pawn pawn2 = transportersInGroup[k].innerContainer[num2] as Pawn; if (pawn2 != null) { if (pawn2.IsColonist && !requiredPawns.Contains(pawn2)) { list.Add(pawn2); } pawn2.ExitMap(allowedToJoinOrCreateCaravan: false, Rot4.Invalid); } } compTransporter.innerContainer.ClearAndDestroyContentsOrPassToWorld(); Thing newThing = ThingMaker.MakeThing(ThingDefOf.ShuttleLeaving); compTransporter.CleanUpLoadingVars(map); compTransporter.parent.Destroy(DestroyMode.QuestLogic); GenSpawn.Spawn(newThing, compTransporter.parent.Position, map); } if (list.Count != 0) { for (int l = 0; l < transportersInGroup.Count; l++) { QuestUtility.SendQuestTargetSignals(transportersInGroup[l].parent.questTags, "SentWithExtraColonists", transportersInGroup[l].parent.Named("SUBJECT"), list.Named("SENTCOLONISTS")); } } sending = false; } } }