Beispiel #1
0
 public Quest(uint questid, ulong guid)
 {
     this.QuestId    = questid;
     this.PlayerGuid = guid;
     Status          = QuestStatuses.QUEST_STATUS_INCOMPLETE;
 }
Beispiel #2
0
 public Quest(uint questid)
 {
     this.QuestId = questid;
     Status       = QuestStatuses.QUEST_STATUS_INCOMPLETE;
 }
Beispiel #3
0
        public static uint GetDialogStatus(this Player p, WorldObject obj, uint defStatus)
        {
            QuestStatuses           status  = QuestStatuses.QUEST_STATUS_NONE;
            HashSet <QuestTemplate> rbounds = new HashSet <QuestTemplate>();
            HashSet <QuestTemplate> ibounds = new HashSet <QuestTemplate>();

            if (obj.IsTypeOf(ObjectTypes.TYPE_UNIT) && !obj.IsTypeOf(ObjectTypes.TYPE_PLAYER))
            {
                uint entry = ((Creature)obj).Entry;
                rbounds = new HashSet <QuestTemplate>(Database.CreatureQuests.TryGet(entry).Select(x => Database.QuestTemplates.TryGet(x.QuestEntry)));
                ibounds = new HashSet <QuestTemplate>(Database.CreatureInvolvedQuests.TryGet(entry).Select(x => Database.QuestTemplates.TryGet(x.QuestEntry)));

                if (((Creature)obj).IsEnemyTo(p))
                {
                    return((uint)QuestGiverStatuses.QUEST_GIVER_NONE);
                }
            }
            else if (obj.IsTypeOf(ObjectTypes.TYPE_GAMEOBJECT))
            {
                rbounds = new HashSet <QuestTemplate>(); //TODO gameobject quests
            }
            else
            {
                return((uint)QuestGiverStatuses.QUEST_GIVER_NONE);
            }

            //Quest Finish
            foreach (QuestTemplate qt in ibounds)
            {
                QuestGiverStatuses dialogStatusNew = QuestGiverStatuses.QUEST_GIVER_NONE;
                status = p.GetQuestStatus(qt.QuestId);

                Quest quest = null;
                if (p.Quests.ContainsKey(qt.QuestId))
                {
                    quest = p.Quests[qt.QuestId];
                }

                if ((status == QuestStatuses.QUEST_STATUS_COMPLETE && quest?.Rewarded != true) || qt.IsAutoComplete)
                {
                    return((uint)QuestGiverStatuses.QUEST_GIVER_REWARD); //Turn in is priority
                }
                else if (status == QuestStatuses.QUEST_STATUS_INCOMPLETE)
                {
                    dialogStatusNew = QuestGiverStatuses.QUEST_GIVER_NONE;
                }

                if ((uint)dialogStatusNew > defStatus)
                {
                    defStatus = (uint)dialogStatusNew;
                }
            }

            //Quest start
            foreach (QuestTemplate qt in rbounds)
            {
                if (qt == null)
                {
                    continue;
                }

                QuestGiverStatuses dialogStatusNew = QuestGiverStatuses.QUEST_GIVER_NONE;
                status = p.GetQuestStatus(qt.QuestId);

                if (status == QuestStatuses.QUEST_STATUS_NONE) //QUEST_STATUS_NONE aka New Quest
                {
                    if (!p.CheckQuestRequirements(qt, false) || !p.CheckQuestLevel(qt, false))
                    {
                        continue;
                    }

                    if (qt.IsAutoComplete)
                    {
                        dialogStatusNew = QuestGiverStatuses.QUEST_GIVER_REWARD; //Autocomplete just show icon
                    }
                    else if (p.Level < qt.MinLevel && p.Level >= qt.MinLevel - 4)
                    {
                        dialogStatusNew = QuestGiverStatuses.QUEST_GIVER_FUTURE; //Player is in level range of accepting soon (silver icon)
                    }
                    else if (p.Level >= qt.MinLevel && p.Level < qt.QuestLevel + 7)
                    {
                        dialogStatusNew = QuestGiverStatuses.QUEST_GIVER_QUEST; //Player in level range (yellow icon)
                    }
                    else if (p.Level > qt.QuestLevel + 7)
                    {
                        dialogStatusNew = QuestGiverStatuses.QUEST_GIVER_TRIVIAL; //Trivial for player (grey icon hovered)
                    }
                }

                if ((uint)dialogStatusNew > defStatus)
                {
                    defStatus = (uint)dialogStatusNew;
                }
            }

            return(defStatus);
        }
