private RawSkillCache() { try { this.InitFlag = false; s_dicTypes.Clear(); s_dicSkills.Clear(); s_lstHideSkills.Clear(); var xd = XDocument.Load(AppDomain.CurrentDomain.BaseDirectory + CFGFileName); string typeKey, typeName, fileName; typeKey = typeName = fileName = string.Empty; foreach (var xe in xd.Root.Element("Types").Elements("Type")) { typeKey = xe.Attribute("name").Value; typeName = xe.Attribute("typeName").Value; fileName = xe.Attribute("fileName").Value; s_dicTypes[typeKey] = Assembly.Load(fileName).GetType(typeName, false, true); } IRawSkill skill = null; foreach (var xes in xd.Root.Elements("Skills")) { foreach (var xe in xes.Elements("Skill")) { skill = BuildObj <IRawSkill>(xe); if (null != skill) { s_dicSkills[skill.SkillCode] = skill; } } } string hideFile = AppDomain.CurrentDomain.BaseDirectory + CFGHideFileName; if (File.Exists(hideFile)) { xd = XDocument.Load(hideFile); foreach (var xes in xd.Root.Elements("Skills")) { foreach (var xe in xes.Elements("Skill")) { skill = BuildObj <IRawSkill>(xe); if (null != skill) { s_lstHideSkills.Add(skill); } } } } string cfg = ConfigurationManager.AppSettings["TRACEPlayerSkillFlag"] ?? string.Empty; bool val; if (bool.TryParse(cfg, out val)) { TRACEPlayerSkillFlag = val; } this.InitFlag = true; } catch (Exception ex) { LogUtil.Error("RawSkillCache:Init", ex); this.InitFlag = false; } }
public void Load(IRawSkill rawSkill) { this._rawSkill = rawSkill; this._skillId = this._owner.InnerId * 100000 + rawSkill.RawSkillId; IEffector effector = null; this._skillFlag = EnumSkillFlag.None; if (null != rawSkill.MainEffector) { effector = rawSkill.MainEffector.Clone(this); this.MainEffector = effector; this._skillFlag |= rawSkill.MainEffector.SkillFlag; if (effector.RedoFlag || effector.UndoFlag) { this.RedoEffectors.Add(effector); } } if (null != rawSkill.SubEffectors && rawSkill.SubEffectors.Count > 0) { foreach (var item in rawSkill.SubEffectors) { effector = item.Clone(this); this.SubEffectors.Add(effector); this._skillFlag |= item.SkillFlag; if (effector.RedoFlag || effector.UndoFlag) { this.RedoEffectors.Add(effector); } } } if (this.Owner is ISkillManager) { if (rawSkill.CastFlag) { this._casters = ((ISkillManager)this.Owner).SkillPlayerList; } else { this._casters = null; } } else if (this.Owner is ISkillPlayer) { this._casters = new List <ISkillPlayer>(); this._casters.Add((ISkillPlayer)this.Owner); } this.CheckRedoFlag(); }
public void LoadSkill(ISkillOwner owner, List <string> skills) { if (null == skills || skills.Count == 0) { return; } if (RawSkillCache.Instance().TRACEPlayerSkillFlag&& owner is ISkillPlayer) { LogUtil.Info("Loading...Player[{0}] Skills[{1}] ", ((ISkillPlayer)owner).SkillPlayerId, string.Join(",", skills)); } if (owner is ISkillManager) { LogUtil.Info("Loading...Manager[{0}] Skills[{1}] ", ((ISkillManager)owner).InnerId, string.Join(",", skills)); } var dic = this._context.DicBuffer(1); dic.Clear(); for (int i = 0; i < this._skillList.Count; i++) { dic[_skillList[i].RawSkill.RawSkillId] = i; } string skillCode = string.Empty; string args = string.Empty; int argsIdx = 0; IRawSkill rawSkill = null; ISkill skill = null; int idx = 0; foreach (var str in skills) { skillCode = str; argsIdx = str.IndexOf('.'); if (argsIdx >= 0) { args = str.Substring(argsIdx + 1); skillCode = str.Substring(0, argsIdx); } if (!RawSkillCache.Instance().TryGetRawSkill(skillCode, out rawSkill)) { LogUtil.Info("No RawSkill for SkillCode:" + skillCode); continue; } if (dic.TryGetValue(rawSkill.RawSkillId, out idx)) { dic[rawSkill.RawSkillId] = -1; _skillList[idx].InvalidFlag = false; _skillList[idx].FitCasters(); continue; } skill = new Skill(this._context, owner, args); skill.Load(rawSkill); this._skillList.Add(skill); switch (rawSkill.TimeType) { case EnumSkillTimeType.Session: _skillDic[EnumSkillTimeType.Session].Add(skill); break; case EnumSkillTimeType.Section: _skillDic[EnumSkillTimeType.Session].Add(skill); _skillDic[EnumSkillTimeType.Section].Add(skill); break; case EnumSkillTimeType.Minute: _skillDic[EnumSkillTimeType.Section].Add(skill); _skillDic[EnumSkillTimeType.Minute].Add(skill); break; case EnumSkillTimeType.Round: _skillDic[EnumSkillTimeType.Minute].Add(skill); _skillDic[EnumSkillTimeType.Round].Add(skill); break; case EnumSkillTimeType.PreDecide: _skillDic[EnumSkillTimeType.PreDecide].Add(skill); break; } this.AddOpenClip(skill); } foreach (var kvp in dic) { if (kvp.Value < 0) { continue; } this._skillList[kvp.Value].Revoke(); } }
public bool TryGetRawSkill(string skillCode, out IRawSkill rawSkill) { return(s_dicSkills.TryGetValue(skillCode, out rawSkill)); }