diff --git a/NewHorizons/External/Modules/Props/EyeOfTheUniverse/EyeTravelerInfo.cs b/NewHorizons/External/Modules/Props/EyeOfTheUniverse/EyeTravelerInfo.cs
index 82f5abe8..733d803d 100644
--- a/NewHorizons/External/Modules/Props/EyeOfTheUniverse/EyeTravelerInfo.cs
+++ b/NewHorizons/External/Modules/Props/EyeOfTheUniverse/EyeTravelerInfo.cs
@@ -1,6 +1,7 @@
using NewHorizons.External.Modules.Props.Audio;
using NewHorizons.External.Modules.Props.Dialogue;
using Newtonsoft.Json;
+using Newtonsoft.Json.Converters;
namespace NewHorizons.External.Modules.Props.EyeOfTheUniverse
{
@@ -46,5 +47,23 @@ namespace NewHorizons.External.Modules.Props.EyeOfTheUniverse
/// The dialogue to use for this traveler. If omitted, the first CharacterDialogueTree in the object will be used.
///
public DialogueInfo dialogue;
+
+ ///
+ /// The name of the base game traveler to position this traveler after at the campfire, starting clockwise from Riebeck. Defaults to the end of the list (right before Riebeck).
+ ///
+ public TravelerName? afterTraveler;
+
+
+ [JsonConverter(typeof(StringEnumConverter))]
+ public enum TravelerName
+ {
+ Riebeck,
+ Chert,
+ Esker,
+ Felspar,
+ Gabbro,
+ Solanum,
+ Prisoner,
+ }
}
}
diff --git a/NewHorizons/Handlers/EyeSceneHandler.cs b/NewHorizons/Handlers/EyeSceneHandler.cs
index 7a3a4c1a..350abfb2 100644
--- a/NewHorizons/Handlers/EyeSceneHandler.cs
+++ b/NewHorizons/Handlers/EyeSceneHandler.cs
@@ -266,28 +266,48 @@ namespace NewHorizons.Handlers
var quantumCampsiteController = Object.FindObjectOfType();
- var travelers = new List()
- {
- quantumCampsiteController._travelerControllers[0].transform, // Riebeck
- quantumCampsiteController._travelerControllers[2].transform, // Chert
- quantumCampsiteController._travelerControllers[6].transform, // Esker
- quantumCampsiteController._travelerControllers[1].transform, // Felspar
- quantumCampsiteController._travelerControllers[3].transform, // Gabbro
- };
+ var travelers = new List();
- if (quantumCampsiteController._hasMetSolanum)
- {
- travelers.Add(quantumCampsiteController._travelerControllers[4].transform); // Solanum
- }
- if (quantumCampsiteController._hasMetPrisoner)
+ var hasMetSolanum = quantumCampsiteController._hasMetSolanum;
+ var hasMetPrisoner = quantumCampsiteController._hasMetPrisoner;
+
+ // The order of the travelers in the base game differs depending on if the player has met both Solanum and the Prisoner or not.
+ if (hasMetPrisoner && hasMetSolanum)
{
+ travelers.Add(quantumCampsiteController._travelerControllers[0].transform); // Riebeck
travelers.Add(quantumCampsiteController._travelerControllers[5].transform); // Prisoner
+ travelers.Add(quantumCampsiteController._travelerControllers[6].transform); // Esker
+ travelers.Add(quantumCampsiteController._travelerControllers[1].transform); // Felspar
+ travelers.Add(quantumCampsiteController._travelerControllers[3].transform); // Gabbro
+ travelers.Add(quantumCampsiteController._travelerControllers[4].transform); // Solanum
+ travelers.Add(quantumCampsiteController._travelerControllers[2].transform); // Chert
+ }
+ else
+ {
+ travelers.Add(quantumCampsiteController._travelerControllers[0].transform); // Riebeck
+ travelers.Add(quantumCampsiteController._travelerControllers[2].transform); // Chert
+ travelers.Add(quantumCampsiteController._travelerControllers[6].transform); // Esker
+ travelers.Add(quantumCampsiteController._travelerControllers[1].transform); // Felspar
+ travelers.Add(quantumCampsiteController._travelerControllers[3].transform); // Gabbro
+ if (hasMetSolanum)
+ travelers.Add(quantumCampsiteController._travelerControllers[4].transform); // Solanum
+ if (hasMetPrisoner)
+ travelers.Add(quantumCampsiteController._travelerControllers[5].transform); // Prisoner
}
- // Custom travelers (starting at index 7)
+ // Custom travelers (starting at index 7, after Esker). We loop through the array instead of the list of custom travelers in case a non-NH mod added their own.
for (int i = 7; i < quantumCampsiteController._travelerControllers.Length; i++)
{
- travelers.Add(quantumCampsiteController._travelerControllers[i].transform);
+ var travelerInfo = GetActiveCustomEyeTravelers().FirstOrDefault(t => t.controller == quantumCampsiteController._travelerControllers[i]);
+ var travelerName = travelerInfo?.info?.afterTraveler;
+ if (travelerName.HasValue)
+ {
+ InsertTravelerAfter(quantumCampsiteController, travelers, travelerInfo.info.afterTraveler.ToString(), quantumCampsiteController._travelerControllers[i].transform);
+ }
+ else
+ {
+ travelers.Add(quantumCampsiteController._travelerControllers[i].transform);
+ }
}
var radius = 2f + 0.2f * travelers.Count;
@@ -312,6 +332,22 @@ namespace NewHorizons.Handlers
}
}
+ private static void InsertTravelerAfter(QuantumCampsiteController campsite, List travelers, string travelerName, Transform newTraveler)
+ {
+ if (travelerName == "Prisoner")
+ travelerName = "Prisoner_Campfire";
+ var existingTraveler = campsite._travelerControllers.FirstOrDefault(c => c.name == travelerName);
+ if (existingTraveler != null)
+ {
+ var index = travelers.IndexOf(existingTraveler.transform);
+ travelers.Insert(index + 1, newTraveler);
+ }
+ else
+ {
+ travelers.Add(newTraveler);
+ }
+ }
+
public class EyeTravelerData
{
public string id;