using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; public class dialogContentSystem : MonoBehaviour { public int dialogContentID; public int dialogContentScene; public List completeDialogInfoList = new List (); public int currentDialogIndex; public GameObject dialogOwner; public bool showDialogOnwerName; public bool dialogActive; public bool dialogInProcess; public bool playingExternalDialog; public bool useEventsOnStartEndDialog; public UnityEvent eventOnStartDialog; public UnityEvent eventOnEndDialog; public bool pauseAIOnDialogStart; public bool resumeAIOnDialogEnd; public bool interruptWanderAroundStateIfActiveOnDialogStart; public bool disableWanderAroundStateOnDialogEnd; public bool useAnimations; public Animator mainAnimator; public playerController mainPlayerController; public bool playerAnimationsOnDialogEnabled = true; public string dialogueActiveAnimatorName = "Dialogue Active"; public GameObject newCharacterToAddDialog; public bool useDialogContentTemplate; public dialogContentTemplate mainDialogContentTemplate; GameObject currentPlayer; Coroutine playDialogOnTriggerEnterCoroutine; Coroutine disableDialogCharacterAnimatorCoroutine; private void InitializeAudioElements () { foreach (var completeDialogInfo in completeDialogInfoList) foreach (var dialogInfo in completeDialogInfo.dialogInfoList) dialogInfo.InitializeAudioElements (); } private void Start () { InitializeAudioElements (); } public void setCurrentPlayer (GameObject newPlayer) { currentPlayer = newPlayer; } public void activateDialog () { if (dialogInProcess) { bool canActivateDialog = false; if (playingExternalDialog) { if (currentDialogIndex < completeDialogInfoList.Count && completeDialogInfoList [currentDialogIndex].playDialogWithoutPausingPlayerActions) { canActivateDialog = true; dialogActive = false; } } if (!canActivateDialog) { return; } } if (currentPlayer == null) { print ("WARNING: current player hasn't been assigned, make sure to assign the function to set current player into the electronic device component"); return; } dialogActive = !dialogActive; playerComponentsManager currentPlayerComponentsManager = currentPlayer.GetComponent (); dialogSystem currentDialogSystem = null; if (currentPlayerComponentsManager != null) { currentDialogSystem = currentPlayerComponentsManager.getMainDialogSystem (); } if (dialogActive) { if (currentDialogSystem != null) { currentDialogSystem.setNewDialogContent (this); } } else { if (currentDialogSystem != null) { if (applyDamage.checkIfDead (currentPlayer)) { currentDialogSystem.closeDialogIfActive (); } } } } public void setDialogInProcessState (bool state) { dialogInProcess = state; if (!dialogInProcess) { dialogActive = false; } } public void activateEventOnDialogStopped () { if (currentDialogIndex < completeDialogInfoList.Count) { if (completeDialogInfoList [currentDialogIndex].playDialogWithoutPausingPlayerActions) { completeDialogInfoList [currentDialogIndex].eventOnDialogStopped.Invoke (); } } } public void setNextCompleteDialogIndex () { currentDialogIndex++; if (currentDialogIndex >= completeDialogInfoList.Count) { currentDialogIndex = completeDialogInfoList.Count - 1; } } public void setPrevioustCompleteDialogIndex () { currentDialogIndex--; if (currentDialogIndex < 0) { currentDialogIndex = 0; } } public void setCompleteDialogIndex (int newIndex) { currentDialogIndex = newIndex; if (currentDialogIndex >= completeDialogInfoList.Count) { currentDialogIndex = completeDialogInfoList.Count - 1; } } public void setPlayingExternalDialogState (bool state) { playingExternalDialog = state; } public void checkIfPlayDialogOnTriggerEnter () { if (playDialogOnTriggerEnterCoroutine != null) { StopCoroutine (playDialogOnTriggerEnterCoroutine); } playDialogOnTriggerEnterCoroutine = StartCoroutine (checkIfPlayDialogOnTriggerEnterCoroutine ()); } IEnumerator checkIfPlayDialogOnTriggerEnterCoroutine () { yield return new WaitForEndOfFrame (); if (completeDialogInfoList [currentDialogIndex].playDialogOnTriggerEnter) { completeDialogInfoList [currentDialogIndex].eventToPlayDialogOnTriggerEnter.Invoke (); } } public void disableDialogCharacterAnimatorState (float delayAmount) { if (!useAnimations) { return; } stopDisableDialogCharacterAnimatorStateCoroutine (); disableDialogCharacterAnimatorCoroutine = StartCoroutine (disableDialogCharacterAnimatorStateCoroutine (delayAmount)); } public void stopDisableDialogCharacterAnimatorStateCoroutine () { if (disableDialogCharacterAnimatorCoroutine != null) { StopCoroutine (disableDialogCharacterAnimatorCoroutine); } } IEnumerator disableDialogCharacterAnimatorStateCoroutine (float delayAmount) { yield return new WaitForSeconds (delayAmount); setDialogAnimatorState (false); } public void setDialogAnimatorState (bool state) { if (mainAnimator != null) { mainAnimator.SetBool (dialogueActiveAnimatorName, state); } if (mainPlayerController != null) { mainPlayerController.setApplyRootMotionAlwaysActiveState (state); } } public void enableAnimatorLayerWeight (string animatorLayerName) { if (mainPlayerController != null) { mainPlayerController.enableAnimatorLayerWeight (animatorLayerName); } } public void checkEventsOnDialog (bool state) { if (useEventsOnStartEndDialog) { if (state) { eventOnStartDialog.Invoke (); } else { eventOnEndDialog.Invoke (); } } } public void checkIfPauseOrResumeAI (bool state) { if (dialogOwner == null) { return; } playerComponentsManager mainPlayerComponentsManager = dialogOwner.GetComponent (); if (mainPlayerComponentsManager != null) { AINavMesh mainAINavmesh = dialogOwner.GetComponent (); findObjectivesSystem mainFindObjectivesSystem = dialogOwner.GetComponent (); if (mainAINavmesh == null) { return; } if (mainFindObjectivesSystem == null) { return; } if (state) { if (interruptWanderAroundStateIfActiveOnDialogStart) { mainFindObjectivesSystem.checkIfInterruptWanderState (); } if (pauseAIOnDialogStart) { mainAINavmesh.pauseAI (true); } } else { if (resumeAIOnDialogEnd) { mainAINavmesh.pauseAI (false); } if (disableWanderAroundStateOnDialogEnd) { mainFindObjectivesSystem.disableWanderState (); } } } } public void checkIfAIFollowPlayerAfterDialogEnd (bool state) { if (dialogOwner == null) { return; } playerComponentsManager mainPlayerComponentsManager = dialogOwner.GetComponent (); if (mainPlayerComponentsManager != null) { findObjectivesSystem mainFindObjectivesSystem = dialogOwner.GetComponent (); if (mainFindObjectivesSystem == null) { return; } if (state) { if (currentPlayer != null) { mainFindObjectivesSystem.addPlayerAsPartner (currentPlayer); } } } } public void setDialogAnswerConditionCheckResult (bool state) { if (dialogActive) { playerComponentsManager currentPlayerComponentsManager = currentPlayer.GetComponent (); if (currentPlayerComponentsManager != null) { dialogSystem currentDialogSystem = currentPlayerComponentsManager.getMainDialogSystem (); if (currentDialogSystem != null) { currentDialogSystem.setDialogAnswerConditionCheckResult (state); } } } } public void setNextDialogWithConditionCheckResult (bool state) { if (dialogActive) { playerComponentsManager currentPlayerComponentsManager = currentPlayer.GetComponent (); if (currentPlayerComponentsManager != null) { dialogSystem currentDialogSystem = currentPlayerComponentsManager.getMainDialogSystem (); if (currentDialogSystem != null) { currentDialogSystem.setNextDialogWithConditionCheckResult (state); } } } } public completeDialogInfoTemplate getCompleteDialogInfoTemplateByLanguageName (string languageName) { for (int i = 0; i < mainDialogContentTemplate.completeDialogInfoTemplateList.Count; i++) { if (mainDialogContentTemplate.completeDialogInfoTemplateList [i].language.Equals (languageName)) { return mainDialogContentTemplate.completeDialogInfoTemplateList [i]; } } return null; } public int getDialogContentID () { return dialogContentID; } public int getDialogContentScene () { return dialogContentScene; } public int getCurrentDialogIndex () { return currentDialogIndex; } //Editor functions public void addNewDialog () { completeDialogInfo newCompleteDialogInfo = new completeDialogInfo (); newCompleteDialogInfo.ID = completeDialogInfoList.Count; completeDialogInfoList.Add (newCompleteDialogInfo); updateComponent (); } public void addNewLine (int dialogIndex) { dialogInfo newDialogInfo = new dialogInfo (); newDialogInfo.ID = completeDialogInfoList [dialogIndex].dialogInfoList.Count; completeDialogInfoList [dialogIndex].dialogInfoList.Add (newDialogInfo); updateComponent (); } public void addNewAnswer (int dialogIndex, int lineIndex) { dialogLineInfo newDialogLineInfo = new dialogLineInfo (); newDialogLineInfo.ID = completeDialogInfoList [dialogIndex].dialogInfoList [lineIndex].dialogLineInfoList.Count; completeDialogInfoList [dialogIndex].dialogInfoList [lineIndex].dialogLineInfoList.Add (newDialogLineInfo); updateComponent (); } public void assignIDToDialog (int newID) { dialogContentID = newID; updateComponent (); } public void assignDialogContentScene (int newScene) { dialogContentScene = newScene; updateComponent (); } public void setDialogOwnerGameObject (GameObject newOwner) { dialogOwner = newOwner; if (newOwner != null) { mainPlayerController = newOwner.GetComponentInChildren (); if (mainPlayerController != null) { dialogOwner = mainPlayerController.gameObject; mainAnimator = mainPlayerController.getCharacterAnimator (); Transform previousParent = transform.parent; transform.SetParent (mainPlayerController.transform.parent); transform.localPosition = Vector3.zero; transform.localRotation = Quaternion.identity; transform.SetParent (previousParent); followObjectPositionSystem newFollowObjectPositionSystem = GetComponent (); if (newFollowObjectPositionSystem != null) { newFollowObjectPositionSystem.setObjectToFollowFromEditor (dialogOwner.transform); } } } updateComponent (); } public void addDialogToCharacterManually () { if (newCharacterToAddDialog != null) { setDialogOwnerGameObject (newCharacterToAddDialog); newCharacterToAddDialog = null; updateComponent (); } } public void addDialogContentToTemplate () { if (mainDialogContentTemplate == null) { } if (mainDialogContentTemplate != null) { completeDialogInfoTemplate newCompleteDialogInfoTemplate = new completeDialogInfoTemplate (); newCompleteDialogInfoTemplate.language = "English"; for (int i = 0; i < completeDialogInfoList.Count; i++) { completeDialogInfo currentCompleteDialogInfo = completeDialogInfoList [i]; simpleCompleteDialogInfo newSimpleCompleteDialogInfo = new simpleCompleteDialogInfo (); newSimpleCompleteDialogInfo.Name = currentCompleteDialogInfo.Name; newSimpleCompleteDialogInfo.ID = currentCompleteDialogInfo.ID; for (int j = 0; j < currentCompleteDialogInfo.dialogInfoList.Count; j++) { dialogInfo currentDialogInfo = currentCompleteDialogInfo.dialogInfoList [j]; simpleDialogInfo newSimpleDialogInfo = new simpleDialogInfo (); newSimpleDialogInfo.Name = currentDialogInfo.Name; newSimpleDialogInfo.ID = currentDialogInfo.ID; newSimpleDialogInfo.dialogOwnerName = currentDialogInfo.dialogOwnerName; newSimpleDialogInfo.dialogContent = currentDialogInfo.dialogContent; newSimpleDialogInfo.dialogLineSound = currentDialogInfo.dialogLineSound; newSimpleDialogInfo.dialogLineAudioElement = currentDialogInfo.dialogLineAudioElement; for (int k = 0; k < currentDialogInfo.dialogLineInfoList.Count; k++) { dialogLineInfo currentDialogLineInfo = currentDialogInfo.dialogLineInfoList [k]; simpleDialogLineInfo newSimpleDialogLineInfo = new simpleDialogLineInfo (); newSimpleDialogLineInfo.Name = currentDialogLineInfo.Name; newSimpleDialogLineInfo.ID = currentDialogLineInfo.ID; newSimpleDialogLineInfo.dialogLineContent = currentDialogLineInfo.dialogLineContent; newSimpleDialogInfo.dialogLineInfoList.Add (newSimpleDialogLineInfo); } newSimpleCompleteDialogInfo.dialogInfoList.Add (newSimpleDialogInfo); } newCompleteDialogInfoTemplate.completeDialogInfoList.Add (newSimpleCompleteDialogInfo); } mainDialogContentTemplate.completeDialogInfoTemplateList.Add (newCompleteDialogInfoTemplate); updateComponent (); } } public void updateComponent () { GKC_Utils.updateComponent (this); GKC_Utils.updateDirtyScene ("Update Dialog Content Object " + gameObject.name, gameObject); } }