Beispiel #4
0
        public static void SendQuestGiverRequestItems(this Player p, QuestTemplate quest, QuestStatuses status, ulong guid, bool CloseOnCancel)
        {
            bool completeable = p.CanCompleteQuest(quest.QuestId);

            if (!quest.IsAutoComplete && status != QuestStatuses.QUEST_STATUS_COMPLETE) //Check if it is complete
            {
                completeable = false;
            }

            if (p.Quests.ContainsKey(quest.QuestId))
            {
                if (p.Quests[quest.QuestId]?.Rewarded == true)
                {
                    completeable = false;
                }
            }

            PacketWriter packet = new PacketWriter(Opcodes.SMSG_QUESTGIVER_REQUEST_ITEMS);

            packet.WriteUInt64(guid);
            packet.WriteUInt32(quest.QuestId);
            packet.WriteString(quest.Title);
            packet.WriteString(quest.RequestItemsText);
            packet.WriteUInt32(0);
            packet.WriteUInt32(0);
            packet.WriteUInt32(CloseOnCancel ? (uint)1 : 0);
            packet.WriteUInt32(quest.RewOrReqMoney < 0 ? (uint)-quest.RewOrReqMoney : 0);

            packet.WriteUInt32((uint)quest.GetReqItemCount);
            for (int i = 0; i < 4; i++)
            {
                packet.WriteUInt32(quest.ReqItemId[i]);
                packet.WriteUInt32(quest.ReqItemCount[i]);
                packet.WriteUInt32(Database.ItemTemplates.TryGet(quest.ReqItemId[i])?.DisplayID ?? 0);
            }

            packet.WriteUInt32(2);
            packet.WriteUInt32(completeable ? (uint)3 : 0);
            packet.WriteUInt32(4);
            packet.WriteUInt32(8);
            packet.WriteUInt32(0x10);
            p.Client.Send(packet);
        }
Beispiel #5
0
        public static void SendPreparedQuest(this Player p, WorldObject obj)
        {
            QuestStatuses           status  = QuestStatuses.QUEST_STATUS_NONE;
            QuestMenu               menu    = new QuestMenu();
            HashSet <QuestTemplate> rbounds = new HashSet <QuestTemplate>();
            HashSet <QuestTemplate> ibounds = new HashSet <QuestTemplate>();

            if (obj.IsTypeOf(ObjectTypes.TYPE_UNIT) && !obj.IsTypeOf(ObjectTypes.TYPE_PLAYER))
            {
                uint entry = ((Creature)obj).Entry;
                rbounds = new HashSet <QuestTemplate>(Database.CreatureQuests.TryGet(entry).Select(x => Database.QuestTemplates.TryGet(x.QuestEntry)));
                ibounds = new HashSet <QuestTemplate>(Database.CreatureInvolvedQuests.TryGet(entry).Select(x => Database.QuestTemplates.TryGet(x.QuestEntry)));
            }
            else if (obj.IsTypeOf(ObjectTypes.TYPE_GAMEOBJECT))
            {
                rbounds = new HashSet <QuestTemplate>(); //TODO gameobject quests
            }
            //Finish quest
            foreach (QuestTemplate qt in ibounds)
            {
                if (qt == null)
                {
                    continue;
                }

                Quest quest = null;
                if (p.Quests.ContainsKey(qt.QuestId))
                {
                    quest = p.Quests[qt.QuestId];
                }

                status = p.GetQuestStatus(qt.QuestId);

                if (status == QuestStatuses.QUEST_STATUS_COMPLETE && quest?.Rewarded == false)
                {
                    menu.AddItem(qt, QuestStatuses.QUEST_STATUS_COMPLETE);
                }
                else if (status == QuestStatuses.QUEST_STATUS_INCOMPLETE) //Incomplete
                {
                    menu.AddItem(qt, QuestStatuses.QUEST_STATUS_INCOMPLETE);
                }
                else if (status == QuestStatuses.QUEST_STATUS_AVAILABLE)
                {
                    menu.AddItem(qt, QuestStatuses.QUEST_STATUS_AVAILABLE);
                }
            }

            //Check all object's quests
            foreach (QuestTemplate qt in rbounds)
            {
                if (qt == null)
                {
                    continue;
                }

                if (p.GetQuestStatus(qt.QuestId) == QuestStatuses.QUEST_STATUS_NONE) //QUEST_STATUS_NONE aka New Quest
                {
                    if (!p.CheckQuestRequirements(qt, false) || !p.CheckQuestLevel(qt, false))
                    {
                        continue;
                    }

                    if (qt.IsAutoComplete)
                    {
                        menu.AddItem(qt, QuestStatuses.QUEST_STATUS_COMPLETE); //Autocomplete just show icon
                    }
                    else
                    {
                        menu.AddItem(qt, QuestStatuses.QUEST_STATUS_AVAILABLE);
                    }
                }
            }

            if (menu.Count == 1)
            {
                var quest = menu.MenuItems.First();
                if (quest.Value == QuestStatuses.QUEST_STATUS_COMPLETE)
                {
                    if (quest.Key.GetRewItemCount > 0)
                    {
                        p.SendQuestGiverRequestItems(quest.Key, quest.Value, obj.Guid, true); //Send complete
                    }
                    else
                    {
                        p.SendQuestGiverOfferReward(quest.Key, obj.Guid, true); //Send complete
                    }
                }
                else if (quest.Value == QuestStatuses.QUEST_STATUS_INCOMPLETE)
                {
                    p.SendQuestGiverRequestItems(quest.Key, quest.Value, obj.Guid, true);
                }
                else
                {
                    p.SendQuestGiverQuestDetails(quest.Key, obj.Guid, true); //Send details
                }
            }
            else
            {
                //Todo gossip text & emotes
                p.SendQuestGiverQuestList("Greetings $N", obj.Guid, menu.MenuItems);
            }

            p.UpdateSurroundingQuestStatus();
        }
Beispiel #6
0
 public void AddItem(QuestTemplate quest, QuestStatuses status)
 {
     this.MenuItems.Add(quest, status);
 }