写Quest

这东西真是很头疼

/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描   述:                                                    
*│ 作   者:blackmaple                                              
*│ 版   本:1.0                                                 
*│ 创建时间:2019/3/10 18:02:49                             
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 命名空间: GameServer.GameObjects.QuestTest                                   
*│ 类   名:MapleQuestActionType                                      
*└──────────────────────────────────────────────────────────────┘
*/

using Common.Collections;
using Common.WzData;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace GameServer.GameObjects.QuestTest
{
    public enum MapleQuestActionType
    {
        UNDEFINED = -1, EXP = 0, ITEM = 1, NEXTQUEST = 2, MESO = 3, QUEST = 4, SKILL = 5, FAME = 6, BUFF = 7, PETSKILL = 8, YES = 9, NO = 10, NPC = 11, MIN_LEVEL = 12, NORMAL_AUTO_START = 13, PETTAMENESS = 14, ZERO = 15
    }

    public enum MapleQuestRequirementType
    {
        UNDEFINED = -1, JOB = 0, ITEM = 1, QUEST = 2, MIN_LEVEL = 3, MAX_LEVEL = 4, END_DATE = 5, MOB = 6, NPC = 7, FIELD_ENTER = 8, INTERVAL = 9, SCRIPT = 10, PET = 11, MIN_PET_TAMENESS = 12, MONSTER_BOOK = 13, NORMAL_AUTO_START = 14, INFO_NUMBER = 15, INFO_EX = 16, COMPLETED_QUEST = 17, START_DATE = 18, END = 19, DAY_BY_DAY = 20, MESO = 21, BUFF = 22, EXCEPT_BUFF = 23
    }
    public class MapleQuest
    {
        private static readonly Dictionary<int, MapleQuest> QuestsCache = new Dictionary<int, MapleQuest>();
        private static readonly Dictionary<int, int> MedalQuests = new Dictionary<int, int>();
        private static readonly HashSet<short> ExploitableQuests = new HashSet<short>
        {
            2338, 3637, 3714, 21752
        };
        public short InfoNumber { get; set; }
        public int QuestID { get; set; }
        protected int timeLimit, timeLimit2;
        protected string infoex;
        protected Dictionary<MapleQuestRequirementType, MapleQuestRequirement> StartReqs = new Dictionary<MapleQuestRequirementType, MapleQuestRequirement>();
        protected Dictionary<MapleQuestRequirementType, MapleQuestRequirement> CompleteReqs = new Dictionary<MapleQuestRequirementType, MapleQuestRequirement>();
        protected Dictionary<MapleQuestActionType, MapleQuestAction> StartActs = new Dictionary<MapleQuestActionType, MapleQuestAction>();
        protected Dictionary<MapleQuestActionType, MapleQuestAction> CompleteActs = new Dictionary<MapleQuestActionType, MapleQuestAction>();
        public List<int> RelevantMobs { get; set; }
        private bool AutoStart;
        private bool AutoPreComplete;
        private bool AutoComplete;
        private bool Repeatable = false;
        private string Name = "";
        private string Parent = "";
        private static readonly string QuestPath = Path.Combine(Environment.CurrentDirectory, "wz", "Quest.wz");
        private static XmlFile QuestInfo;
        private static XmlFile QuestAct;
        private static XmlFile QuestReq;
        private static MapleQuestActionType GetMapleQuestActionTypeByName(string name)
        {
            switch (name)
            {
                case "exp": return MapleQuestActionType.EXP;
                case "money": return MapleQuestActionType.MESO;
                case "item": return MapleQuestActionType.ITEM;
                case "skill": return MapleQuestActionType.SKILL;
                case "nextQuest": return MapleQuestActionType.NEXTQUEST;
                case "pop": return MapleQuestActionType.FAME;
                case "buffItemID": return MapleQuestActionType.BUFF;
                case "petskill": return MapleQuestActionType.PETSKILL;
                case "no": return MapleQuestActionType.NO;
                case "yes": return MapleQuestActionType.YES;
                case "npc": return MapleQuestActionType.NPC;
                case "lvmin": return MapleQuestActionType.MIN_LEVEL;
                case "normalAutoStart": return MapleQuestActionType.NORMAL_AUTO_START;
                case "pettameness": return MapleQuestActionType.PETTAMENESS;
                default: return MapleQuestActionType.UNDEFINED;
            }
        }
        private static MapleQuestRequirementType GetMapleQuestRequirementTypeByName(string name)
        {
            switch (name)
            {
                case "job": return MapleQuestRequirementType.JOB;
                case "quest": return MapleQuestRequirementType.QUEST;
                case "item": return MapleQuestRequirementType.ITEM;
                case "lvmin": return MapleQuestRequirementType.MIN_LEVEL;
                case "lvmax": return MapleQuestRequirementType.MAX_LEVEL;
                case "end": return MapleQuestRequirementType.END_DATE;
                case "mob": return MapleQuestRequirementType.MOB;
                case "npc": return MapleQuestRequirementType.NPC;
                case "fieldEnter": return MapleQuestRequirementType.FIELD_ENTER;
                case "interval": return MapleQuestRequirementType.INTERVAL;
                case "startscript": return MapleQuestRequirementType.SCRIPT;
                case "endscript": return MapleQuestRequirementType.SCRIPT;
                case "pet": return MapleQuestRequirementType.PET;
                case "pettamenessmin": return MapleQuestRequirementType.MIN_PET_TAMENESS;
                case "mbmin": return MapleQuestRequirementType.MONSTER_BOOK;
                case "normalAutoStart": return MapleQuestRequirementType.NORMAL_AUTO_START;
                case "infoNumber": return MapleQuestRequirementType.INFO_NUMBER;
                case "infoex": return MapleQuestRequirementType.INFO_EX;
                case "questComplete": return MapleQuestRequirementType.COMPLETED_QUEST;
                case "start": return MapleQuestRequirementType.START_DATE;
                case "daybyday": return MapleQuestRequirementType.DAY_BY_DAY;
                case "endmeso": return MapleQuestRequirementType.MESO;
                default: return MapleQuestRequirementType.UNDEFINED;

            }
        }

        private MapleQuest(int id)
        {
            QuestID = id;
            var reqData = QuestReq.GetElement(id.ToString());
            if (reqData == null) return;

            if (QuestInfo != null)
            {
                var reqInfo = QuestInfo.GetElement(id.ToString());
                reqInfo.Elements.ForEach(iNode =>
                {
                    switch (iNode.Name)
                    {
                        case "name": Name = iNode.Value; break;
                        case "parent": Parent = iNode.Value; break;
                        case "timeLimit": timeLimit = iNode.ValueInt; break;
                        case "timeLimit2": timeLimit2 = iNode.ValueInt; break;
                        case "autoStart": AutoStart = iNode.ValueBool; break;
                        case "autoComplete": AutoComplete = iNode.ValueBool; break;
                        case "autoPreComplete": AutoPreComplete = iNode.ValueBool; break;
                        case "viewMedalItem": MedalQuests.Add(id, iNode.ValueInt); break;
                    }
                });
            }
            else
                Console.WriteLine("无任务信息数据:" + id);

            var startReqData = reqData.GetElement("0");
            if (startReqData != null)
            {
                startReqData.Elements.ForEach(x =>
                {
                    var type = GetMapleQuestRequirementTypeByName(x.Name);
                    var req = GetRequirement(type, x);
                    if (req != null)
                    {
                        switch (type)
                        {
                            case MapleQuestRequirementType.INTERVAL: Repeatable = true; break;
                            case MapleQuestRequirementType.INFO_NUMBER: InfoNumber = x.ValueShort; break;
                            case MapleQuestRequirementType.MOB: RelevantMobs = x.Elements.Select(m => m.GetElement("id").ValueInt).ToList(); break;
                            default:
                                break;
                        }
                        StartReqs.Add(type, req);
                    }
                });
            }
            var completeReqData = reqData.GetElement("1");
            if (completeReqData != null)
            {
                completeReqData.Elements.ForEach(x =>
                {
                    var type = GetMapleQuestRequirementTypeByName(x.Name);
                    var req = GetRequirement(type, x);
                    if (req != null)
                    {
                        switch (type)
                        {
                            case MapleQuestRequirementType.INFO_NUMBER: InfoNumber = x.ValueShort; break;
                            case MapleQuestRequirementType.MOB: RelevantMobs = x.Elements.Select(m => m.GetElement("id").ValueInt).ToList(); break;
                        }
                        CompleteReqs.Add(type, req);
                    }
                });
            }
            var actData = QuestAct.GetElement(id.ToString());
            if (actData == null) return;

            var startActData = actData.GetElement("0");
            if (startActData != null)
            {
                startActData.Elements.ForEach(startAct =>
                {
                    var questActionType = GetMapleQuestActionTypeByName(startAct.Name);
                    var act = GetAction(questActionType, startAct);
                    if (act != null)
                    {
                        StartActs.Add(questActionType, act);
                    }
                });
            }
            var completeActData = actData.GetElement("1");
            if (completeActData != null)
            {
                completeActData.Elements.ForEach(completeAct => {
                    var questActionType = GetMapleQuestActionTypeByName(completeAct.Name);
                    var act = GetAction(questActionType, completeAct);
                    if (act != null)
                    {
                        CompleteActs.Add(questActionType, act);
                    }
                });
            }
        }
        public bool IsAutoComplete() => AutoComplete || AutoPreComplete;
        public bool IsAutoStart() => AutoStart;
        public static MapleQuest GetInstance(int questid)
        {
            MapleQuest ret = null;
            if (QuestsCache.ContainsKey(questid))
                ret = QuestsCache[questid];
            else
            {
                QuestInfo = new XmlFile(Path.Combine(QuestPath, "QuestInfo.img.xml"));
                QuestReq = new XmlFile(Path.Combine(QuestPath, "Check.img.xml"));
                QuestAct = new XmlFile(Path.Combine(QuestPath, "Act.img.xml"));
                ret = new MapleQuest(questid);
                QuestsCache.Add(questid, ret);
            }
            return ret;
        }

        public bool IsSameDayRepeatable()
        {
            if (!Repeatable) return false;

            var ir = (IntervalRequirement)StartReqs[MapleQuestRequirementType.INTERVAL];
            return ir.GetInterval() < 24 * 60 * 60 * 1000;
        }

        private MapleQuestAction GetAction(MapleQuestActionType type, XmlFile data)
        {
            MapleQuestAction ret = null;
            switch (type)
            {
                case MapleQuestActionType.BUFF:
                    ret = new BuffAction(this, data);
                    break;
                case MapleQuestActionType.EXP:
                    ret = new ExpAction(this, data);
                    break;
                case MapleQuestActionType.FAME:
                    ret = new FameAction(this, data);
                    break;
                case MapleQuestActionType.ITEM:
                    ret = new ItemAction(this, data);
                    break;
                case MapleQuestActionType.MESO:
                    ret = new MesoAction(this, data);
                    break;
                case MapleQuestActionType.NEXTQUEST:
                    ret = new NextQuestAction(this, data);
                    break;
                case MapleQuestActionType.PETSKILL:
                    ret = new PetSkillAction(this, data);
                    break;
                case MapleQuestActionType.QUEST:
                    ret = new QuestAction(this, data);
                    break;
                case MapleQuestActionType.SKILL:
                    ret = new SkillAction(this, data);
                    break;
                case MapleQuestActionType.PETTAMENESS:
                    ret = new PetTamenessAction(this, data);
                    break;
                default:
                    //FilePrinter.printError(FilePrinter.EXCEPTION_CAUGHT, "Unhandled Action Type: " + type.toString() + " QuestID: " + this.getId());
                    break;
            }
            return ret;
        }

        private MapleQuestRequirement GetRequirement(MapleQuestRequirementType type, XmlFile data)
        {
            MapleQuestRequirement ret = null;
            switch (type)
            {
                case MapleQuestRequirementType.END_DATE:
                    ret = new EndDateRequirement(this, data);
                    break;
                case MapleQuestRequirementType.JOB:
                    ret = new JobRequirement(this, data);
                    break;
                case MapleQuestRequirementType.QUEST:
                    ret = new QuestRequirement(this, data);
                    break;
                case MapleQuestRequirementType.FIELD_ENTER:
                    ret = new FieldEnterRequirement(this, data);
                    break;
                case MapleQuestRequirementType.INFO_EX:
                    ret = new InfoExRequirement(this, data);
                    break;
                case MapleQuestRequirementType.INTERVAL:
                    ret = new IntervalRequirement(this, data);
                    break;
                case MapleQuestRequirementType.COMPLETED_QUEST:
                    ret = new CompletedQuestRequirement(this, data);
                    break;
                case MapleQuestRequirementType.ITEM:
                    ret = new ItemRequirement(this, data);
                    break;
                case MapleQuestRequirementType.MAX_LEVEL:
                    ret = new MaxLevelRequirement(this, data);
                    break;
                case MapleQuestRequirementType.MESO:
                    ret = new MesoRequirement(this, data);
                    break;
                case MapleQuestRequirementType.MIN_LEVEL:
                    ret = new MinLevelRequirement(this, data);
                    break;
                case MapleQuestRequirementType.MIN_PET_TAMENESS:
                    ret = new MinTamenessRequirement(this, data);
                    break;
                case MapleQuestRequirementType.MOB:
                    ret = new MobRequirement(this, data);
                    break;
                case MapleQuestRequirementType.NPC:
                    ret = new NpcRequirement(this, data);
                    break;
                case MapleQuestRequirementType.PET:
                    ret = new PetRequirement(this, data);
                    break;
                case MapleQuestRequirementType.BUFF:
                    ret = new BuffRequirement(this, data);
                    break;
                case MapleQuestRequirementType.EXCEPT_BUFF:
                    ret = new BuffExceptRequirement(this, data);
                    break;
                case MapleQuestRequirementType.SCRIPT:
                case MapleQuestRequirementType.NORMAL_AUTO_START:
                case MapleQuestRequirementType.INFO_NUMBER:
                    break;
                default:
                    break;
            }
            return ret;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值