这东西真是很头疼
/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描 述:
*│ 作 者: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;
}
}
}