public void HandleEvent(Objective_Type type, uint entry, int count, bool suppressGroupBroadcast = false) { Player player = _Owner as Player; if (!suppressGroupBroadcast) { if (player?.PriorityGroup != null) { Group currentGroup = player.PriorityGroup; foreach (Player member in currentGroup.GetPlayersCloseTo(player, 150)) { if (member != player) { member.QtsInterface.HandleEvent(type, entry, count, true); } } } } if (_Owner is Pet && _Owner.GetPet().Owner != null) { _Owner.GetPet().Owner.QtsInterface.HandleEvent(type, entry, count, true); } // Check every quest a player has... foreach (KeyValuePair <ushort, Character_quest> questKp in Quests) { // For each objective in every quest... foreach (Character_Objectives objective in questKp.Value._Objectives) { if (objective.Objective == null) { continue; } // RB 7/4/2016 Allow objectives to be completed in an order if (objective.Objective.PreviousObj > 0) { Character_Objectives previousObjective = questKp.Value._Objectives.FirstOrDefault(o => o.Objective.Guid == objective.Objective.PreviousObj); if (previousObjective != null && !previousObjective.IsDone()) { continue; } } if (objective.Objective.ObjType == (uint)type && !objective.IsDone()) { if (objective.Objective.PQArea > 0) { bool skip = true; if (player.CurrentKeep != null && player.CurrentKeep.Realm == player.Realm && player.CurrentKeep.Info.PQuest != null && player.CurrentKeep.Info.PQuest.Entry == objective.Objective.PQArea) { skip = false; } else if (PublicQuest != null && PublicQuest.Info.Entry == objective.Objective.PQArea) { skip = false; } if (skip) { continue; } } if (!string.IsNullOrEmpty(objective.Objective.inZones)) { string[] temp = objective.Objective.inZones.Split(','); if (temp != null && (player.Zone == null || !temp.Contains("" + player.Zone.ZoneId))) { continue; } } bool canAdd = false; int newCount = objective.Count; switch (type) { case Objective_Type.QUEST_SPEAK_TO: case Objective_Type.QUEST_KILL_MOB: case Objective_Type.QUEST_PROTECT_UNIT: if (objective.Objective.Creature != null && entry == objective.Objective.Creature.Entry) { canAdd = true; newCount += count; } break; case Objective_Type.QUEST_KILL_GO: if (objective.Objective.GameObject != null && entry == objective.Objective.GameObject.Entry) { canAdd = true; newCount += count; } break; case Objective_Type.QUEST_KILL_PLAYERS: if (objective.Objective != null) { int result; if (int.TryParse(objective.Objective.ObjID, out result)) { if (result == 0 || ((result >> ((byte)entry - 1)) & 1) == 1) { canAdd = true; newCount += count; } } } break; case Objective_Type.QUEST_GET_ITEM: case Objective_Type.QUEST_USE_ITEM: if (objective.Objective.Item != null && entry == objective.Objective.Item.Entry) { canAdd = true; newCount = _Owner.GetPlayer().ItmInterface.GetItemCount(entry); } break; case Objective_Type.QUEST_USE_GO: if (objective.Objective.GameObject != null && entry == objective.Objective.GameObject.Entry) { // This will turn off Interactable flag on clicked GO, some more work can be // done with GO despawning and UNKs[3] unk modification // Default respawn time: 60 seconds Object target = player.CbtInterface.GetCurrentTarget(); if (target != null) { GameObject go = target.GetGameObject(); if (go != null && go.IsGameObject()) { if (go.Spawn.AllowVfxUpdate == 1) { go.VfxState = 1; } go.Interactable = false; go.EvtInterface.AddEvent(MakeGOInteractable, 60000, 1, target); } } canAdd = true; newCount += count; } break; case Objective_Type.QUEST_WIN_SCENARIO: if (objective.Objective.Scenario != null && entry == objective.Objective.Scenario.ScenarioId) { canAdd = true; newCount += count; } break; case Objective_Type.QUEST_CAPTURE_BO: if (objective.Objective.BattleFrontObjective != null && entry == objective.Objective.BattleFrontObjective.Entry) { canAdd = true; newCount += count; } break; case Objective_Type.QUEST_CAPTURE_KEEP: if (objective.Objective.Keep != null && entry == objective.Objective.Keep.KeepId) { canAdd = true; newCount += count; } break; default: if (objective.Objective.Guid == entry) { canAdd = true; newCount += count; } break; } if (canAdd) { objective.Count = newCount; questKp.Value.Dirty = true; SendQuestUpdate(questKp.Value); CharMgr.Database.SaveObject(questKp.Value); if (objective.IsDone()) { Creature finisher; foreach (Object obj in _Owner.ObjectsInRange) { if (obj.IsCreature()) { finisher = obj.GetCreature(); if (QuestService.HasQuestToFinish(finisher.Entry, questKp.Value.Quest.Entry)) { finisher.SendMeTo(_Owner.GetPlayer()); } } } } } } } } }
public void FinishQuestAndTeleportOutside(ushort Quest) { foreach (Object inRange in stuffInRange) { if (inRange != null) { Player player = inRange as Player; if (player != null && player.IsPlayer() && player.CbtInterface.IsInCombat) { if (player.QtsInterface.GetQuest(Quest) != null) { Character_quest quest = player.QtsInterface.GetQuest(Quest); foreach (KeyValuePair <ushort, Character_quest> questKp in player.QtsInterface.Quests) { if (questKp.Value == quest) { foreach (Character_Objectives objective in questKp.Value._Objectives) { if (objective.Objective == null) { continue; } objective.Count = 1; questKp.Value.Dirty = true; player.QtsInterface.SendQuestUpdate(questKp.Value); CharMgr.Database.SaveObject(questKp.Value); if (objective.IsDone()) { Creature finisher; foreach (Object obj in player.ObjectsInRange) { if (obj.IsCreature()) { finisher = obj.GetCreature(); if (QuestService.HasQuestToFinish(finisher.Entry, questKp.Value.Quest.Entry)) { finisher.SendMeTo(player.GetPlayer()); } } } } } } } } var prms = new List <object>() { player }; if (!player.IsInvulnerable) { player.EvtInterface.AddEvent(KickPlayerOutside, 1500, 1, prms); } } } } }