private static void ArrivePatch(TransportPodsArrivalAction_LandInSpecificCell __instance, List <ActiveDropPodInfo> pods, int tile)
        {
            if (Traverse.Create(__instance).Field("mapParent").GetValue() is WorldSettlementFC settlement)
            {
                List <Pawn> pawns       = new List <Pawn>();
                bool        hasAnyPawns = false;

                foreach (ActiveDropPodInfo activeDropPodInfo in pods)
                {
                    foreach (Thing thing in activeDropPodInfo.innerContainer)
                    {
                        if (thing is Pawn pawn)
                        {
                            hasAnyPawns = true;
                            pawns.Add(pawn);
                        }
                    }
                }

                if (hasAnyPawns)
                {
                    settlement.AddToDefenceFromList(pawns, tile);
                }
            }
        }
예제 #2
0
        public static bool Prefix(
            TransportPodsArrivalAction_LandInSpecificCell __instance,
            List <ActiveDropPodInfo> pods,
            int tile)
        {
            foreach (ActiveDropPodInfo pod in pods)
            {
                for (int index = 0; index < pod.innerContainer.Count; index++)
                {
                    if (pod.innerContainer[index].TryGetComp <CompLaunchableSRTS>() != null)
                    {
                        Thing    lookTarget = TransportPodsArrivalActionUtility.GetLookTarget(pods);
                        Traverse traverse   = Traverse.Create((object)__instance);
                        IntVec3  c          = traverse.Field("cell").GetValue <IntVec3>();
                        Map      map        = traverse.Field("mapParent").GetValue <MapParent>().Map;
                        TransportPodsArrivalActionUtility.RemovePawnsFromWorldPawns(pods);

                        for (int i = 0; i < pods.Count; ++i)
                        {
                            pods[i].openDelay = 0;
                            DropPodUtility.MakeDropPodAt(c, map, pods[i]);
                        }
                        Messages.Message("MessageTransportPodsArrived".Translate(), (LookTargets)lookTarget, MessageTypeDefOf.TaskCompletion, true);
                        return(false);
                    }
                }
            }
            return(true);
        }
 public static bool Prefix(TransportPodsArrivalAction_LandInSpecificCell __instance, List <ActiveDropPodInfo> pods, int tile, IntVec3 ___cell, MapParent ___mapParent)
 {
     //    Log.Message(string.Format("pods: {0}", pods.Count));
     foreach (ActiveDropPodInfo info in pods)
     {
         for (int i = 0; i < info.innerContainer.Count; i++)
         {
             Thing        dropship = info.innerContainer[i];
             CompDropship comp     = dropship.TryGetCompFast <CompDropship>();
             if (comp != null)
             {
                 //    Log.Message(string.Format("pods: {0}", info.innerContainer.ContentsString));
                 Thing    lookTarget = TransportPodsArrivalActionUtility.GetLookTarget(pods);
                 Traverse tv         = Traverse.Create(__instance);
                 IntVec3  c          = ___cell;
                 Map      map        = ___mapParent.Map;
                 TransportPodsArrivalActionUtility.RemovePawnsFromWorldPawns(pods);
                 for (int ii = 0; ii < pods.Count; ii++)
                 {
                     DropPodUtility.MakeDropPodAt(c, map, pods[ii]);
                 }
                 Messages.Message("AvP_USCM_Dropship_MessageArrived".Translate(), lookTarget, MessageTypeDefOf.TaskCompletion, true);
                 return(false);
             }
         }
     }
     return(true);
 }
