mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
Implement #401
This commit is contained in:
parent
01f719dee4
commit
feb22deba1
@ -21,18 +21,47 @@ namespace NewHorizons.Builder.Props
|
|||||||
var dialogue = MakeConversationZone(go, sector, info, mod.ModHelper);
|
var dialogue = MakeConversationZone(go, sector, info, mod.ModHelper);
|
||||||
|
|
||||||
RemoteDialogueTrigger remoteTrigger = null;
|
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
|
// Make the character look at the player
|
||||||
// Useful for dialogue replacement
|
// 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);
|
return (dialogue, remoteTrigger);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static RemoteDialogueTrigger MakeRemoteDialogueTrigger(GameObject planetGO, Sector sector, PropModule.DialogueInfo info, CharacterDialogueTree dialogue)
|
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);
|
conversationTrigger.SetActive(false);
|
||||||
|
|
||||||
var remoteDialogueTrigger = conversationTrigger.AddComponent<RemoteDialogueTrigger>();
|
var remoteDialogueTrigger = conversationTrigger.AddComponent<RemoteDialogueTrigger>();
|
||||||
@ -64,7 +93,7 @@ namespace NewHorizons.Builder.Props
|
|||||||
|
|
||||||
private static CharacterDialogueTree MakeConversationZone(GameObject planetGO, Sector sector, PropModule.DialogueInfo info, IModHelper mod)
|
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.SetActive(false);
|
||||||
|
|
||||||
conversationZone.layer = LayerMask.NameToLayer("Interactible");
|
conversationZone.layer = LayerMask.NameToLayer("Interactible");
|
||||||
@ -88,10 +117,11 @@ namespace NewHorizons.Builder.Props
|
|||||||
var dialogueTree = conversationZone.AddComponent<CharacterDialogueTree>();
|
var dialogueTree = conversationZone.AddComponent<CharacterDialogueTree>();
|
||||||
|
|
||||||
var xml = File.ReadAllText(Path.Combine(mod.Manifest.ModFolderPath, info.xmlFile));
|
var xml = File.ReadAllText(Path.Combine(mod.Manifest.ModFolderPath, info.xmlFile));
|
||||||
var text = new TextAsset(xml);
|
var text = new TextAsset(xml)
|
||||||
|
{
|
||||||
// Text assets need a name to be used with VoiceMod
|
// Text assets need a name to be used with VoiceMod
|
||||||
text.name = Path.GetFileNameWithoutExtension(info.xmlFile);
|
name = Path.GetFileNameWithoutExtension(info.xmlFile)
|
||||||
|
};
|
||||||
|
|
||||||
dialogueTree.SetTextXml(text);
|
dialogueTree.SetTextXml(text);
|
||||||
AddTranslation(xml);
|
AddTranslation(xml);
|
||||||
@ -146,7 +176,7 @@ namespace NewHorizons.Builder.Props
|
|||||||
|
|
||||||
if (info.lookAtRadius > 0)
|
if (info.lookAtRadius > 0)
|
||||||
{
|
{
|
||||||
GameObject playerTrackingZone = new GameObject("PlayerTrackingZone");
|
var playerTrackingZone = new GameObject("PlayerTrackingZone");
|
||||||
playerTrackingZone.SetActive(false);
|
playerTrackingZone.SetActive(false);
|
||||||
|
|
||||||
playerTrackingZone.layer = LayerMask.NameToLayer("BasicEffectVolume");
|
playerTrackingZone.layer = LayerMask.NameToLayer("BasicEffectVolume");
|
||||||
@ -194,22 +224,22 @@ namespace NewHorizons.Builder.Props
|
|||||||
|
|
||||||
private static void AddTranslation(string xml)
|
private static void AddTranslation(string xml)
|
||||||
{
|
{
|
||||||
XmlDocument xmlDocument = new XmlDocument();
|
var xmlDocument = new XmlDocument();
|
||||||
xmlDocument.LoadXml(xml);
|
xmlDocument.LoadXml(xml);
|
||||||
XmlNode xmlNode = xmlDocument.SelectSingleNode("DialogueTree");
|
var xmlNode = xmlDocument.SelectSingleNode("DialogueTree");
|
||||||
XmlNodeList xmlNodeList = xmlNode.SelectNodes("DialogueNode");
|
var xmlNodeList = xmlNode.SelectNodes("DialogueNode");
|
||||||
string characterName = xmlNode.SelectSingleNode("NameField").InnerText;
|
string characterName = xmlNode.SelectSingleNode("NameField").InnerText;
|
||||||
TranslationHandler.AddDialogue(characterName);
|
TranslationHandler.AddDialogue(characterName);
|
||||||
|
|
||||||
foreach (object obj in xmlNodeList)
|
foreach (object obj in xmlNodeList)
|
||||||
{
|
{
|
||||||
XmlNode xmlNode2 = (XmlNode)obj;
|
var xmlNode2 = (XmlNode)obj;
|
||||||
var name = xmlNode2.SelectSingleNode("Name").InnerText;
|
var name = xmlNode2.SelectSingleNode("Name").InnerText;
|
||||||
|
|
||||||
XmlNodeList xmlText = xmlNode2.SelectNodes("Dialogue/Page");
|
var xmlText = xmlNode2.SelectNodes("Dialogue/Page");
|
||||||
foreach (object page in xmlText)
|
foreach (object page in xmlText)
|
||||||
{
|
{
|
||||||
XmlNode pageData = (XmlNode)page;
|
var pageData = (XmlNode)page;
|
||||||
var text = pageData.InnerText;
|
var text = pageData.InnerText;
|
||||||
// The text is trimmed in DialogueText constructor (_listTextBlocks), so we also need to trim it for the key
|
// The text is trimmed in DialogueText constructor (_listTextBlocks), so we also need to trim it for the key
|
||||||
TranslationHandler.AddDialogue(text, true, name);
|
TranslationHandler.AddDialogue(text, true, name);
|
||||||
@ -218,7 +248,7 @@ namespace NewHorizons.Builder.Props
|
|||||||
xmlText = xmlNode2.SelectNodes("DialogueOptionsList/DialogueOption/Text");
|
xmlText = xmlNode2.SelectNodes("DialogueOptionsList/DialogueOption/Text");
|
||||||
foreach (object option in xmlText)
|
foreach (object option in xmlText)
|
||||||
{
|
{
|
||||||
XmlNode optionData = (XmlNode)option;
|
var optionData = (XmlNode)option;
|
||||||
var text = optionData.InnerText;
|
var text = optionData.InnerText;
|
||||||
// The text is trimmed in CharacterDialogueTree.LoadXml, so we also need to trim it for the key
|
// The text is trimmed in CharacterDialogueTree.LoadXml, so we also need to trim it for the key
|
||||||
TranslationHandler.AddDialogue(text, true, characterName, name);
|
TranslationHandler.AddDialogue(text, true, characterName, name);
|
||||||
|
|||||||
10
NewHorizons/External/Modules/PropModule.cs
vendored
10
NewHorizons/External/Modules/PropModule.cs
vendored
@ -450,6 +450,16 @@ namespace NewHorizons.External.Modules
|
|||||||
/// Relative path to the xml file defining the dialogue.
|
/// Relative path to the xml file defining the dialogue.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string xmlFile;
|
public string xmlFile;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Optionally rename the dialogue object. The remote trigger volume will be renamed to have this as a prefix.
|
||||||
|
/// </summary>
|
||||||
|
public string rename;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Optionally set the parent object that the dialogue and remote trigger will be attached to
|
||||||
|
/// </summary>
|
||||||
|
public string parentPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
[JsonObject]
|
[JsonObject]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user