Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 35 additions & 27 deletions Source/Vehicles/Harmony/Patches/Patch_FormCaravanDialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,11 @@ void IPatchCategory.PatchMethods()
original: AccessTools.Method(typeof(Dialog_FormCaravan), "DoBottomButtons"),
transpiler: new HarmonyMethod(typeof(Patch_FormCaravanDialog),
nameof(StartRoutePlanningForVehiclesTranspiler)));
HarmonyPatcher.Patch(
original: AccessTools.Method(typeof(Dialog_FormCaravan),
nameof(Dialog_FormCaravan.Notify_ChoseRoute)),
transpiler: new HarmonyMethod(typeof(Patch_FormCaravanDialog),
nameof(ChooseVehicleStartingTileTranspiler)));
HarmonyPatcher.Patch(original: AccessTools.Method(typeof(Dialog_FormCaravan), "TrySend"),
prefix: new HarmonyMethod(typeof(Patch_FormCaravanDialog),
nameof(TryAndSendWithVehicles)));
Expand Down Expand Up @@ -622,9 +627,6 @@ private static IEnumerable<CodeInstruction> StartRoutePlanningForVehiclesTranspi
MethodInfo startPlanningMethod =
AccessTools.Method(typeof(WorldRoutePlanner), nameof(WorldRoutePlanner.Start),
parameters: [typeof(Dialog_FormCaravan)]);
FieldInfo mapField = AccessTools.Field(typeof(Dialog_FormCaravan), "map");
FieldInfo autoSelectTravelSuppliesField =
AccessTools.Field(typeof(Dialog_FormCaravan), "autoSelectTravelSupplies");
for (int i = 0; i < instructionList.Count; i++)
{
CodeInstruction instruction = instructionList[i];
Expand All @@ -634,13 +636,6 @@ private static IEnumerable<CodeInstruction> StartRoutePlanningForVehiclesTranspi
// Callvirt WorldRoutePlanner::Start(Dialog_FormCaravan)
instruction = instructionList[++i];
// ON STACK - WorldRoutePlanner instance, Dialog_FormCaravan instance
// this.map
yield return new CodeInstruction(opcode: OpCodes.Ldarg_0);
yield return new CodeInstruction(opcode: OpCodes.Ldfld, operand: mapField);
// this.autoSelectTravelSupplies
yield return new CodeInstruction(opcode: OpCodes.Ldarg_0);
yield return new CodeInstruction(opcode: OpCodes.Ldfld,
operand: autoSelectTravelSuppliesField);
yield return new CodeInstruction(opcode: OpCodes.Call,
operand: AccessTools.Method(typeof(Patch_FormCaravanDialog),
nameof(WorldRoutePannerReroute)));
Expand All @@ -651,7 +646,7 @@ private static IEnumerable<CodeInstruction> StartRoutePlanningForVehiclesTranspi

// NOTE - It's easier to pass in the world route planner since it's already on the stack
private static void WorldRoutePannerReroute(WorldRoutePlanner routePlanner,
Dialog_FormCaravan formCaravan, Map map, bool autoSelectTravelSupplies)
Dialog_FormCaravan formCaravan)
{
if (VehiclesSelected(formCaravan.transferables))
{
Expand All @@ -666,33 +661,46 @@ private static void WorldRoutePannerReroute(WorldRoutePlanner routePlanner,
{
Find.WindowStack.Add(formCaravan);
formCaravan.Notify_NoLongerChoosingRoute();
}, ChoseVehicleRoute);
}, formCaravan.Notify_ChoseRoute);
}
else
{
routePlanner.Start(formCaravan);
}
return;
}

void ChoseVehicleRoute(PlanetTile tile)
{
CaravanFormation.formation.DestinationTile = tile;
List<VehicleDef> vehicleDefs = TransferableUtility
.GetPawnsFromTransferables(formCaravan.transferables)
.UniqueVehicleDefsInList();
CaravanFormation.formation.StartingTile =
CaravanHelper.BestExitTileToGoTo(vehicleDefs, tile, map);
CaravanFormation.formation.TicksToArriveDirty = true;
CaravanFormation.formation.DaysWorthOfFoodDirty = true;
private static IEnumerable<CodeInstruction> ChooseVehicleStartingTileTranspiler(
IEnumerable<CodeInstruction> instructions)
{
MethodInfo bestExitTileMethod = AccessTools.Method(typeof(CaravanExitMapUtility),
nameof(CaravanExitMapUtility.BestExitTileToGoTo),
parameters: [typeof(PlanetTile), typeof(Map)]);
MethodInfo replacement = AccessTools.Method(typeof(Patch_FormCaravanDialog),
nameof(BestExitTileToGoTo));

formCaravan.soundAppear.PlayOneShotOnCamera();
if (autoSelectTravelSupplies)
foreach (CodeInstruction instruction in instructions)
{
if (instruction.Calls(bestExitTileMethod))
{
CaravanFormation.formation.SelectApproximateBestTravelSupplies();
yield return new CodeInstruction(OpCodes.Ldarg_0);
instruction.operand = replacement;
}
yield return instruction;
}
}

private static PlanetTile BestExitTileToGoTo(PlanetTile destinationTile, Map map,
Dialog_FormCaravan formCaravan)
{
if (!VehiclesSelected(formCaravan.transferables))
return CaravanExitMapUtility.BestExitTileToGoTo(destinationTile, map);

List<VehicleDef> vehicleDefs = TransferableUtility
.GetPawnsFromTransferables(formCaravan.transferables)
.UniqueVehicleDefsInList();
return CaravanHelper.BestExitTileToGoTo(vehicleDefs, destinationTile, map);
}

/// <summary>
/// Reroute caravan send off to create VehicleCaravan or initialize vehicle caravan lord job.
/// </summary>
Expand Down Expand Up @@ -1018,4 +1026,4 @@ private static int AppendMapPawnsInVehicles(int count, MapParent mapParent)
}
return count;
}
}
}
72 changes: 36 additions & 36 deletions Source/Vehicles/Utility/Helpers/World/CaravanFormation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -138,50 +138,50 @@ public static void TrySendVehicleCaravan(Dialog_FormCaravan formCaravan)
SoundDefOf.Tick_High.PlayOneShotOnCamera();
formCaravan.Close(false);
}
return;
}

