Ejemplo n.º 1
0
        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());
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        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);
                        }
                    }
                }
            }
        }