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;