Add "afterTraveler" to position custom travelers in the campfire order, and fix order with both solanum and prisoner

This commit is contained in:
Joshua Thome 2025-02-15 21:04:06 -06:00
parent fc0dd05cf3
commit c775fda2fc
2 changed files with 70 additions and 15 deletions

View File

@ -1,6 +1,7 @@
using NewHorizons.External.Modules.Props.Audio; using NewHorizons.External.Modules.Props.Audio;
using NewHorizons.External.Modules.Props.Dialogue; using NewHorizons.External.Modules.Props.Dialogue;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
namespace NewHorizons.External.Modules.Props.EyeOfTheUniverse 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. /// The dialogue to use for this traveler. If omitted, the first CharacterDialogueTree in the object will be used.
/// </summary> /// </summary>
public DialogueInfo dialogue; public DialogueInfo dialogue;
/// <summary>
/// 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).
/// </summary>
public TravelerName? afterTraveler;
[JsonConverter(typeof(StringEnumConverter))]
public enum TravelerName
{
Riebeck,
Chert,
Esker,
Felspar,
Gabbro,
Solanum,
Prisoner,
}
} }
} }

View File

@ -266,28 +266,48 @@ namespace NewHorizons.Handlers
var quantumCampsiteController = Object.FindObjectOfType<QuantumCampsiteController>(); var quantumCampsiteController = Object.FindObjectOfType<QuantumCampsiteController>();
var travelers = new List<Transform>() var travelers = new List<Transform>();
{
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
};
if (quantumCampsiteController._hasMetSolanum) var hasMetSolanum = quantumCampsiteController._hasMetSolanum;
{ var hasMetPrisoner = quantumCampsiteController._hasMetPrisoner;
travelers.Add(quantumCampsiteController._travelerControllers[4].transform); // Solanum
} // 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 (quantumCampsiteController._hasMetPrisoner) if (hasMetPrisoner && hasMetSolanum)
{ {
travelers.Add(quantumCampsiteController._travelerControllers[0].transform); // Riebeck
travelers.Add(quantumCampsiteController._travelerControllers[5].transform); // Prisoner 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++) 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; var radius = 2f + 0.2f * travelers.Count;
@ -312,6 +332,22 @@ namespace NewHorizons.Handlers
} }
} }
private static void InsertTravelerAfter(QuantumCampsiteController campsite, List<Transform> 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 class EyeTravelerData
{ {
public string id; public string id;