using CommonAI.Zone.Helper; using CommonLang; using CommonLang.IO; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.IO; using System.Linq; using XmdsCommonServer.XLS.Data; namespace XmdsCommonServer.XLS { public class XLSSkillCfgLoader : XLSLoader { public const string ACTOR_NAME = "SkillValue"; public const string MONSTER_SKILL = "MonsterSkillValue"; public const string PET_SKILL = "PetSkill"; public const string CARD_SKILL = "CardSkill"; private HashMap SkillDatas = new HashMap(); //boss通用技能随机库 XmdsSkillData [] bossComActiveSkill = null; XmdsSkillData [] bossComPassiveSkill = null; public XLSSkillCfgLoader(string path) { byte[] data = Resource.LoadData(path); if (data == null) { throw new Exception("Can not read xls file : " + path); } using (MemoryStream ms = new MemoryStream(data)) { IWorkbook Workbook = null; if (path.Contains(".xlsx")) { Workbook = new XSSFWorkbook(ms); } else if (path.Contains(".xls")) { Workbook = new HSSFWorkbook(ms); } for (int si = 0; si < Workbook.NumberOfSheets; si++) { ISheet sheet = Workbook.GetSheetAt(si) as ISheet; if (sheet.SheetName == ACTOR_NAME || sheet.SheetName == MONSTER_SKILL || sheet.SheetName == PET_SKILL || sheet.SheetName == CARD_SKILL) { try { LoadSheet(sheet, sheet.SheetName == CARD_SKILL); } catch (Exception error) { throw new Exception(string.Format("XLSSkillCfgLoader 初始化技能配置错误SheetName = {0},Error = {1}", sheet.SheetName, error.ToString())); } } } } log.Info("XLSSkillCfgLoader 初始化技能配置完成."); } private void LoadSheet(ISheet sheet, bool isCardSKill) { int index = 0; try { HashMap activeSkill = new HashMap(); HashMap passiveSkill = new HashMap(); bool isMonsterSkill = (sheet.SheetName == MONSTER_SKILL); foreach (XmdsSkillData m in LoadSheet(sheet)) { m.Init(); if(isCardSKill) { m.SkillType = (byte)XmdsSkillType.cardSkill; } SkillDatas.Add(m.SkillID, m); index++; if(isMonsterSkill) { if((int)XmdsSkillData.XmdsSkillExtKey.BossComActiveSkill == m.SkillExt) { activeSkill.Add(m.SkillID, m); } else if ((int)XmdsSkillData.XmdsSkillExtKey.BossComPassiveSkill == m.SkillExt) { passiveSkill.Add(m.SkillID, m); } } } if (isMonsterSkill) { bossComActiveSkill = activeSkill.Values.ToArray(); bossComPassiveSkill = passiveSkill.Values.ToArray(); } } catch (Exception error) { throw new Exception(string.Format("XLSSkillCfgLoader Error : index = {0} Error = {1}", index, error.ToString())); } log.Info(string.Format("loadSheet【{0}】Complete", sheet.SheetName)); } public XmdsSkillData GetSkillData(int skillid) { XmdsSkillData ret = null; SkillDatas.TryGetValue(skillid, out ret); return ret; } //获得boss随机主动技能数 public int GetBossComActiveNum() { return this.bossComActiveSkill.Length; } //获得boss被动技能数 public int GetBossComPassiveNum() { return this.bossComPassiveSkill.Length; } //随机获得一个boss主动技能 public XmdsSkillData GetBossRandomActiveSkill(Random random) { XmdsSkillData result = null; try { if (this.bossComActiveSkill.Length <= 0) { return null; } int index = random.Next(this.bossComActiveSkill.Length); result = this.bossComActiveSkill[index]; } catch(Exception e) { log.Error(string.Format("GetBossRandomActiveSkill catch - ", e)); } return result; } //随机获得一个boss被动技能 public XmdsSkillData GetBossRandomPassiveSkill(Random random, XmdsSkillData[] hasList) { XmdsSkillData result = null; int randIndex = 0; try { if (this.bossComPassiveSkill.Length <= 0) { return null; } int ntestTimes = 10; while(--ntestTimes >= 0) { randIndex = random.Next(this.bossComPassiveSkill.Length); result = this.bossComPassiveSkill[randIndex]; foreach(XmdsSkillData temp in hasList) { if(temp == null || temp.SkillID != result.SkillID) { break; } else { result = null; } } if (result != null) { break; } } } catch (Exception e) { log.Error("GetBossRandomPassiveSkill catch - " + (hasList == null ? "null" : ("序列:" + hasList.Length)) + ", 技能数:" + this.bossComPassiveSkill.Length + ", 随机index: " + randIndex + ", e: " + e); result = null; } return result; } } }