public static FloatMenuOption MakeMenuItemForLabel([NotNull] string label, [NotNull] List <FloatMenuOption> fmo) { // List<SortByWhat> sortByWhats = fmo.Keys.ToList(); List <FloatMenuOption> options = fmo.ToList(); string labelFixed = label; bool isSingle = options.Count == 1 && !labelFixed.Contains(NestedString); FloatMenuOptionNoClose option = new FloatMenuOptionNoClose( labelFixed, () => { if (isSingle && options[0].Disabled == false) { Action action = options[0].action; if (action == null) { return; } CloseLabelMenu(true); action(); } else { int i = 0; List <FloatMenuOption> actions = new List <FloatMenuOption>(); fmo.Do( menuOption => { FloatMenuOption floatMenuOption = new FloatMenuOption( menuOption .Label, () => { FloatMenuOption pawnOption = menuOption; actionMenu .Close(); CloseLabelMenu(true); pawnOption .action(); }, (MenuOptionPriority )i++, menuOption .mouseoverGuiAction, menuOption .revalidateClickTarget, menuOption .extraPartWidth, menuOption .extraPartOnGUI); actions.Add(floatMenuOption); }); actionMenu = new FloatMenuNested(actions, null); Find.WindowStack.Add(actionMenu); } }, isSingle ? options[0].extraPartWidth : 0f, isSingle ? options[0].extraPartOnGUI : null) { Disabled = options.All(o => o.Disabled), }; return(option); }
public static Caravan ExitMapAndCreateCaravan(IEnumerable <Pawn> pawns, Faction faction, int exitFromTile, int directionTile, int destinationTile, bool sendMessage = true) { Caravan result; if (!GenWorldClosest.TryFindClosestPassableTile(exitFromTile, out exitFromTile)) { Log.Error("Could not find any passable tile for a new caravan.", false); result = null; } else { if (Find.World.Impassable(directionTile)) { directionTile = exitFromTile; } CaravanExitMapUtility.tmpPawns.Clear(); CaravanExitMapUtility.tmpPawns.AddRange(pawns); Map map = null; for (int i = 0; i < CaravanExitMapUtility.tmpPawns.Count; i++) { CaravanExitMapUtility.AddCaravanExitTaleIfShould(CaravanExitMapUtility.tmpPawns[i]); map = CaravanExitMapUtility.tmpPawns[i].MapHeld; if (map != null) { break; } } Caravan caravan = CaravanMaker.MakeCaravan(CaravanExitMapUtility.tmpPawns, faction, exitFromTile, false); Rot4 exitDir = (map == null) ? Rot4.Invalid : Find.WorldGrid.GetRotFromTo(exitFromTile, directionTile); for (int j = 0; j < CaravanExitMapUtility.tmpPawns.Count; j++) { CaravanExitMapUtility.tmpPawns[j].ExitMap(false, exitDir); } List <Pawn> pawnsListForReading = caravan.PawnsListForReading; for (int k = 0; k < pawnsListForReading.Count; k++) { if (!pawnsListForReading[k].IsWorldPawn()) { Find.WorldPawns.PassToWorld(pawnsListForReading[k], PawnDiscardDecideMode.Decide); } } if (map != null) { map.Parent.Notify_CaravanFormed(caravan); map.retainedCaravanData.Notify_CaravanFormed(caravan); } if (!caravan.pather.Moving && caravan.Tile != directionTile) { caravan.pather.StartPath(directionTile, null, true, true); caravan.pather.nextTileCostLeft /= 2f; caravan.tweener.ResetTweenedPosToRoot(); } if (destinationTile != -1) { List <FloatMenuOption> list = FloatMenuMakerWorld.ChoicesAtFor(destinationTile, caravan); if (list.Any((FloatMenuOption x) => !x.Disabled)) { FloatMenuOption floatMenuOption = list.First((FloatMenuOption x) => !x.Disabled); floatMenuOption.action(); } else { caravan.pather.StartPath(destinationTile, null, true, true); } } if (sendMessage) { string text = "MessageFormedCaravan".Translate(new object[] { caravan.Name }).CapitalizeFirst(); if (caravan.pather.Moving && caravan.pather.ArrivalAction != null) { string text2 = text; text = string.Concat(new string[] { text2, " ", "MessageFormedCaravan_Orders".Translate(), ": ", caravan.pather.ArrivalAction.Label, "." }); } Messages.Message(text, caravan, MessageTypeDefOf.TaskCompletion, true); } result = caravan; } return(result); }
public static Caravan ExitMapAndCreateCaravan(IEnumerable <Pawn> pawns, Faction faction, int exitFromTile, int directionTile, int destinationTile, bool sendMessage = true) { if (!GenWorldClosest.TryFindClosestPassableTile(exitFromTile, out exitFromTile)) { Log.Error("Could not find any passable tile for a new caravan."); return(null); } if (Find.World.Impassable(directionTile)) { directionTile = exitFromTile; } tmpPawns.Clear(); tmpPawns.AddRange(pawns); Map map = null; for (int i = 0; i < tmpPawns.Count; i++) { AddCaravanExitTaleIfShould(tmpPawns[i]); map = tmpPawns[i].MapHeld; if (map != null) { break; } } Caravan caravan = CaravanMaker.MakeCaravan(tmpPawns, faction, exitFromTile, addToWorldPawnsIfNotAlready: false); Rot4 exitDir = (map == null) ? Rot4.Invalid : Find.WorldGrid.GetRotFromTo(exitFromTile, directionTile); for (int j = 0; j < tmpPawns.Count; j++) { tmpPawns[j].ExitMap(allowedToJoinOrCreateCaravan: false, exitDir); } List <Pawn> pawnsListForReading = caravan.PawnsListForReading; for (int k = 0; k < pawnsListForReading.Count; k++) { if (!pawnsListForReading[k].IsWorldPawn()) { Find.WorldPawns.PassToWorld(pawnsListForReading[k]); } } if (map != null) { map.Parent.Notify_CaravanFormed(caravan); map.retainedCaravanData.Notify_CaravanFormed(caravan); } if (!caravan.pather.Moving && caravan.Tile != directionTile) { caravan.pather.StartPath(directionTile, null, repathImmediately: true); caravan.pather.nextTileCostLeft /= 2f; caravan.tweener.ResetTweenedPosToRoot(); } if (destinationTile != -1) { List <FloatMenuOption> list = FloatMenuMakerWorld.ChoicesAtFor(destinationTile, caravan); if (list.Any((FloatMenuOption x) => !x.Disabled)) { FloatMenuOption floatMenuOption = list.First((FloatMenuOption x) => !x.Disabled); floatMenuOption.action(); } else { caravan.pather.StartPath(destinationTile, null, repathImmediately: true); } } if (sendMessage) { string text = "MessageFormedCaravan".Translate(caravan.Name).CapitalizeFirst(); if (caravan.pather.Moving && caravan.pather.ArrivalAction != null) { string text2 = text; text = text2 + " " + "MessageFormedCaravan_Orders".Translate() + ": " + caravan.pather.ArrivalAction.Label + "."; } Messages.Message(text, caravan, MessageTypeDefOf.TaskCompletion); } return(caravan); }