Пример #1
0
 public QuestScript(string sScriptName, int nAct, string sScriptContents, QuestEntry quest, WvsGameClient client)
     : base(sScriptName, sScriptContents, client)
 {
     Context   = new QuestScriptContext(this);
     Quest     = quest;
     this.nAct = nAct;
 }
Пример #2
0
            public static COutPacket UserQuestResult(QuestResultType op, QuestEntry pQuest, int nNpcTemplateId = 0, short usNextQuestID = 0)
            {
                var p = new COutPacket(SendOps.LP_UserQuestResult);

                p.Encode1(op);

                switch (op)
                {
                case QuestResultType.Failed_Equipped:
                case QuestResultType.Failed_Meso:
                case QuestResultType.Failed_OnlyItem:
                case QuestResultType.Failed_Unknown:
                    return(p);

                case QuestResultType.Failed_Inventory:
                case QuestResultType.Reset_QuestTimer:
                case QuestResultType.Failed_TimeOver:
                    p.Encode2(pQuest.nQuestID);
                    return(p);

                case QuestResultType.Success:
                    p.Encode2(pQuest.nQuestID);
                    p.Encode4(nNpcTemplateId);
                    p.Encode2(usNextQuestID);                             // 0 if no next
                    break;
                }

                return(p);
            }
Пример #3
0
            public static COutPacket QuestRecordMessage(QuestEntry pQuest)
            {
                var p = new COutPacket(SendOps.LP_Message);

                p.Encode1(MessageType.QuestRecordMessage);
                p.Encode2(pQuest.nQuestID);
                p.Encode1((byte)pQuest.nState);

                switch (pQuest.nState)
                {
                case QuestActType.NotStarted:
                    p.Encode1(0);
                    // nothing
                    break;

                case QuestActType.QuestAccept:
                    p.EncodeString(pQuest.sQRValue);
                    // accept time, idc -> used for a few quests to determine when it can be completed
                    //p.EncodeDateTime(DateTime.Now.AddMinutes(-3));
                    break;

                case QuestActType.QuestComplete:
                    p.EncodeDateTime(pQuest.tCompleted);
                    break;
                }

                return(p);
            }
Пример #4
0
 private void PopulatePopup()
 {
     foreach (Quest q in _currentQuests)
     {
         QuestEntry newEntry = Instantiate(questPlaceHolder).GetComponentInChildren <QuestEntry>();
         newEntry.quest = q;
         newEntry.gameObject.SetActive(true);
         newEntry.transform.SetParent(questContainer.transform);
     }
 }
Пример #5
0
 public static QuestResult ActivateQuest(User user, QuestEntry quest, bool npcActivation = false, QuestResult res = null)
 {
     if (CanComplete(user, quest))
     {
         return(CompleteQuest(user, quest, npcActivation, res));
     }
     else
     {
         return(FailQuest(user, quest, npcActivation, res));
     }
 }
Пример #6
0
        public QuestScript GetQuestScript(int nQuestID, int nAct, QuestEntry pQuest, WvsGameClient c)
        {
            var sScriptName = $"{nQuestID}";

            var script = GetScript(ScriptType.Quest, sScriptName, c);

            if (script.Length <= 0)
            {
                return(null);
            }

            return(new QuestScript(sScriptName, nAct, script, pQuest, c));
        }