bool TryFormAndSendCaravan()
public static bool TryFormAndSendCaravan()
{
Assert.IsNotNull(formation);
foreach (Pawn pawn in formation.pawns)
{
foreach (Pawn pawn in formation.pawns)
{
if (pawn is VehiclePawn vehicle)
{
vehicle.DisembarkAll();
}
}
if (!CheckForErrors())
if (pawn is VehiclePawn vehicle)
{
return false;
}
Direction8Way direction8WayFromTo =
Find.WorldGrid.GetDirection8WayFromTo(formation.Dialog.CurrentTile, formation.StartingTile);
if (!TryFindExitSpot(formation.pawns, reachableForEveryColonist: true, out IntVec3 intVec))
{
if (!TryFindExitSpot(formation.pawns, reachableForEveryColonist: false, out intVec))
{
Messages.Message(
"CaravanCouldNotFindExitSpot".Translate(direction8WayFromTo.LabelShort()),
MessageTypeDefOf.RejectInput, false);
return false;
}
Messages.Message(
"CaravanCouldNotFindReachableExitSpot".Translate(direction8WayFromTo.LabelShort()),
new GlobalTargetInfo(intVec, formation.Map), MessageTypeDefOf.CautionInput, false);
vehicle.DisembarkAll();
}
if (!TryFindRandomPackingSpot(intVec, out IntVec3 meetingPoint))
}
if (!CheckForErrors())
{
return false;
}
Direction8Way direction8WayFromTo =
Find.WorldGrid.GetDirection8WayFromTo(formation.Dialog.CurrentTile, formation.StartingTile);
if (!TryFindExitSpot(formation.pawns, reachableForEveryColonist: true, out IntVec3 intVec))
{
if (!TryFindExitSpot(formation.pawns, reachableForEveryColonist: false, out intVec))
{
Messages.Message(
"CaravanCouldNotFindPackingSpot".Translate(direction8WayFromTo.LabelShort()),
new GlobalTargetInfo(intVec, formation.Map), MessageTypeDefOf.RejectInput, false);
"CaravanCouldNotFindExitSpot".Translate(direction8WayFromTo.LabelShort()),
MessageTypeDefOf.RejectInput, false);
return false;
}
formation.RecacheTransferables();
VehicleCaravanFormingUtility.StartFormingCaravan(formation.Dialog.transferables,
meetingPoint, intVec, formation.StartingTile, formation.DestinationTile);
Messages.Message("CaravanFormationProcessStarted".Translate(), formation.vehicles[0],
MessageTypeDefOf.PositiveEvent, false);
return true;
Messages.Message(
"CaravanCouldNotFindReachableExitSpot".Translate(direction8WayFromTo.LabelShort()),
new GlobalTargetInfo(intVec, formation.Map), MessageTypeDefOf.CautionInput, false);
}
if (!TryFindRandomPackingSpot(intVec, out IntVec3 meetingPoint))
{
Messages.Message(
"CaravanCouldNotFindPackingSpot".Translate(direction8WayFromTo.LabelShort()),
new GlobalTargetInfo(intVec, formation.Map), MessageTypeDefOf.RejectInput, false);
return false;
}
formation.RecacheTransferables();
VehicleCaravanFormingUtility.StartFormingCaravan(formation.Dialog.transferables,
meetingPoint, intVec, formation.StartingTile, formation.DestinationTile);
Messages.Message("CaravanFormationProcessStarted".Translate(), formation.vehicles[0],
MessageTypeDefOf.PositiveEvent, false);
return true;
}

private static void ReformInstantly()
Expand Down Expand Up @@ -532,4 +532,4 @@ static bool ThingIsVehicle(Thing thing)
}
}
}
}
}