protected virtual void Awake() { myID = StringField.GetStringValue(QuestMachineMessages.GetID(gameObject)); InitializeQuestIndicatorUI(); InitializeStates(); RegisterWithMessageSystem(); }
/// <summary> /// Starts dialogue with the player. The content of the dialogue will depend on the quest giver's /// offerable quests and the player's quests. /// </summary> /// <param name="player">Player conversing with this QuestGiver. If null, searches the scene for a GameObject tagged Player.</param> public virtual void StartDialogue(GameObject player) { if (questDialogueUI == null && Debug.isDebugBuild) { Debug.LogWarning("Quest Machine: Can't start dialogue with " + name + ". Quest Giver doesn't have access to a quest dialogue UI.", this); return; } // If player isn't specified, find it in the scene and find relevant quest journal: if (player == null) { player = FindPlayerGameObject(); } if (player == null && Debug.isDebugBuild) { Debug.LogWarning("Quest Machine: Can't start dialogue with " + name + ". No quester specified.", this); return; } playerQuestListContainer = player.GetComponent <QuestListContainer>(); if (playerQuestListContainer == null) { var playerID = player.GetComponent <QuestMachineID>(); if (playerID != null && playerID.questListContainer != null) { playerQuestListContainer = playerID.questListContainer; } else { var playerJournalObject = FindPlayerJournalGameObject(); playerQuestListContainer = (playerJournalObject != null) ? playerJournalObject.GetComponent <QuestListContainer>() : null; } } if (playerQuestListContainer == null && Debug.isDebugBuild) { Debug.LogWarning("Quest Machine: Can't start dialogue with " + name + ". Quester " + player.name + " doesn't have a Quest Journal and can't find one in scene.", this); return; } QuestMachineTags.fallbackTextTable = textTable; // Setup player info: this.player = player; playerTextInfo = new QuestParticipantTextInfo(QuestMachineMessages.GetID(player), QuestMachineMessages.GetDisplayName(player), null, null); // Greet before recording quests in case Greet message changes a quest state: QuestMachineMessages.Greet(player, this, id); // Record quests related to this player and me: RecordQuestsByState(); StartMostRelevantDialogue(); // Note: Sends Greeted immediately after opening dialogue UI, not when closing it: QuestMachineMessages.Greeted(player, this, id); }
/// <summary> /// Adds an instance of a quest to a quester's list. If the quest's maxTimes are reached, /// deletes the quest from the giver. Otherwise starts cooldown timer until it can be /// given again. /// </summary> /// <param name="quest">Quest to give to quester.</param> /// <param name="questerQuestListContainer">Quester's quest list container.</param> public virtual void GiveQuestToQuester(Quest quest, QuestListContainer questerQuestListContainer) { if (quest == null) { return; } if (questerQuestListContainer == null) { Debug.LogWarning("Quest Machine: " + name + ".GiveQuestToQuester - quester (QuestListContainer) is null.", this); return; } var questerTextInfo = new QuestParticipantTextInfo(QuestMachineMessages.GetID(questerQuestListContainer.gameObject), QuestMachineMessages.GetDisplayName(questerQuestListContainer.gameObject), null, null); GiveQuestToQuester(quest, questerTextInfo, questerQuestListContainer); }
public virtual void OnMessage(MessageArgs messageArgs) { var target = messageArgs.targetString; if (!(string.IsNullOrEmpty(target) || string.Equals(target, myID) || StringField.Equals(QuestMachineMessages.GetID(target), myID))) { return; } switch (messageArgs.message) { case QuestMachineMessages.SetIndicatorStateMessage: SetIndicatorState(messageArgs.parameter, (QuestIndicatorState)messageArgs.firstValue); break; case QuestMachineMessages.RefreshIndicatorMessage: case QuestMachineMessages.RefreshUIsMessage: Repaint(); break; } }
public override void ApplyData(string data) { if (!includeInSavedGameData) { return; } if (string.IsNullOrEmpty(data)) { return; } try { QuestMachine.isLoadingGame = true; var saveData = SaveSystem.Deserialize <SaveData>(data); if (saveData == null) { return; } // Clear current quest list: DestroyQuestInstances(); // Adds them to deletedStaticQuests, but that's OK since we're going to restore deletedStaticQuests. // Restore dynamic quests: for (int i = 0; i < saveData.proceduralQuests.Count; i++) { try { var questProxy = JsonUtility.FromJson <QuestProxy>(saveData.proceduralQuests[i]); if (questProxy == null) { continue; } var quest = ScriptableObject.CreateInstance <Quest>(); quest.name = questProxy.displayName; questProxy.CopyTo(quest); AddQuest(quest); } catch (Exception e) { if (Debug.isDebugBuild) { Debug.LogWarning("Quest Machine: Unable to restore quest from serialized quest proxy. Message: " + e.Message + "\nData: " + saveData.proceduralQuests[i], this); } } } // Restore list of deleted static quests: deletedStaticQuests.Clear(); deletedStaticQuests.AddRange(saveData.deletedStaticQuests); // Restore static quests: for (int i = 0; i < Mathf.Min(saveData.staticQuestIds.Count, saveData.staticQuestData.Count); i++) { var questID = saveData.staticQuestIds[i]; var questData = saveData.staticQuestData[i]; if (string.IsNullOrEmpty(questID) || questData == null || questData.bytes == null) { continue; } if (deletedStaticQuests.Contains(questID)) { continue; } var quest = QuestMachine.GetQuestAsset(questID); if (quest == null) { quest = originalQuestList.Find(x => string.Equals(StringField.GetStringValue(x.id), questID)); } if (quest == null && Debug.isDebugBuild) { Debug.LogError("Quest Machine: " + name + " Can't find quest " + saveData.staticQuestIds[i] + ". Is it registered with Quest Machine?", this); } if (quest == null) { continue; } quest = quest.Clone(); try { QuestStateSerializer.DeserializeInto(quest, questData.bytes, true); } catch (Exception e) { try { if (Debug.isDebugBuild) { Debug.LogWarning("Quest Machine: Unable to restore quest: " + quest.name + ". Message: " + e.Message, this); } Destroy(quest); } catch (Exception) { } quest = quest.Clone(); } AddQuest(quest); } QuestMachineMessages.RefreshIndicator(this, QuestMachineMessages.GetID(this)); } finally { QuestMachine.isLoadingGame = false; } }