Пример #7
0
        public static QuestResult FailQuest(User user, QuestEntry quest, bool npcActivation = false, QuestResult res = null)
        {
            if (res == null)
            {
                res = new QuestResult();
            }
            res.QuestCompleted = false;

            if (npcActivation)
            {
                if (quest.GotoNpcChatpoint != -1)
                {
                    res.GotoChatpoint = quest.GotoNpcChatpoint;
                }
                if (quest.HideReplyOnFail != false)
                {
                    res.HideRepliesOnFail = quest.HideReplyOnFail;
                }
                if (res.SetChatpoint != -1)
                {
                    res.SetChatpoint = quest.SetNpcChatpoint;
                }
            }
            if (quest.FailNpcChat != null)
            {
                if (!npcActivation)
                {
                    byte[] ChatPacket = PacketBuilder.CreateChat(quest.FailNpcChat, PacketBuilder.CHAT_BOTTOM_RIGHT);
                    user.LoggedinClient.SendPacket(ChatPacket);
                }
                else
                {
                    if (quest.FailNpcChat != null)
                    {
                        if (npcActivation)
                        {
                            if (quest.FailNpcChat != "")
                            {
                                res.NpcChat = quest.FailNpcChat;
                            }
                        }
                    }
                }
            }
            return(res);
        }
Пример #8
0
        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();

            switch (version)
            {
            case 0:

                m_Points     = reader.ReadInt();
                m_Credits    = reader.ReadInt();
                m_Completed  = reader.ReadInt();
                m_Rank       = reader.ReadInt();
                m_DeltaRank  = reader.ReadInt();
                m_WhenRanked = reader.ReadDateTime();

                int nquests = reader.ReadInt();

                if (nquests > 0)
                {
                    QuestList = new ArrayList(nquests);
                    for (int i = 0; i < nquests; i++)
                    {
                        QuestEntry e = new QuestEntry();
                        e.Deserialize(reader);

                        QuestList.Add(e);
                    }
                }



                // get the owner of this in order to rebuild the rankings
                Mobile quester = reader.ReadMobile();

                // rebuild the ranking list
                // if they have never made a kill, then dont rank
                if (quester != null && QuestsCompleted > 0)
                {
                    XmlQuestLeaders.UpdateQuestRanking(quester, this);
                }
                break;
            }
        }
Пример #9
0
        public static void GiveQuestPoints(Mobile from, IXmlQuest quest)
        {
            if (from == null || quest == null)
            {
                return;
            }

            // find the XmlQuestPoints attachment

            XmlQuestPoints p = (XmlQuestPoints)XmlAttach.FindAttachment(from, typeof(XmlQuestPoints));

            // if doesnt have one yet, then add it
            if (p == null)
            {
                p = new XmlQuestPoints();
                XmlAttach.AttachTo(from, p);
            }

            // if you wanted to scale the points given based on party size, karma, fame, etc.
            // this would be the place to do it
            int points = quest.Difficulty;

            // update the questpoints attachment information
            p.Points  += points;
            p.Credits += points;
            p.QuestsCompleted++;

            if (from != null)
            {
                from.SendMessage("You have received {0} quest points!", points);
            }

            // add the completed quest to the quest list
            QuestEntry.AddQuestEntry(from, quest);

            // update the overall ranking list
            XmlQuestLeaders.UpdateQuestRanking(from, p);
        }
Пример #10
0
        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();

            switch(version)
            {
                case 0:

                    m_Points = reader.ReadInt();
                    m_Credits = reader.ReadInt();
                    m_Completed = reader.ReadInt();
                    m_Rank = reader.ReadInt();
                    m_DeltaRank = reader.ReadInt();
                    m_WhenRanked = reader.ReadDateTime();

                    int nquests = reader.ReadInt();

                    if(nquests > 0)
                    {
                        QuestList = new ArrayList(nquests);
                        for(int i = 0; i< nquests;i++)
                        {
                            QuestEntry e = new QuestEntry();
                            e.Deserialize(reader);

                            QuestList.Add(e);
                        }
                    }

                    // get the owner of this in order to rebuild the rankings
                    Mobile quester = reader.ReadMobile();

                    // rebuild the ranking list
                    // if they have never made a kill, then dont rank
                    if(quester != null && QuestsCompleted > 0)
                    {
                        XmlQuestLeaders.UpdateQuestRanking(quester, this);
                    }
                    break;
            }
        }
