diff --git a/NewHorizons/Builder/Props/DialogueBuilder.cs b/NewHorizons/Builder/Props/DialogueBuilder.cs index b20a57d5..450b2966 100644 --- a/NewHorizons/Builder/Props/DialogueBuilder.cs +++ b/NewHorizons/Builder/Props/DialogueBuilder.cs @@ -21,18 +21,47 @@ namespace NewHorizons.Builder.Props var dialogue = MakeConversationZone(go, sector, info, mod.ModHelper); RemoteDialogueTrigger remoteTrigger = null; - if (info.remoteTriggerPosition != null || info.remoteTriggerRadius != 0) remoteTrigger = MakeRemoteDialogueTrigger(go, sector, info, dialogue); + if (info.remoteTriggerPosition != null || info.remoteTriggerRadius != 0) + { + remoteTrigger = MakeRemoteDialogueTrigger(go, sector, info, dialogue); + } + + if (!string.IsNullOrEmpty(info.rename)) + { + dialogue.name = info.rename; + if (remoteTrigger != null) + { + remoteTrigger.name = $"{info.rename}_{remoteTrigger.name}"; + } + } + + if (!string.IsNullOrEmpty(info.parentPath)) + { + var parent = go.transform.Find(info.parentPath); + if (parent != null) + { + dialogue.transform.parent = parent; + if (remoteTrigger != null) + { + remoteTrigger.transform.parent = parent; + } + } + } // Make the character look at the player // Useful for dialogue replacement - if (!string.IsNullOrEmpty(info.pathToAnimController)) MakePlayerTrackingZone(go, dialogue, info); + // Overrides parent path for dialogue + if (!string.IsNullOrEmpty(info.pathToAnimController)) + { + MakePlayerTrackingZone(go, dialogue, info); + } return (dialogue, remoteTrigger); } private static RemoteDialogueTrigger MakeRemoteDialogueTrigger(GameObject planetGO, Sector sector, PropModule.DialogueInfo info, CharacterDialogueTree dialogue) { - GameObject conversationTrigger = new GameObject("ConversationTrigger"); + var conversationTrigger = new GameObject("ConversationTrigger"); conversationTrigger.SetActive(false); var remoteDialogueTrigger = conversationTrigger.AddComponent(); @@ -64,7 +93,7 @@ namespace NewHorizons.Builder.Props private static CharacterDialogueTree MakeConversationZone(GameObject planetGO, Sector sector, PropModule.DialogueInfo info, IModHelper mod) { - GameObject conversationZone = new GameObject("ConversationZone"); + var conversationZone = new GameObject("ConversationZone"); conversationZone.SetActive(false); conversationZone.layer = LayerMask.NameToLayer("Interactible"); @@ -88,10 +117,11 @@ namespace NewHorizons.Builder.Props var dialogueTree = conversationZone.AddComponent(); var xml = File.ReadAllText(Path.Combine(mod.Manifest.ModFolderPath, info.xmlFile)); - var text = new TextAsset(xml); - - // Text assets need a name to be used with VoiceMod - text.name = Path.GetFileNameWithoutExtension(info.xmlFile); + var text = new TextAsset(xml) + { + // Text assets need a name to be used with VoiceMod + name = Path.GetFileNameWithoutExtension(info.xmlFile) + }; dialogueTree.SetTextXml(text); AddTranslation(xml); @@ -146,7 +176,7 @@ namespace NewHorizons.Builder.Props if (info.lookAtRadius > 0) { - GameObject playerTrackingZone = new GameObject("PlayerTrackingZone"); + var playerTrackingZone = new GameObject("PlayerTrackingZone"); playerTrackingZone.SetActive(false); playerTrackingZone.layer = LayerMask.NameToLayer("BasicEffectVolume"); @@ -194,22 +224,22 @@ namespace NewHorizons.Builder.Props private static void AddTranslation(string xml) { - XmlDocument xmlDocument = new XmlDocument(); + var xmlDocument = new XmlDocument(); xmlDocument.LoadXml(xml); - XmlNode xmlNode = xmlDocument.SelectSingleNode("DialogueTree"); - XmlNodeList xmlNodeList = xmlNode.SelectNodes("DialogueNode"); + var xmlNode = xmlDocument.SelectSingleNode("DialogueTree"); + var xmlNodeList = xmlNode.SelectNodes("DialogueNode"); string characterName = xmlNode.SelectSingleNode("NameField").InnerText; TranslationHandler.AddDialogue(characterName); foreach (object obj in xmlNodeList) { - XmlNode xmlNode2 = (XmlNode)obj; + var xmlNode2 = (XmlNode)obj; var name = xmlNode2.SelectSingleNode("Name").InnerText; - XmlNodeList xmlText = xmlNode2.SelectNodes("Dialogue/Page"); + var xmlText = xmlNode2.SelectNodes("Dialogue/Page"); foreach (object page in xmlText) { - XmlNode pageData = (XmlNode)page; + var pageData = (XmlNode)page; var text = pageData.InnerText; // The text is trimmed in DialogueText constructor (_listTextBlocks), so we also need to trim it for the key TranslationHandler.AddDialogue(text, true, name); @@ -218,7 +248,7 @@ namespace NewHorizons.Builder.Props xmlText = xmlNode2.SelectNodes("DialogueOptionsList/DialogueOption/Text"); foreach (object option in xmlText) { - XmlNode optionData = (XmlNode)option; + var optionData = (XmlNode)option; var text = optionData.InnerText; // The text is trimmed in CharacterDialogueTree.LoadXml, so we also need to trim it for the key TranslationHandler.AddDialogue(text, true, characterName, name); diff --git a/NewHorizons/External/Modules/PropModule.cs b/NewHorizons/External/Modules/PropModule.cs index fa81ebf0..c1ba1103 100644 --- a/NewHorizons/External/Modules/PropModule.cs +++ b/NewHorizons/External/Modules/PropModule.cs @@ -450,6 +450,16 @@ namespace NewHorizons.External.Modules /// Relative path to the xml file defining the dialogue. /// public string xmlFile; + + /// + /// Optionally rename the dialogue object. The remote trigger volume will be renamed to have this as a prefix. + /// + public string rename; + + /// + /// Optionally set the parent object that the dialogue and remote trigger will be attached to + /// + public string parentPath; } [JsonObject]