/// <summary> /// 加入爆怪区域 /// </summary> /// <param name="monsterZone"></param> private void AddMap2MonsterZoneDict(CMonsterZone monsterZone) { List <CMonsterZone> monsterZoneList = null; if (Map2MonsterZoneDict.TryGetValue(monsterZone.MapCode, out monsterZoneList)) { monsterZoneList.Add(monsterZone); return; } monsterZoneList = new List <CMonsterZone>(); Map2MonsterZoneDict[monsterZone.MapCode] = monsterZoneList; monsterZoneList.Add(monsterZone); }
//public void RunMapDynamicMonsters(SocketListener sl, TCPOutPacketPool pool) //{ // //执行添加动态的副本怪物 // for (int i = 0; i < MonsterZoneManager.MaxRunQueueNum; i++) // { // if (!RunAddCopyMapMonsters()) // { // break; // } // } // //执行销毁动态的副本怪物 // for (int i = 0; i < MonsterZoneManager.MaxRunQueueNum; i++) // { // if (!RunDestroyCopyMapMonsters()) // { // break; // } // } // //执行立刻刷新副本怪物的操作 // for (int i = 0; i < MonsterZoneManager.MaxRunQueueNum; i++) // { // if (!RunReloadCopyMapMonsters()) // { // break; // } // } // //执行立刻刷新普通地图怪物的操作 // for (int i = 0; i < MonsterZoneManager.MaxRunQueueNum; i++) // { // if (!RunReloadNormalMapMonsters()) // { // break; // } // } // /*//执行动态召唤怪物操作 // for (int i = 0; i < MonsterZoneManager.MaxRunQueueNum; i++) // { // if (!RunAddDynamicMonsters()) // { // break; // } // }*/ // //执行立刻刷新竞技场机器人的刷新 // for (int i = 0; i < MonsterZoneManager.MaxRunAddDynamicMonstersQueueNum; i++) // { // if (!RunAddRobots()) // { // break; // } // } // // 最多循环100次 // int Count = 0; // int loop_Count = 0; // while (Count < MaxRunAddDynamicMonstersQueueNum) // { // for (int i = 0; i < Max_WaitingAddDynamicMonsterQueneCount; i++) // { // loop_Count++; // if (RunAddDynamicMonsters(i)) // { // Count++; // } // } // if (loop_Count >= MonsterZoneManager.MaxRunQueueNum) // { // break; // } // } //} #endregion #region /// <summary> /// 添加动态爆怪区域,每个地图有一个,所有参数都动态生成 /// </summary> /// <param name="mapCode"></param> public void AddDynamicMonsterZone(int mapCode) { //判断是否是副本地图 bool isFuBenMap = FuBenManager.IsFuBenMap(mapCode); CMonsterZone monsterZone = new CMonsterZone() { MapCode = mapCode, ID = MonsterDynamicZoneDict.Count + 10000, //动态配置 爆怪的区域ID,这个ID这样生成就可以 Code = -1, //动态配置---区域怪物ID,需要生成的时候动态配置 ToX = -1, //动态配置 ToY = -1, //动态配置 Radius = 300, //可以动态修改 TotalNum = 0, //动态 Timeslot = 1, IsFuBenMap = isFuBenMap, //意味着该区域的怪不管是在副本还说非副本,都由外部代码动态控制怪物的加载,怪物不会被程序定期循环复活 //同时该区域的怪物一旦死亡,直接销毁【将来或许需要加入一个针对这种类型的最大复活次数?】 BirthType = (int)MonsterBirthTypes.CrossMap, //这个字段非常重要,用于区分是动态刷怪区域还是 旧的系统怪区域!!!!!! ConfigBirthType = -1, //配置文件可没配置 BirthTimePointList = null, BirthRate = 10000, //必爆 }; //追踪范围,动态配置 monsterZone.PursuitRadius = 0; lock (InitMonsterZoneMutex) { //动态爆怪区域列表--->里面的怪物一旦死亡,移除 MonsterDynamicZoneDict.Add(mapCode, monsterZone); //加入列表 MonsterZoneList.Add(monsterZone); //加入爆怪区域 AddMap2MonsterZoneDict(monsterZone); } }
/// <summary> /// 加载精灵类型控件 /// </summary> /// <param name="sprite">引参:对象精灵</param> /// <param name="roleID">角色ID</param> /// <param name="roleSex">性别</param> /// <param name="name">识别名</param> /// <param name="sname">角色名</param> /// <param name="life">当前生命值</param> /// <param name="mana">当前魔法值</param> /// <param name="level">等级</param> /// <param name="experience">经验值</param> /// <param name="buff">属性BUFF加/减持</param> /// <param name="facesign">头像</param> /// <param name="frameRange">各动作帧数</param> /// <param name="effectiveFrame">各动作起效帧</param> /// <param name="attackRange">物理攻击距离</param> /// <param name="seekRange">索敌距离</param> /// <param name="equipmentBody">衣服代号</param> /// <param name="equipmentWeapon">武器代号</param> /// <param name="coordinate">XY坐标</param> /// <param name="direction">朝向</param> /// <param name="holdWidth">朝向</param> /// <param name="holdHeight">朝向</param> private void LoadMonster(Monster monster, CMonsterZone monsterZone, CMonsterStaticInfo monsterInfo, int monsterType, int roleID, string name, double life, double mana, Point coordinate, double direction, double moveSpeed, int attackRange) { monster.Name = name; monster.MonsterZoneNode = monsterZone; monster.MonsterInfo = monsterInfo; monster.RoleID = roleID; monster.VLife = life * 10000;//HX_SERVER FOR TEST monster.VMana = mana; monster.AttackRange = attackRange; monster.Coordinate = coordinate; monster.Direction = direction; monster.MoveSpeed = moveSpeed; monster.MonsterType = monsterType; monster.CoordinateChanged += UpdateMonsterEvent; SysConOut.WriteLine(string.Format("初始化怪物 {0}----{1}", monster.RoleID, monster.VLife)); //人为导致搜索的时间间隔错开 monster.NextSeekEnemyTicks = Global.MonsterSearchTimer + Global.GetRandomNumber(0, Global.MonsterSearchRandomTimer); }
/// <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); } CMonsterZone cmonsterZone = new CMonsterZone() { 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) { cmonsterZone.PursuitRadius = (int)Global.GetSafeAttributeLong(monsterItem, "PursuitRadius"); } else { cmonsterZone.PursuitRadius = (int)Global.GetSafeAttributeLong(monsterItem, "Radius"); } lock (InitMonsterZoneMutex) { //加入列表 MonsterZoneList.Add(cmonsterZone); //加入爆怪区域 AddMap2MonsterZoneDict(cmonsterZone); } //加载静态的怪物信息 cmonsterZone.LoadStaticMonsterInfo(); //加载怪物 cmonsterZone.LoadMonsters();//暂时屏蔽怪物加载 } }