Пример #11
0
    public void Load()
    {
        List <int> completedQuestIDs;

        using (Stream stream = File.Open("savedQuestData.dat", FileMode.Open))
        {
            var bformatter = new BinaryFormatter();
            completedQuestIDs = (List <int>)bformatter.Deserialize(stream);
        }

        QuestEntry tempQuestEntry = new QuestEntry(); // used to apply quest upgrades

        tempQuestEntry.player = FindObjectOfType <Player>();
        tempQuestEntry.BM     = FindObjectOfType <GameManager>().BM;

        // fill quest GUI
        addQuest();
        addQuest();
        addQuest();

        // complete each saved quest
        foreach (int ID in completedQuestIDs)
        {
            Quest quest = new Quest();

            // find quest by ID
            foreach (Quest uncompletedQuest in quests)
            {
                if (uncompletedQuest.ID == ID)
                {
                    quest = uncompletedQuest;
                }
            }

            //quests.Remove(quest); // remove quest from list

            // apply quest upgrade if not gas or health
            if (quest.upgradeReward.Length > 0 && quest.upgradeReward != "gas" && quest.upgradeReward != "health")
            {
                tempQuestEntry.upgradeReward = quest.upgradeReward;
                tempQuestEntry.UpgradeReward();
            }

            // remove quest from UI if it is present
            if (questEntry1.quest == quest)
            {
                questEntry1.clearRewards(); // remove rewards (should be saved by other means)
                if (questEntry1.questType == "boss")
                {
                    Destroy(questEntry1.boss);
                }
                questEntry1.questCompleted(); // mark as complete
                addQuest();                   // add new quest to GUI
            }
            else if (questEntry2.quest == quest)
            {
                questEntry2.clearRewards();
                if (questEntry2.questType == "boss")
                {
                    Destroy(questEntry2.boss);
                }
                questEntry2.questCompleted();
                addQuest(); // add new quest to GUI
            }
            else if (questEntry3.quest == quest)
            {
                questEntry3.clearRewards();
                if (questEntry3.questType == "boss")
                {
                    Destroy(questEntry3.boss);
                }
                questEntry3.questCompleted();
                addQuest(); // add new quest to GUI
            }
        }
    }
Пример #12
0
        public static void Start()
        {
            ConsoleUtils.Write(ConsoleMsgType.Status, "Loading Quest Database...\n");

            DB = new Dictionary <int, QuestEntry>();
            Database      db    = new Database(Server.GameDbConString);
            StringBuilder query = new StringBuilder(
                "SELECT `id`,`min_level`,`max_level`," +
                "`min_job_level`,`max_job_level`," +
                "`limit_races`,`limit_classes`,`limit_depth`," +
                "`repeatable`," +
                "`exp`,`jp`,`holic_point`,`gold`," +
                "`drop_group`,`type`,");

            for (int i = 0; i < Quest.MaxObjectives; i++)
            {
                query.Append("`objective" + i + "`,");
            }
            query.Append("`default_reward_id`,`default_reward_level`,`default_reward_quantity`,");

            for (int i = 1; i < Quest.MaxRewards; i++)
            {
                query.Append("`optional_reward_id" + i + "`,`optional_reward_level" + i + "`,`optional_reward_quantity" + i + "`,");
            }

            query.Remove(query.Length - 1, 1);             // removes last comma
            query.Append(" FROM `quest_db`");

            MySqlDataReader reader =
                db.ReaderQuery(query.ToString(), null, null);

            while (reader.Read())
            {
                QuestEntry quest = new QuestEntry();
                quest.Objectives   = new int[Quest.MaxObjectives];
                quest.Rewards      = new int[Quest.MaxRewards];
                quest.RewardsCount = new int[Quest.MaxRewards];
                quest.RewardsLevel = new sbyte[Quest.MaxRewards];

                int id = (int)reader["id"];
                quest.MinLevel     = (int)reader["min_level"];
                quest.MaxLevel     = (int)reader["max_level"];
                quest.MinJobLevel  = (int)reader["min_job_level"];
                quest.MaxJobLevel  = (int)reader["max_job_level"];
                quest.LimitRaces   = (Db.Races)(sbyte) reader["limit_races"];
                quest.LimitClasses = (Db.Classes)(sbyte) reader["limit_classes"];
                quest.LimitDepth   = (Db.JobDepth)(sbyte) reader["limit_depth"];
                quest.Repeatable   = (bool)reader["repeatable"];
                quest.Exp          = (int)reader["exp"];
                quest.JP           = (int)reader["jp"];
                quest.HolicPoint   = (int)reader["holic_point"];
                quest.Gold         = (int)reader["gold"];
                quest.DropGroup    = (int)reader["drop_group"];
                quest.Type         = (Quest.Type)(int) reader["type"];
                for (int i = 0; i < Quest.MaxObjectives; i++)
                {
                    quest.Objectives[i] = (int)reader["objective" + i];
                }

                quest.Rewards[0]      = (int)reader["default_reward_id"];
                quest.RewardsLevel[0] = (sbyte)reader["default_reward_level"];
                quest.RewardsCount[0] = (int)reader["default_reward_quantity"];

                for (int i = 1; i < Quest.MaxRewards; i++)
                {
                    quest.Rewards[i]      = (int)reader["optional_reward_id" + i];
                    quest.RewardsLevel[i] = (sbyte)reader["optional_reward_level" + i];
                    quest.RewardsCount[i] = (int)reader["optional_reward_quantity" + i];
                }

                DB.Add(id, quest);
            }

            ConsoleUtils.Write(ConsoleMsgType.Status, "Quest Database Loaded.\n");
        }
