using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Xml; using UnityEngine; namespace HxGame.Data { //刷怪模式 public enum CreateMonsterMode { Death, //死亡 FixedTime, //固定时间刷怪 } //巡逻类型 public enum PatrolMode { Range, //范围 Path, //路径 } public class MonstersConfig { public class MonsterConfig { public int itemIdx; public int groupId; //是否是分组 public int id; public CreateMonsterMode createMode; //刷怪模式 public PatrolMode patrolMode; //巡逻类型 public Vector2Int pos; //刷怪中心点 public int radius; //半径 public int num; //数量 public int delayTime; //刷怪时间,死亡模式使用 public string strTime; //格式 天数,时间 1,10:20 每天10点20 public List paths = new List(); public MonsterConfig() { groupId = -1; delayTime = 0; strTime = string.Empty; } } public List monsterConfigs = new List(); public void SaveXML(int mapId) { string path = PathUtil.GetXmlPath(mapId, "MonstersConfig"); string tmp = path.Substring(0, path.LastIndexOf('/')); if (!Directory.Exists(tmp)) Directory.CreateDirectory(tmp); if (File.Exists(path)) File.Delete(path); XmlDocument xml = new XmlDocument(); XmlDeclaration node = xml.CreateXmlDeclaration("1.0", "utf-8", "no"); xml.AppendChild(node); XmlElement Root = xml.CreateElement("config"); xml.AppendChild(Root); XmlElement xmlSettings = xml.CreateElement("Settings");//节点Settings xml.DocumentElement.AppendChild(xmlSettings); xmlSettings.SetAttribute("mapID", mapId.ToString()); XmlElement MonsterAreas = xml.CreateElement("MonsterAreas");//节点Settings xml.DocumentElement.AppendChild(MonsterAreas); SaveMonsterAreas(xml, MonsterAreas); xml.Save(path); UIWindow.Instance.ShowMessage("保存怪物配置成功"); } private void SaveMonsterAreas(XmlDocument xml, XmlElement xmlElement) { XmlElement child = null; for (int i = 0; i < monsterConfigs.Count; i++) { child = xml.CreateElement("MonsterArea"); child.SetAttribute("itemIdx", monsterConfigs[i].itemIdx.ToString()); child.SetAttribute("groupId", monsterConfigs[i].groupId.ToString()); child.SetAttribute("id", monsterConfigs[i].id.ToString()); child.SetAttribute("createMode", ((int)(monsterConfigs[i].createMode)).ToString()); child.SetAttribute("patrolMode", ((int)(monsterConfigs[i].patrolMode)).ToString()); child.SetAttribute("indexX", monsterConfigs[i].pos.x.ToString()); child.SetAttribute("indexY", monsterConfigs[i].pos.y.ToString()); child.SetAttribute("radius", monsterConfigs[i].radius.ToString()); child.SetAttribute("num", monsterConfigs[i].num.ToString()); child.SetAttribute("delayTime", monsterConfigs[i].delayTime.ToString()); if(monsterConfigs[i].createMode == CreateMonsterMode.Death) { child.SetAttribute("day", "0"); child.SetAttribute("time", "0"); } else { string[] tmp = monsterConfigs[i].strTime.Split(','); child.SetAttribute("day", tmp[0]); child.SetAttribute("time", tmp[1]); } XmlElement MonsterPaths = xml.CreateElement("MonsterPaths"); for (int m = 0; m < monsterConfigs[i].paths.Count; m++) { XmlElement path = xml.CreateElement($"Path{m}"); path.SetAttribute("pos", monsterConfigs[i].paths[m]); MonsterPaths.AppendChild(path); } child.AppendChild(MonsterPaths); xmlElement.AppendChild(child); } } public bool LoadXML(int mapId) { string path = PathUtil.GetXmlPath(mapId, "MonstersConfig"); if (!File.Exists(path)) { UIWindow.Instance.ShowMessage("没有找到怪物配置文件"); return false; } XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load(path); XmlNode xmlRoot = xmlDocument.SelectSingleNode("config"); XmlNode xmlSettings = xmlRoot.SelectSingleNode("Settings"); int id = Convert.ToInt32(xmlSettings.Attributes.GetNamedItem("mapID").Value); if (id != mapId) { UIWindow.Instance.ShowMessage("地图ID错误,请检查MonstersConfig配置文件"); return false; } XmlNode xmlMonsterAreas = xmlRoot.SelectSingleNode("MonsterAreas"); LoadMonsterAreas(xmlMonsterAreas); return true; } private void LoadMonsterAreas(XmlNode xmlNodes) { if (xmlNodes == null) return; XmlNode xmlNode = null; XmlNodeList xmlNodeList = xmlNodes.ChildNodes; int x, y; for (int i = 0; i < xmlNodeList.Count; i++) { xmlNode = xmlNodeList.Item(i); if (xmlNode.Name != "MonsterArea") continue; MonsterConfig mc = new MonsterConfig(); if (xmlNode.Attributes.GetNamedItem("itemIdx") == null) mc.itemIdx = -1; else mc.itemIdx = Convert.ToInt32(xmlNode.Attributes.GetNamedItem("itemIdx").Value); if (xmlNode.Attributes.GetNamedItem("groupId") == null) mc.groupId = -1; else mc.groupId = Convert.ToInt32(xmlNode.Attributes.GetNamedItem("groupId").Value); mc.id = Convert.ToInt32(xmlNode.Attributes.GetNamedItem("id").Value); mc.createMode = (CreateMonsterMode)Convert.ToInt32(xmlNode.Attributes.GetNamedItem("createMode").Value); if(xmlNode.Attributes.GetNamedItem("patrolMode") != null) mc.patrolMode = (PatrolMode)Convert.ToInt32(xmlNode.Attributes.GetNamedItem("patrolMode").Value); x = Convert.ToInt32(xmlNode.Attributes.GetNamedItem("indexX").Value); y = Convert.ToInt32(xmlNode.Attributes.GetNamedItem("indexY").Value); mc.pos = new Vector2Int(x, y); mc.radius = Convert.ToInt32(xmlNode.Attributes.GetNamedItem("radius").Value); mc.num = Convert.ToInt32(xmlNode.Attributes.GetNamedItem("num").Value); mc.delayTime = Convert.ToInt32(xmlNode.Attributes.GetNamedItem("delayTime").Value); if (mc.createMode == CreateMonsterMode.FixedTime) { string day = xmlNode.Attributes.GetNamedItem("day").Value; string time = xmlNode.Attributes.GetNamedItem("time").Value; mc.strTime = $"{day},{time}"; } XmlNode xmlPaths = xmlNode.SelectSingleNode("MonsterPaths"); if (xmlPaths != null) { XmlNodeList xmlPathList = xmlPaths.ChildNodes; for (int m = 0; m < xmlPathList.Count; m++) { XmlNode xmlPath = xmlPathList.Item(m); if (xmlPath.Name != $"Path{m}") continue; string path = xmlPath.Attributes.GetNamedItem("pos").Value; mc.paths.Add(path); } } monsterConfigs.Add(mc); } } } }