예제 #4
0
 private void Arrived()
 {
     if (!arrived)
     {
         arrived = true;
         if (arrivalAction == null || !(bool)arrivalAction.StillValid(pods.Cast <IThingHolder>(), destinationTile))
         {
             arrivalAction = null;
             List <Map> maps = Find.Maps;
             for (int i = 0; i < maps.Count; i++)
             {
                 if (maps[i].Tile == destinationTile)
                 {
                     if (destinationCell != default(IntVec3))
                     {
                         arrivalAction = new WorldTransport.TM_TransportPodsArrivalAction_LandAtExactCell(maps[i].Parent, destinationCell, draftFlag);
                         break;
                     }
                     arrivalAction = new TransportPodsArrivalAction_LandInSpecificCell(maps[i].Parent, DropCellFinder.RandomDropSpot(maps[i]));
                     break;
                 }
             }
             if (arrivalAction == null)
             {
                 if (TransportPodsArrivalAction_FormCaravan.CanFormCaravanAt(pods.Cast <IThingHolder>(), destinationTile))
                 {
                     arrivalAction = new TransportPodsArrivalAction_FormCaravan();
                 }
                 else
                 {
                     List <Caravan> caravans = Find.WorldObjects.Caravans;
                     for (int j = 0; j < caravans.Count; j++)
                     {
                         if (caravans[j].Tile == destinationTile && (bool)TransportPodsArrivalAction_GiveToCaravan.CanGiveTo(pods.Cast <IThingHolder>(), caravans[j]))
                         {
                             arrivalAction = new TransportPodsArrivalAction_GiveToCaravan(caravans[j]);
                             break;
                         }
                     }
                 }
             }
         }
         if (arrivalAction != null && arrivalAction.ShouldUseLongEvent(pods, destinationTile))
         {
             LongEventHandler.QueueLongEvent(delegate
             {
                 DoArrivalAction();
             }, "GeneratingMapForNewEncounter", false, null);
         }
         else
         {
             DoArrivalAction();
         }
     }
 }
 private static void SyncLandInSpecificCell(SyncWorker sync, ref TransportPodsArrivalAction_LandInSpecificCell transportPodAction)
 {
     if (sync.isWriting)
     {
         sync.Write((MapParent)mapParentField.GetValue(transportPodAction));
         sync.Write((IntVec3)cellField.GetValue(transportPodAction));
         sync.Write((bool)landInShuttleField.GetValue(transportPodAction));
     }
     else
     {
         transportPodAction = new TransportPodsArrivalAction_LandInSpecificCell(sync.Read <MapParent>(), sync.Read <IntVec3>(), sync.Read <bool>());
     }
 }
예제 #6
0
        public static IEnumerable <FloatMenuOption> GetMapParent(MapParent mapparent, IEnumerable <IThingHolder> pods, CompLaunchableHelicopter representative, Caravan car)
        {
            /*
             * foreach (FloatMenuOption o in mapparent.GetFloatMenuOptions())
             * {
             *  yield return o;
             * }
             */

            if (TransportPodsArrivalAction_LandInSpecificCell.CanLandInSpecificCell(pods, mapparent))
            {
                yield return(new FloatMenuOption("LandInExistingMap".Translate(new object[]
                {
                    mapparent.Label
                }), delegate
                {
                    Map myMap;
                    if (car == null)
                    {
                        myMap = representative.parent.Map;
                    }
                    else
                    {
                        myMap = null;
                    }

                    Map map = mapparent.Map;
                    Current.Game.CurrentMap = map;
                    CameraJumper.TryHideWorld();
                    Find.Targeter.BeginTargeting(TargetingParameters.ForDropPodsDestination(), delegate(LocalTargetInfo x)
                    {
                        representative.TryLaunch(mapparent.Tile, new TransportPodsArrivalAction_LandInSpecificCell(mapparent, x.Cell), car);
                    }, null, delegate
                    {
                        if (myMap != null && Find.Maps.Contains(myMap))
                        {
                            Current.Game.CurrentMap = myMap;
                        }
                    }, CompLaunchable.TargeterMouseAttachment);
                }, MenuOptionPriority.Default, null, null, 0f, null, null));
            }
            yield break;
        }