Пример #13
0
 public static void AddQuestEntry(QuestEntry quest)
 {
     questList.Add(quest);
 }
Пример #14
0
        public static QuestResult CompleteQuest(User user, QuestEntry quest, bool npcActivation = false, QuestResult res = null)
        {
            if (res == null)
            {
                res = new QuestResult();
            }
            // Take Items
            foreach (QuestItemInfo itemInfo in quest.ItemsRequired)
            {
                InventoryItem itm = user.Inventory.GetItemByItemId(itemInfo.ItemId);
                for (int i = 0; i < itemInfo.Quantity; i++)
                {
                    user.Inventory.Remove(itm.ItemInstances[0]);
                }
            }
            // Take Money
            user.TakeMoney(quest.MoneyCost);
            // Give money
            user.AddMoney(quest.MoneyEarned);
            // Give items
            foreach (QuestItemInfo itemInfo in quest.ItemsEarned)
            {
                for (int i = 0; i < itemInfo.Quantity; i++)
                {
                    ItemInstance         itm             = new ItemInstance(itemInfo.ItemId);
                    Item.ItemInformation itemInformation = itm.GetItemInfo();
                    if (itemInformation.Type == "CONCEPTUAL")
                    {
                        Item.ConsumeItem(user, itemInformation);
                    }
                    else
                    {
                        user.Inventory.AddIgnoringFull(itm);
                    }
                }
            }
            if (quest.WarpX != 0 && quest.WarpY != 0)
            {
                user.Teleport(quest.WarpX, quest.WarpY);
            }

            // Give quest points
            user.QuestPoints += quest.QuestPointsEarned;

            res.QuestCompleted = true;
            if (npcActivation)
            {
                if (quest.SuccessNpcChat != null && quest.SuccessNpcChat != "")
                {
                    res.NpcChat = quest.SuccessNpcChat;
                }

                if (quest.SetNpcChatpoint != -1)
                {
                    res.SetChatpoint = quest.SetNpcChatpoint;
                }

                if (quest.GotoNpcChatpoint != -1)
                {
                    res.GotoChatpoint = quest.GotoNpcChatpoint;
                }
            }

            if (quest.Tracked)
            {
                user.Quests.TrackQuest(quest.Id);
            }

            if (quest.ChainedQuestId != 0)
            {
                res = ActivateQuest(user, Quest.GetQuestById(quest.ChainedQuestId), npcActivation, res);
            }

            if (quest.SuccessMessage != null)
            {
                byte[] ChatPacket = PacketBuilder.CreateChat(quest.SuccessMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
                user.LoggedinClient.SendPacket(ChatPacket);
            }

            if (quest.SuccessNpcChat != null)
            {
                if (!npcActivation)
                {
                    byte[] ChatPacket = PacketBuilder.CreateChat(quest.SuccessNpcChat, PacketBuilder.CHAT_BOTTOM_RIGHT);
                    user.LoggedinClient.SendPacket(ChatPacket);
                }
            }

            // Check if award unlocked
            int questPointsPercent = Convert.ToInt32(Math.Floor(((decimal)user.QuestPoints / (decimal)GetTotalQuestPoints()) * (decimal)100.0));

            if (questPointsPercent >= 25)
            {
                user.Awards.AddAward(Award.GetAwardById(1)); // 25% Quest Completion Award.
            }
            if (questPointsPercent >= 50)
            {
                user.Awards.AddAward(Award.GetAwardById(2)); // 50% Quest Completion Award.
            }
            if (questPointsPercent >= 75)
            {
                user.Awards.AddAward(Award.GetAwardById(3)); // 75% Quest Completion Award.
            }
            if (questPointsPercent >= 100)
            {
                user.Awards.AddAward(Award.GetAwardById(4)); // 100% Quest Completion Award.
            }
            // Is cloud isles quest?
            if (quest.Id == 1373)
            {
                byte[] swfLoadPacket = PacketBuilder.CreateSwfModulePacket("ballooncutscene", PacketBuilder.PACKET_SWF_CUTSCENE);
                user.LoggedinClient.SendPacket(swfLoadPacket);
            }

            return(res);
        }
Пример #15
0
        public static bool CanComplete(User user, QuestEntry quest)
        {
            // Has completed other required quests?
            foreach (int questId in quest.RequiresQuestIdCompleted)
            {
                if (user.Quests.GetTrackedQuestAmount(questId) < 1)
                {
                    return(false);
                }
            }

            // Has NOT competed other MUST NOT BE required quests
            foreach (int questId in quest.RequiresQuestIdNotCompleted)
            {
                if (user.Quests.GetTrackedQuestAmount(questId) > 1)
                {
                    return(false);
                }
            }

            if (quest.Tracked)
            {
                // Has allready tracked this quest?
                if (user.Quests.GetTrackedQuestAmount(quest.Id) >= quest.MaxRepeats)
                {
                    return(false);
                }
            }

            // Check if user has award unlocked
            if (quest.AwardRequired != 0)
            {
                if (!user.Awards.HasAward(Award.GetAwardById(quest.AwardRequired)))
                {
                    return(false);
                }
            }

            // Check if i have required items
            foreach (QuestItemInfo itemInfo in quest.ItemsRequired)
            {
                bool            hasThisItem = false;
                InventoryItem[] items       = user.Inventory.GetItemList();
                foreach (InventoryItem item in items)
                {
                    if (item.ItemId == itemInfo.ItemId && item.ItemInstances.Length >= itemInfo.Quantity)
                    {
                        hasThisItem = true;
                        break;
                    }
                }
                if (!hasThisItem)
                {
                    return(false);
                }
            }

            // Have enough money?
            if (user.Money < quest.MoneyCost)
            {
                return(false);
            }


            return(true);
        }
Пример #16
0
    /*
     * ===========================================================================================================
     * QUEST'S STUFF
     * ===========================================================================================================
     */
    /// <summary>
    /// Creates a new quest and adds it to quests list
    /// </summary>
    /// <param name="stQuestName"> A string with this quest's name</param>
    public void CreateNewQuest(string stQuestName)
    {
        QuestEntry entry = new QuestEntry();
        entry.stName = stQuestName;
        entry.lstTasks = new List<TaskEntry>();

        // Adds this quest to the quests list
        lstQuests.Add(entry);
    }