private void InitDynamicMonsterSeedByMonserID(int monsterID) { MonsterZone monsterZone = new MonsterZone(); Monster myMonster = null; if (!this._DictDynamicMonsterSeed.TryGetValue(monsterID, out myMonster) || null == myMonster) { int ID = 1; lock (this._DictDynamicMonsterSeed) { ID = this._DictDynamicMonsterSeed.Count + 1; } monsterZone.MapCode = 1; monsterZone.ID = ID; monsterZone.Code = monsterID; monsterZone.LoadStaticMonsterInfo(); myMonster = monsterZone.LoadDynamicMonsterSeed(); lock (this._DictDynamicMonsterSeed) { if (!this._DictDynamicMonsterSeed.ContainsKey(monsterID)) { this._DictDynamicMonsterSeed.Add(monsterID, myMonster); } } } }
/// <summary> /// 初始化动态召唤怪物的缓存 /// </summary> /// <param name="monsterID"></param> private void InitDynamicMonsterSeedByMonserID(int monsterID) { MonsterZone monsterZone = new MonsterZone(); Monster myMonster = null; //如果原来有,就不要再次加载了,重用就好,相当于增量加载 if (_DictDynamicMonsterSeed.TryGetValue(monsterID, out myMonster) && null != myMonster) { return; } int ID = 1; lock (_DictDynamicMonsterSeed) { ID = _DictDynamicMonsterSeed.Count + 1; } monsterZone.MapCode = 1;//强行设置地图编号 后期进程允许过程中动态修改 monsterZone.ID = ID; monsterZone.Code = monsterID; //加载静态的怪物信息 monsterZone.LoadStaticMonsterInfo(); //加载怪物 myMonster = monsterZone.LoadDynamicMonsterSeed(); lock (_DictDynamicMonsterSeed) { //不存在就加入 if (!_DictDynamicMonsterSeed.ContainsKey(monsterID)) { _DictDynamicMonsterSeed.Add(monsterID, myMonster); } } }
/// <summary> /// 加载怪物 /// </summary> public void AddMapMonsters(int mapCode, GameMap gameMap) { //对于每一个地图,都要加入一个动态刷怪区域,用于动态刷怪管理 AddDynamicMonsterZone(mapCode); string fileName = string.Format("Map/{0}/Monsters.xml", mapCode); XElement xml = null; try { xml = XElement.Load(Global.ResPath(fileName)); } catch (Exception) { throw new Exception(string.Format("加载地图怪物配置文件:{0}, 失败。没有找到相关XML配置文件!", fileName)); } IEnumerable <XElement> monsterItems = xml.Elements("Monsters").Elements(); if (null == monsterItems) { return; } //判断是否是副本地图 bool isFuBenMap = FuBenManager.IsFuBenMap(mapCode); foreach (var monsterItem in monsterItems) { String timePoints = Global.GetSafeAttributeStr(monsterItem, "TimePoints"); int configBirthType = (int)Global.GetSafeAttributeLong(monsterItem, "BirthType"); int realBirthType = configBirthType; String realTimePoints = timePoints; int spawnMonstersAfterKaiFuDays = 0; int spawnMonstersDays = 0; List <BirthTimeForDayOfWeek> CreateMonstersDayOfWeek = new List <BirthTimeForDayOfWeek>(); List <BirthTimePoint> birthTimePointList = null; //对于开服多少天之后才开始刷怪,进行特殊配置 格式:开服多少天;连续刷多少天[负数0表示一直];刷怪方式0或1;0或1的配置 if ((int)MonsterBirthTypes.AfterKaiFuDays == configBirthType || (int)MonsterBirthTypes.AfterHeFuDays == configBirthType || (int)MonsterBirthTypes.AfterJieRiDays == configBirthType) { String[] arr = timePoints.Split(';'); if (4 != arr.Length) { throw new Exception(String.Format("地图{0}的类型4的刷怪配置参数个数不对!!!!", mapCode)); } spawnMonstersAfterKaiFuDays = int.Parse(arr[0]); spawnMonstersDays = int.Parse(arr[1]); realBirthType = int.Parse(arr[2]); realTimePoints = arr[3]; if ((int)MonsterBirthTypes.TimePoint != realBirthType && (int)MonsterBirthTypes.TimeSpan != realBirthType) { throw new Exception(String.Format("地图{0}的类型4的刷怪配置子类型不对!!!!", mapCode)); } } // MU新增 一周中的哪天刷 TimePoints 配置形式 周几,时间点|周几,时间点|周几,时间点... [1/10/2014 LiaoWei] if ((int)MonsterBirthTypes.CreateDayOfWeek == configBirthType) { String[] arrTime = timePoints.Split('|'); if (arrTime.Length > 0) { for (int nIndex = 0; nIndex < arrTime.Length; ++nIndex) { string sTimePoint = null; sTimePoint = arrTime[nIndex]; if (sTimePoint != null) { String[] sTime = null; sTime = sTimePoint.Split(','); if (sTime != null && sTime.Length == 2) { string sTimeString = null; int nDayOfWeek = -1; nDayOfWeek = int.Parse(sTime[0]); sTimeString = sTime[1]; if (nDayOfWeek != -1 && !string.IsNullOrEmpty(sTimeString)) { string[] fields2 = sTimeString.Split(':'); if (fields2.Length != 2) { continue; } string str1 = fields2[0].TrimStart('0'); string str2 = fields2[1].TrimStart('0'); BirthTimePoint birthTimePoint = new BirthTimePoint() { BirthHour = Global.SafeConvertToInt32(str1), BirthMinute = Global.SafeConvertToInt32(str2), }; BirthTimeForDayOfWeek BirthTimeTmp = new BirthTimeForDayOfWeek(); BirthTimeTmp.BirthDayOfWeek = nDayOfWeek; BirthTimeTmp.BirthTime = birthTimePoint; CreateMonstersDayOfWeek.Add(BirthTimeTmp); } } } } } } else { birthTimePointList = ParseBirthTimePoints(realTimePoints); } MonsterZone monsterZone = new MonsterZone() { MapCode = mapCode, ID = (int)Global.GetSafeAttributeLong(monsterItem, "ID"), Code = (int)Global.GetSafeAttributeLong(monsterItem, "Code"), ToX = (int)Global.GetSafeAttributeLong(monsterItem, "X") / gameMap.MapGridWidth, ToY = (int)Global.GetSafeAttributeLong(monsterItem, "Y") / gameMap.MapGridHeight, Radius = (int)Global.GetSafeAttributeLong(monsterItem, "Radius") / gameMap.MapGridWidth, TotalNum = (int)Global.GetSafeAttributeLong(monsterItem, "Num"), Timeslot = (int)Global.GetSafeAttributeLong(monsterItem, "Timeslot"), IsFuBenMap = isFuBenMap, BirthType = realBirthType, ConfigBirthType = configBirthType, SpawnMonstersAfterKaiFuDays = spawnMonstersAfterKaiFuDays, SpawnMonstersDays = spawnMonstersDays, SpawnMonstersDayOfWeek = CreateMonstersDayOfWeek, BirthTimePointList = birthTimePointList, BirthRate = (int)(Global.GetSafeAttributeDouble(monsterItem, "BirthRate") * 10000), }; XAttribute attrib = monsterItem.Attribute("PursuitRadius"); if (null != attrib) { monsterZone.PursuitRadius = (int)Global.GetSafeAttributeLong(monsterItem, "PursuitRadius"); } else { monsterZone.PursuitRadius = (int)Global.GetSafeAttributeLong(monsterItem, "Radius"); } lock (InitMonsterZoneMutex) { //加入列表 MonsterZoneList.Add(monsterZone); //如果是副本地图, 则加入副本爆怪区域列表 if (isFuBenMap) { FuBenMonsterZoneList.Add(monsterZone); } //加入爆怪区域 AddMap2MonsterZoneDict(monsterZone); } //加载静态的怪物信息 monsterZone.LoadStaticMonsterInfo(); //加载怪物 monsterZone.LoadMonsters();//暂时屏蔽怪物加载 } }