예제 #7
0
 public static bool Prefix(TransportPodsArrivalAction_LandInSpecificCell __instance, List <ActiveDropPodInfo> pods, int tile)
 {
     foreach (ActiveDropPodInfo info in pods)
     {
         if (info.innerContainer.Contains(ThingDef.Named("Building_Helicopter")))
         {
             Thing    lookTarget = TransportPodsArrivalActionUtility.GetLookTarget(pods);
             Traverse tv         = Traverse.Create(__instance);
             IntVec3  c          = tv.Field("cell").GetValue <IntVec3>();
             Map      map        = tv.Field("mapParent").GetValue <MapParent>().Map;
             TransportPodsArrivalActionUtility.RemovePawnsFromWorldPawns(pods);
             for (int i = 0; i < pods.Count; i++)
             {
                 DropPodUtility.MakeDropPodAt(c, map, pods[i]);
             }
             Messages.Message("MessageTransportPodsArrived".Translate(), lookTarget, MessageTypeDefOf.TaskCompletion, true);
             return(false);
         }
     }
     return(true);
 }
 public static bool Prefix(TransportPodsArrivalAction_LandInSpecificCell __instance, List <ActiveDropPodInfo> pods, int tile)
 {
     //    Log.Message(string.Format("pods: {0}", pods.Count));
     foreach (ActiveDropPodInfo info in pods)
     {
         if (info.innerContainer.Contains(USCMDefOf.RRY_USCM_DropshipUD4L))
         {
             //    Log.Message(string.Format("pods: {0}", info.innerContainer.ContentsString));
             Thing    lookTarget = TransportPodsArrivalActionUtility.GetLookTarget(pods);
             Traverse tv         = Traverse.Create(__instance);
             IntVec3  c          = tv.Field("cell").GetValue <IntVec3>();
             Map      map        = tv.Field("mapParent").GetValue <MapParent>().Map;
             TransportPodsArrivalActionUtility.RemovePawnsFromWorldPawns(pods);
             for (int i = 0; i < pods.Count; i++)
             {
                 DropPodUtility.MakeDropPodAt(c, map, pods[i]);
             }
             Messages.Message("USCM_Dropship_MessageArrived".Translate(), lookTarget, MessageTypeDefOf.TaskCompletion, true);
             return(false);
         }
     }
     return(true);
 }
 public static IEnumerable <FloatMenuOption> GetMapParent(
     MapParent mapparent,
     IEnumerable <IThingHolder> pods,
     CompLaunchableHelicopter representative,
     Caravan car)
 {
     if (TransportPodsArrivalAction_LandInSpecificCell.CanLandInSpecificCell(pods, mapparent))
     {
         yield return(new FloatMenuOption("LandInExistingMap".Translate((object)mapparent.Label), (Action)(() =>
         {
             Map myMap = car != null ? (Map)null : representative.parent.Map;
             Current.Game.CurrentMap = mapparent.Map;
             CameraJumper.TryHideWorld();
             Find.Targeter.BeginTargeting(TargetingParameters.ForDropPodsDestination(), (Action <LocalTargetInfo>)(x => representative.TryLaunch(mapparent.Tile, (TransportPodsArrivalAction) new TransportPodsArrivalAction_LandInSpecificCell(mapparent, x.Cell), car)), (Pawn)null, (Action)(() =>
             {
                 if (myMap == null || !Find.Maps.Contains(myMap))
                 {
                     return;
                 }
                 Current.Game.CurrentMap = myMap;
             }), CompLaunchable.TargeterMouseAttachment);
         }), MenuOptionPriority.Default, (Action)null, (Thing)null, 0.0f, (Func <Rect, bool>)null, (WorldObject)null));
     }
 }
 private static void SyncLandInSpecificCell(ThingComp compLaunchableSrts, int destinationTile, TransportPodsArrivalAction_LandInSpecificCell arrivalAction, Caravan caravanMethodParameter, Caravan caravanFieldValue)
 => SyncedUniversalArrivalAction(compLaunchableSrts, destinationTile, arrivalAction, caravanMethodParameter, caravanFieldValue);