/// <summary> /// Completes a Criteria. /// </summary> /// <param name="player">The player who completed it</param> /// <param name="criteria">The criteria to complete</param> /// <param name="unit">The unit who completed the criteria</param> public virtual void CriteriaCompleted(CQExamplePlayer unit, CQPlayerObject player, Criteria criteria) { if (unCompletedCriterias.ContainsKey(player) != true || completedCriterias.ContainsKey(player) != true || activeCriterias.ContainsKey(player) != true || completedOptionalCriterias.ContainsKey(player) != true) { AddPlayerToCriterias(); } if (unCompletedCriterias[player].Contains(criteria)) //TODO: Some check if its in activeCriterias aswell? { ProcessCriteria(unit, player, criteria); } else if (activeOptionalCriterias[player].Contains(criteria)) { ProcessOptionalCriteria(unit, player, criteria); } else if (completedCriterias[player].Contains(criteria) || completedOptionalCriterias[player].Contains(criteria)) { //Criteria has already been completed by that player } else { Debug.LogWarning(criteria + " not found in any lists in " + this + ". " + criteria + " could not be completed"); } EventInfoHolder tmpE = new EventInfoHolder(); tmpE.player = player; tmpE.quest = this; QuestHandler.TriggerEvent("UpdateQuestTracker", tmpE); //Sends out the UpdateQuestTracker event }
/// <summary> /// Starts the progress of a quest pop up. /// </summary> /// <param name="player">The player recieving the quest pop up</param> public void StartQuestPopUp(CQPlayerObject player, Quest quest) { if (quest) { if (quest.pickUpAble == true) { if (FindObjectOfType <QuestUI>()) { EventInfoHolder tmpE = new EventInfoHolder(); tmpE.player = player; tmpE.quest = quest; tmpE.questGiver = this; QuestHandler.TriggerEvent("StartQuestPopUp", tmpE); //Sends out the StartQuestPopUp event } else { QuestHandler.Instance.QuestsDiscovered(quest, player); } } } else { Debug.LogWarning("Quest is null in: " + this.gameObject + " Cannot give quest"); } }
/// <summary> /// Is run when this criteria is completed /// </summary> /// <param name="player">The player who completed the criteria</param> public virtual void Complete(CQPlayerObject player, CQExamplePlayer unit) { EventInfoHolder tmpE = new EventInfoHolder(); tmpE.criteria = this; tmpE.player = player; tmpE.unit = unit; QuestHandler.TriggerEvent("CriteriaCompleted", tmpE); //Sends out the CriteriaCompleted event if (!dontDespawnObjectsWhenComplete) { bool despawn = true; foreach (CQPlayerObject p in quest.playersUnCompleted) { if (quest.activeCriterias[p].Contains(this)) { despawn = false; } } if (despawn == true) { foreach (SpawnZone zone in spawnZones) { zone.DespawnQuestObjects(); zone.Spawn = false; } } } }
/// <summary> /// Run if Quest failed /// </summary> /// <param name="player">The player failing the quest</param> public virtual void OnFail(CQPlayerObject player) { EventInfoHolder tmpE = new EventInfoHolder(); tmpE.quest = this; tmpE.player = player; QuestHandler.TriggerEvent("QuestFailed", tmpE); //Sends out the QuestFailed event QuestHandler.Instance.availableQuests[player].Remove(this); playersUnCompleted.Remove(player); ResetCriterias(player); if (noSpawnIfNoPlayer == true) { if (playersUnCompleted.Count <= 0) { List <Criteria> tmpCriteria = new List <Criteria>(criterias); foreach (Criteria criteria in tmpCriteria) { foreach (SpawnZone zone in criteria.spawnZones) { zone.DespawnQuestObjects(); } } StopSpawning(); } } //TODO: Delete, if all players has failed it, and they are not allowed to try again. (OneTry == true) (List of players who failed?) tmpE.player = player; tmpE.quest = this; QuestHandler.TriggerEvent("UpdateQuestTracker", tmpE); //Sends out the UpdateQuestTracker event }
/// <summary> /// Is run when this criteria fails /// </summary> public virtual void Fail(CQPlayerObject player) { EventInfoHolder tmpE = new EventInfoHolder(); tmpE.criteria = this; tmpE.player = player; QuestHandler.TriggerEvent("CriteriaFailed", tmpE); //Sends out the CriteriaFailed event quest.CriteriaFailed(player, this); remainingTimer.Remove(player); }
/// <summary> /// Give's the Reward when the player completes the quest. /// </summary> /// <param name="unit">The unit who completed the quest</param> /// <param name="player">The player who completed the quest</param> public virtual void GiveReward(CQExamplePlayer unit, CQPlayerObject player, List <Reward> rewards) { foreach (Reward reward in rewards) { EventInfoHolder tmpE = new EventInfoHolder(); tmpE.player = player; tmpE.unit = unit; tmpE.quest = this; tmpE.reward = reward; QuestHandler.TriggerEvent("GiveReward", tmpE); //Sends out the QuestCompleted event } }
/// <summary> /// Updates the player progress. /// </summary> /// <param name="player"></param> public virtual void Progress(CQPlayerObject player, CQExamplePlayer unit) { if (playerProgression.ContainsKey(player)) { playerProgression[player] += 1; if (playerProgression[player] <= amount) { EventInfoHolder tmpE = new EventInfoHolder(); tmpE.player = player; tmpE.unit = unit; tmpE.criteria = this; QuestHandler.TriggerEvent("CriterionProgress", tmpE); //Sends out the CriteriaProgress event } if (playerProgression[player] >= amount) { Quest.CriteriaCompleted(unit, player, this); } } }
/// <summary> /// Spawns Quest Objects /// </summary> /// <param name="questObject">The object to spawn</param> /// <param name="objectAmount">The amount to spawn</param> /// <param name="criteria">The criteria spawning them</param> public virtual void SpawnQuestObjects(GameObject questObject, int objectAmount, SpawnZone zone) { if (zone.spawnAreaObject) { for (int i = 0; i < objectAmount; i++) { if (zone.spawnedObjects.Count < zone.maxSpawnAmount) { GameObject tmpObject; Vector3 spawnArea = zone.spawnAreaObject.transform.position + Random.insideUnitSphere * zone.spawnRadius; spawnArea.y = zone.spawnAreaObject.transform.position.y; tmpObject = Instantiate(questObject, spawnArea, zone.spawnAreaObject.transform.rotation); if (tmpObject.GetComponent <QuestObject>()) { tmpObject.GetComponent <QuestObject>().criteria = zone.Criteria; } else { tmpObject.AddComponent <QuestObject>(); tmpObject.GetComponent <QuestObject>().criteria = zone.Criteria; } zone.spawnedObjects.Add(tmpObject); EventInfoHolder tmpE = new EventInfoHolder(); tmpE.quest = this; tmpE.gameObject = questObject; tmpE.criteria = zone.Criteria; tmpE.spawnZone = zone; QuestHandler.TriggerEvent("QuestObjectSpawned", tmpE); //Sends out the QuestObjectSpawned event } } } else { Debug.Log("No spawnAreaObject on: " + zone + ". Cannot spawn questObjects"); } }
/// <summary> /// Run this to fail a criteria /// </summary> /// <param name="critera">The criteria to fail</param> /// <param name="player">The player who failed this criteria</param> public virtual void CriteriaFailed(CQPlayerObject player, Criteria criteria) { if (unCompletedCriterias.ContainsKey(player) != true || completedCriterias.ContainsKey(player) != true || activeCriterias.ContainsKey(player) != true || completedOptionalCriterias.ContainsKey(player) != true) { AddPlayerToCriterias(); } if (unCompletedCriterias[player].Contains(criteria) && activeCriterias[player].Contains(criteria)) { activeCriterias[player].Remove(criteria); unCompletedCriterias[player].Remove(criteria); if (thresholds[criteria.Level] > activeCriterias[player].Count || thresholds[criteria.Level] == 0) { OnFail(player); } EventInfoHolder tmpE = new EventInfoHolder(); tmpE.quest = this; QuestHandler.TriggerEvent("ResetQuestInList", tmpE); //Sends out the ResetQuestInList event } else if (activeOptionalCriterias[player].Contains(criteria)) { failedOptionalCriterias[player].Add(criteria); activeOptionalCriterias[player].Remove(criteria); } }
/// <summary> /// Processes a criteria /// </summary> /// <param name="unit">The unit who completed the criteria</param> /// <param name="player">The player who completed the criteria</param> /// <param name="criteria">The criteria which is completed</param> public virtual void ProcessCriteria(CQExamplePlayer unit, CQPlayerObject player, Criteria criteria) { unCompletedCriterias[player].Remove(criteria); activeCriterias[player].Remove(criteria); completedCriterias[player].Add(criteria); if (activeCriterias[player].Count <= 0 && unCompletedCriterias[player].Count > 0) { int counter = 1; while (activeCriterias[player].Count <= 0) { //Adds the new level of criterias foreach (Criteria c in unCompletedCriterias[player]) { if (c.Level == criteria.Level + counter) { activeCriterias[player].Add(c); c.StartCriteria(player); } } if (matchOptionalLevels) { activeOptionalCriterias[player].Clear(); foreach (Criteria c in optionalCriterias) { if (c.Level == criteria.Level + counter) { activeOptionalCriterias[player].Add(c); c.StartCriteria(player); } } } counter++; if (counter > 100) { Debug.Log("infinite loop prevented"); break; } } } else if (thresholds.Count > 0) //Checks for any threshold level - Prevents errors. { if (thresholds[criteria.Level] > 0) //Ignores thresholds if its value is 0 or lower { //Threshold logic int thresholdCounter = 0; foreach (Criteria c in completedCriterias[player]) { if (c.Level == criteria.Level) { thresholdCounter += 1; } } if (thresholds[criteria.Level] <= thresholdCounter) { //Threshold reached for (int i = 0; i < activeCriterias[player].Count; i++) { //Removing the rest of the activeCriterias and uncompleted criterias unCompletedCriterias[player].Remove(activeCriterias[player][i]); activeCriterias[player].Remove(activeCriterias[player][i]); } int counter = 0; while (activeCriterias[player].Count <= 0) { //Adds the new level of criterias foreach (Criteria c in unCompletedCriterias[player]) { if (c.Level == criteria.Level + counter) { activeCriterias[player].Add(c); c.StartCriteria(player); } } if (matchOptionalLevels) { activeOptionalCriterias[player].Clear(); foreach (Criteria c in optionalCriterias) { if (c.Level == criteria.Level + counter) { activeOptionalCriterias[player].Add(c); c.StartCriteria(player); } } } counter++; if (counter > 100) { Debug.Log("infinite loop prevented"); break; } } } } } if (activeCriterias[player].Count > 0) { EventInfoHolder tmpE = new EventInfoHolder(); tmpE.quest = this; QuestHandler.TriggerEvent("ResetQuestInList", tmpE); //Sends out the ResetQuestInList event } if (autoComplete == true && activeCriterias[player].Count <= 0) { OnCompletion(player, unit); } if (CustomQuestSettings.SettingsHolder.criteriaSpecificRewards && criteria.giveRewardsOnCompletion) { GiveReward(unit, player, criteria.rewards); } criteria.Complete(player, unit); }
/// <summary> /// Run if Quest is completed /// </summary> /// <param name="player">The player completing the quest</param> /// <param name="unit">The unit completing the quest</param> public virtual void OnCompletion(CQPlayerObject player, CQExamplePlayer unit) { if (playersUnCompleted.Contains(player)) { EventInfoHolder tmpE = new EventInfoHolder(); tmpE.player = player; tmpE.unit = unit; tmpE.quest = this; QuestHandler.TriggerEvent("QuestCompleted", tmpE); //Sends out the QuestCompleted event List <Criteria> allCriterias = new List <Criteria>(criterias); allCriterias.AddRange(optionalCriterias); foreach (Criteria c in allCriterias) { if (c.type == criteriaType.Deliver || c.type == criteriaType.Gather) { for (int i = unit.items.Count - 1; i >= 0; i--) { if (unit.items[i] != null) { if (unit.items[i].GetComponent <QuestObject>()) { if (unit.items[i].GetComponent <QuestObject>().criteria == c) { c.Remove(unit.items[i].gameObject); unit.items.RemoveAt(i); } } } } } } //Gives rewards GiveReward(unit, player, rewards); //Standard rewards if (completedOptionalThreshold <= completedOptionalCriterias[player].Count) //If the player has completed enought optional objectives, gives the player the 'optional' rewards { GiveReward(unit, player, optionalRewards); //optional rewards } if (CustomQuestSettings.SettingsHolder.criteriaSpecificRewards) { foreach (Criteria c in completedCriterias[player]) { if (!c.giveRewardsOnCompletion) { GiveReward(unit, player, c.rewards); //Individual criteria rewards } } } if (CustomQuestSettings.SettingsHolder.optionalCriteriaSpecificRewards) { foreach (Criteria c in completedOptionalCriterias[player]) { if (!c.giveRewardsOnCompletion) { GiveReward(unit, player, c.rewards); //Individual optional criteria rewards } } } QuestHandler.Instance.availableQuests[player].Remove(this); foreach (Quest quest in questsToUnlock) { if (quest != null) { quest.UnlockQuest(this, player); } } // QuestHandler.Instance.UpdateQuestTracker(); if (!playersCompleted.Contains(player)) { playersCompleted.Add(player); } playersUnCompleted.Remove(player); if (noSpawnIfNoPlayer == true) { if (playersUnCompleted.Count <= 0) { List <Criteria> tmpCriteria = new List <Criteria>(criterias); tmpCriteria.AddRange(optionalCriterias); foreach (Criteria criteria in tmpCriteria) { foreach (SpawnZone zone in criteria.spawnZones) { zone.DespawnQuestObjects(); } } StopSpawning(); } } if (repeatable == false) { if (dontDelete == false) { bool delete = true; if (!singleComplete) { foreach (CQPlayerObject p in QuestHandler.Instance.players) { if (!playersCompleted.Contains(p)) { delete = false; } } } if (delete == true) { QuestHandler.Instance.allQuests.Remove(this); List <Criteria> tmpCriteria = new List <Criteria>(criterias); tmpCriteria.AddRange(optionalCriterias); foreach (Criteria criteria in tmpCriteria) { foreach (SpawnZone zone in criteria.spawnZones) { zone.DespawnQuestObjects(); } } Destroy(this.gameObject); } } } else { //Debug.Log(repeatableTime); //if (repeatableTime > 0) //{ List <Criteria> tmpCriteria = new List <Criteria>(criterias); tmpCriteria.AddRange(optionalCriterias); foreach (Criteria criteria in tmpCriteria) { if (!criteria.dontDespawnObjectsWhenComplete) { foreach (SpawnZone zone in criteria.spawnZones) { zone.DespawnQuestObjects(); } } } if (!remainingRepeatableTime.ContainsKey(player)) { remainingRepeatableTime.Add(player, repeatableTime); } else { remainingRepeatableTime[player] = repeatableTime; } tmpE.quest = this; QuestHandler.TriggerEvent("ResetQuestInList", tmpE); //Sends out the ResetQuestInList event //} tmpE.player = player; tmpE.quest = this; QuestHandler.TriggerEvent("UpdateQuestTracker", tmpE); //Sends out the UpdateQuestTracker event } } }