public static void ModifyEffect(GameClient client, int effectID, int talentType, int newLevel) { try { TalentData talentData = client.ClientData.MyTalentData; TalentInfo talentInfo = TalentManager.GetTalentInfoByID(client.ClientData.Occupation, effectID); if (talentInfo != null) { List <TalentEffectInfo> newItemEffectList = talentInfo.EffectList[newLevel]; bool result = TalentManager.DBTalentEffectModify(client.ClientData.RoleID, talentType, effectID, newLevel, client.ClientData.ZoneID, client.ServerId); Dictionary <int, int> countList; (countList = talentData.CountList)[talentType] = countList[talentType] + newLevel; TalentEffectItem effectItemOld = TalentManager.GetOpenEffectItem(talentData, effectID); if (effectItemOld == null) { effectItemOld = new TalentEffectItem(); effectItemOld.ID = effectID; effectItemOld.TalentType = talentType; talentData.EffectList.Add(effectItemOld); } effectItemOld.Level = newLevel; effectItemOld.ItemEffectList = newItemEffectList; } } catch (Exception ex) { LogManager.WriteException(ex.ToString()); } }
private static int GetTalentUseCount(TalentData talentData) { int result; if (talentData.CountList == null || talentData.CountList.Count <= 0) { result = 0; } else { result = talentData.CountList[2] + talentData.CountList[1] + talentData.CountList[3]; } return(result); }
public bool ProcessCmdTalentGetData(GameClient client, int nID, byte[] bytes, string[] cmdParams) { try { if (!CheckHelper.CheckCmdLengthAndRole(client, nID, cmdParams, 1)) { return(false); } TalentData talentData = TalentManager.GetTalentData(client); client.sendCmd <TalentData>(1000, talentData, false); return(true); } catch (Exception ex) { DataHelper.WriteFormatExceptionLog(ex, Global.GetDebugHelperInfo(client.ClientSocket), false, false); } return(false); }
private static TalentEffectItem GetOpenEffectItem(TalentData talentData, int effectID) { TalentEffectItem result; if (effectID <= 0) { result = null; } else { foreach (TalentEffectItem item in talentData.EffectList) { if (item.ID == effectID) { return(item); } } result = null; } return(result); }
public bool ProcessCmdTalentWash(GameClient client, int nID, byte[] bytes, string[] cmdParams) { try { if (!CheckHelper.CheckCmdLengthAndRole(client, nID, cmdParams, 2)) { return(false); } int washType = int.Parse(cmdParams[1]); int state = TalentManager.TalentWash(client, washType); TalentData talentData = TalentManager.GetTalentData(client); talentData.State = state; client.sendCmd <TalentData>(1002, talentData, false); return(true); } catch (Exception ex) { DataHelper.WriteFormatExceptionLog(ex, Global.GetDebugHelperInfo(client.ClientSocket), false, false); } return(false); }
private static bool IsEffectOpen(TalentData talentData, int effectID, int level) { bool result; if (effectID <= 0) { result = true; } else { TalentEffectItem item = TalentManager.GetOpenEffectItem(talentData, effectID); if (item != null) { if (item.Level >= level) { return(true); } } result = false; } return(result); }
/// <summary> /// Generate a comment for the talent field, based on it's description( Replaceed changed value by [BaseNumber * Pts]) /// </summary> /// <param name="Talent">Given talent</param> /// <returns>The comment</returns> private string GenerateComment(TalentData Talent) { string Comment = Talent.Description[Talent.Description.Length - 1]; if (Talent.Description.Length > 1) { char[] SplitCharacter = new char[] { ' ', '%' }; string[] FirstRank = Talent.Description[0].Split(SplitCharacter, StringSplitOptions.RemoveEmptyEntries); string[] LastRank = Talent.Description[Talent.Description.Length - 1].Split(SplitCharacter, StringSplitOptions.RemoveEmptyEntries); int ReplacePos = 0; //Description contains the same count of words for all ranks, diference only in some values for (int i = 0; i < Math.Min(FirstRank.Length, LastRank.Length); i++) { if (FirstRank[i] != LastRank[i]) { //To avoid string like "... increase by 5." if (FirstRank[i].Contains(".") == false) FirstRank[i] = FirstRank[i] + ".0"; else FirstRank[i] = FirstRank[i] + "0"; float BaseNumber = 0; if (float.TryParse(FirstRank[i], NumberStyles.Any, new NumberFormatInfo(), out BaseNumber)) { float MaxNumber = 0; string Replaced = "[{0} * Pts]"; if (float.TryParse(LastRank[i], NumberStyles.Any, new NumberFormatInfo(), out MaxNumber)) { int Base = Convert.ToInt32(BaseNumber); int Max = Convert.ToInt32(MaxNumber); //Number like: BaseNumber - 7, MaxNumber - 20 if ((Base > 0) && ((Max / Base) * Base) != Max) { Replaced = "[" + MaxNumber + " / " + Talent.Description.Length + " * Pts]"; } } Comment = Replace(Comment, LastRank[i], String.Format(Replaced, BaseNumber), ref ReplacePos); } } } } Comment = @"/// <summary>" + Environment.NewLine + @"/// " + Comment.Replace("\r\n", "\r\n/// ") + Environment.NewLine + @"/// </summary>"; return Comment; }
private void ProcessTalentDataJSON(string fullResponse, ClassData classData) { //Clean formatting out of the Descriptions fullResponse = fullResponse .Replace("</div></div>", "\r\n") .Replace("\\r\\n", "\r\n") .Replace(" <NNF>", "") .Replace(" <NYI>", "") .Replace("'", "'") .Replace("</div>", " - ") .Replace("<span style=\"color:#FFFFFF;\">", "") .Replace("<span style=\"color: #FFFFFF;\">", "") .Replace("</span>", "") .Replace("<div class=\"tt-spell sigrie-tooltip\">", "") .Replace("<div class=\"tt-name tts-name\">", "") .Replace("<div class=\"tts-rank\">", "") .Replace("</a>", "") .Replace("<div class=\"tt-spell-range_power\">", "") .Replace("<div class=\"tts-power_cost\">", "") .Replace("<div class=\"tt-spell-cast_cooldown\">", "") .Replace("<div class=\"tts-cooldown tt-spell-right\">", "") .Replace("<div class=\"tts-cast_time\">", "") .Replace("<div class=\"tts-description\">", "") .Replace("<div class=\"tts-range\">", "") .Replace("<div class=\"tts-required_tools\">", "") .Replace("<div class=\"tts-rune_cost tts-power_cost\">", "") .Replace("<div class=\"tts-required_stances\">", "") .Replace("<div class=\"tts-range tt-spell-right\">", "") .Replace("<div class=\"tts-power_cost tts-power_percent\">", "") .Replace("<div class=\"tts-required_item_subclasses\">", ""); while (fullResponse.Contains("<a href=\"")) { string href = fullResponse.Between("<a href=\"", "\">"); fullResponse = fullResponse.Replace("<a href=\"" + href + "\">", ""); } List<TalentData> talents = new List<TalentData>(); string[] allTalents = fullResponse.Between("[\"talents\"] = {", "}};").Split(new string[] { "}," }, StringSplitOptions.None); string[] allDescriptions = fullResponse.Between("[\"tooltips\"] = {", "}};").Split(new string[] { "}," }, StringSplitOptions.None); foreach (string strTalent in allTalents) { //10496: {'depends_count': 0, 'depends': 10486, 'max_ranks': 3, 'name': 'Sword and Board', 'tab': 845, 'column': 2, 'icon': 'ability_warrior_swordandboard', 'active': false, 'row': 5 TalentData talent = new TalentData(); talent.ID = strTalent.Before(":").Trim(); talent.Name = strTalent.Between("'name': ", ", 'tab'").Trim('\'','"'); talent.Icon = strTalent.Between("'icon': '", "',"); ; talent.MaxPoints = int.Parse(strTalent.Between("'max_ranks': ", ",")); talent.Prerequisite = int.Parse(strTalent.Between("'depends': ", ",")); ; //Set this to the ID for now, will update it to be the Index in a moment if (string.IsNullOrWhiteSpace(talent.Name) || talent.MaxPoints == 0) continue; string treeID = strTalent.Between("'tab': ", ","); talent.Tree = treeID == classData.TreeIDs[0] ? 0 : (treeID == classData.TreeIDs[1] ? 1 : 2); talent.Row = int.Parse(strTalent.After("'row': ")) + 1; talent.Column = int.Parse(strTalent.Between("'column': ", ",")) + 1; string strDescription = allDescriptions.First(str => str.Trim().StartsWith(talent.ID + ":")).After("{"); if (strDescription.After(": ")[0]=='\'') { //It's quoted using ' talent.Description = strDescription.TrimEnd('\'') .Split(new string[] { "'," }, StringSplitOptions.None).Select(str => str.After("'").Trim()).ToArray(); } else { //It's quoted using " talent.Description = strDescription.TrimEnd('"') .Split(new string[] { "\"," }, StringSplitOptions.None).Select(str => str.After("\"").Trim()).ToArray(); } // 1: "Your critical strikes cause the opponent to bleed, dealing 16% of your melee weapon's average damage over 6 sec.", 2: "Your critical strikes cause the opponent to bleed, dealing 32% of your melee weapon's average damage over 6 sec.", 3: "Your critical strikes cause the opponent to bleed, dealing 48% of your melee weapon's average damage over 6 sec." talents.Add(talent); } talents = talents.OrderBy(talent => talent.Tree * 1000 + talent.Row * 10 + talent.Column * 1).ToList(); int index = 0; foreach (var talent in talents) talent.Index = index++; foreach (var talent in talents.Where(t => t.Prerequisite > 0)) talent.Prerequisite = talents.First(t => t.ID == talent.Prerequisite.ToString()).Index; //Generaete the code string className = classData.Name + "Talents"; StringBuilder code = new StringBuilder(); code.AppendFormat( @" public partial class {0} : TalentsBase {{ public override TalentsBase Clone() {{ {0} clone = ({0})MemberwiseClone(); clone._data = (int[])_data.Clone(); clone._glyphData = (bool[])_glyphData.Clone(); clone.TreeCounts = new int[] {{ -1, -1, -1 }}; return clone; }} ", className); code.Append("\r\n"); code.AppendFormat(" private int[] _data = new int[{0}];\r\n", talents.Count); code.Append(" public override int[] Data { get { return _data; } }\r\n"); code.AppendFormat(" public {0}() {{ }}\r\n", className); code.AppendFormat(" public {0}(string talents, int[][] glyphEncodes=null)\r\n", className); code.Append(" {\r\n"); code.Append(" LoadString(talents, glyphEncodes);\r\n"); code.Append(" }\r\n"); code.Append(" public static string[] TreeNames = new [] {"); foreach (string tree in classData.TreeNames) code.AppendFormat("\r\n @\"{0}\",", tree); code.Append("};\r\n\r\n"); int lasttree = -1; foreach (TalentData talent in talents) { if (lasttree == -1) { lasttree = 0; code.Append(string.Format(" #region {0}\r\n", classData.TreeNames[lasttree])); code.Append(" public override int TreeStartingIndexes_"+lasttree.ToString()+" { get { return "+talent.Index.ToString()+"; } }\r\n"); } else if (lasttree == 0 && talent.Tree == 1) { lasttree = 1; code.Append(" #endregion\r\n"); code.Append(string.Format(" #region {0}\r\n", classData.TreeNames[lasttree])); code.Append(" public override int TreeStartingIndexes_"+lasttree.ToString()+" { get { return "+talent.Index.ToString()+"; } }\r\n"); } else if (lasttree == 1 && talent.Tree == 2) { lasttree = 2; code.Append(" #endregion\r\n"); code.Append(string.Format(" #region {0}\r\n", classData.TreeNames[lasttree])); code.Append(" public override int TreeStartingIndexes_"+lasttree.ToString()+" { get { return "+talent.Index.ToString()+"; } }\r\n"); } code.Append(GenerateComment(talent)); code.AppendFormat("\r\n[TalentData(index: {0}, name: \"{1}\", maxPoints: {2}, icon: \"{3}\",\r\n tree: {4}, column: {5}, row: {6}, prerequisite: {7}, description: new [] {{", talent.Index, talent.Name, talent.MaxPoints, talent.Icon, talent.Tree, talent.Column, talent.Row, talent.Prerequisite == 0 ? -1 : talent.Prerequisite); foreach (string descRank in talent.Description) { //strip html breaks from descriptions string description = descRank.Replace("<br/>", "\r\n"); code.AppendFormat("\r\n@\"{0}\",", description); } code.Append("})]\r\n"); code.AppendFormat("public int {0} {{ get {{ return _data[{1}]; }} set {{ _data[{1}] = value; }} }}\r\n", PropertyFromName(talent.Name), talent.Index); } code.Append(" #endregion\r\n"); code.Append(" }\r\n\r\n"); textBoxCode.Text += code.ToString(); }
/// <summary> /// 將字典傳入,依json表設定資料 /// </summary> public static void SetData(Dictionary<int, TalentData> _dic) { string jsonStr = Resources.Load<TextAsset>("Json/Talent").ToString(); JsonData jd = JsonMapper.ToObject(jsonStr); JsonData items = jd["Talent"]; for (int i = 0; i < items.Count; i++) { TalentData data = new TalentData(items[i]); int lv = data.ID; if (_dic.ContainsKey(lv)) { Debug.LogWarning("Talent表的ID重複"); break; } _dic.Add(lv, data); } }