예제 #1
0
 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());
     }
 }
예제 #2
0
        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);
        }
예제 #3
0
 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);
 }
예제 #4
0
        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);
        }
예제 #5
0
 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);
 }
예제 #6
0
        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("&#39;", "'")
				.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();
		}
예제 #9
0
 /// <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);
     }
 }