├── README.md ├── WowHeadParser.VC.VC.opendb ├── .nuget ├── NuGet.exe ├── NuGet.Config └── NuGet.targets ├── WowHeadParser.VC.db ├── WowHeadParser ├── Newtonsoft.Json.dll ├── packages.config ├── Classes │ ├── WowheadWebclient.cs │ ├── Range.cs │ └── Zone.cs ├── Program.cs ├── SqlBuilder │ ├── SqlItem.cs │ ├── SqlBuilderException.cs │ └── SqlBuilder.cs ├── Properties │ ├── Settings.settings │ ├── AssemblyInfo.cs │ ├── Settings.Designer.cs │ ├── Resources.Designer.cs │ └── Resources.resx ├── App.config ├── Entities │ ├── Entity.cs │ ├── BlackMarket.cs │ ├── ZoneEntity.cs │ ├── Quest.cs │ ├── Item.cs │ ├── Zone.cs │ └── Gameobject.cs ├── WowHeadParser.csproj ├── MainWindow.resx ├── Ressources │ ├── NpcTotalHp.txt │ ├── NpcTotalHpExp1.txt │ ├── NpcTotalHpExp3.txt │ ├── NpcTotalHpExp4.txt │ ├── NpcTotalHpExp6.txt │ ├── NpcTotalHpExp2.txt │ ├── NpcTotalHpExp5.txt │ └── CurrencyTypes.db2.csv ├── MainWindow.Designer.cs └── MainWindow.cs ├── WowHeadParser.sln └── .gitignore /README.md: -------------------------------------------------------------------------------- 1 | # WowpacketParser for AshamaneProject 2 | -------------------------------------------------------------------------------- /WowHeadParser.VC.VC.opendb: -------------------------------------------------------------------------------- 1 | TheltTHELT-PC -------------------------------------------------------------------------------- /.nuget/NuGet.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AshamaneProject/WowheadParser/HEAD/.nuget/NuGet.exe -------------------------------------------------------------------------------- /WowHeadParser.VC.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AshamaneProject/WowheadParser/HEAD/WowHeadParser.VC.db -------------------------------------------------------------------------------- /WowHeadParser/Newtonsoft.Json.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AshamaneProject/WowheadParser/HEAD/WowHeadParser/Newtonsoft.Json.dll -------------------------------------------------------------------------------- /WowHeadParser/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.nuget/NuGet.Config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /WowHeadParser/Classes/WowheadWebclient.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * * Created by Traesh for AshamaneProject (https://github.com/AshamaneProject) 3 | */ 4 | using System.Net; 5 | using System.Text; 6 | 7 | namespace WowHeadParser 8 | { 9 | [System.ComponentModel.DesignerCategory("Code")] 10 | class WowheadWebclient : WebClient 11 | { 12 | public WowheadWebclient() : base() 13 | { 14 | this.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"); 15 | this.Encoding = Encoding.UTF8; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /WowHeadParser/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | 7 | namespace WowHeadParser 8 | { 9 | static class Program 10 | { 11 | /// 12 | /// Point d'entrée principal de l'application. 13 | /// 14 | [STAThread] 15 | static void Main(string[] args) 16 | { 17 | Application.EnableVisualStyles(); 18 | Application.SetCompatibleTextRenderingDefault(false); 19 | Application.Run(new MainWindow()); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /WowHeadParser/SqlBuilder/SqlItem.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace Sql 5 | { 6 | public class SqlItem 7 | { 8 | private List _values = new List(64); 9 | 10 | public object Key { get; set; } 11 | 12 | /// 13 | /// Gets the number of elements actually contained in the list 14 | /// 15 | public int Count { get { return _values.Count; } } 16 | 17 | public SqlItem(object key, List values) 18 | { 19 | Key = key; 20 | _values = values; 21 | } 22 | 23 | public string this[int x] 24 | { 25 | get 26 | { 27 | if (x >= Count) 28 | throw new IndexOutOfRangeException(); 29 | 30 | return _values[x]; 31 | } 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /WowHeadParser/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | fr 7 | 8 | 9 | 2 10 | 11 | 12 | 13 | 14 | 15 | 0 16 | 17 | 18 | -------------------------------------------------------------------------------- /WowHeadParser/SqlBuilder/SqlBuilderException.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Sql 4 | { 5 | [Serializable] 6 | internal class InvalidQueryTypeException : Exception 7 | { 8 | public InvalidQueryTypeException() 9 | { 10 | } 11 | 12 | public InvalidQueryTypeException(SqlQueryType type) 13 | : base(type.ToString()) 14 | { 15 | } 16 | 17 | public InvalidQueryTypeException(string message) 18 | : base(message) 19 | { 20 | } 21 | 22 | public InvalidQueryTypeException(string message, params object[] args) 23 | : base(string.Format(message, args)) 24 | { 25 | } 26 | 27 | public override string Message { get { return string.Format(@"{0}: Invalid SqlQueryType value! Query type value must be in the interval from SqlQueryType.None to SqlQueryType.Max", Source); } } 28 | 29 | public override string ToString() 30 | { 31 | return Message; 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /WowHeadParser.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2013 4 | VisualStudioVersion = 12.0.30723.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WowHeadParser", "WowHeadParser\WowHeadParser.csproj", "{017A8055-0E2B-475C-A318-AD96BF782B19}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {017A8055-0E2B-475C-A318-AD96BF782B19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {017A8055-0E2B-475C-A318-AD96BF782B19}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {017A8055-0E2B-475C-A318-AD96BF782B19}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {017A8055-0E2B-475C-A318-AD96BF782B19}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /WowHeadParser/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | fr 15 | 16 | 17 | 2 18 | 19 | 20 | 0 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /WowHeadParser/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // Les informations générales relatives à un assembly dépendent de 6 | // l'ensemble d'attributs suivant. Changez les valeurs de ces attributs pour modifier les informations 7 | // associées à un assembly. 8 | [assembly: AssemblyTitle("WowHeadParser")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Farahlon Server")] 12 | [assembly: AssemblyProduct("WowHeadParser")] 13 | [assembly: AssemblyCopyright("Copyright © 2015")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // L'affectation de la valeur false à ComVisible rend les types invisibles dans cet assembly 18 | // aux composants COM. Si vous devez accéder à un type dans cet assembly à partir de 19 | // COM, affectez la valeur true à l'attribut ComVisible sur ce type. 20 | [assembly: ComVisible(false)] 21 | 22 | // Le GUID suivant est pour l'ID de la typelib si ce projet est exposé à COM 23 | [assembly: Guid("8ff557a9-d899-4710-912c-db141be67ec0")] 24 | 25 | // Les informations de version pour un assembly se composent des quatre valeurs suivantes : 26 | // 27 | // Version principale 28 | // Version secondaire 29 | // Numéro de build 30 | // Révision 31 | // 32 | // Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut 33 | // en utilisant '*', comme indiqué ci-dessous : 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /WowHeadParser/Entities/Entity.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * * Created by Traesh for AshamaneProject (https://github.com/AshamaneProject) 3 | */ 4 | using Sql; 5 | using System; 6 | using System.Collections.Generic; 7 | using System.Linq; 8 | using System.Net.Http; 9 | using System.Text; 10 | using System.Threading.Tasks; 11 | 12 | namespace WowHeadParser.Entities 13 | { 14 | public class Entity 15 | { 16 | public Entity() 17 | { 18 | m_hasZoneData = false; 19 | isError = false; 20 | webClient = null; 21 | } 22 | 23 | static public String GetWowheadBaseUrl() 24 | { 25 | if (m_baseWowheadUrl == "") 26 | ReloadWowheadBaseUrl(); 27 | 28 | return m_baseWowheadUrl; 29 | } 30 | 31 | static public void ReloadWowheadBaseUrl() 32 | { 33 | m_baseWowheadUrl = "https://" + Properties.Settings.Default.wowheadLocale + ".wowhead.com"; 34 | } 35 | 36 | public virtual String GetWowheadUrl() { return ""; } 37 | 38 | public virtual List GetIdsFromZone(String zoneId, String zoneHtml) { return new List(); } 39 | 40 | public virtual bool ParseSingleJson(int id = 0) { return false; } 41 | 42 | public virtual String GetSQLRequest() { return ""; } 43 | 44 | public void SetIsError() { isError = true; } 45 | 46 | public bool IsCheckboxChecked(String checkboxName) 47 | { 48 | for (int i = 0; i < Properties.Settings.Default.checkedList.Count; ++i) 49 | if (Properties.Settings.Default.checkedList[i] == checkboxName) 50 | return true; 51 | 52 | return false; 53 | } 54 | 55 | protected bool isError; 56 | protected bool m_hasZoneData; 57 | 58 | static private String m_baseWowheadUrl = ""; 59 | 60 | public HttpClient webClient; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /WowHeadParser/Entities/BlackMarket.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * * Created by Traesh for AshamaneProject (https://github.com/AshamaneProject) 3 | */ 4 | using Newtonsoft.Json; 5 | using Sql; 6 | using System; 7 | using System.Collections.Generic; 8 | using System.Linq; 9 | using System.Text; 10 | using System.Text.RegularExpressions; 11 | using System.Threading.Tasks; 12 | using Newtonsoft.Json.Linq; 13 | using System.IO; 14 | 15 | namespace WowHeadParser.Entities 16 | { 17 | class BlackMarket : Entity 18 | { 19 | struct BlackMarketItem 20 | { 21 | public int id; 22 | public int level; 23 | } 24 | 25 | private int m_id; 26 | 27 | public BlackMarket(int id = 0) 28 | { 29 | m_id = id; 30 | } 31 | 32 | public override List GetIdsFromZone(String zoneId, String zoneHtml) 33 | { 34 | String blackMarketHtml = Tools.GetHtmlFromWowhead("http://www.wowhead.com/items?filter=cr=181;crs=1;crv=0#700-2"); 35 | 36 | String blackMarketItemsPattern = @"var listviewitems = (\[.+\]);"; 37 | String allBlackMarketItemJson = Tools.ExtractJsonFromWithPattern(blackMarketHtml, blackMarketItemsPattern); 38 | BlackMarketItem[] allBlackMarketItemsParsing = JsonConvert.DeserializeObject(allBlackMarketItemJson); 39 | 40 | List tempArray = new List(); 41 | foreach (BlackMarketItem blackMarketItemsParsing in allBlackMarketItemsParsing) 42 | { 43 | if (blackMarketItemsParsing.level > UInt32.Parse(zoneId)) 44 | continue; 45 | 46 | BlackMarket bm = new BlackMarket(blackMarketItemsParsing.id); 47 | tempArray.Add(bm); 48 | } 49 | 50 | return tempArray; 51 | } 52 | 53 | public override bool ParseSingleJson(int id = 0) 54 | { 55 | if (id == 0 && m_id != 0) 56 | id = m_id; 57 | else 58 | return false; 59 | 60 | return true; 61 | } 62 | 63 | public override String GetSQLRequest() 64 | { 65 | String returnSql = "INSERT INTO blackmarket_template (id, itemEntry, itemCount, seller, startBid, duration, chance) VALUES (0, " + m_id + ", 1, 83867, 50000000, 43200, 10);\n"; 66 | return returnSql; 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /WowHeadParser/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // Ce code a été généré par un outil. 4 | // Version du runtime :4.0.30319.34209 5 | // 6 | // Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si 7 | // le code est régénéré. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace WowHeadParser.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | 26 | [global::System.Configuration.UserScopedSettingAttribute()] 27 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 28 | [global::System.Configuration.DefaultSettingValueAttribute("fr")] 29 | public string wowheadLocale { 30 | get { 31 | return ((string)(this["wowheadLocale"])); 32 | } 33 | set { 34 | this["wowheadLocale"] = value; 35 | } 36 | } 37 | 38 | [global::System.Configuration.UserScopedSettingAttribute()] 39 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 40 | [global::System.Configuration.DefaultSettingValueAttribute("2")] 41 | public int localIndex { 42 | get { 43 | return ((int)(this["localIndex"])); 44 | } 45 | set { 46 | this["localIndex"] = value; 47 | } 48 | } 49 | 50 | [global::System.Configuration.UserScopedSettingAttribute()] 51 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 52 | public global::System.Collections.Specialized.StringCollection checkedList { 53 | get { 54 | return ((global::System.Collections.Specialized.StringCollection)(this["checkedList"])); 55 | } 56 | set { 57 | this["checkedList"] = value; 58 | } 59 | } 60 | 61 | [global::System.Configuration.UserScopedSettingAttribute()] 62 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 63 | [global::System.Configuration.DefaultSettingValueAttribute("0")] 64 | public int selectedEntity { 65 | get { 66 | return ((int)(this["selectedEntity"])); 67 | } 68 | set { 69 | this["selectedEntity"] = value; 70 | } 71 | } 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /WowHeadParser/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // Ce code a été généré par un outil. 4 | // Version du runtime :4.0.30319.34209 5 | // 6 | // Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si 7 | // le code est régénéré. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace WowHeadParser.Properties 12 | { 13 | 14 | 15 | /// 16 | /// Une classe de ressource fortement typée destinée, entre autres, à la consultation des chaînes localisées. 17 | /// 18 | // Cette classe a été générée automatiquement par la classe StronglyTypedResourceBuilder 19 | // à l'aide d'un outil, tel que ResGen ou Visual Studio. 20 | // Pour ajouter ou supprimer un membre, modifiez votre fichier .ResX, puis réexécutez ResGen 21 | // avec l'option /str ou régénérez votre projet VS. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources 26 | { 27 | 28 | private static global::System.Resources.ResourceManager resourceMan; 29 | 30 | private static global::System.Globalization.CultureInfo resourceCulture; 31 | 32 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 33 | internal Resources() 34 | { 35 | } 36 | 37 | /// 38 | /// Retourne l'instance ResourceManager mise en cache utilisée par cette classe. 39 | /// 40 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 41 | internal static global::System.Resources.ResourceManager ResourceManager 42 | { 43 | get 44 | { 45 | if ((resourceMan == null)) 46 | { 47 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WowHeadParser.Properties.Resources", typeof(Resources).Assembly); 48 | resourceMan = temp; 49 | } 50 | return resourceMan; 51 | } 52 | } 53 | 54 | /// 55 | /// Remplace la propriété CurrentUICulture du thread actuel pour toutes 56 | /// les recherches de ressources à l'aide de cette classe de ressource fortement typée. 57 | /// 58 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 59 | internal static global::System.Globalization.CultureInfo Culture 60 | { 61 | get 62 | { 63 | return resourceCulture; 64 | } 65 | set 66 | { 67 | resourceCulture = value; 68 | } 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /WowHeadParser/Entities/ZoneEntity.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * * Created by Traesh for AshamaneProject (https://github.com/AshamaneProject) 3 | */ 4 | using Newtonsoft.Json; 5 | using Sql; 6 | using System; 7 | 8 | namespace WowHeadParser.Entities 9 | { 10 | class ZoneEntity : Entity 11 | { 12 | public struct ZoneParsing 13 | { 14 | public int id; 15 | public string name; 16 | } 17 | 18 | public struct FishingParsing 19 | { 20 | public int id; 21 | public int count; 22 | } 23 | 24 | public ZoneEntity() 25 | { 26 | m_data.id = 0; 27 | m_itemMaxCount = 0; 28 | } 29 | 30 | public ZoneEntity(int id) 31 | { 32 | m_data.id = id; 33 | m_itemMaxCount = 0; 34 | } 35 | 36 | public override String GetWowheadUrl() 37 | { 38 | return GetWowheadBaseUrl() + "/zone=" + m_data.id; 39 | } 40 | 41 | public override bool ParseSingleJson(int id = 0) 42 | { 43 | if (m_data.id == 0 && id == 0) 44 | return false; 45 | else if (m_data.id == 0 && id != 0) 46 | m_data.id = id; 47 | 48 | String zoneHTML = Tools.GetHtmlFromWowhead(GetWowheadUrl()); 49 | 50 | String fishingPattern = @"new Listview\(\{template: 'item', id: 'fishing', name: LANG\.tab_fishing, tabs: tabsRelated, parent: 'lkljbjkb574', extraCols: \[Listview\.extraCols\.count, Listview\.extraCols.percent\], sort:\['-percent', 'name'\], computeDataFunc: Listview\.funcBox\.initLootTable, note: \$WH\.sprintf\(LANG\.lvnote_zonefishing, [0-9]+\), _totalCount: ([0-9]+), data: (.+)\}\);"; 51 | 52 | m_itemMaxCount = Int32.Parse(Tools.ExtractJsonFromWithPattern(zoneHTML, fishingPattern, 0)); 53 | String fishingJSon = Tools.ExtractJsonFromWithPattern(zoneHTML, fishingPattern, 1); 54 | if (fishingJSon != null) 55 | { 56 | m_fishingDatas = JsonConvert.DeserializeObject(fishingJSon); 57 | } 58 | 59 | return true; 60 | } 61 | 62 | public override String GetSQLRequest() 63 | { 64 | String returnSql = ""; 65 | 66 | if (m_data.id == 0 || isError) 67 | return returnSql; 68 | 69 | if (IsCheckboxChecked("Fishing") && m_fishingDatas != null) 70 | { 71 | m_FishingLootTemplateBuilder = new SqlBuilder("fishing_loot_template", "entry", SqlQueryType.InsertIgnore); 72 | m_FishingLootTemplateBuilder.SetFieldsNames("item", "ChanceOrQuestChance", "lootmode", "groupid", "mincountOrRef", "maxcount", "itemBonuses"); 73 | 74 | foreach (FishingParsing fishingLootdata in m_fishingDatas) 75 | { 76 | String percent = ((float)fishingLootdata.count / (float)m_itemMaxCount * 100).ToString().Replace(",", "."); 77 | m_FishingLootTemplateBuilder.AppendFieldsValue(m_data.id, fishingLootdata.id, percent, 1, 0, "1", "1", ""); 78 | } 79 | 80 | returnSql += m_FishingLootTemplateBuilder.ToString() + "\n"; 81 | } 82 | 83 | return returnSql; 84 | } 85 | 86 | public ZoneParsing m_data; 87 | 88 | protected FishingParsing[] m_fishingDatas; 89 | protected int m_itemMaxCount; 90 | 91 | protected SqlBuilder m_spellLootTemplateBuilder; 92 | protected SqlBuilder m_FishingLootTemplateBuilder; 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | build/ 21 | bld/ 22 | [Bb]in/ 23 | [Oo]bj/ 24 | 25 | # Visual Studo 2015 cache/options directory 26 | .vs/ 27 | 28 | # MSTest test Results 29 | [Tt]est[Rr]esult*/ 30 | [Bb]uild[Ll]og.* 31 | 32 | # NUNIT 33 | *.VisualState.xml 34 | TestResult.xml 35 | 36 | # Build Results of an ATL Project 37 | [Dd]ebugPS/ 38 | [Rr]eleasePS/ 39 | dlldata.c 40 | 41 | *_i.c 42 | *_p.c 43 | *_i.h 44 | *.ilk 45 | *.meta 46 | *.obj 47 | *.pch 48 | *.pdb 49 | *.pgc 50 | *.pgd 51 | *.rsp 52 | *.sbr 53 | *.tlb 54 | *.tli 55 | *.tlh 56 | *.tmp 57 | *.tmp_proj 58 | *.log 59 | *.vspscc 60 | *.vssscc 61 | .builds 62 | *.pidb 63 | *.svclog 64 | *.scc 65 | 66 | # Chutzpah Test files 67 | _Chutzpah* 68 | 69 | # Visual C++ cache files 70 | ipch/ 71 | *.aps 72 | *.ncb 73 | *.opensdf 74 | *.sdf 75 | *.cachefile 76 | 77 | # Visual Studio profiler 78 | *.psess 79 | *.vsp 80 | *.vspx 81 | 82 | # TFS 2012 Local Workspace 83 | $tf/ 84 | 85 | # Guidance Automation Toolkit 86 | *.gpState 87 | 88 | # ReSharper is a .NET coding add-in 89 | _ReSharper*/ 90 | *.[Rr]e[Ss]harper 91 | *.DotSettings.user 92 | 93 | # JustCode is a .NET coding addin-in 94 | .JustCode 95 | 96 | # TeamCity is a build add-in 97 | _TeamCity* 98 | 99 | # DotCover is a Code Coverage Tool 100 | *.dotCover 101 | 102 | # NCrunch 103 | _NCrunch_* 104 | .*crunch*.local.xml 105 | 106 | # MightyMoose 107 | *.mm.* 108 | AutoTest.Net/ 109 | 110 | # Web workbench (sass) 111 | .sass-cache/ 112 | 113 | # Installshield output folder 114 | [Ee]xpress/ 115 | 116 | # DocProject is a documentation generator add-in 117 | DocProject/buildhelp/ 118 | DocProject/Help/*.HxT 119 | DocProject/Help/*.HxC 120 | DocProject/Help/*.hhc 121 | DocProject/Help/*.hhk 122 | DocProject/Help/*.hhp 123 | DocProject/Help/Html2 124 | DocProject/Help/html 125 | 126 | # Click-Once directory 127 | publish/ 128 | 129 | # Publish Web Output 130 | *.[Pp]ublish.xml 131 | *.azurePubxml 132 | # TODO: Comment the next line if you want to checkin your web deploy settings 133 | # but database connection strings (with potential passwords) will be unencrypted 134 | *.pubxml 135 | *.publishproj 136 | 137 | # NuGet Packages 138 | *.nupkg 139 | # The packages folder can be ignored because of Package Restore 140 | **/packages/* 141 | # except build/, which is used as an MSBuild target. 142 | !**/packages/build/ 143 | # Uncomment if necessary however generally it will be regenerated when needed 144 | #!**/packages/repositories.config 145 | 146 | # Windows Azure Build Output 147 | csx/ 148 | *.build.csdef 149 | 150 | # Windows Store app package directory 151 | AppPackages/ 152 | 153 | # Others 154 | *.[Cc]ache 155 | ClientBin/ 156 | [Ss]tyle[Cc]op.* 157 | ~$* 158 | *~ 159 | *.dbmdl 160 | *.dbproj.schemaview 161 | *.pfx 162 | *.publishsettings 163 | node_modules/ 164 | bower_components/ 165 | 166 | # RIA/Silverlight projects 167 | Generated_Code/ 168 | 169 | # Backup & report files from converting an old project file 170 | # to a newer Visual Studio version. Backup files are not needed, 171 | # because we have git ;-) 172 | _UpgradeReport_Files/ 173 | Backup*/ 174 | UpgradeLog*.XML 175 | UpgradeLog*.htm 176 | 177 | # SQL Server files 178 | *.mdf 179 | *.ldf 180 | 181 | # Business Intelligence projects 182 | *.rdl.data 183 | *.bim.layout 184 | *.bim_*.settings 185 | 186 | # Microsoft Fakes 187 | FakesAssemblies/ 188 | 189 | # Node.js Tools for Visual Studio 190 | .ntvs_analysis.dat 191 | 192 | # Visual Studio 6 build log 193 | *.plg 194 | 195 | # Visual Studio 6 workspace options file 196 | *.opt -------------------------------------------------------------------------------- /WowHeadParser/Classes/Range.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * * Created by Traesh for AshamaneProject (https://github.com/AshamaneProject) 3 | */ 4 | using System; 5 | using System.ComponentModel; 6 | using System.IO; 7 | using System.Net.Http; 8 | using WowHeadParser.Entities; 9 | 10 | namespace WowHeadParser 11 | { 12 | class Range 13 | { 14 | const int MAX_WORKER = 20; 15 | 16 | public Range(MainWindow view, String fileName) 17 | { 18 | m_view = view; 19 | m_index = 0; 20 | m_parsedEntitiesCount = 0; 21 | m_getRangeListBackgroundWorker = new BackgroundWorker[MAX_WORKER]; 22 | m_webClients = new HttpClient[MAX_WORKER]; 23 | 24 | m_fileName = fileName; 25 | m_lastEstimateTime = 0; 26 | } 27 | 28 | public void StartParsing(int from, int to) 29 | { 30 | if (from > to) 31 | return; 32 | 33 | m_timestamp = Tools.GetUnixTimestamp(); 34 | 35 | m_from = from; 36 | m_to = to; 37 | m_entityTodoCount = to - from + 1; // + 1 car le premier est compris 38 | 39 | StartSnifByEntity(); 40 | } 41 | 42 | void StartSnifByEntity() 43 | { 44 | m_index = 0; 45 | m_parsedEntitiesCount = 0; 46 | 47 | int maxWorkers = (m_to - m_from + 1) > MAX_WORKER ? MAX_WORKER : m_to - m_from + 1; 48 | 49 | for (int i = 0; i < maxWorkers; ++i) 50 | { 51 | m_webClients[i] = Tools.InitHttpClient(); 52 | 53 | m_getRangeListBackgroundWorker[i] = new BackgroundWorker(); 54 | m_getRangeListBackgroundWorker[i].DoWork += new DoWorkEventHandler(BackgroundWorkerProcessEntitiesList); 55 | m_getRangeListBackgroundWorker[i].RunWorkerCompleted += new RunWorkerCompletedEventHandler(BackgroundWorkerProcessEntitiesCompleted); 56 | m_getRangeListBackgroundWorker[i].RunWorkerAsync(i); 57 | } 58 | } 59 | 60 | private void BackgroundWorkerProcessEntitiesList(object sender, DoWorkEventArgs e) 61 | { 62 | if (m_index >= m_entityTodoCount) 63 | return; 64 | 65 | int tempIndex = m_index++; 66 | try 67 | { 68 | e.Result = e.Argument; 69 | Entity entity = m_view.CreateNeededEntity(m_from + tempIndex); 70 | entity.webClient = m_webClients[(int)e.Result]; 71 | entity.ParseSingleJson(); 72 | String requestText = "\n\n" + entity.GetSQLRequest(); 73 | requestText += requestText != "" ? "\n" : ""; 74 | File.AppendAllText(m_fileName, entity.GetSQLRequest()); 75 | } 76 | catch (Exception ex) 77 | { 78 | if (ex.Message.IndexOf("404") != -1) 79 | Console.WriteLine("Introuvable"); 80 | else 81 | Console.WriteLine("Erreur"); 82 | } 83 | ++m_parsedEntitiesCount; 84 | } 85 | 86 | private void BackgroundWorkerProcessEntitiesCompleted(object sender, RunWorkerCompletedEventArgs e) 87 | { 88 | if (m_parsedEntitiesCount > m_entityTodoCount) 89 | return; 90 | 91 | Console.WriteLine("Nombre effectué : " + m_parsedEntitiesCount); 92 | 93 | float percent = ((float)m_index / (float)m_entityTodoCount) * 100; 94 | 95 | if (m_view != null) 96 | { 97 | m_view.setProgressBar((int)percent); 98 | EstimateSecondsTimeLeft(); 99 | } 100 | 101 | if (m_parsedEntitiesCount == m_entityTodoCount) 102 | { 103 | m_view.SetWorkDone(); 104 | return; 105 | } 106 | 107 | if (m_index >= m_entityTodoCount) 108 | return; 109 | 110 | int workerIndex = (int)e.Result; 111 | m_getRangeListBackgroundWorker[workerIndex].RunWorkerAsync(workerIndex); 112 | } 113 | 114 | private void EstimateSecondsTimeLeft() 115 | { 116 | Int32 unixTimestamp = Tools.GetUnixTimestamp(); 117 | 118 | if ((m_lastEstimateTime + 1) >= unixTimestamp) 119 | return; 120 | 121 | m_lastEstimateTime = unixTimestamp; 122 | 123 | float elapsedSeconds = unixTimestamp - m_timestamp; 124 | 125 | float entityCount = m_to - m_from; 126 | float timeByEntity = (float)elapsedSeconds / (float)m_parsedEntitiesCount; 127 | 128 | float estimatedSecondsLeft = timeByEntity * (entityCount - m_parsedEntitiesCount); 129 | 130 | m_view.SetTimeLeft((Int32)estimatedSecondsLeft); 131 | } 132 | 133 | private MainWindow m_view; 134 | 135 | private String m_fileName; 136 | 137 | private int m_from; 138 | private int m_to; 139 | private int m_entityTodoCount; 140 | private int m_index; 141 | private int m_parsedEntitiesCount; 142 | 143 | private BackgroundWorker[] m_getRangeListBackgroundWorker; 144 | private HttpClient[] m_webClients; 145 | 146 | // Test 147 | private int m_timestamp; 148 | private int m_lastEstimateTime; 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /WowHeadParser/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | text/microsoft-resx 107 | 108 | 109 | 2.0 110 | 111 | 112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 113 | 114 | 115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | -------------------------------------------------------------------------------- /WowHeadParser/WowHeadParser.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {017A8055-0E2B-475C-A318-AD96BF782B19} 8 | WinExe 9 | Properties 10 | WowHeadParser 11 | WowHeadParser 12 | v4.5 13 | 512 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | AnyCPU 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 36 | ..\packages\CsvHelper.2.13.2.0\lib\net40-client\CsvHelper.dll 37 | 38 | 39 | False 40 | .\Newtonsoft.Json.dll 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | Form 71 | 72 | 73 | MainWindow.cs 74 | 75 | 76 | 77 | 78 | MainWindow.cs 79 | 80 | 81 | ResXFileCodeGenerator 82 | Resources.Designer.cs 83 | Designer 84 | 85 | 86 | True 87 | Resources.resx 88 | 89 | 90 | 91 | SettingsSingleFileGenerator 92 | Settings.Designer.cs 93 | 94 | 95 | True 96 | Settings.settings 97 | True 98 | 99 | 100 | PreserveNewest 101 | 102 | 103 | PreserveNewest 104 | 105 | 106 | PreserveNewest 107 | 108 | 109 | 110 | 111 | Designer 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 128 | -------------------------------------------------------------------------------- /WowHeadParser/MainWindow.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /WowHeadParser/Classes/Zone.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * * Created by Traesh for AshamaneProject (https://github.com/AshamaneProject) 3 | */ 4 | using System; 5 | using System.Collections.Generic; 6 | using System.ComponentModel; 7 | using System.IO; 8 | using System.Linq; 9 | using WowHeadParser.Entities; 10 | 11 | namespace WowHeadParser 12 | { 13 | class Zone 14 | { 15 | const int MAX_WORKER = 50; 16 | 17 | public Zone(MainWindow view) 18 | { 19 | m_view = view; 20 | m_zoneId = "0"; 21 | m_index = 0; 22 | m_parsedEntitiesCount = 0; 23 | m_getZoneListBackgroundWorker = new BackgroundWorker[MAX_WORKER]; 24 | 25 | m_fileName = ""; 26 | m_array = new List(); 27 | } 28 | 29 | private void ResetZone() 30 | { 31 | if (m_view != null) 32 | m_view.setProgressBar(0); 33 | 34 | m_index = 0; 35 | m_array.Clear(); 36 | m_parsedEntitiesCount = 0; 37 | m_timestamp = Tools.GetUnixTimestamp(); 38 | m_fileName = Tools.GetFileNameForCurrentTime(); 39 | m_timestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; 40 | } 41 | 42 | public void StartParsing(String zone) 43 | { 44 | Entity askedEntity = m_view.CreateNeededEntity(); 45 | 46 | if (askedEntity == null) 47 | return; 48 | 49 | ResetZone(); 50 | m_zoneId = zone; 51 | 52 | if (askedEntity.GetType() != typeof(BlackMarket)) 53 | m_zoneHtml = GetZoneHtmlFromWowhead(m_zoneId); 54 | 55 | ParseZoneJson(); 56 | StartSnifByEntity(); 57 | } 58 | 59 | public String GetZoneHtmlFromWowhead(String zone) 60 | { 61 | return Tools.GetHtmlFromWowhead(Tools.GetWowheadUrl("zone", zone)); 62 | } 63 | 64 | public void ParseZoneJson() 65 | { 66 | Entity askedEntity = m_view.CreateNeededEntity(); 67 | 68 | if (askedEntity == null) 69 | return; 70 | 71 | List entityList = m_view.CreateNeededEntity().GetIdsFromZone(m_zoneId, m_zoneHtml); 72 | 73 | if (entityList != null) 74 | m_array.AddRange(entityList); 75 | } 76 | 77 | void StartSnifByEntity() 78 | { 79 | m_index = 0; 80 | m_parsedEntitiesCount = 0; 81 | 82 | for (int i = 0; i < MAX_WORKER; ++i) 83 | { 84 | m_getZoneListBackgroundWorker[i] = new BackgroundWorker(); 85 | m_getZoneListBackgroundWorker[i].DoWork += new DoWorkEventHandler(BackgroundWorkerProcessEntitiesList); 86 | m_getZoneListBackgroundWorker[i].RunWorkerCompleted += new RunWorkerCompletedEventHandler(BackgroundWorkerProcessEntitiesCompleted); 87 | m_getZoneListBackgroundWorker[i].WorkerReportsProgress = true; 88 | m_getZoneListBackgroundWorker[i].WorkerSupportsCancellation = true; 89 | m_getZoneListBackgroundWorker[i].RunWorkerAsync(i); 90 | } 91 | } 92 | 93 | private void BackgroundWorkerProcessEntitiesList(object sender, DoWorkEventArgs e) 94 | { 95 | if (m_index >= m_array.Count) 96 | return; 97 | 98 | int tempIndex = m_index++; 99 | try 100 | { 101 | e.Result = e.Argument; 102 | bool parseReturn = m_array[tempIndex].ParseSingleJson(); 103 | } 104 | catch (Exception ex) 105 | { 106 | Console.WriteLine("Erreur"); 107 | } 108 | ++m_parsedEntitiesCount; 109 | } 110 | 111 | private void BackgroundWorkerProcessEntitiesCompleted(object sender, RunWorkerCompletedEventArgs e) 112 | { 113 | if (m_parsedEntitiesCount > m_array.Count) 114 | return; 115 | 116 | Console.WriteLine("Nombre effectué : " + m_parsedEntitiesCount); 117 | 118 | float percent = ((float)m_index / (float)m_array.Count) * 100; 119 | 120 | if (m_view != null) 121 | { 122 | m_view.setProgressBar((int)percent); 123 | EstimateSecondsTimeLeft(); 124 | } 125 | 126 | if (m_parsedEntitiesCount == m_array.Count) 127 | { 128 | AppendAllEntitiesToSql(); 129 | m_view.SetWorkDone(); 130 | return; 131 | } 132 | 133 | if (m_index >= m_array.Count) 134 | return; 135 | 136 | int workerIndex = (int)e.Result; 137 | 138 | if (!m_getZoneListBackgroundWorker[workerIndex].IsBusy) 139 | m_getZoneListBackgroundWorker[workerIndex].RunWorkerAsync(workerIndex); 140 | } 141 | 142 | void AppendAllEntitiesToSql() 143 | { 144 | int tempCount = 0; 145 | foreach (Entity entity in m_array) 146 | { 147 | Console.WriteLine("Doing entity n°" + tempCount++); 148 | String requestText = entity.GetSQLRequest(); 149 | requestText += requestText != "" ? "\n" : ""; 150 | File.AppendAllText(m_fileName, entity.GetSQLRequest()); 151 | } 152 | 153 | Console.WriteLine("Elapsed Time : " + ((Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds - m_timestamp)); 154 | } 155 | 156 | private void EstimateSecondsTimeLeft() 157 | { 158 | Int32 unixTimestamp = Tools.GetUnixTimestamp(); 159 | 160 | if ((m_lastEstimateTime + 1) >= unixTimestamp) 161 | return; 162 | 163 | m_lastEstimateTime = unixTimestamp; 164 | 165 | float elapsedSeconds = unixTimestamp - m_timestamp; 166 | 167 | float entityCount = m_array.Count(); 168 | float timeByEntity = (float)elapsedSeconds / (float)m_parsedEntitiesCount; 169 | 170 | float estimatedSecondsLeft = timeByEntity * (entityCount - m_parsedEntitiesCount); 171 | 172 | m_view.SetTimeLeft((Int32)estimatedSecondsLeft); 173 | } 174 | 175 | private MainWindow m_view; 176 | 177 | private String m_zoneId; 178 | private String m_zoneHtml; 179 | 180 | private String m_fileName; 181 | 182 | private List m_array; 183 | private int m_index; 184 | private int m_parsedEntitiesCount; 185 | 186 | private BackgroundWorker[] m_getZoneListBackgroundWorker; 187 | 188 | private int m_timestamp; 189 | private int m_lastEstimateTime; 190 | } 191 | } 192 | -------------------------------------------------------------------------------- /.nuget/NuGet.targets: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | $(MSBuildProjectDirectory)\..\ 5 | 6 | 7 | false 8 | 9 | 10 | false 11 | 12 | 13 | true 14 | 15 | 16 | false 17 | 18 | 19 | 20 | 21 | 22 | 26 | 27 | 28 | 29 | 30 | $([System.IO.Path]::Combine($(SolutionDir), ".nuget")) 31 | 32 | 33 | 34 | 35 | $(SolutionDir).nuget 36 | 37 | 38 | 39 | $(MSBuildProjectDirectory)\packages.$(MSBuildProjectName.Replace(' ', '_')).config 40 | $(MSBuildProjectDirectory)\packages.$(MSBuildProjectName).config 41 | 42 | 43 | 44 | $(MSBuildProjectDirectory)\packages.config 45 | $(PackagesProjectConfig) 46 | 47 | 48 | 49 | 50 | $(NuGetToolsPath)\NuGet.exe 51 | @(PackageSource) 52 | 53 | "$(NuGetExePath)" 54 | mono --runtime=v4.0.30319 "$(NuGetExePath)" 55 | 56 | $(TargetDir.Trim('\\')) 57 | 58 | -RequireConsent 59 | -NonInteractive 60 | 61 | "$(SolutionDir) " 62 | "$(SolutionDir)" 63 | 64 | 65 | $(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir) 66 | $(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols 67 | 68 | 69 | 70 | RestorePackages; 71 | $(BuildDependsOn); 72 | 73 | 74 | 75 | 76 | $(BuildDependsOn); 77 | BuildPackage; 78 | 79 | 80 | 81 | 82 | 83 | 84 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 99 | 100 | 103 | 104 | 105 | 106 | 108 | 109 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 141 | 142 | 143 | 144 | 145 | -------------------------------------------------------------------------------- /WowHeadParser/Ressources/NpcTotalHp.txt: -------------------------------------------------------------------------------- 1 | Level Rogue Druid Hunter Mage Paladin Priest Shaman Warlock Warrior Death Knight Monk Demon Hunter 2 | 1 87.36 1 1 69.888 87.36 1 1 1 87.36 1 1 1 3 | 2 110.5 1 1 88.4 110.5 1 1 1 110.5 1 1 1 4 | 3 144.495 1 1 115.596 144.495 1 1 1 144.495 1 1 1 5 | 4 161.2687831 1 1 129.0150265 161.2687831 1 1 1 161.2687831 1 1 1 6 | 5 187.7113333 1 1 150.1690667 187.7113333 1 1 1 187.7113333 1 1 1 7 | 6 207.2686984 1 1 165.8149587 207.2686984 1 1 1 207.2686984 1 1 1 8 | 7 237.5371693 1 1 190.0297354 237.5371693 1 1 1 237.5371693 1 1 1 9 | 8 260.0453968 1 1 208.0363175 260.0453968 1 1 1 260.0453968 1 1 1 10 | 9 283.8364286 1 1 227.0691429 283.8364286 1 1 1 283.8364286 1 1 1 11 | 10 338.2635004 1 1 270.6108003 338.2635004 1 1 1 338.2635004 1 1 1 12 | 11 392.6217835 1 1 314.0974268 392.6217835 1 1 1 392.6217835 1 1 1 13 | 12 441.8880869 1 1 353.5104695 441.8880869 1 1 1 441.8880869 1 1 1 14 | 13 517.2006263 1 1 413.760501 517.2006263 1 1 1 517.2006263 1 1 1 15 | 14 564.3336299 1 1 451.4669039 564.3336299 1 1 1 564.3336299 1 1 1 16 | 15 678.8665457 1 1 543.0932366 678.8665457 1 1 1 678.8665457 1 1 1 17 | 16 737.5240153 1 1 590.0192122 737.5240153 1 1 1 737.5240153 1 1 1 18 | 17 890.7807392 1 1 712.6245913 890.7807392 1 1 1 890.7807392 1 1 1 19 | 18 963.8497776 1 1 771.0798221 963.8497776 1 1 1 963.8497776 1 1 1 20 | 19 1140.014663 1 1 912.0117307 1140.014663 1 1 1 1140.014663 1 1 1 21 | 20 1227.015287 1 1 981.6122298 1227.015287 1 1 1 1227.015287 1 1 1 22 | 21 1371.556419 1 1 1097.245135 1371.556419 1 1 1 1371.556419 1 1 1 23 | 22 1428.596659 1 1 1142.877327 1428.596659 1 1 1 1428.596659 1 1 1 24 | 23 1629.820212 1 1 1303.856169 1629.820212 1 1 1 1629.820212 1 1 1 25 | 24 1726.965829 1 1 1381.572663 1726.965829 1 1 1 1726.965829 1 1 1 26 | 25 1929.441064 1 1 1543.552851 1929.441064 1 1 1 1929.441064 1 1 1 27 | 26 2018.858874 1 1 1615.087099 2018.858874 1 1 1 2018.858874 1 1 1 28 | 27 2264.711598 1 1 1811.769278 2264.711598 1 1 1 2264.711598 1 1 1 29 | 28 2382.709508 1 1 1906.167606 2382.709508 1 1 1 2382.709508 1 1 1 30 | 29 2583.193917 1 1 2066.555133 2583.193917 1 1 1 2583.193917 1 1 1 31 | 30 2690.167534 1 1 2152.134028 2690.167534 1 1 1 2690.167534 1 1 1 32 | 31 2966.067561 1 1 2372.854049 2966.067561 1 1 1 2966.067561 1 1 1 33 | 32 3062.562861 1 1 2450.050289 3062.562861 1 1 1 3062.562861 1 1 1 34 | 33 3321.591877 1 1 2657.273502 3321.591877 1 1 1 3321.591877 1 1 1 35 | 34 3465.096795 1 1 2772.077436 3465.096795 1 1 1 3465.096795 1 1 1 36 | 35 3783.899466 1 1 3027.119573 3783.899466 1 1 1 3783.899466 1 1 1 37 | 36 3894.060206 1 1 3115.248165 3894.060206 1 1 1 3894.060206 1 1 1 38 | 37 4127.776357 1 1 3302.221085 4127.776357 1 1 1 4127.776357 1 1 1 39 | 38 4242.130071 1 1 3393.704057 4242.130071 1 1 1 4242.130071 1 1 1 40 | 39 4605.247375 1 1 3684.1979 4605.247375 1 1 1 4605.247375 1 1 1 41 | 40 4751.795197 1 1 3801.436157 4751.795197 1 1 1 4751.795197 1 1 1 42 | 41 5117.909514 1 1 4094.327611 5117.909514 1 1 1 5117.909514 1 1 1 43 | 42 5224.492214 1 1 4179.593771 5224.492214 1 1 1 5224.492214 1 1 1 44 | 43 5543.764003 1 1 4435.011202 5543.764003 1 1 1 5543.764003 1 1 1 45 | 44 5655.823287 1 1 4524.658629 5655.823287 1 1 1 5655.823287 1 1 1 46 | 45 5999.566482 1 1 4799.653185 5999.566482 1 1 1 5999.566482 1 1 1 47 | 46 6140.34332 1 1 4912.274656 6140.34332 1 1 1 6140.34332 1 1 1 48 | 47 6486.280745 1 1 5189.024596 6486.280745 1 1 1 6486.280745 1 1 1 49 | 48 6607.30217 1 1 5285.841736 6607.30217 1 1 1 6607.30217 1 1 1 50 | 49 7035.673421 1 1 5628.538737 7035.673421 1 1 1 7035.673421 1 1 1 51 | 50 7520.380152 1 1 6016.304121 7520.380152 1 1 1 7520.380152 1 1 1 52 | 51 7895.18227 1 1 6316.145816 7895.18227 1 1 1 7895.18227 1 1 1 53 | 52 8041.762023 1 1 6433.409618 8041.762023 1 1 1 8041.762023 1 1 1 54 | 53 8394.553234 1 1 6715.642587 8394.553234 1 1 1 8394.553234 1 1 1 55 | 54 8514.832969 1 1 6811.866375 8514.832969 1 1 1 8514.832969 1 1 1 56 | 55 8988.593778 1 1 7190.875022 8988.593778 1 1 1 8988.593778 1 1 1 57 | 56 9142.471314 1 1 7313.977051 9142.471314 1 1 1 9142.471314 1 1 1 58 | 57 9555.210465 1 1 7644.168372 9555.210465 1 1 1 9555.210465 1 1 1 59 | 58 9684.658381 1 1 7747.726705 9684.658381 1 1 1 9684.658381 1 1 1 60 | 59 11045.08664 1 1 8836.069315 11045.08664 1 1 1 11045.08664 1 1 1 61 | 60 11215.82425 1 1 8972.659402 11215.82425 1 1 1 11215.82425 1 1 1 62 | 61 11602.77019 1 1 9282.216151 11602.77019 1 1 1 11602.77019 1 1 1 63 | 62 12003.06576 1 1 9602.452609 12003.06576 1 1 1 12003.06576 1 1 1 64 | 63 12417.17153 1 1 9933.737224 12417.17153 1 1 1 12417.17153 1 1 1 65 | 64 13666.90154 1 1 10933.52123 13666.90154 1 1 1 13666.90154 1 1 1 66 | 65 14410.60702 1 1 11528.48562 14410.60702 1 1 1 14410.60702 1 1 1 67 | 66 14514.43038 1 1 11611.5443 14514.43038 1 1 1 14514.43038 1 1 1 68 | 67 14955.02181 1 1 11964.01744 14955.02181 1 1 1 14955.02181 1 1 1 69 | 68 15060.13771 1 1 12048.11017 15060.13771 1 1 1 15060.13771 1 1 1 70 | 69 15602.51862 1 1 12482.01489 15602.51862 1 1 1 15602.51862 1 1 1 71 | 70 15940.13148 1 1 12752.10518 15940.13148 1 1 1 15940.13148 1 1 1 72 | 71 16492.81203 1 1 13194.24963 16492.81203 1 1 1 16492.81203 1 1 1 73 | 72 17129.78521 1 1 13703.82817 17129.78521 1 1 1 17129.78521 1 1 1 74 | 73 18290.22918 1 1 14632.18335 18290.22918 1 1 1 18290.22918 1 1 1 75 | 74 19070.22309 1 1 15256.17847 19070.22309 1 1 1 19070.22309 1 1 1 76 | 75 20027.75891 1 1 16022.20713 20027.75891 1 1 1 20027.75891 1 1 1 77 | 76 20140.7883 1 1 16112.63064 20140.7883 1 1 1 20140.7883 1 1 1 78 | 77 20775.00611 1 1 16620.00489 20775.00611 1 1 1 20775.00611 1 1 1 79 | 78 20889.33301 1 1 16711.46641 20889.33301 1 1 1 20889.33301 1 1 1 80 | 79 21328.75101 1 1 17063.00081 21328.75101 1 1 1 21328.75101 1 1 1 81 | 80 21597.37899 1 1 17277.90319 21597.37899 1 1 1 21597.37899 1 1 1 82 | 81 21896.83817 1 1 17517.47053 21896.83817 1 1 1 21896.83817 1 1 1 83 | 82 23194.43508 1 1 18555.54806 23194.43508 1 1 1 23194.43508 1 1 1 84 | 83 25479.5755 1 1 20383.6604 25479.5755 1 1 1 25479.5755 1 1 1 85 | 84 25760.63849 1 1 20608.51079 25760.63849 1 1 1 25760.63849 1 1 1 86 | 85 26268.0299 1 1 21014.42392 26268.0299 1 1 1 26268.0299 1 1 1 87 | 86 27515.82553 1 1 22012.66043 27515.82553 1 1 1 27515.82553 1 1 1 88 | 87 28369.93198 1 1 22695.94558 28369.93198 1 1 1 28369.93198 1 1 1 89 | 88 29874.00472 1 1 23899.20378 29874.00472 1 1 1 29874.00472 1 1 1 90 | 89 32863.08472 1 1 26290.46778 32863.08472 1 1 1 32863.08472 1 1 1 91 | 90 50735.29988 1 1 40588.2399 50735.29988 1 1 1 50735.29988 1 1 1 92 | 91 58800.97878 1 1 47040.78302 58800.97878 1 1 1 58800.97878 1 1 1 93 | 92 64731.11086 1 1 51784.88869 64731.11086 1 1 1 64731.11086 1 1 1 94 | 93 68872.29029 1 1 55097.83223 68872.29029 1 1 1 68872.29029 1 1 1 95 | 94 77238.51873 1 1 61790.81498 77238.51873 1 1 1 77238.51873 1 1 1 96 | 95 84582.89393 1 1 67666.31515 84582.89393 1 1 1 84582.89393 1 1 1 97 | 96 104272.4595 1 1 83417.96758 104272.4595 1 1 1 104272.4595 1 1 1 98 | 97 109325.7391 1 1 87460.5913 109325.7391 1 1 1 109325.7391 1 1 1 99 | 98 130624 1 1 104499 130624 1 1 1 130624 1 1 1 100 | 99 198753 1 1 159002 198753 1 1 1 198753 1 1 1 101 | 100 336523 1 1 269218 336523 1 1 1 299132 1 1 1 102 | 101 440250 1 1 352200 440250 1 1 1 401117 1 1 1 103 | 102 495234 1 1 396187 495234 1 1 1 462218 1 1 1 104 | 103 546544 1 1 437235 546544 1 1 1 522253 1 1 1 105 | 104 582866 1 1 466293 582866 1 1 1 569913 1 1 1 106 | 105 611763 1 1 489410 611763 1 1 1 611763 1 1 1 107 | 106 627057 1 1 501646 627057 1 1 1 627057 1 1 1 108 | 107 642733 1 1 514186 642733 1 1 1 642733 1 1 1 109 | 108 658801 1 1 527041 658801 1 1 1 658801 1 1 1 110 | 109 675271 1 1 540217 675271 1 1 1 675271 1 1 1 111 | 110 1039267.25 1 1 831414 1039267.25 1 1 1 1039267.25 1 1 1 112 | 111 1075123.209 1 1 860099 1075123.209 1 1 1 1075123.209 1 1 1 113 | 112 1112213.744 1 1 889771 1112213.744 1 1 1 1112213.744 1 1 1 114 | 113 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 115 | 114 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 116 | 115 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 117 | 116 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 118 | 117 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 119 | 118 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 120 | 119 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 121 | 120 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 122 | 121 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 123 | 122 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 124 | 123 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 125 | -------------------------------------------------------------------------------- /WowHeadParser/Ressources/NpcTotalHpExp1.txt: -------------------------------------------------------------------------------- 1 | Level Rogue Druid Hunter Mage Paladin Priest Shaman Warlock Warrior Death Knight Monk Demon Hunter 2 | 1 87.36 1 1 69.888 87.36 1 1 1 87.36 1 1 1 3 | 2 110.5 1 1 88.4 110.5 1 1 1 110.5 1 1 1 4 | 3 144.495 1 1 115.596 144.495 1 1 1 144.495 1 1 1 5 | 4 161.2687831 1 1 129.0150265 161.2687831 1 1 1 161.2687831 1 1 1 6 | 5 187.7113333 1 1 150.1690667 187.7113333 1 1 1 187.7113333 1 1 1 7 | 6 207.2686984 1 1 165.8149587 207.2686984 1 1 1 207.2686984 1 1 1 8 | 7 237.5371693 1 1 190.0297354 237.5371693 1 1 1 237.5371693 1 1 1 9 | 8 260.0453968 1 1 208.0363175 260.0453968 1 1 1 260.0453968 1 1 1 10 | 9 283.8364286 1 1 227.0691429 283.8364286 1 1 1 283.8364286 1 1 1 11 | 10 338.2635004 1 1 270.6108003 338.2635004 1 1 1 338.2635004 1 1 1 12 | 11 392.6217835 1 1 314.0974268 392.6217835 1 1 1 392.6217835 1 1 1 13 | 12 441.8880869 1 1 353.5104695 441.8880869 1 1 1 441.8880869 1 1 1 14 | 13 517.2006263 1 1 413.760501 517.2006263 1 1 1 517.2006263 1 1 1 15 | 14 564.3336299 1 1 451.4669039 564.3336299 1 1 1 564.3336299 1 1 1 16 | 15 678.8665457 1 1 543.0932366 678.8665457 1 1 1 678.8665457 1 1 1 17 | 16 737.5240153 1 1 590.0192122 737.5240153 1 1 1 737.5240153 1 1 1 18 | 17 890.7807392 1 1 712.6245913 890.7807392 1 1 1 890.7807392 1 1 1 19 | 18 963.8497776 1 1 771.0798221 963.8497776 1 1 1 963.8497776 1 1 1 20 | 19 1140.014663 1 1 912.0117307 1140.014663 1 1 1 1140.014663 1 1 1 21 | 20 1227.015287 1 1 981.6122298 1227.015287 1 1 1 1227.015287 1 1 1 22 | 21 1371.556419 1 1 1097.245135 1371.556419 1 1 1 1371.556419 1 1 1 23 | 22 1428.596659 1 1 1142.877327 1428.596659 1 1 1 1428.596659 1 1 1 24 | 23 1629.820212 1 1 1303.856169 1629.820212 1 1 1 1629.820212 1 1 1 25 | 24 1726.965829 1 1 1381.572663 1726.965829 1 1 1 1726.965829 1 1 1 26 | 25 1929.441064 1 1 1543.552851 1929.441064 1 1 1 1929.441064 1 1 1 27 | 26 2018.858874 1 1 1615.087099 2018.858874 1 1 1 2018.858874 1 1 1 28 | 27 2264.711598 1 1 1811.769278 2264.711598 1 1 1 2264.711598 1 1 1 29 | 28 2382.709508 1 1 1906.167606 2382.709508 1 1 1 2382.709508 1 1 1 30 | 29 2583.193917 1 1 2066.555133 2583.193917 1 1 1 2583.193917 1 1 1 31 | 30 2690.167534 1 1 2152.134028 2690.167534 1 1 1 2690.167534 1 1 1 32 | 31 2966.067561 1 1 2372.854049 2966.067561 1 1 1 2966.067561 1 1 1 33 | 32 3062.562861 1 1 2450.050289 3062.562861 1 1 1 3062.562861 1 1 1 34 | 33 3321.591877 1 1 2657.273502 3321.591877 1 1 1 3321.591877 1 1 1 35 | 34 3465.096795 1 1 2772.077436 3465.096795 1 1 1 3465.096795 1 1 1 36 | 35 3783.899466 1 1 3027.119573 3783.899466 1 1 1 3783.899466 1 1 1 37 | 36 3894.060206 1 1 3115.248165 3894.060206 1 1 1 3894.060206 1 1 1 38 | 37 4127.776357 1 1 3302.221085 4127.776357 1 1 1 4127.776357 1 1 1 39 | 38 4242.130071 1 1 3393.704057 4242.130071 1 1 1 4242.130071 1 1 1 40 | 39 4605.247375 1 1 3684.1979 4605.247375 1 1 1 4605.247375 1 1 1 41 | 40 4751.795197 1 1 3801.436157 4751.795197 1 1 1 4751.795197 1 1 1 42 | 41 5117.909514 1 1 4094.327611 5117.909514 1 1 1 5117.909514 1 1 1 43 | 42 5224.492214 1 1 4179.593771 5224.492214 1 1 1 5224.492214 1 1 1 44 | 43 5543.764003 1 1 4435.011202 5543.764003 1 1 1 5543.764003 1 1 1 45 | 44 5655.823287 1 1 4524.658629 5655.823287 1 1 1 5655.823287 1 1 1 46 | 45 5999.566482 1 1 4799.653185 5999.566482 1 1 1 5999.566482 1 1 1 47 | 46 6140.34332 1 1 4912.274656 6140.34332 1 1 1 6140.34332 1 1 1 48 | 47 6486.280745 1 1 5189.024596 6486.280745 1 1 1 6486.280745 1 1 1 49 | 48 6607.30217 1 1 5285.841736 6607.30217 1 1 1 6607.30217 1 1 1 50 | 49 7035.673421 1 1 5628.538737 7035.673421 1 1 1 7035.673421 1 1 1 51 | 50 7520.380152 1 1 6016.304121 7520.380152 1 1 1 7520.380152 1 1 1 52 | 51 7895.18227 1 1 6316.145816 7895.18227 1 1 1 7895.18227 1 1 1 53 | 52 8041.762023 1 1 6433.409618 8041.762023 1 1 1 8041.762023 1 1 1 54 | 53 8394.553234 1 1 6715.642587 8394.553234 1 1 1 8394.553234 1 1 1 55 | 54 8514.832969 1 1 6811.866375 8514.832969 1 1 1 8514.832969 1 1 1 56 | 55 8988.593778 1 1 7190.875022 8988.593778 1 1 1 8988.593778 1 1 1 57 | 56 9142.471314 1 1 7313.977051 9142.471314 1 1 1 9142.471314 1 1 1 58 | 57 9555.210465 1 1 7644.168372 9555.210465 1 1 1 9555.210465 1 1 1 59 | 58 9684.658381 1 1 7747.726705 9684.658381 1 1 1 9684.658381 1 1 1 60 | 59 11045.08664 1 1 8836.069315 11045.08664 1 1 1 11045.08664 1 1 1 61 | 60 11215.82425 1 1 8972.659402 11215.82425 1 1 1 11215.82425 1 1 1 62 | 61 11527.72395 1 1 9222.179161 11527.72395 1 1 1 11527.72395 1 1 1 63 | 62 11841.32842 1 1 9473.062734 11841.32842 1 1 1 11841.32842 1 1 1 64 | 63 12737.13941 1 1 10189.71152 12737.13941 1 1 1 12737.13941 1 1 1 65 | 64 13666.90154 1 1 10933.52123 13666.90154 1 1 1 13666.90154 1 1 1 66 | 65 14410.60702 1 1 11528.48562 14410.60702 1 1 1 14410.60702 1 1 1 67 | 66 14514.43038 1 1 11611.5443 14514.43038 1 1 1 14514.43038 1 1 1 68 | 67 14955.02181 1 1 11964.01744 14955.02181 1 1 1 14955.02181 1 1 1 69 | 68 15060.13771 1 1 12048.11017 15060.13771 1 1 1 15060.13771 1 1 1 70 | 69 15602.51862 1 1 12482.01489 15602.51862 1 1 1 15602.51862 1 1 1 71 | 70 15940.13148 1 1 12752.10518 15940.13148 1 1 1 15940.13148 1 1 1 72 | 71 16490.06601 1 1 13192.05281 16490.06601 1 1 1 16490.06601 1 1 1 73 | 72 17058.97329 1 1 13647.17863 17058.97329 1 1 1 17058.97329 1 1 1 74 | 73 17647.50787 1 1 14118.00629 17647.50787 1 1 1 17647.50787 1 1 1 75 | 74 19070.22309 1 1 15256.17847 19070.22309 1 1 1 19070.22309 1 1 1 76 | 75 20027.75891 1 1 16022.20713 20027.75891 1 1 1 20027.75891 1 1 1 77 | 76 20140.7883 1 1 16112.63064 20140.7883 1 1 1 20140.7883 1 1 1 78 | 77 20775.00611 1 1 16620.00489 20775.00611 1 1 1 20775.00611 1 1 1 79 | 78 20889.33301 1 1 16711.46641 20889.33301 1 1 1 20889.33301 1 1 1 80 | 79 21328.75101 1 1 17063.00081 21328.75101 1 1 1 21328.75101 1 1 1 81 | 80 21597.37899 1 1 17277.90319 21597.37899 1 1 1 21597.37899 1 1 1 82 | 81 21896.83817 1 1 17517.47053 21896.83817 1 1 1 21896.83817 1 1 1 83 | 82 23194.43508 1 1 18555.54806 23194.43508 1 1 1 23194.43508 1 1 1 84 | 83 25479.5755 1 1 20383.6604 25479.5755 1 1 1 25479.5755 1 1 1 85 | 84 25760.63849 1 1 20608.51079 25760.63849 1 1 1 25760.63849 1 1 1 86 | 85 26268.0299 1 1 21014.42392 26268.0299 1 1 1 26268.0299 1 1 1 87 | 86 27515.82553 1 1 22012.66043 27515.82553 1 1 1 27515.82553 1 1 1 88 | 87 28369.93198 1 1 22695.94558 28369.93198 1 1 1 28369.93198 1 1 1 89 | 88 29874.00472 1 1 23899.20378 29874.00472 1 1 1 29874.00472 1 1 1 90 | 89 32863.08472 1 1 26290.46778 32863.08472 1 1 1 32863.08472 1 1 1 91 | 90 50735.29988 1 1 40588.2399 50735.29988 1 1 1 50735.29988 1 1 1 92 | 91 58800.97878 1 1 47040.78302 58800.97878 1 1 1 58800.97878 1 1 1 93 | 92 64731.11086 1 1 51784.88869 64731.11086 1 1 1 64731.11086 1 1 1 94 | 93 68872.29029 1 1 55097.83223 68872.29029 1 1 1 68872.29029 1 1 1 95 | 94 77238.51873 1 1 61790.81498 77238.51873 1 1 1 77238.51873 1 1 1 96 | 95 84582.89393 1 1 67666.31515 84582.89393 1 1 1 84582.89393 1 1 1 97 | 96 104272.4595 1 1 83417.96758 104272.4595 1 1 1 104272.4595 1 1 1 98 | 97 109325.7391 1 1 87460.5913 109325.7391 1 1 1 109325.7391 1 1 1 99 | 98 130624 1 1 104499 130624 1 1 1 130624 1 1 1 100 | 99 198753 1 1 159002 198753 1 1 1 198753 1 1 1 101 | 100 336523 1 1 269218 336523 1 1 1 299132 1 1 1 102 | 101 440250 1 1 352200 440250 1 1 1 401117 1 1 1 103 | 102 495234 1 1 396187 495234 1 1 1 462218 1 1 1 104 | 103 546544 1 1 437235 546544 1 1 1 522253 1 1 1 105 | 104 582866 1 1 466293 582866 1 1 1 569913 1 1 1 106 | 105 611763 1 1 489410 611763 1 1 1 611763 1 1 1 107 | 106 627057 1 1 501646 627057 1 1 1 627057 1 1 1 108 | 107 642733 1 1 514186 642733 1 1 1 642733 1 1 1 109 | 108 658801 1 1 527041 658801 1 1 1 658801 1 1 1 110 | 109 675271 1 1 540217 675271 1 1 1 675271 1 1 1 111 | 110 1039267.25 1 1 831414 1039267.25 1 1 1 1039267.25 1 1 1 112 | 111 1075123.209 1 1 860099 1075123.209 1 1 1 1075123.209 1 1 1 113 | 112 1112213.744 1 1 889771 1112213.744 1 1 1 1112213.744 1 1 1 114 | 113 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 115 | 114 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 116 | 115 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 117 | 116 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 118 | 117 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 119 | 118 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 120 | 119 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 121 | 120 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 122 | 121 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 123 | 122 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 124 | 123 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 125 | -------------------------------------------------------------------------------- /WowHeadParser/Ressources/NpcTotalHpExp3.txt: -------------------------------------------------------------------------------- 1 | Level Rogue Druid Hunter Mage Paladin Priest Shaman Warlock Warrior Death Knight Monk Demon Hunter 2 | 1 87.36 1 1 69.888 87.36 1 1 1 87.36 1 1 1 3 | 2 110.5 1 1 88.4 110.5 1 1 1 110.5 1 1 1 4 | 3 144.495 1 1 115.596 144.495 1 1 1 144.495 1 1 1 5 | 4 161.2687831 1 1 129.0150265 161.2687831 1 1 1 161.2687831 1 1 1 6 | 5 187.7113333 1 1 150.1690667 187.7113333 1 1 1 187.7113333 1 1 1 7 | 6 207.2686984 1 1 165.8149587 207.2686984 1 1 1 207.2686984 1 1 1 8 | 7 237.5371693 1 1 190.0297354 237.5371693 1 1 1 237.5371693 1 1 1 9 | 8 260.0453968 1 1 208.0363175 260.0453968 1 1 1 260.0453968 1 1 1 10 | 9 283.8364286 1 1 227.0691429 283.8364286 1 1 1 283.8364286 1 1 1 11 | 10 338.2635004 1 1 270.6108003 338.2635004 1 1 1 338.2635004 1 1 1 12 | 11 392.6217835 1 1 314.0974268 392.6217835 1 1 1 392.6217835 1 1 1 13 | 12 441.8880869 1 1 353.5104695 441.8880869 1 1 1 441.8880869 1 1 1 14 | 13 517.2006263 1 1 413.760501 517.2006263 1 1 1 517.2006263 1 1 1 15 | 14 564.3336299 1 1 451.4669039 564.3336299 1 1 1 564.3336299 1 1 1 16 | 15 678.8665457 1 1 543.0932366 678.8665457 1 1 1 678.8665457 1 1 1 17 | 16 737.5240153 1 1 590.0192122 737.5240153 1 1 1 737.5240153 1 1 1 18 | 17 890.7807392 1 1 712.6245913 890.7807392 1 1 1 890.7807392 1 1 1 19 | 18 963.8497776 1 1 771.0798221 963.8497776 1 1 1 963.8497776 1 1 1 20 | 19 1140.014663 1 1 912.0117307 1140.014663 1 1 1 1140.014663 1 1 1 21 | 20 1227.015287 1 1 981.6122298 1227.015287 1 1 1 1227.015287 1 1 1 22 | 21 1371.556419 1 1 1097.245135 1371.556419 1 1 1 1371.556419 1 1 1 23 | 22 1428.596659 1 1 1142.877327 1428.596659 1 1 1 1428.596659 1 1 1 24 | 23 1629.820212 1 1 1303.856169 1629.820212 1 1 1 1629.820212 1 1 1 25 | 24 1726.965829 1 1 1381.572663 1726.965829 1 1 1 1726.965829 1 1 1 26 | 25 1929.441064 1 1 1543.552851 1929.441064 1 1 1 1929.441064 1 1 1 27 | 26 2018.858874 1 1 1615.087099 2018.858874 1 1 1 2018.858874 1 1 1 28 | 27 2264.711598 1 1 1811.769278 2264.711598 1 1 1 2264.711598 1 1 1 29 | 28 2382.709508 1 1 1906.167606 2382.709508 1 1 1 2382.709508 1 1 1 30 | 29 2583.193917 1 1 2066.555133 2583.193917 1 1 1 2583.193917 1 1 1 31 | 30 2690.167534 1 1 2152.134028 2690.167534 1 1 1 2690.167534 1 1 1 32 | 31 2966.067561 1 1 2372.854049 2966.067561 1 1 1 2966.067561 1 1 1 33 | 32 3062.562861 1 1 2450.050289 3062.562861 1 1 1 3062.562861 1 1 1 34 | 33 3321.591877 1 1 2657.273502 3321.591877 1 1 1 3321.591877 1 1 1 35 | 34 3465.096795 1 1 2772.077436 3465.096795 1 1 1 3465.096795 1 1 1 36 | 35 3783.899466 1 1 3027.119573 3783.899466 1 1 1 3783.899466 1 1 1 37 | 36 3894.060206 1 1 3115.248165 3894.060206 1 1 1 3894.060206 1 1 1 38 | 37 4127.776357 1 1 3302.221085 4127.776357 1 1 1 4127.776357 1 1 1 39 | 38 4242.130071 1 1 3393.704057 4242.130071 1 1 1 4242.130071 1 1 1 40 | 39 4605.247375 1 1 3684.1979 4605.247375 1 1 1 4605.247375 1 1 1 41 | 40 4751.795197 1 1 3801.436157 4751.795197 1 1 1 4751.795197 1 1 1 42 | 41 5117.909514 1 1 4094.327611 5117.909514 1 1 1 5117.909514 1 1 1 43 | 42 5224.492214 1 1 4179.593771 5224.492214 1 1 1 5224.492214 1 1 1 44 | 43 5543.764003 1 1 4435.011202 5543.764003 1 1 1 5543.764003 1 1 1 45 | 44 5655.823287 1 1 4524.658629 5655.823287 1 1 1 5655.823287 1 1 1 46 | 45 5999.566482 1 1 4799.653185 5999.566482 1 1 1 5999.566482 1 1 1 47 | 46 6140.34332 1 1 4912.274656 6140.34332 1 1 1 6140.34332 1 1 1 48 | 47 6486.280745 1 1 5189.024596 6486.280745 1 1 1 6486.280745 1 1 1 49 | 48 6607.30217 1 1 5285.841736 6607.30217 1 1 1 6607.30217 1 1 1 50 | 49 7035.673421 1 1 5628.538737 7035.673421 1 1 1 7035.673421 1 1 1 51 | 50 7520.380152 1 1 6016.304121 7520.380152 1 1 1 7520.380152 1 1 1 52 | 51 7895.18227 1 1 6316.145816 7895.18227 1 1 1 7895.18227 1 1 1 53 | 52 8041.762023 1 1 6433.409618 8041.762023 1 1 1 8041.762023 1 1 1 54 | 53 8394.553234 1 1 6715.642587 8394.553234 1 1 1 8394.553234 1 1 1 55 | 54 8514.832969 1 1 6811.866375 8514.832969 1 1 1 8514.832969 1 1 1 56 | 55 8988.593778 1 1 7190.875022 8988.593778 1 1 1 8988.593778 1 1 1 57 | 56 9142.471314 1 1 7313.977051 9142.471314 1 1 1 9142.471314 1 1 1 58 | 57 9555.210465 1 1 7644.168372 9555.210465 1 1 1 9555.210465 1 1 1 59 | 58 9684.658381 1 1 7747.726705 9684.658381 1 1 1 9684.658381 1 1 1 60 | 59 11045.08664 1 1 8836.069315 11045.08664 1 1 1 11045.08664 1 1 1 61 | 60 11215.82425 1 1 8972.659402 11215.82425 1 1 1 11215.82425 1 1 1 62 | 61 11527.72395 1 1 9222.179161 11527.72395 1 1 1 11527.72395 1 1 1 63 | 62 11841.32842 1 1 9473.062734 11841.32842 1 1 1 11841.32842 1 1 1 64 | 63 12737.13941 1 1 10189.71152 12737.13941 1 1 1 12737.13941 1 1 1 65 | 64 13666.90154 1 1 10933.52123 13666.90154 1 1 1 13666.90154 1 1 1 66 | 65 14410.60702 1 1 11528.48562 14410.60702 1 1 1 14410.60702 1 1 1 67 | 66 14514.43038 1 1 11611.5443 14514.43038 1 1 1 14514.43038 1 1 1 68 | 67 14955.02181 1 1 11964.01744 14955.02181 1 1 1 14955.02181 1 1 1 69 | 68 15060.13771 1 1 12048.11017 15060.13771 1 1 1 15060.13771 1 1 1 70 | 69 15602.51862 1 1 12482.01489 15602.51862 1 1 1 15602.51862 1 1 1 71 | 70 15940.13148 1 1 12752.10518 15940.13148 1 1 1 15940.13148 1 1 1 72 | 71 16492.81203 1 1 13194.24963 16492.81203 1 1 1 16492.81203 1 1 1 73 | 72 17129.78521 1 1 13703.82817 17129.78521 1 1 1 17129.78521 1 1 1 74 | 73 18290.22918 1 1 14632.18335 18290.22918 1 1 1 18290.22918 1 1 1 75 | 74 19070.22309 1 1 15256.17847 19070.22309 1 1 1 19070.22309 1 1 1 76 | 75 20027.75891 1 1 16022.20713 20027.75891 1 1 1 20027.75891 1 1 1 77 | 76 20140.7883 1 1 16112.63064 20140.7883 1 1 1 20140.7883 1 1 1 78 | 77 20775.00611 1 1 16620.00489 20775.00611 1 1 1 20775.00611 1 1 1 79 | 78 20889.33301 1 1 16711.46641 20889.33301 1 1 1 20889.33301 1 1 1 80 | 79 21328.75101 1 1 17063.00081 21328.75101 1 1 1 21328.75101 1 1 1 81 | 80 21597.37899 1 1 17277.90319 21597.37899 1 1 1 21597.37899 1 1 1 82 | 81 21896.83817 1 1 17517.47053 21896.83817 1 1 1 21896.83817 1 1 1 83 | 82 23194.43508 1 1 18555.54806 23194.43508 1 1 1 23194.43508 1 1 1 84 | 83 25479.5755 1 1 20383.6604 25479.5755 1 1 1 25479.5755 1 1 1 85 | 84 25760.63849 1 1 20608.51079 25760.63849 1 1 1 25760.63849 1 1 1 86 | 85 26268.0299 1 1 21014.42392 26268.0299 1 1 1 26268.0299 1 1 1 87 | 86 27174.27693 1 1 21739.42154 27174.27693 1 1 1 27174.27693 1 1 1 88 | 87 28111.78949 1 1 22489.43159 28111.78949 1 1 1 28111.78949 1 1 1 89 | 88 29081.64622 1 1 23265.31698 29081.64622 1 1 1 29081.64622 1 1 1 90 | 89 32863.08472 1 1 26290.46778 32863.08472 1 1 1 32863.08472 1 1 1 91 | 90 50735.29988 1 1 40588.2399 50735.29988 1 1 1 50735.29988 1 1 1 92 | 91 58800.97878 1 1 47040.78302 58800.97878 1 1 1 58800.97878 1 1 1 93 | 92 64731.11086 1 1 51784.88869 64731.11086 1 1 1 64731.11086 1 1 1 94 | 93 68872.29029 1 1 55097.83223 68872.29029 1 1 1 68872.29029 1 1 1 95 | 94 77238.51873 1 1 61790.81498 77238.51873 1 1 1 77238.51873 1 1 1 96 | 95 84582.89393 1 1 67666.31515 84582.89393 1 1 1 84582.89393 1 1 1 97 | 96 104272.4595 1 1 83417.96758 104272.4595 1 1 1 104272.4595 1 1 1 98 | 97 109325.7391 1 1 87460.5913 109325.7391 1 1 1 109325.7391 1 1 1 99 | 98 130624 1 1 104499 130624 1 1 1 130624 1 1 1 100 | 99 198753 1 1 159002 198753 1 1 1 198753 1 1 1 101 | 100 336523 1 1 269218 336523 1 1 1 299132 1 1 1 102 | 101 440250 1 1 352200 440250 1 1 1 401117 1 1 1 103 | 102 495234 1 1 396187 495234 1 1 1 462218 1 1 1 104 | 103 546544 1 1 437235 546544 1 1 1 522253 1 1 1 105 | 104 582866 1 1 466293 582866 1 1 1 569913 1 1 1 106 | 105 611763 1 1 489410 611763 1 1 1 611763 1 1 1 107 | 106 627057 1 1 501646 627057 1 1 1 627057 1 1 1 108 | 107 642733 1 1 514186 642733 1 1 1 642733 1 1 1 109 | 108 658801 1 1 527041 658801 1 1 1 658801 1 1 1 110 | 109 675271 1 1 540217 675271 1 1 1 675271 1 1 1 111 | 110 1039267.25 1 1 831414 1039267.25 1 1 1 1039267.25 1 1 1 112 | 111 1075123.209 1 1 860099 1075123.209 1 1 1 1075123.209 1 1 1 113 | 112 1112213.744 1 1 889771 1112213.744 1 1 1 1112213.744 1 1 1 114 | 113 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 115 | 114 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 116 | 115 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 117 | 116 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 118 | 117 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 119 | 118 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 120 | 119 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 121 | 120 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 122 | 121 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 123 | 122 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 124 | 123 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 125 | -------------------------------------------------------------------------------- /WowHeadParser/Ressources/NpcTotalHpExp4.txt: -------------------------------------------------------------------------------- 1 | Level Rogue Druid Hunter Mage Paladin Priest Shaman Warlock Warrior Death Knight Monk Demon Hunter 2 | 1 87.36 1 1 69.888 87.36 1 1 1 87.36 1 1 1 3 | 2 110.5 1 1 88.4 110.5 1 1 1 110.5 1 1 1 4 | 3 144.495 1 1 115.596 144.495 1 1 1 144.495 1 1 1 5 | 4 161.2687831 1 1 129.0150265 161.2687831 1 1 1 161.2687831 1 1 1 6 | 5 187.7113333 1 1 150.1690667 187.7113333 1 1 1 187.7113333 1 1 1 7 | 6 207.2686984 1 1 165.8149587 207.2686984 1 1 1 207.2686984 1 1 1 8 | 7 237.5371693 1 1 190.0297354 237.5371693 1 1 1 237.5371693 1 1 1 9 | 8 260.0453968 1 1 208.0363175 260.0453968 1 1 1 260.0453968 1 1 1 10 | 9 283.8364286 1 1 227.0691429 283.8364286 1 1 1 283.8364286 1 1 1 11 | 10 338.2635004 1 1 270.6108003 338.2635004 1 1 1 338.2635004 1 1 1 12 | 11 392.6217835 1 1 314.0974268 392.6217835 1 1 1 392.6217835 1 1 1 13 | 12 441.8880869 1 1 353.5104695 441.8880869 1 1 1 441.8880869 1 1 1 14 | 13 517.2006263 1 1 413.760501 517.2006263 1 1 1 517.2006263 1 1 1 15 | 14 564.3336299 1 1 451.4669039 564.3336299 1 1 1 564.3336299 1 1 1 16 | 15 678.8665457 1 1 543.0932366 678.8665457 1 1 1 678.8665457 1 1 1 17 | 16 737.5240153 1 1 590.0192122 737.5240153 1 1 1 737.5240153 1 1 1 18 | 17 890.7807392 1 1 712.6245913 890.7807392 1 1 1 890.7807392 1 1 1 19 | 18 963.8497776 1 1 771.0798221 963.8497776 1 1 1 963.8497776 1 1 1 20 | 19 1140.014663 1 1 912.0117307 1140.014663 1 1 1 1140.014663 1 1 1 21 | 20 1227.015287 1 1 981.6122298 1227.015287 1 1 1 1227.015287 1 1 1 22 | 21 1371.556419 1 1 1097.245135 1371.556419 1 1 1 1371.556419 1 1 1 23 | 22 1428.596659 1 1 1142.877327 1428.596659 1 1 1 1428.596659 1 1 1 24 | 23 1629.820212 1 1 1303.856169 1629.820212 1 1 1 1629.820212 1 1 1 25 | 24 1726.965829 1 1 1381.572663 1726.965829 1 1 1 1726.965829 1 1 1 26 | 25 1929.441064 1 1 1543.552851 1929.441064 1 1 1 1929.441064 1 1 1 27 | 26 2018.858874 1 1 1615.087099 2018.858874 1 1 1 2018.858874 1 1 1 28 | 27 2264.711598 1 1 1811.769278 2264.711598 1 1 1 2264.711598 1 1 1 29 | 28 2382.709508 1 1 1906.167606 2382.709508 1 1 1 2382.709508 1 1 1 30 | 29 2583.193917 1 1 2066.555133 2583.193917 1 1 1 2583.193917 1 1 1 31 | 30 2690.167534 1 1 2152.134028 2690.167534 1 1 1 2690.167534 1 1 1 32 | 31 2966.067561 1 1 2372.854049 2966.067561 1 1 1 2966.067561 1 1 1 33 | 32 3062.562861 1 1 2450.050289 3062.562861 1 1 1 3062.562861 1 1 1 34 | 33 3321.591877 1 1 2657.273502 3321.591877 1 1 1 3321.591877 1 1 1 35 | 34 3465.096795 1 1 2772.077436 3465.096795 1 1 1 3465.096795 1 1 1 36 | 35 3783.899466 1 1 3027.119573 3783.899466 1 1 1 3783.899466 1 1 1 37 | 36 3894.060206 1 1 3115.248165 3894.060206 1 1 1 3894.060206 1 1 1 38 | 37 4127.776357 1 1 3302.221085 4127.776357 1 1 1 4127.776357 1 1 1 39 | 38 4242.130071 1 1 3393.704057 4242.130071 1 1 1 4242.130071 1 1 1 40 | 39 4605.247375 1 1 3684.1979 4605.247375 1 1 1 4605.247375 1 1 1 41 | 40 4751.795197 1 1 3801.436157 4751.795197 1 1 1 4751.795197 1 1 1 42 | 41 5117.909514 1 1 4094.327611 5117.909514 1 1 1 5117.909514 1 1 1 43 | 42 5224.492214 1 1 4179.593771 5224.492214 1 1 1 5224.492214 1 1 1 44 | 43 5543.764003 1 1 4435.011202 5543.764003 1 1 1 5543.764003 1 1 1 45 | 44 5655.823287 1 1 4524.658629 5655.823287 1 1 1 5655.823287 1 1 1 46 | 45 5999.566482 1 1 4799.653185 5999.566482 1 1 1 5999.566482 1 1 1 47 | 46 6140.34332 1 1 4912.274656 6140.34332 1 1 1 6140.34332 1 1 1 48 | 47 6486.280745 1 1 5189.024596 6486.280745 1 1 1 6486.280745 1 1 1 49 | 48 6607.30217 1 1 5285.841736 6607.30217 1 1 1 6607.30217 1 1 1 50 | 49 7035.673421 1 1 5628.538737 7035.673421 1 1 1 7035.673421 1 1 1 51 | 50 7520.380152 1 1 6016.304121 7520.380152 1 1 1 7520.380152 1 1 1 52 | 51 7895.18227 1 1 6316.145816 7895.18227 1 1 1 7895.18227 1 1 1 53 | 52 8041.762023 1 1 6433.409618 8041.762023 1 1 1 8041.762023 1 1 1 54 | 53 8394.553234 1 1 6715.642587 8394.553234 1 1 1 8394.553234 1 1 1 55 | 54 8514.832969 1 1 6811.866375 8514.832969 1 1 1 8514.832969 1 1 1 56 | 55 8988.593778 1 1 7190.875022 8988.593778 1 1 1 8988.593778 1 1 1 57 | 56 9142.471314 1 1 7313.977051 9142.471314 1 1 1 9142.471314 1 1 1 58 | 57 9555.210465 1 1 7644.168372 9555.210465 1 1 1 9555.210465 1 1 1 59 | 58 9684.658381 1 1 7747.726705 9684.658381 1 1 1 9684.658381 1 1 1 60 | 59 11045.08664 1 1 8836.069315 11045.08664 1 1 1 11045.08664 1 1 1 61 | 60 11215.82425 1 1 8972.659402 11215.82425 1 1 1 11215.82425 1 1 1 62 | 61 11527.72395 1 1 9222.179161 11527.72395 1 1 1 11527.72395 1 1 1 63 | 62 11841.32842 1 1 9473.062734 11841.32842 1 1 1 11841.32842 1 1 1 64 | 63 12737.13941 1 1 10189.71152 12737.13941 1 1 1 12737.13941 1 1 1 65 | 64 13666.90154 1 1 10933.52123 13666.90154 1 1 1 13666.90154 1 1 1 66 | 65 14410.60702 1 1 11528.48562 14410.60702 1 1 1 14410.60702 1 1 1 67 | 66 14514.43038 1 1 11611.5443 14514.43038 1 1 1 14514.43038 1 1 1 68 | 67 14955.02181 1 1 11964.01744 14955.02181 1 1 1 14955.02181 1 1 1 69 | 68 15060.13771 1 1 12048.11017 15060.13771 1 1 1 15060.13771 1 1 1 70 | 69 15602.51862 1 1 12482.01489 15602.51862 1 1 1 15602.51862 1 1 1 71 | 70 15940.13148 1 1 12752.10518 15940.13148 1 1 1 15940.13148 1 1 1 72 | 71 16492.81203 1 1 13194.24963 16492.81203 1 1 1 16492.81203 1 1 1 73 | 72 17129.78521 1 1 13703.82817 17129.78521 1 1 1 17129.78521 1 1 1 74 | 73 18290.22918 1 1 14632.18335 18290.22918 1 1 1 18290.22918 1 1 1 75 | 74 19070.22309 1 1 15256.17847 19070.22309 1 1 1 19070.22309 1 1 1 76 | 75 20027.75891 1 1 16022.20713 20027.75891 1 1 1 20027.75891 1 1 1 77 | 76 20140.7883 1 1 16112.63064 20140.7883 1 1 1 20140.7883 1 1 1 78 | 77 20775.00611 1 1 16620.00489 20775.00611 1 1 1 20775.00611 1 1 1 79 | 78 20889.33301 1 1 16711.46641 20889.33301 1 1 1 20889.33301 1 1 1 80 | 79 21328.75101 1 1 17063.00081 21328.75101 1 1 1 21328.75101 1 1 1 81 | 80 21597.37899 1 1 17277.90319 21597.37899 1 1 1 21597.37899 1 1 1 82 | 81 21896.83817 1 1 17517.47053 21896.83817 1 1 1 21896.83817 1 1 1 83 | 82 23194.43508 1 1 18555.54806 23194.43508 1 1 1 23194.43508 1 1 1 84 | 83 25479.5755 1 1 20383.6604 25479.5755 1 1 1 25479.5755 1 1 1 85 | 84 25760.63849 1 1 20608.51079 25760.63849 1 1 1 25760.63849 1 1 1 86 | 85 26268.0299 1 1 21014.42392 26268.0299 1 1 1 26268.0299 1 1 1 87 | 86 27515.82553 1 1 22012.66043 27515.82553 1 1 1 27515.82553 1 1 1 88 | 87 28369.93198 1 1 22695.94558 28369.93198 1 1 1 28369.93198 1 1 1 89 | 88 29874.00472 1 1 23899.20378 29874.00472 1 1 1 29874.00472 1 1 1 90 | 89 32863.08472 1 1 26290.46778 32863.08472 1 1 1 32863.08472 1 1 1 91 | 90 34506.23896 1 1 27604.99116 34506.23896 1 1 1 34506.23896 1 1 1 92 | 91 35696.7042 1 1 28557.36336 35696.7042 1 1 1 35696.7042 1 1 1 93 | 92 36928.24049 1 1 29542.5924 36928.24049 1 1 1 36928.24049 1 1 1 94 | 93 38202.26479 1 1 30561.81183 38202.26479 1 1 1 38202.26479 1 1 1 95 | 94 77238.51873 1 1 61790.81498 77238.51873 1 1 1 77238.51873 1 1 1 96 | 95 84582.89393 1 1 67666.31515 84582.89393 1 1 1 84582.89393 1 1 1 97 | 96 104272.4595 1 1 83417.96758 104272.4595 1 1 1 104272.4595 1 1 1 98 | 97 109325.7391 1 1 87460.5913 109325.7391 1 1 1 109325.7391 1 1 1 99 | 98 130624 1 1 104499 130624 1 1 1 130624 1 1 1 100 | 99 198753 1 1 159002 198753 1 1 1 198753 1 1 1 101 | 100 336523 1 1 269218 336523 1 1 1 299132 1 1 1 102 | 101 440250 1 1 352200 440250 1 1 1 401117 1 1 1 103 | 102 495234 1 1 396187 495234 1 1 1 462218 1 1 1 104 | 103 546544 1 1 437235 546544 1 1 1 522253 1 1 1 105 | 104 582866 1 1 466293 582866 1 1 1 569913 1 1 1 106 | 105 611763 1 1 489410 611763 1 1 1 611763 1 1 1 107 | 106 627057 1 1 501646 627057 1 1 1 627057 1 1 1 108 | 107 642733 1 1 514186 642733 1 1 1 642733 1 1 1 109 | 108 658801 1 1 527041 658801 1 1 1 658801 1 1 1 110 | 109 675271 1 1 540217 675271 1 1 1 675271 1 1 1 111 | 110 1039267.25 1 1 831414 1039267.25 1 1 1 1039267.25 1 1 1 112 | 111 1075123.209 1 1 860099 1075123.209 1 1 1 1075123.209 1 1 1 113 | 112 1112213.744 1 1 889771 1112213.744 1 1 1 1112213.744 1 1 1 114 | 113 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 115 | 114 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 116 | 115 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 117 | 116 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 118 | 117 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 119 | 118 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 120 | 119 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 121 | 120 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 122 | 121 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 123 | 122 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 124 | 123 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 125 | -------------------------------------------------------------------------------- /WowHeadParser/Ressources/NpcTotalHpExp6.txt: -------------------------------------------------------------------------------- 1 | Level Rogue Druid Hunter Mage Paladin Priest Shaman Warlock Warrior Death Knight Monk Demon Hunter 2 | 1 87.36 1 1 69.888 87.36 1 1 1 87.36 1 1 1 3 | 2 110.5 1 1 88.4 110.5 1 1 1 110.5 1 1 1 4 | 3 144.495 1 1 115.596 144.495 1 1 1 144.495 1 1 1 5 | 4 161.2687831 1 1 129.0150265 161.2687831 1 1 1 161.2687831 1 1 1 6 | 5 187.7113333 1 1 150.1690667 187.7113333 1 1 1 187.7113333 1 1 1 7 | 6 207.2686984 1 1 165.8149587 207.2686984 1 1 1 207.2686984 1 1 1 8 | 7 237.5371693 1 1 190.0297354 237.5371693 1 1 1 237.5371693 1 1 1 9 | 8 260.0453968 1 1 208.0363175 260.0453968 1 1 1 260.0453968 1 1 1 10 | 9 283.8364286 1 1 227.0691429 283.8364286 1 1 1 283.8364286 1 1 1 11 | 10 338.2635004 1 1 270.6108003 338.2635004 1 1 1 338.2635004 1 1 1 12 | 11 392.6217835 1 1 314.0974268 392.6217835 1 1 1 392.6217835 1 1 1 13 | 12 441.8880869 1 1 353.5104695 441.8880869 1 1 1 441.8880869 1 1 1 14 | 13 517.2006263 1 1 413.760501 517.2006263 1 1 1 517.2006263 1 1 1 15 | 14 564.3336299 1 1 451.4669039 564.3336299 1 1 1 564.3336299 1 1 1 16 | 15 678.8665457 1 1 543.0932366 678.8665457 1 1 1 678.8665457 1 1 1 17 | 16 737.5240153 1 1 590.0192122 737.5240153 1 1 1 737.5240153 1 1 1 18 | 17 890.7807392 1 1 712.6245913 890.7807392 1 1 1 890.7807392 1 1 1 19 | 18 963.8497776 1 1 771.0798221 963.8497776 1 1 1 963.8497776 1 1 1 20 | 19 1140.014663 1 1 912.0117307 1140.014663 1 1 1 1140.014663 1 1 1 21 | 20 1227.015287 1 1 981.6122298 1227.015287 1 1 1 1227.015287 1 1 1 22 | 21 1371.556419 1 1 1097.245135 1371.556419 1 1 1 1371.556419 1 1 1 23 | 22 1428.596659 1 1 1142.877327 1428.596659 1 1 1 1428.596659 1 1 1 24 | 23 1629.820212 1 1 1303.856169 1629.820212 1 1 1 1629.820212 1 1 1 25 | 24 1726.965829 1 1 1381.572663 1726.965829 1 1 1 1726.965829 1 1 1 26 | 25 1929.441064 1 1 1543.552851 1929.441064 1 1 1 1929.441064 1 1 1 27 | 26 2018.858874 1 1 1615.087099 2018.858874 1 1 1 2018.858874 1 1 1 28 | 27 2264.711598 1 1 1811.769278 2264.711598 1 1 1 2264.711598 1 1 1 29 | 28 2382.709508 1 1 1906.167606 2382.709508 1 1 1 2382.709508 1 1 1 30 | 29 2583.193917 1 1 2066.555133 2583.193917 1 1 1 2583.193917 1 1 1 31 | 30 2690.167534 1 1 2152.134028 2690.167534 1 1 1 2690.167534 1 1 1 32 | 31 2966.067561 1 1 2372.854049 2966.067561 1 1 1 2966.067561 1 1 1 33 | 32 3062.562861 1 1 2450.050289 3062.562861 1 1 1 3062.562861 1 1 1 34 | 33 3321.591877 1 1 2657.273502 3321.591877 1 1 1 3321.591877 1 1 1 35 | 34 3465.096795 1 1 2772.077436 3465.096795 1 1 1 3465.096795 1 1 1 36 | 35 3783.899466 1 1 3027.119573 3783.899466 1 1 1 3783.899466 1 1 1 37 | 36 3894.060206 1 1 3115.248165 3894.060206 1 1 1 3894.060206 1 1 1 38 | 37 4127.776357 1 1 3302.221085 4127.776357 1 1 1 4127.776357 1 1 1 39 | 38 4242.130071 1 1 3393.704057 4242.130071 1 1 1 4242.130071 1 1 1 40 | 39 4605.247375 1 1 3684.1979 4605.247375 1 1 1 4605.247375 1 1 1 41 | 40 4751.795197 1 1 3801.436157 4751.795197 1 1 1 4751.795197 1 1 1 42 | 41 5117.909514 1 1 4094.327611 5117.909514 1 1 1 5117.909514 1 1 1 43 | 42 5224.492214 1 1 4179.593771 5224.492214 1 1 1 5224.492214 1 1 1 44 | 43 5543.764003 1 1 4435.011202 5543.764003 1 1 1 5543.764003 1 1 1 45 | 44 5655.823287 1 1 4524.658629 5655.823287 1 1 1 5655.823287 1 1 1 46 | 45 5999.566482 1 1 4799.653185 5999.566482 1 1 1 5999.566482 1 1 1 47 | 46 6140.34332 1 1 4912.274656 6140.34332 1 1 1 6140.34332 1 1 1 48 | 47 6486.280745 1 1 5189.024596 6486.280745 1 1 1 6486.280745 1 1 1 49 | 48 6607.30217 1 1 5285.841736 6607.30217 1 1 1 6607.30217 1 1 1 50 | 49 7035.673421 1 1 5628.538737 7035.673421 1 1 1 7035.673421 1 1 1 51 | 50 7520.380152 1 1 6016.304121 7520.380152 1 1 1 7520.380152 1 1 1 52 | 51 7895.18227 1 1 6316.145816 7895.18227 1 1 1 7895.18227 1 1 1 53 | 52 8041.762023 1 1 6433.409618 8041.762023 1 1 1 8041.762023 1 1 1 54 | 53 8394.553234 1 1 6715.642587 8394.553234 1 1 1 8394.553234 1 1 1 55 | 54 8514.832969 1 1 6811.866375 8514.832969 1 1 1 8514.832969 1 1 1 56 | 55 8988.593778 1 1 7190.875022 8988.593778 1 1 1 8988.593778 1 1 1 57 | 56 9142.471314 1 1 7313.977051 9142.471314 1 1 1 9142.471314 1 1 1 58 | 57 9555.210465 1 1 7644.168372 9555.210465 1 1 1 9555.210465 1 1 1 59 | 58 9684.658381 1 1 7747.726705 9684.658381 1 1 1 9684.658381 1 1 1 60 | 59 11045.08664 1 1 8836.069315 11045.08664 1 1 1 11045.08664 1 1 1 61 | 60 11215.82425 1 1 8972.659402 11215.82425 1 1 1 11215.82425 1 1 1 62 | 61 11527.72395 1 1 9222.179161 11527.72395 1 1 1 11527.72395 1 1 1 63 | 62 11841.32842 1 1 9473.062734 11841.32842 1 1 1 11841.32842 1 1 1 64 | 63 12737.13941 1 1 10189.71152 12737.13941 1 1 1 12737.13941 1 1 1 65 | 64 13666.90154 1 1 10933.52123 13666.90154 1 1 1 13666.90154 1 1 1 66 | 65 14410.60702 1 1 11528.48562 14410.60702 1 1 1 14410.60702 1 1 1 67 | 66 14514.43038 1 1 11611.5443 14514.43038 1 1 1 14514.43038 1 1 1 68 | 67 14955.02181 1 1 11964.01744 14955.02181 1 1 1 14955.02181 1 1 1 69 | 68 15060.13771 1 1 12048.11017 15060.13771 1 1 1 15060.13771 1 1 1 70 | 69 15602.51862 1 1 12482.01489 15602.51862 1 1 1 15602.51862 1 1 1 71 | 70 15940.13148 1 1 12752.10518 15940.13148 1 1 1 15940.13148 1 1 1 72 | 71 16492.81203 1 1 13194.24963 16492.81203 1 1 1 16492.81203 1 1 1 73 | 72 17129.78521 1 1 13703.82817 17129.78521 1 1 1 17129.78521 1 1 1 74 | 73 18290.22918 1 1 14632.18335 18290.22918 1 1 1 18290.22918 1 1 1 75 | 74 19070.22309 1 1 15256.17847 19070.22309 1 1 1 19070.22309 1 1 1 76 | 75 20027.75891 1 1 16022.20713 20027.75891 1 1 1 20027.75891 1 1 1 77 | 76 20140.7883 1 1 16112.63064 20140.7883 1 1 1 20140.7883 1 1 1 78 | 77 20775.00611 1 1 16620.00489 20775.00611 1 1 1 20775.00611 1 1 1 79 | 78 20889.33301 1 1 16711.46641 20889.33301 1 1 1 20889.33301 1 1 1 80 | 79 21328.75101 1 1 17063.00081 21328.75101 1 1 1 21328.75101 1 1 1 81 | 80 21597.37899 1 1 17277.90319 21597.37899 1 1 1 21597.37899 1 1 1 82 | 81 21896.83817 1 1 17517.47053 21896.83817 1 1 1 21896.83817 1 1 1 83 | 82 23194.43508 1 1 18555.54806 23194.43508 1 1 1 23194.43508 1 1 1 84 | 83 25479.5755 1 1 20383.6604 25479.5755 1 1 1 25479.5755 1 1 1 85 | 84 25760.63849 1 1 20608.51079 25760.63849 1 1 1 25760.63849 1 1 1 86 | 85 26268.0299 1 1 21014.42392 26268.0299 1 1 1 26268.0299 1 1 1 87 | 86 27515.82553 1 1 22012.66043 27515.82553 1 1 1 27515.82553 1 1 1 88 | 87 28369.93198 1 1 22695.94558 28369.93198 1 1 1 28369.93198 1 1 1 89 | 88 29874.00472 1 1 23899.20378 29874.00472 1 1 1 29874.00472 1 1 1 90 | 89 32863.08472 1 1 26290.46778 32863.08472 1 1 1 32863.08472 1 1 1 91 | 90 50735.29988 1 1 40588.2399 50735.29988 1 1 1 50735.29988 1 1 1 92 | 91 58800.97878 1 1 47040.78302 58800.97878 1 1 1 58800.97878 1 1 1 93 | 92 64731.11086 1 1 51784.88869 64731.11086 1 1 1 64731.11086 1 1 1 94 | 93 68872.29029 1 1 55097.83223 68872.29029 1 1 1 68872.29029 1 1 1 95 | 94 77238.51873 1 1 61790.81498 77238.51873 1 1 1 77238.51873 1 1 1 96 | 95 84582.89393 1 1 67666.31515 84582.89393 1 1 1 84582.89393 1 1 1 97 | 96 104272.4595 1 1 83417.96758 104272.4595 1 1 1 104272.4595 1 1 1 98 | 97 109325.7391 1 1 87460.5913 109325.7391 1 1 1 109325.7391 1 1 1 99 | 98 130624 1 1 104499 130624 1 1 1 130624 1 1 1 100 | 99 198753 1 1 159002 198753 1 1 1 198753 1 1 1 101 | 100 336523 1 1 269218 336523 1 1 1 299132 1 1 1 102 | 101 440250 1 1 352200 440250 1 1 1 401117 1 1 1 103 | 102 495234 1 1 396187 495234 1 1 1 462218 1 1 1 104 | 103 546544 1 1 437235 546544 1 1 1 522253 1 1 1 105 | 104 582866 1 1 466293 582866 1 1 1 569913 1 1 1 106 | 105 611763 1 1 489410 611763 1 1 1 611763 1 1 1 107 | 106 627057 1 1 501646 627057 1 1 1 627057 1 1 1 108 | 107 642733 1 1 514186 642733 1 1 1 642733 1 1 1 109 | 108 658801 1 1 527041 658801 1 1 1 658801 1 1 1 110 | 109 675271 1 1 540217 675271 1 1 1 675271 1 1 1 111 | 110 1039267.25 1 1 831414 1039267.25 1 1 1 1039267.25 1 1 1 112 | 111 1075123.209 1 1 860099 1075123.209 1 1 1 1075123.209 1 1 1 113 | 112 1112213.744 1 1 889771 1112213.744 1 1 1 1112213.744 1 1 1 114 | 113 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 115 | 114 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 116 | 115 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 117 | 116 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 118 | 117 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 119 | 118 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 120 | 119 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 121 | 120 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 122 | 121 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 123 | 122 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 124 | 123 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 125 | -------------------------------------------------------------------------------- /WowHeadParser/Ressources/NpcTotalHpExp2.txt: -------------------------------------------------------------------------------- 1 | Level Rogue Druid Hunter Mage Paladin Priest Shaman Warlock Warrior Death Knight Monk Demon Hunter 2 | 1 87.36 1 1 69.888 87.36 1 1 1 87.36 1 1 1 3 | 2 110.5 1 1 88.4 110.5 1 1 1 110.5 1 1 1 4 | 3 144.495 1 1 115.596 144.495 1 1 1 144.495 1 1 1 5 | 4 161.2687831 1 1 129.0150265 161.2687831 1 1 1 161.2687831 1 1 1 6 | 5 187.7113333 1 1 150.1690667 187.7113333 1 1 1 187.7113333 1 1 1 7 | 6 207.2686984 1 1 165.8149587 207.2686984 1 1 1 207.2686984 1 1 1 8 | 7 237.5371693 1 1 190.0297354 237.5371693 1 1 1 237.5371693 1 1 1 9 | 8 260.0453968 1 1 208.0363175 260.0453968 1 1 1 260.0453968 1 1 1 10 | 9 283.8364286 1 1 227.0691429 283.8364286 1 1 1 283.8364286 1 1 1 11 | 10 338.2635004 1 1 270.6108003 338.2635004 1 1 1 338.2635004 1 1 1 12 | 11 392.6217835 1 1 314.0974268 392.6217835 1 1 1 392.6217835 1 1 1 13 | 12 441.8880869 1 1 353.5104695 441.8880869 1 1 1 441.8880869 1 1 1 14 | 13 517.2006263 1 1 413.760501 517.2006263 1 1 1 517.2006263 1 1 1 15 | 14 564.3336299 1 1 451.4669039 564.3336299 1 1 1 564.3336299 1 1 1 16 | 15 678.8665457 1 1 543.0932366 678.8665457 1 1 1 678.8665457 1 1 1 17 | 16 737.5240153 1 1 590.0192122 737.5240153 1 1 1 737.5240153 1 1 1 18 | 17 890.7807392 1 1 712.6245913 890.7807392 1 1 1 890.7807392 1 1 1 19 | 18 963.8497776 1 1 771.0798221 963.8497776 1 1 1 963.8497776 1 1 1 20 | 19 1140.014663 1 1 912.0117307 1140.014663 1 1 1 1140.014663 1 1 1 21 | 20 1227.015287 1 1 981.6122298 1227.015287 1 1 1 1227.015287 1 1 1 22 | 21 1371.556419 1 1 1097.245135 1371.556419 1 1 1 1371.556419 1 1 1 23 | 22 1428.596659 1 1 1142.877327 1428.596659 1 1 1 1428.596659 1 1 1 24 | 23 1629.820212 1 1 1303.856169 1629.820212 1 1 1 1629.820212 1 1 1 25 | 24 1726.965829 1 1 1381.572663 1726.965829 1 1 1 1726.965829 1 1 1 26 | 25 1929.441064 1 1 1543.552851 1929.441064 1 1 1 1929.441064 1 1 1 27 | 26 2018.858874 1 1 1615.087099 2018.858874 1 1 1 2018.858874 1 1 1 28 | 27 2264.711598 1 1 1811.769278 2264.711598 1 1 1 2264.711598 1 1 1 29 | 28 2382.709508 1 1 1906.167606 2382.709508 1 1 1 2382.709508 1 1 1 30 | 29 2583.193917 1 1 2066.555133 2583.193917 1 1 1 2583.193917 1 1 1 31 | 30 2690.167534 1 1 2152.134028 2690.167534 1 1 1 2690.167534 1 1 1 32 | 31 2966.067561 1 1 2372.854049 2966.067561 1 1 1 2966.067561 1 1 1 33 | 32 3062.562861 1 1 2450.050289 3062.562861 1 1 1 3062.562861 1 1 1 34 | 33 3321.591877 1 1 2657.273502 3321.591877 1 1 1 3321.591877 1 1 1 35 | 34 3465.096795 1 1 2772.077436 3465.096795 1 1 1 3465.096795 1 1 1 36 | 35 3783.899466 1 1 3027.119573 3783.899466 1 1 1 3783.899466 1 1 1 37 | 36 3894.060206 1 1 3115.248165 3894.060206 1 1 1 3894.060206 1 1 1 38 | 37 4127.776357 1 1 3302.221085 4127.776357 1 1 1 4127.776357 1 1 1 39 | 38 4242.130071 1 1 3393.704057 4242.130071 1 1 1 4242.130071 1 1 1 40 | 39 4605.247375 1 1 3684.1979 4605.247375 1 1 1 4605.247375 1 1 1 41 | 40 4751.795197 1 1 3801.436157 4751.795197 1 1 1 4751.795197 1 1 1 42 | 41 5117.909514 1 1 4094.327611 5117.909514 1 1 1 5117.909514 1 1 1 43 | 42 5224.492214 1 1 4179.593771 5224.492214 1 1 1 5224.492214 1 1 1 44 | 43 5543.764003 1 1 4435.011202 5543.764003 1 1 1 5543.764003 1 1 1 45 | 44 5655.823287 1 1 4524.658629 5655.823287 1 1 1 5655.823287 1 1 1 46 | 45 5999.566482 1 1 4799.653185 5999.566482 1 1 1 5999.566482 1 1 1 47 | 46 6140.34332 1 1 4912.274656 6140.34332 1 1 1 6140.34332 1 1 1 48 | 47 6486.280745 1 1 5189.024596 6486.280745 1 1 1 6486.280745 1 1 1 49 | 48 6607.30217 1 1 5285.841736 6607.30217 1 1 1 6607.30217 1 1 1 50 | 49 7035.673421 1 1 5628.538737 7035.673421 1 1 1 7035.673421 1 1 1 51 | 50 7520.380152 1 1 6016.304121 7520.380152 1 1 1 7520.380152 1 1 1 52 | 51 7895.18227 1 1 6316.145816 7895.18227 1 1 1 7895.18227 1 1 1 53 | 52 8041.762023 1 1 6433.409618 8041.762023 1 1 1 8041.762023 1 1 1 54 | 53 8394.553234 1 1 6715.642587 8394.553234 1 1 1 8394.553234 1 1 1 55 | 54 8514.832969 1 1 6811.866375 8514.832969 1 1 1 8514.832969 1 1 1 56 | 55 8988.593778 1 1 7190.875022 8988.593778 1 1 1 8988.593778 1 1 1 57 | 56 9142.471314 1 1 7313.977051 9142.471314 1 1 1 9142.471314 1 1 1 58 | 57 9555.210465 1 1 7644.168372 9555.210465 1 1 1 9555.210465 1 1 1 59 | 58 9684.658381 1 1 7747.726705 9684.658381 1 1 1 9684.658381 1 1 1 60 | 59 11045.08664 1 1 8836.069315 11045.08664 1 1 1 11045.08664 1 1 1 61 | 60 11215.82425 1 1 8972.659402 11215.82425 1 1 1 11215.82425 1 1 1 62 | 61 11527.72395 1 1 9222.179161 11527.72395 1 1 1 11527.72395 1 1 1 63 | 62 11841.32842 1 1 9473.062734 11841.32842 1 1 1 11841.32842 1 1 1 64 | 63 12737.13941 1 1 10189.71152 12737.13941 1 1 1 12737.13941 1 1 1 65 | 64 13666.90154 1 1 10933.52123 13666.90154 1 1 1 13666.90154 1 1 1 66 | 65 14410.60702 1 1 11528.48562 14410.60702 1 1 1 14410.60702 1 1 1 67 | 66 14514.43038 1 1 11611.5443 14514.43038 1 1 1 14514.43038 1 1 1 68 | 67 14955.02181 1 1 11964.01744 14955.02181 1 1 1 14955.02181 1 1 1 69 | 68 15060.13771 1 1 12048.11017 15060.13771 1 1 1 15060.13771 1 1 1 70 | 69 15602.51862 1 1 12482.01489 15602.51862 1 1 1 15602.51862 1 1 1 71 | 70 15940.13148 1 1 12752.10518 15940.13148 1 1 1 15940.13148 1 1 1 72 | 71 16492.81203 1 1 13194.24963 16492.81203 1 1 1 16492.81203 1 1 1 73 | 72 17129.78521 1 1 13703.82817 17129.78521 1 1 1 17129.78521 1 1 1 74 | 73 18290.22918 1 1 14632.18335 18290.22918 1 1 1 18290.22918 1 1 1 75 | 74 19070.22309 1 1 15256.17847 19070.22309 1 1 1 19070.22309 1 1 1 76 | 75 20027.75891 1 1 16022.20713 20027.75891 1 1 1 20027.75891 1 1 1 77 | 76 20140.7883 1 1 16112.63064 20140.7883 1 1 1 20140.7883 1 1 1 78 | 77 20775.00611 1 1 16620.00489 20775.00611 1 1 1 20775.00611 1 1 1 79 | 78 20889.33301 1 1 16711.46641 20889.33301 1 1 1 20889.33301 1 1 1 80 | 79 21328.75101 1 1 17063.00081 21328.75101 1 1 1 21328.75101 1 1 1 81 | 80 21597.37899 1 1 17277.90319 21597.37899 1 1 1 21597.37899 1 1 1 82 | 81 22342.48856 1 1 17873.99085 22342.48856 1 1 1 22342.48856 1 1 1 83 | 82 23113.30442 1 1 18490.64354 23113.30442 1 1 1 23113.30442 1 1 1 84 | 83 23910.71342 1 1 19128.57074 23910.71342 1 1 1 23910.71342 1 1 1 85 | 84 25760.63849 1 1 20608.51079 25760.63849 1 1 1 25760.63849 1 1 1 86 | 85 26268.0299 1 1 21014.42392 26268.0299 1 1 1 26268.0299 1 1 1 87 | 86 27515.82553 1 1 22012.66043 27515.82553 1 1 1 27515.82553 1 1 1 88 | 87 28369.93198 1 1 22695.94558 28369.93198 1 1 1 28369.93198 1 1 1 89 | 88 29874.00472 1 1 23899.20378 29874.00472 1 1 1 29874.00472 1 1 1 90 | 89 32863.08472 1 1 26290.46778 32863.08472 1 1 1 32863.08472 1 1 1 91 | 90 50735.29988 1 1 40588.2399 50735.29988 1 1 1 50735.29988 1 1 1 92 | 91 58800.97878 1 1 47040.78302 58800.97878 1 1 1 58800.97878 1 1 1 93 | 92 64731.11086 1 1 51784.88869 64731.11086 1 1 1 64731.11086 1 1 1 94 | 93 68872.29029 1 1 55097.83223 68872.29029 1 1 1 68872.29029 1 1 1 95 | 94 77238.51873 1 1 61790.81498 77238.51873 1 1 1 77238.51873 1 1 1 96 | 95 84582.89393 1 1 67666.31515 84582.89393 1 1 1 84582.89393 1 1 1 97 | 96 104272.4595 1 1 83417.96758 104272.4595 1 1 1 104272.4595 1 1 1 98 | 97 109325.7391 1 1 87460.5913 109325.7391 1 1 1 109325.7391 1 1 1 99 | 98 130624 1 1 104499 130624 1 1 1 130624 1 1 1 100 | 99 198753 1 1 159002 198753 1 1 1 198753 1 1 1 101 | 100 336523 1 1 269218 336523 1 1 1 299132 1 1 1 102 | 101 440250 1 1 352200 440250 1 1 1 401117 1 1 1 103 | 102 495234 1 1 396187 495234 1 1 1 462218 1 1 1 104 | 103 546544 1 1 437235 546544 1 1 1 522253 1 1 1 105 | 104 582866 1 1 466293 582866 1 1 1 569913 1 1 1 106 | 105 611763 1 1 489410 611763 1 1 1 611763 1 1 1 107 | 106 627057 1 1 501646 627057 1 1 1 627057 1 1 1 108 | 107 642733 1 1 514186 642733 1 1 1 642733 1 1 1 109 | 108 658801 1 1 527041 658801 1 1 1 658801 1 1 1 110 | 109 675271 1 1 540217 675271 1 1 1 675271 1 1 1 111 | 110 1039267.25 1 1 831414 1039267.25 1 1 1 1039267.25 1 1 1 112 | 111 1075123.209 1 1 860099 1075123.209 1 1 1 1075123.209 1 1 1 113 | 112 1112213.744 1 1 889771 1112213.744 1 1 1 1112213.744 1 1 1 114 | 113 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 115 | 114 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 116 | 115 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 117 | 116 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 118 | 117 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 119 | 118 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 120 | 119 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 121 | 120 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 122 | 121 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 123 | 122 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 124 | 123 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 125 | -------------------------------------------------------------------------------- /WowHeadParser/Ressources/NpcTotalHpExp5.txt: -------------------------------------------------------------------------------- 1 | Level Rogue Druid Hunter Mage Paladin Priest Shaman Warlock Warrior Death Knight Monk Demon Hunter 2 | 1 87.36 1 1 69.888 87.36 1 1 1 87.36 1 1 1 3 | 2 110.5 1 1 88.4 110.5 1 1 1 110.5 1 1 1 4 | 3 144.495 1 1 115.596 144.495 1 1 1 144.495 1 1 1 5 | 4 161.2687831 1 1 129.0150265 161.2687831 1 1 1 161.2687831 1 1 1 6 | 5 187.7113333 1 1 150.1690666 187.7113333 1 1 1 187.7113333 1 1 1 7 | 6 207.2686984 1 1 165.8149587 207.2686984 1 1 1 207.2686984 1 1 1 8 | 7 237.5371693 1 1 190.0297354 237.5371693 1 1 1 237.5371693 1 1 1 9 | 8 260.0453968 1 1 208.0363174 260.0453968 1 1 1 260.0453968 1 1 1 10 | 9 283.8364286 1 1 227.0691429 283.8364286 1 1 1 283.8364286 1 1 1 11 | 10 338.2635004 1 1 270.6108003 338.2635004 1 1 1 338.2635004 1 1 1 12 | 11 392.6217835 1 1 314.0974268 392.6217835 1 1 1 392.6217835 1 1 1 13 | 12 441.8880869 1 1 353.5104695 441.8880869 1 1 1 441.8880869 1 1 1 14 | 13 517.2006263 1 1 413.760501 517.2006263 1 1 1 517.2006263 1 1 1 15 | 14 564.3336299 1 1 451.4669039 564.3336299 1 1 1 564.3336299 1 1 1 16 | 15 678.8665457 1 1 543.0932366 678.8665457 1 1 1 678.8665457 1 1 1 17 | 16 737.5240153 1 1 590.0192122 737.5240153 1 1 1 737.5240153 1 1 1 18 | 17 890.7807392 1 1 712.6245914 890.7807392 1 1 1 890.7807392 1 1 1 19 | 18 963.8497776 1 1 771.0798221 963.8497776 1 1 1 963.8497776 1 1 1 20 | 19 1140.014663 1 1 912.0117304 1140.014663 1 1 1 1140.014663 1 1 1 21 | 20 1227.015287 1 1 981.6122296 1227.015287 1 1 1 1227.015287 1 1 1 22 | 21 1371.556419 1 1 1097.245135 1371.556419 1 1 1 1371.556419 1 1 1 23 | 22 1428.596659 1 1 1142.877327 1428.596659 1 1 1 1428.596659 1 1 1 24 | 23 1629.820212 1 1 1303.85617 1629.820212 1 1 1 1629.820212 1 1 1 25 | 24 1726.965829 1 1 1381.572663 1726.965829 1 1 1 1726.965829 1 1 1 26 | 25 1929.441064 1 1 1543.552851 1929.441064 1 1 1 1929.441064 1 1 1 27 | 26 2018.858874 1 1 1615.087099 2018.858874 1 1 1 2018.858874 1 1 1 28 | 27 2264.711598 1 1 1811.769278 2264.711598 1 1 1 2264.711598 1 1 1 29 | 28 2382.709508 1 1 1906.167606 2382.709508 1 1 1 2382.709508 1 1 1 30 | 29 2583.193917 1 1 2066.555134 2583.193917 1 1 1 2583.193917 1 1 1 31 | 30 2690.167534 1 1 2152.134027 2690.167534 1 1 1 2690.167534 1 1 1 32 | 31 2966.067561 1 1 2372.854049 2966.067561 1 1 1 2966.067561 1 1 1 33 | 32 3062.562861 1 1 2450.050289 3062.562861 1 1 1 3062.562861 1 1 1 34 | 33 3321.591877 1 1 2657.273502 3321.591877 1 1 1 3321.591877 1 1 1 35 | 34 3465.096795 1 1 2772.077436 3465.096795 1 1 1 3465.096795 1 1 1 36 | 35 3783.899466 1 1 3027.119573 3783.899466 1 1 1 3783.899466 1 1 1 37 | 36 3894.060206 1 1 3115.248165 3894.060206 1 1 1 3894.060206 1 1 1 38 | 37 4127.776357 1 1 3302.221086 4127.776357 1 1 1 4127.776357 1 1 1 39 | 38 4242.130071 1 1 3393.704057 4242.130071 1 1 1 4242.130071 1 1 1 40 | 39 4605.247375 1 1 3684.1979 4605.247375 1 1 1 4605.247375 1 1 1 41 | 40 4751.795197 1 1 3801.436158 4751.795197 1 1 1 4751.795197 1 1 1 42 | 41 5117.909514 1 1 4094.327611 5117.909514 1 1 1 5117.909514 1 1 1 43 | 42 5224.492214 1 1 4179.593771 5224.492214 1 1 1 5224.492214 1 1 1 44 | 43 5543.764003 1 1 4435.011202 5543.764003 1 1 1 5543.764003 1 1 1 45 | 44 5655.823287 1 1 4524.65863 5655.823287 1 1 1 5655.823287 1 1 1 46 | 45 5999.566482 1 1 4799.653186 5999.566482 1 1 1 5999.566482 1 1 1 47 | 46 6140.34332 1 1 4912.274656 6140.34332 1 1 1 6140.34332 1 1 1 48 | 47 6486.280745 1 1 5189.024596 6486.280745 1 1 1 6486.280745 1 1 1 49 | 48 6607.30217 1 1 5285.841736 6607.30217 1 1 1 6607.30217 1 1 1 50 | 49 7035.673421 1 1 5628.538737 7035.673421 1 1 1 7035.673421 1 1 1 51 | 50 7520.380152 1 1 6016.304122 7520.380152 1 1 1 7520.380152 1 1 1 52 | 51 7895.18227 1 1 6316.145816 7895.18227 1 1 1 7895.18227 1 1 1 53 | 52 8041.762023 1 1 6433.409618 8041.762023 1 1 1 8041.762023 1 1 1 54 | 53 8394.553234 1 1 6715.642587 8394.553234 1 1 1 8394.553234 1 1 1 55 | 54 8514.832969 1 1 6811.866375 8514.832969 1 1 1 8514.832969 1 1 1 56 | 55 8988.593778 1 1 7190.875022 8988.593778 1 1 1 8988.593778 1 1 1 57 | 56 9142.471314 1 1 7313.977051 9142.471314 1 1 1 9142.471314 1 1 1 58 | 57 9555.210465 1 1 7644.168372 9555.210465 1 1 1 9555.210465 1 1 1 59 | 58 9684.658381 1 1 7747.726705 9684.658381 1 1 1 9684.658381 1 1 1 60 | 59 11045.08664 1 1 8836.069312 11045.08664 1 1 1 11045.08664 1 1 1 61 | 60 11215.82425 1 1 8972.6594 11215.82425 1 1 1 11215.82425 1 1 1 62 | 61 11527.72395 1 1 9222.17916 11527.72395 1 1 1 11527.72395 1 1 1 63 | 62 11841.32842 1 1 9473.062736 11841.32842 1 1 1 11841.32842 1 1 1 64 | 63 12737.13941 1 1 10189.71153 12737.13941 1 1 1 12737.13941 1 1 1 65 | 64 13666.90154 1 1 10933.52123 13666.90154 1 1 1 13666.90154 1 1 1 66 | 65 14410.60702 1 1 11528.48562 14410.60702 1 1 1 14410.60702 1 1 1 67 | 66 14514.43038 1 1 11611.5443 14514.43038 1 1 1 14514.43038 1 1 1 68 | 67 14955.02181 1 1 11964.01745 14955.02181 1 1 1 14955.02181 1 1 1 69 | 68 15060.13771 1 1 12048.11017 15060.13771 1 1 1 15060.13771 1 1 1 70 | 69 15602.51862 1 1 12482.0149 15602.51862 1 1 1 15602.51862 1 1 1 71 | 70 15940.13148 1 1 12752.10518 15940.13148 1 1 1 15940.13148 1 1 1 72 | 71 16492.81203 1 1 13194.24962 16492.81203 1 1 1 16492.81203 1 1 1 73 | 72 17129.78521 1 1 13703.82817 17129.78521 1 1 1 17129.78521 1 1 1 74 | 73 18290.22918 1 1 14632.18334 18290.22918 1 1 1 18290.22918 1 1 1 75 | 74 19070.22309 1 1 15256.17847 19070.22309 1 1 1 19070.22309 1 1 1 76 | 75 20027.75891 1 1 16022.20713 20027.75891 1 1 1 20027.75891 1 1 1 77 | 76 20140.7883 1 1 16112.63064 20140.7883 1 1 1 20140.7883 1 1 1 78 | 77 20775.00611 1 1 16620.00489 20775.00611 1 1 1 20775.00611 1 1 1 79 | 78 20889.33301 1 1 16711.46641 20889.33301 1 1 1 20889.33301 1 1 1 80 | 79 21328.75101 1 1 17063.00081 21328.75101 1 1 1 21328.75101 1 1 1 81 | 80 21597.37899 1 1 17277.90319 21597.37899 1 1 1 21597.37899 1 1 1 82 | 81 21896.83817 1 1 17517.47054 21896.83817 1 1 1 21896.83817 1 1 1 83 | 82 23194.43508 1 1 18555.54806 23194.43508 1 1 1 23194.43508 1 1 1 84 | 83 25479.5755 1 1 20383.6604 25479.5755 1 1 1 25479.5755 1 1 1 85 | 84 25760.63849 1 1 20608.51079 25760.63849 1 1 1 25760.63849 1 1 1 86 | 85 26268.0299 1 1 21014.42392 26268.0299 1 1 1 26268.0299 1 1 1 87 | 86 27515.82553 1 1 22012.66042 27515.82553 1 1 1 27515.82553 1 1 1 88 | 87 28369.93198 1 1 22695.94558 28369.93198 1 1 1 28369.93198 1 1 1 89 | 88 29874.00472 1 1 23899.20378 29874.00472 1 1 1 29874.00472 1 1 1 90 | 89 32863.08472 1 1 26290.46778 32863.08472 1 1 1 32863.08472 1 1 1 91 | 90 46975.36677 1 1 37580.29342 46975.36677 1 1 1 46975.36677 1 1 1 92 | 91 54305.20642 1 1 43444.16514 54305.20642 1 1 1 54305.20642 1 1 1 93 | 92 59632.09954 1 1 47705.67963 59632.09954 1 1 1 59632.09954 1 1 1 94 | 93 63289.93006 1 1 50631.94405 63289.93006 1 1 1 63289.93006 1 1 1 95 | 94 70804.32204 1 1 56643.45763 70804.32204 1 1 1 70804.32204 1 1 1 96 | 95 77349.33422 1 1 61879.46738 77349.33422 1 1 1 77349.33422 1 1 1 97 | 96 95127.06763 1 1 76101.6541 95127.06763 1 1 1 95127.06763 1 1 1 98 | 97 99501.44684 1 1 79601.15747 99501.44684 1 1 1 99501.44684 1 1 1 99 | 98 102486.4902 1 1 81989.1922 102486.4902 1 1 1 102486.4902 1 1 1 100 | 99 105561.085 1 1 84448.86797 105561.085 1 1 1 105561.085 1 1 1 101 | 100 108727.9175 1 1 86982.334 108727.9175 1 1 1 108727.9175 1 1 1 102 | 101 112479.0307 1 1 89983.22453 112479.0307 1 1 1 112479.0307 1 1 1 103 | 102 116359.5572 1 1 93087.64577 116359.5572 1 1 1 116359.5572 1 1 1 104 | 103 120373.9619 1 1 96299.16955 120373.9619 1 1 1 120373.9619 1 1 1 105 | 104 582866 1 1 466293 582866 1 1 1 582866 1 1 1 106 | 105 611763 1 1 489410 611763 1 1 1 611763 1 1 1 107 | 106 627057 1 1 501646 627057 1 1 1 627057 1 1 1 108 | 107 642733 1 1 514186 642733 1 1 1 642733 1 1 1 109 | 108 658801 1 1 527041 658801 1 1 1 658801 1 1 1 110 | 109 675271 1 1 540217 675271 1 1 1 675271 1 1 1 111 | 110 1039267.25 1 1 831414 1039267.25 1 1 1 1039267.25 1 1 1 112 | 111 1075123.209 1 1 860099 1075123.209 1 1 1 1075123.209 1 1 1 113 | 112 1112213.744 1 1 889771 1112213.744 1 1 1 1112213.744 1 1 1 114 | 113 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 115 | 114 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 116 | 115 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 117 | 116 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 118 | 117 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 119 | 118 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 120 | 119 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 121 | 120 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 122 | 121 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 123 | 122 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 124 | 123 1150587.269 1 1 920470 1150587.269 1 1 1 1150587.269 1 1 1 125 | -------------------------------------------------------------------------------- /WowHeadParser/MainWindow.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace WowHeadParser 2 | { 3 | partial class MainWindow 4 | { 5 | /// 6 | /// Variable nécessaire au concepteur. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Nettoyage des ressources utilisées. 12 | /// 13 | /// true si les ressources managées doivent être supprimées ; sinon, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Code généré par le Concepteur Windows Form 24 | 25 | /// 26 | /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas 27 | /// le contenu de cette méthode avec l'éditeur de code. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.progressBar1 = new System.Windows.Forms.ProgressBar(); 32 | this.textBoxA = new System.Windows.Forms.TextBox(); 33 | this.comboBoxChoice = new System.Windows.Forms.ComboBox(); 34 | this.textBoxDe = new System.Windows.Forms.TextBox(); 35 | this.labelDe = new System.Windows.Forms.Label(); 36 | this.labelA = new System.Windows.Forms.Label(); 37 | this.button1 = new System.Windows.Forms.Button(); 38 | this.comboBoxLocale = new System.Windows.Forms.ComboBox(); 39 | this.ProgressBarValue = new System.Windows.Forms.Label(); 40 | this.timeLeftLabel = new System.Windows.Forms.Label(); 41 | this.comboBoxEntity = new System.Windows.Forms.ComboBox(); 42 | this.selectList = new System.Windows.Forms.ListView(); 43 | this.label1 = new System.Windows.Forms.Label(); 44 | this.SuspendLayout(); 45 | // 46 | // progressBar1 47 | // 48 | this.progressBar1.Location = new System.Drawing.Point(47, 37); 49 | this.progressBar1.Name = "progressBar1"; 50 | this.progressBar1.Size = new System.Drawing.Size(400, 23); 51 | this.progressBar1.TabIndex = 1; 52 | // 53 | // textBoxA 54 | // 55 | this.textBoxA.Location = new System.Drawing.Point(356, 10); 56 | this.textBoxA.Name = "textBoxA"; 57 | this.textBoxA.Size = new System.Drawing.Size(80, 20); 58 | this.textBoxA.TabIndex = 4; 59 | this.textBoxA.Text = "0"; 60 | // 61 | // comboBoxChoice 62 | // 63 | this.comboBoxChoice.FormattingEnabled = true; 64 | this.comboBoxChoice.Location = new System.Drawing.Point(12, 10); 65 | this.comboBoxChoice.Name = "comboBoxChoice"; 66 | this.comboBoxChoice.Size = new System.Drawing.Size(100, 21); 67 | this.comboBoxChoice.TabIndex = 1; 68 | this.comboBoxChoice.SelectedIndexChanged += new System.EventHandler(this.comboBoxChoice_SelectedIndexChanged); 69 | // 70 | // textBoxDe 71 | // 72 | this.textBoxDe.Location = new System.Drawing.Point(251, 10); 73 | this.textBoxDe.Name = "textBoxDe"; 74 | this.textBoxDe.Size = new System.Drawing.Size(80, 20); 75 | this.textBoxDe.TabIndex = 3; 76 | this.textBoxDe.Text = "1"; 77 | // 78 | // labelDe 79 | // 80 | this.labelDe.AutoSize = true; 81 | this.labelDe.Location = new System.Drawing.Point(224, 16); 82 | this.labelDe.Name = "labelDe"; 83 | this.labelDe.Size = new System.Drawing.Size(21, 13); 84 | this.labelDe.TabIndex = 5; 85 | this.labelDe.Text = "De"; 86 | // 87 | // labelA 88 | // 89 | this.labelA.AutoSize = true; 90 | this.labelA.Location = new System.Drawing.Point(337, 16); 91 | this.labelA.Name = "labelA"; 92 | this.labelA.Size = new System.Drawing.Size(13, 13); 93 | this.labelA.TabIndex = 6; 94 | this.labelA.Text = "à"; 95 | // 96 | // button1 97 | // 98 | this.button1.Location = new System.Drawing.Point(372, 171); 99 | this.button1.Name = "button1"; 100 | this.button1.Size = new System.Drawing.Size(75, 23); 101 | this.button1.TabIndex = 7; 102 | this.button1.Text = "Démarrer"; 103 | this.button1.UseVisualStyleBackColor = true; 104 | this.button1.Click += new System.EventHandler(this.button1_Click); 105 | // 106 | // comboBoxLocale 107 | // 108 | this.comboBoxLocale.FormattingEnabled = true; 109 | this.comboBoxLocale.Location = new System.Drawing.Point(12, 169); 110 | this.comboBoxLocale.Name = "comboBoxLocale"; 111 | this.comboBoxLocale.Size = new System.Drawing.Size(80, 21); 112 | this.comboBoxLocale.TabIndex = 6; 113 | // 114 | // ProgressBarValue 115 | // 116 | this.ProgressBarValue.AutoSize = true; 117 | this.ProgressBarValue.Location = new System.Drawing.Point(9, 47); 118 | this.ProgressBarValue.Name = "ProgressBarValue"; 119 | this.ProgressBarValue.Size = new System.Drawing.Size(21, 13); 120 | this.ProgressBarValue.TabIndex = 8; 121 | this.ProgressBarValue.Text = "0%"; 122 | // 123 | // timeLeftLabel 124 | // 125 | this.timeLeftLabel.AutoSize = true; 126 | this.timeLeftLabel.Location = new System.Drawing.Point(185, 176); 127 | this.timeLeftLabel.Name = "timeLeftLabel"; 128 | this.timeLeftLabel.Size = new System.Drawing.Size(62, 13); 129 | this.timeLeftLabel.TabIndex = 9; 130 | this.timeLeftLabel.Text = "00h00m00s"; 131 | // 132 | // comboBoxEntity 133 | // 134 | this.comboBoxEntity.FormattingEnabled = true; 135 | this.comboBoxEntity.Location = new System.Drawing.Point(118, 10); 136 | this.comboBoxEntity.Name = "comboBoxEntity"; 137 | this.comboBoxEntity.Size = new System.Drawing.Size(100, 21); 138 | this.comboBoxEntity.TabIndex = 2; 139 | this.comboBoxEntity.SelectedIndexChanged += new System.EventHandler(this.comboBoxEntity_SelectedIndexChanged); 140 | // 141 | // selectList 142 | // 143 | this.selectList.CheckBoxes = true; 144 | this.selectList.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; 145 | this.selectList.Location = new System.Drawing.Point(12, 66); 146 | this.selectList.Name = "selectList"; 147 | this.selectList.Size = new System.Drawing.Size(435, 97); 148 | this.selectList.TabIndex = 5; 149 | this.selectList.UseCompatibleStateImageBehavior = false; 150 | this.selectList.View = System.Windows.Forms.View.List; 151 | // 152 | // label1 153 | // 154 | this.label1.AutoSize = true; 155 | this.label1.Location = new System.Drawing.Point(99, 176); 156 | this.label1.Name = "label1"; 157 | this.label1.Size = new System.Drawing.Size(80, 13); 158 | this.label1.TabIndex = 12; 159 | this.label1.Text = "Temps restant :"; 160 | // 161 | // MainWindow 162 | // 163 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 164 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 165 | this.ClientSize = new System.Drawing.Size(459, 198); 166 | this.Controls.Add(this.label1); 167 | this.Controls.Add(this.selectList); 168 | this.Controls.Add(this.comboBoxEntity); 169 | this.Controls.Add(this.timeLeftLabel); 170 | this.Controls.Add(this.ProgressBarValue); 171 | this.Controls.Add(this.comboBoxLocale); 172 | this.Controls.Add(this.labelA); 173 | this.Controls.Add(this.labelDe); 174 | this.Controls.Add(this.textBoxDe); 175 | this.Controls.Add(this.comboBoxChoice); 176 | this.Controls.Add(this.textBoxA); 177 | this.Controls.Add(this.progressBar1); 178 | this.Controls.Add(this.button1); 179 | this.Name = "MainWindow"; 180 | this.Text = "Wowhead Parser"; 181 | this.Load += new System.EventHandler(this.MainWindow_Load); 182 | this.ResumeLayout(false); 183 | this.PerformLayout(); 184 | 185 | } 186 | 187 | #endregion 188 | 189 | private System.Windows.Forms.ProgressBar progressBar1; 190 | private System.Windows.Forms.TextBox textBoxA; 191 | private System.Windows.Forms.ComboBox comboBoxChoice; 192 | private System.Windows.Forms.TextBox textBoxDe; 193 | private System.Windows.Forms.Label labelDe; 194 | private System.Windows.Forms.Label labelA; 195 | private System.Windows.Forms.Button button1; 196 | private System.Windows.Forms.ComboBox comboBoxLocale; 197 | private System.Windows.Forms.Label ProgressBarValue; 198 | private System.Windows.Forms.Label timeLeftLabel; 199 | private System.Windows.Forms.ComboBox comboBoxEntity; 200 | private System.Windows.Forms.ListView selectList; 201 | private System.Windows.Forms.Label label1; 202 | } 203 | } 204 | 205 | -------------------------------------------------------------------------------- /WowHeadParser/Entities/Quest.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * * Created by Traesh for AshamaneProject (https://github.com/AshamaneProject) 3 | */ 4 | using Newtonsoft.Json; 5 | using Sql; 6 | using System; 7 | using System.Collections.Generic; 8 | using System.Xml; 9 | 10 | namespace WowHeadParser.Entities 11 | { 12 | class Quest : Entity 13 | { 14 | struct QuestTemplateParsing 15 | { 16 | public int id; 17 | public int category; 18 | public int category2; 19 | public int[] currencyrewards; 20 | public int money; 21 | public string name; 22 | public int reqlevel; 23 | public int side; 24 | public int type; 25 | } 26 | 27 | public Quest() : base() 28 | { 29 | m_builderStarter = new SqlBuilder("creature_queststarter", "id"); 30 | m_builderStarter.SetFieldsNames("quest"); 31 | 32 | m_builderEnder = new SqlBuilder("creature_questender", "id"); 33 | m_builderEnder.SetFieldsNames("quest"); 34 | 35 | m_builderSerieWithPrevious = new SqlBuilder("quest_template_addon", "id", SqlQueryType.Update); 36 | m_builderSerieWithPrevious.SetFieldsNames("PrevQuestID", "ExclusiveGroup"); 37 | 38 | m_builderSerieWithoutPrevious = new SqlBuilder("quest_template_addon", "id", SqlQueryType.Update); 39 | m_builderSerieWithoutPrevious.SetFieldsNames("ExclusiveGroup"); 40 | 41 | m_builderRequiredTeam = new SqlBuilder("quest_template", "id", SqlQueryType.Update); 42 | m_builderRequiredTeam.SetFieldsNames("requiredTeam"); 43 | 44 | m_builderRequiredClass = new SqlBuilder("quest_template_addon", "id", SqlQueryType.Update); 45 | m_builderRequiredClass.SetFieldsNames("AllowableClasses"); 46 | } 47 | 48 | public Quest(int id) : this() 49 | { 50 | m_data.id = id; 51 | } 52 | 53 | public override String GetWowheadUrl() 54 | { 55 | return GetWowheadBaseUrl() + "/quest=" + m_data.id; 56 | } 57 | 58 | public override List GetIdsFromZone(String zoneId, String zoneHtml) 59 | { 60 | String pattern = @"new Listview\({template: 'quest', id: 'quests', name: LANG\.tab_quests, tabs: tabsRelated, parent: 'lkljbjkb574', computeDataFunc: Listview\.funcBox\.initQuestFilter, onAfterCreate: Listview\.funcBox\.addQuestIndicator,(?: note: WH\.sprintf\(LANG\.lvnote_zonequests, [0-9]+, [0-9]+, '[a-zA-ZÉèéêîÎ’'\- ]+', [0-9]+\),)? data: (.+)}\);"; 61 | String creatureJSon = Tools.ExtractJsonFromWithPattern(zoneHtml, pattern); 62 | 63 | List parsingArray = JsonConvert.DeserializeObject>(creatureJSon); 64 | List tempArray = new List(); 65 | foreach (CreatureTemplateParsing creatureTemplateStruct in parsingArray) 66 | { 67 | Quest questTemplate = new Quest(creatureTemplateStruct.id); 68 | tempArray.Add(questTemplate); 69 | } 70 | 71 | return tempArray; 72 | } 73 | 74 | public override bool ParseSingleJson(int id = 0) 75 | { 76 | if (m_data.id == 0 && id == 0) 77 | return false; 78 | else if (m_data.id == 0 && id != 0) 79 | m_data.id = id; 80 | 81 | String questHtml = Tools.GetHtmlFromWowhead(GetWowheadUrl()); 82 | 83 | if (questHtml.Contains("inputbox-error")) 84 | return false; 85 | 86 | String dataPattern = @"var myMapper = new Mapper\((.+)\)"; 87 | String seriePattern = "(.+?
)"; 88 | 89 | String questDataJSon = Tools.ExtractJsonFromWithPattern(questHtml, dataPattern); 90 | String questSerieXml = Tools.ExtractJsonFromWithPattern(questHtml, seriePattern); 91 | 92 | bool isAlliance = questHtml.Contains(@"Faction\x20\x3A\x20\x5Bspan\x20class\x3Dicon\x2Dalliance\x5DAlliance"); 93 | bool isHorde = questHtml.Contains(@"Faction\x20\x3A\x20\x5Bspan\x20class\x3Dicon\x2Dhorde\x5DHorde"); 94 | 95 | if (questDataJSon != null) 96 | { 97 | dynamic data = JsonConvert.DeserializeObject(questDataJSon); 98 | SetData(data); 99 | } 100 | 101 | if (questSerieXml != null) 102 | { 103 | SetSerie(questSerieXml); 104 | } 105 | 106 | SetTeam(isAlliance, isHorde); 107 | 108 | List questClass = Tools.ExtractListJsonFromWithPattern(questHtml, @"\[class=(\d+)\]"); 109 | SetClassRequired(questClass); 110 | 111 | return true; 112 | } 113 | 114 | public void SetData(dynamic questData) 115 | { 116 | foreach (dynamic objective in questData.objectives) 117 | { 118 | foreach (dynamic zone in objective) 119 | { 120 | foreach (dynamic test1 in zone.levels) 121 | { 122 | foreach (dynamic objectiveData in test1) 123 | { 124 | if (objectiveData.point == "start") 125 | m_builderStarter.AppendFieldsValue(objectiveData.id, m_data.id); 126 | 127 | if (objectiveData.point == "end") 128 | m_builderEnder.AppendFieldsValue(objectiveData.id, m_data.id); 129 | } 130 | } 131 | } 132 | } 133 | } 134 | 135 | public void SetSerie(String serieXml) 136 | { 137 | try 138 | { 139 | XmlDocument doc = new XmlDocument(); 140 | doc.LoadXml(serieXml); 141 | 142 | XmlNodeList trs = doc.DocumentElement.SelectNodes("tr"); 143 | Dictionary> questInSerieByStep = new Dictionary>(); 144 | int step = 0; 145 | 146 | foreach (XmlNode tr in trs) 147 | { 148 | int currentStep = step++; 149 | questInSerieByStep.Add(currentStep, new List()); 150 | 151 | XmlNode td = tr.SelectSingleNode("td"); 152 | 153 | if (td == null) 154 | continue; 155 | 156 | XmlNode div = td.SelectSingleNode("div"); 157 | 158 | if (div == null) 159 | continue; 160 | 161 | XmlNode b = div.SelectSingleNode("b"); 162 | XmlNodeList aList = div.SelectNodes("a"); 163 | 164 | // Current quest is writed with a simple "b" html tag 165 | if (div.SelectSingleNode("b") != null) 166 | questInSerieByStep[currentStep].Add(m_data.id.ToString()); 167 | 168 | foreach (XmlNode a in aList) 169 | { 170 | XmlNode hrefAttr = a.Attributes.GetNamedItem("href"); 171 | 172 | if (hrefAttr == null) 173 | continue; 174 | 175 | String href = hrefAttr.Value; 176 | String questId = href.Substring(7); 177 | 178 | questInSerieByStep[currentStep].Add(questId); 179 | } 180 | } 181 | 182 | if (questInSerieByStep.Count < 2) 183 | return; 184 | 185 | for (int i = questInSerieByStep.Count - 1; i >= 0; --i) 186 | { 187 | String previousQuest = i > 0 ? questInSerieByStep[i - 1][0]: ""; 188 | 189 | String exclusiveGroup = "0"; 190 | if (questInSerieByStep[i].Count > 1) 191 | exclusiveGroup = "-" + questInSerieByStep[i][0]; 192 | 193 | foreach (String questId in questInSerieByStep[i]) 194 | { 195 | if (previousQuest != "") 196 | m_builderSerieWithPrevious.AppendFieldsValue(questId, previousQuest, exclusiveGroup); 197 | else 198 | m_builderSerieWithoutPrevious.AppendFieldsValue(questId, exclusiveGroup); 199 | } 200 | } 201 | } 202 | catch (Exception ex) 203 | { } 204 | } 205 | 206 | public void SetTeam(bool isAlliance, bool isHorde) 207 | { 208 | Int32 team = isAlliance ? 0 : isHorde ? 1 : -1; 209 | 210 | m_builderRequiredTeam.AppendFieldsValue(m_data.id, team); 211 | } 212 | 213 | public void SetClassRequired(List classIds) 214 | { 215 | UInt32 classMask = 0; 216 | foreach (String classId in classIds) 217 | { 218 | classMask += Tools.GetClassMaskFromClassId(classId); 219 | } 220 | 221 | if (classMask != 0) 222 | m_builderRequiredClass.AppendFieldsValue(m_data.id, classMask); 223 | } 224 | 225 | public override String GetSQLRequest() 226 | { 227 | String sqlRequest = ""; 228 | 229 | if (IsCheckboxChecked("starter/ender")) 230 | { 231 | sqlRequest += m_builderStarter.ToString() + m_builderEnder.ToString(); 232 | } 233 | 234 | if (IsCheckboxChecked("serie")) 235 | { 236 | sqlRequest += m_builderSerieWithPrevious.ToString(); 237 | sqlRequest += m_builderSerieWithoutPrevious.ToString(); 238 | } 239 | 240 | if (IsCheckboxChecked("team")) 241 | { 242 | sqlRequest += m_builderRequiredTeam.ToString(); 243 | } 244 | 245 | if (IsCheckboxChecked("class")) 246 | { 247 | sqlRequest += m_builderRequiredClass.ToString(); 248 | } 249 | 250 | return sqlRequest; 251 | } 252 | 253 | private QuestTemplateParsing m_data; 254 | 255 | protected SqlBuilder m_builderStarter; 256 | protected SqlBuilder m_builderEnder; 257 | protected SqlBuilder m_builderSerieWithPrevious; 258 | protected SqlBuilder m_builderSerieWithoutPrevious; 259 | protected SqlBuilder m_builderRequiredTeam; 260 | protected SqlBuilder m_builderRequiredClass; 261 | } 262 | } 263 | -------------------------------------------------------------------------------- /WowHeadParser/MainWindow.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * * Created by Traesh for AshamaneProject (https://github.com/AshamaneProject) 3 | */ 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Windows.Forms; 7 | using WowHeadParser.Entities; 8 | 9 | namespace WowHeadParser 10 | { 11 | public partial class MainWindow : Form 12 | { 13 | public enum LocaleConstant 14 | { 15 | enUS = 0, 16 | koKR = 1, 17 | frFR = 2, 18 | deDE = 3, 19 | zhCN = 4, 20 | zhTW = 5, 21 | esES = 6, 22 | esMX = 7, 23 | ruRU = 8, 24 | ptPT = 9, 25 | itIT = 10, 26 | }; 27 | 28 | public MainWindow() 29 | { 30 | InitializeComponent(); 31 | 32 | comboBoxChoice.Items.Add("Single"); 33 | comboBoxChoice.Items.Add("Zone"); 34 | comboBoxChoice.Items.Add("Range"); 35 | 36 | comboBoxEntity.Items.Add("Creature"); 37 | comboBoxEntity.Items.Add("Gameobject"); 38 | comboBoxEntity.Items.Add("Quest"); 39 | comboBoxEntity.Items.Add("Item"); 40 | comboBoxEntity.Items.Add("Zone"); 41 | comboBoxEntity.Items.Add("BlackMarket"); 42 | 43 | comboBoxLocale.Items.Add("www"); 44 | comboBoxLocale.Items.Add("fr"); 45 | comboBoxLocale.Items.Add("es"); 46 | comboBoxLocale.Items.Add("de"); 47 | comboBoxLocale.Items.Add("it"); 48 | comboBoxLocale.Items.Add("pt"); 49 | comboBoxLocale.Items.Add("ru"); 50 | 51 | comboBoxChoice.SelectedIndex = 0; 52 | 53 | HideToTextbox(true); 54 | 55 | ids = new List(); 56 | currentId = 0; 57 | } 58 | 59 | private void MainWindow_Load(object sender, EventArgs e) 60 | { 61 | for (int i = 0; i < comboBoxLocale.Items.Count; ++i) 62 | if (Properties.Settings.Default.wowheadLocale == (String)comboBoxLocale.Items[i]) 63 | comboBoxLocale.SelectedIndex = i; 64 | } 65 | 66 | private void button1_Click(object sender, EventArgs e) 67 | { 68 | String selectedText = comboBoxLocale.Items[comboBoxLocale.SelectedIndex].ToString(); 69 | Properties.Settings.Default.wowheadLocale = selectedText; 70 | Properties.Settings.Default.selectedEntity = comboBoxEntity.SelectedIndex; 71 | Entity.ReloadWowheadBaseUrl(); 72 | UpdateCheckboxSettings(); // Must be done before Properties.Settings.Default.Save 73 | 74 | switch (selectedText) 75 | { 76 | case "www": Properties.Settings.Default.localIndex = (int)LocaleConstant.enUS; break; 77 | case "fr": Properties.Settings.Default.localIndex = (int)LocaleConstant.frFR; break; 78 | case "es": Properties.Settings.Default.localIndex = (int)LocaleConstant.esES; break; 79 | case "de": Properties.Settings.Default.localIndex = (int)LocaleConstant.deDE; break; 80 | case "it": Properties.Settings.Default.localIndex = (int)LocaleConstant.itIT; break; 81 | case "pt": Properties.Settings.Default.localIndex = (int)LocaleConstant.ptPT; break; 82 | case "ru": Properties.Settings.Default.localIndex = (int)LocaleConstant.ruRU; break; 83 | default: Properties.Settings.Default.localIndex = (int)LocaleConstant.frFR; break; 84 | } 85 | 86 | Properties.Settings.Default.Save(); 87 | 88 | ids = new List(textBoxDe.Text.Split(' ')); 89 | m_fileName = Tools.GetFileNameForCurrentTime(); 90 | StartParsing(); 91 | 92 | SetStartButtonEnableState(false); 93 | } 94 | 95 | public void StartParsing() 96 | { 97 | switch (comboBoxChoice.SelectedIndex) 98 | { 99 | case 0: 100 | { 101 | int firstId = Int32.Parse(ids[currentId]); 102 | 103 | Range range = new Range(this, m_fileName); 104 | range.StartParsing(firstId, firstId); 105 | 106 | break; 107 | } 108 | case 1: 109 | { 110 | Zone zone = new Zone(this); 111 | zone.StartParsing(ids[currentId]); 112 | break; 113 | } 114 | case 2: 115 | { 116 | int firstId = Int32.Parse(textBoxDe.Text); 117 | int lastId = Int32.Parse(textBoxA.Text); 118 | 119 | Range range = new Range(this, m_fileName); 120 | range.StartParsing(firstId, lastId); 121 | 122 | break; 123 | } 124 | } 125 | } 126 | 127 | public void SetStartButtonEnableState(bool state) 128 | { 129 | button1.Enabled = state; 130 | } 131 | 132 | public void setProgressBar(int progress) 133 | { 134 | this.progressBar1.Value = progress; 135 | this.ProgressBarValue.Text = progress + "%"; 136 | } 137 | 138 | public void SetTimeLeft(int seconds) 139 | { 140 | int hours = seconds / 3600; 141 | seconds %= 3600; 142 | 143 | int minutes = seconds / 60; 144 | seconds %= 60; 145 | 146 | timeLeftLabel.Text = hours.ToString("00") + "h" + minutes.ToString("00") + "m" + seconds.ToString("00") + "s"; 147 | } 148 | 149 | public void SetWorkDone() 150 | { 151 | if (ids.Count > ++currentId) 152 | { 153 | StartParsing(); 154 | 155 | setProgressBar(100); 156 | timeLeftLabel.Text = "Terminé (" + (currentId + 1) + "/" + ids.Count + ")"; 157 | } 158 | else 159 | { 160 | setProgressBar(100); 161 | timeLeftLabel.Text = "Terminé"; 162 | SetStartButtonEnableState(true); 163 | currentId = 0; 164 | } 165 | } 166 | 167 | private void comboBoxChoice_SelectedIndexChanged(object sender, EventArgs e) 168 | { 169 | if (comboBoxChoice.SelectedIndex < 2) 170 | HideToTextbox(true); 171 | else 172 | HideToTextbox(false); 173 | } 174 | 175 | private void HideToTextbox(bool hide) 176 | { 177 | if (hide) 178 | { 179 | textBoxA.Hide(); 180 | labelA.Hide(); 181 | } 182 | else 183 | { 184 | textBoxA.Show(); 185 | labelA.Show(); 186 | } 187 | } 188 | 189 | private void comboBoxEntity_SelectedIndexChanged(object sender, EventArgs e) 190 | { 191 | selectList.Clear(); 192 | 193 | switch (comboBoxEntity.SelectedIndex) 194 | { 195 | // Creature 196 | case 0: 197 | { 198 | selectList.Items.Add("Is Dungeon/Raid Boss"); 199 | selectList.Items.Add("template"); 200 | selectList.Items.Add("health modifier"); 201 | selectList.Items.Add("locale"); 202 | selectList.Items.Add("vendor"); 203 | selectList.Items.Add("loot"); 204 | selectList.Items.Add("skinning"); 205 | selectList.Items.Add("trainer"); 206 | selectList.Items.Add("quest starter"); 207 | selectList.Items.Add("quest ender"); 208 | selectList.Items.Add("simple faction"); 209 | selectList.Items.Add("money"); 210 | break; 211 | } 212 | // Gameobject 213 | case 1: 214 | { 215 | selectList.Items.Add("locale"); 216 | selectList.Items.Add("loot"); 217 | selectList.Items.Add("herbalism"); 218 | selectList.Items.Add("mining"); 219 | break; 220 | } 221 | // Quest 222 | case 2: 223 | { 224 | selectList.Items.Add("starter/ender"); 225 | selectList.Items.Add("serie"); 226 | selectList.Items.Add("team"); 227 | selectList.Items.Add("class"); 228 | break; 229 | } 230 | // Item 231 | case 3: 232 | { 233 | selectList.Items.Add("create item"); 234 | selectList.Items.Add("loot"); 235 | selectList.Items.Add("dropped by"); 236 | selectList.Items.Add("export pvp"); 237 | break; 238 | } 239 | // Zone 240 | case 4: 241 | { 242 | selectList.Items.Add("Fishing"); 243 | break; 244 | } 245 | // Marché Noir 246 | case 5: 247 | { 248 | selectList.Items.Add("Débug"); 249 | break; 250 | } 251 | } 252 | } 253 | 254 | public void UpdateCheckboxSettings() 255 | { 256 | if (Properties.Settings.Default.checkedList == null) 257 | Properties.Settings.Default.checkedList = new System.Collections.Specialized.StringCollection(); 258 | else 259 | Properties.Settings.Default.checkedList.Clear(); 260 | 261 | for (int i = 0; i < selectList.Items.Count; ++i) 262 | if (selectList.Items[i].Checked) 263 | Properties.Settings.Default.checkedList.Add(selectList.Items[i].Text); 264 | } 265 | 266 | public Entity CreateNeededEntity(int id = 0) 267 | { 268 | switch (Properties.Settings.Default.selectedEntity) 269 | { 270 | case 0: return new Creature(id); 271 | case 1: return new Gameobject(id); 272 | case 2: return new Quest(id); 273 | case 3: return new Item(id); 274 | case 4: return new ZoneEntity(id); 275 | case 5: return new BlackMarket(id); 276 | } 277 | 278 | return null; 279 | } 280 | 281 | private int currentId; 282 | private List ids; 283 | private String m_fileName; 284 | } 285 | } 286 | -------------------------------------------------------------------------------- /WowHeadParser/SqlBuilder/SqlBuilder.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * * Created by Traesh for AshamaneProject (https://github.com/AshamaneProject) 3 | */ 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Globalization; 7 | using System.Text; 8 | 9 | namespace Sql 10 | { 11 | public enum SqlQueryType : byte 12 | { 13 | None, 14 | Update, 15 | InsertOrUpdate, 16 | Replace, 17 | Insert, 18 | InsertIgnore, 19 | DeleteInsert, 20 | Max, 21 | } 22 | 23 | public class SqlBuilder 24 | { 25 | /// 26 | /// Gets a sql query type 27 | /// 28 | public SqlQueryType QueryType { get; private set; } 29 | 30 | /// 31 | /// Gets a value indicating whether to allow null values 32 | /// 33 | public bool AllowNullValue { get; private set; } 34 | 35 | /// 36 | /// Gets a value indication whether to allow append header to insert and replace query 37 | /// 38 | public bool WriteWithoutHeader { get; private set; } 39 | 40 | private string _tableName = string.Empty; 41 | 42 | private string _keyName = string.Empty; 43 | 44 | private List _fields = new List(64); 45 | 46 | public List _items = new List(64); 47 | 48 | private StringBuilder _content = new StringBuilder(8196); 49 | 50 | /// 51 | /// Initial Sql builder 52 | /// 53 | /// Table name (like creature_template, creature etc.) 54 | /// Key name (like entry, id, guid etc.) 55 | public SqlBuilder(string tableName, string keyName, SqlQueryType type = SqlQueryType.InsertOrUpdate) 56 | { 57 | _tableName = tableName; 58 | _keyName = keyName; 59 | 60 | WriteWithoutHeader = false;// Settings.Default.WithoutHeader; 61 | AllowNullValue = true;// Settings.Default.AllowEmptyValues; 62 | QueryType = type;// (SqlQueryType)Settings.Default.QueryType; 63 | 64 | if (QueryType <= SqlQueryType.None || QueryType >= SqlQueryType.Max) 65 | throw new InvalidQueryTypeException(QueryType); 66 | } 67 | 68 | /// 69 | /// Initial Sql builder 70 | /// Table name (like creature_template, creature etc.) 71 | /// 72 | public SqlBuilder(string tableName) 73 | : this(tableName, "entry") 74 | { 75 | } 76 | 77 | /// 78 | /// Append fields names 79 | /// 80 | /// fields name array 81 | public void SetFieldsNames(params string[] args) 82 | { 83 | if (args == null) 84 | throw new ArgumentNullException(); 85 | 86 | for (int i = 0; i < args.Length; ++i) 87 | { 88 | _fields.Add(args[i]); 89 | } 90 | } 91 | 92 | /// 93 | /// Append fields names 94 | /// 95 | /// fields name array 96 | public void SetFieldsName(string format, params object[] args) 97 | { 98 | if (args == null || string.IsNullOrEmpty(format)) 99 | throw new ArgumentNullException(); 100 | 101 | string field = string.Format(format, args); 102 | _fields.Add(field); 103 | } 104 | 105 | /// 106 | /// Append key and fields value 107 | /// 108 | /// key value 109 | /// string fields values array 110 | public void AppendFieldsValue(object key, params string[] args) 111 | { 112 | if (key == null || args == null) 113 | throw new ArgumentNullException(); 114 | 115 | List values = new List(args.Length); 116 | for (int i = 0; i < args.Length; ++i) 117 | { 118 | values.Add(args[i]); 119 | } 120 | 121 | _items.Add(new SqlItem(key, values)); 122 | } 123 | 124 | /// 125 | /// Append key and fields value 126 | /// 127 | /// key value 128 | /// object fields values array 129 | public void AppendFieldsValue(object key, params object[] args) 130 | { 131 | if (key == null || args == null) 132 | throw new ArgumentNullException(); 133 | 134 | List values = new List(args.Length); 135 | for (int i = 0; i < args.Length; ++i) 136 | { 137 | values.Add(args[i].ToString()); 138 | } 139 | 140 | _items.Add(new SqlItem(key, values)); 141 | } 142 | 143 | /// 144 | /// Append sql query 145 | /// 146 | /// 147 | public void AppendSqlQuery(string query, params object[] args) 148 | { 149 | if (args == null || string.IsNullOrWhiteSpace(query)) 150 | throw new ArgumentNullException(); 151 | 152 | _content.AppendLine(string.Format(query, args)); 153 | } 154 | 155 | public bool Empty 156 | { 157 | get { return _items.Count <= 0; } 158 | } 159 | 160 | /// 161 | /// Build sql query 162 | /// 163 | public override string ToString() 164 | { 165 | if (Empty) 166 | return string.Empty; 167 | 168 | _content.Clear(); 169 | _content.Capacity = 2048 * _items.Count; 170 | 171 | switch (QueryType) 172 | { 173 | case SqlQueryType.Update: 174 | return BuildUpdateQuery(); 175 | case SqlQueryType.InsertOrUpdate: 176 | return BuildInsertOrUpdateQuery(); 177 | case SqlQueryType.Replace: 178 | case SqlQueryType.Insert: 179 | case SqlQueryType.InsertIgnore: 180 | case SqlQueryType.DeleteInsert: 181 | return BuildReplaceInsertQuery(); 182 | default: 183 | return string.Empty; 184 | } 185 | } 186 | 187 | private string BuildUpdateQuery() 188 | { 189 | for (int i = 0; i < _items.Count; ++i) 190 | { 191 | bool notEmpty = false; 192 | 193 | SqlItem item = _items[i]; 194 | 195 | StringBuilder contentInternal = new StringBuilder(1024); 196 | { 197 | contentInternal.AppendFormat("UPDATE `{0}` SET ", _tableName); 198 | for (int j = 0; j < item.Count; ++j) 199 | { 200 | if (!AllowNullValue && string.IsNullOrWhiteSpace(item[j])) 201 | continue; 202 | 203 | contentInternal.AppendFormat(NumberFormatInfo.InvariantInfo, "`{0}` = '{1}', ", _fields[j], item[j]); 204 | notEmpty = true; 205 | } 206 | contentInternal.Remove(contentInternal.Length - 2, 2); 207 | contentInternal.AppendFormat(" WHERE `{0}` = {1};", _keyName, item.Key).AppendLine(); 208 | 209 | if (notEmpty) 210 | _content.Append(contentInternal.ToString()); 211 | } 212 | } 213 | 214 | return _content.ToString(); 215 | } 216 | 217 | private string BuildInsertOrUpdateQuery() 218 | { 219 | for (int i = 0; i < _items.Count; ++i) 220 | { 221 | bool notEmpty = false; 222 | 223 | SqlItem item = _items[i]; 224 | 225 | StringBuilder tableNames = new StringBuilder(1024); 226 | StringBuilder tableValues = new StringBuilder(1024); 227 | StringBuilder tableUpdates = new StringBuilder(1024); 228 | 229 | tableNames.AppendFormat("INSERT INTO `{0}` ({1}, ", _tableName, _keyName); 230 | tableValues.AppendFormat(") VALUES ({0}, ", item.Key); 231 | tableUpdates.AppendFormat(") ON DUPLICATE KEY UPDATE "); 232 | for (int j = 0; j < item.Count; ++j) 233 | { 234 | if (!AllowNullValue && string.IsNullOrWhiteSpace(item[j])) 235 | continue; 236 | 237 | tableNames.AppendFormat(NumberFormatInfo.InvariantInfo, "{0}, ", _fields[j]); 238 | tableValues.AppendFormat(NumberFormatInfo.InvariantInfo, "'{0}', ", item[j].Replace("'", "''")); 239 | tableUpdates.AppendFormat(NumberFormatInfo.InvariantInfo, "{0} = VALUES({1}), ", _fields[j], _fields[j]); 240 | notEmpty = true; 241 | } 242 | 243 | if (notEmpty) 244 | { 245 | tableNames.Remove(tableNames.Length - 2, 2); 246 | tableValues.Remove(tableValues.Length - 2, 2); 247 | tableUpdates.Remove(tableUpdates.Length - 2, 2); 248 | 249 | tableNames.Append(tableValues); 250 | tableNames.Append(tableUpdates); 251 | tableNames.Append(";").AppendLine(); 252 | 253 | _content.Append(tableNames.ToString()); 254 | } 255 | } 256 | 257 | return _content.ToString(); 258 | } 259 | 260 | private string BuildReplaceInsertQuery() 261 | { 262 | if (QueryType == SqlQueryType.DeleteInsert) 263 | { 264 | List alreadyDoneEntry = new List(); 265 | 266 | foreach (SqlItem item in _items) 267 | { 268 | if (alreadyDoneEntry.Contains(item.Key)) 269 | continue; 270 | 271 | _content.AppendFormat("DELETE FROM `{0}` WHERE `{1}` = '{2}';", _tableName, _keyName, item.Key).AppendLine(); 272 | alreadyDoneEntry.Add(item.Key); 273 | } 274 | } 275 | 276 | switch (QueryType) 277 | { 278 | case SqlQueryType.Insert: 279 | case SqlQueryType.DeleteInsert: 280 | _content.AppendFormat("INSERT INTO `{0}`", _tableName); 281 | break; 282 | case SqlQueryType.InsertIgnore: 283 | _content.AppendFormat("INSERT IGNORE INTO `{0}`", _tableName); 284 | break; 285 | case SqlQueryType.Replace: 286 | _content.AppendFormat("REPLACE INTO `{0}`", _tableName); 287 | break; 288 | } 289 | 290 | if (!WriteWithoutHeader) 291 | { 292 | _content.AppendFormat(" (`{0}`, ", _keyName); 293 | 294 | for (int i = 0; i < _fields.Count; ++i) 295 | _content.AppendFormat("`{0}`, ", _fields[i]); 296 | 297 | _content.Remove(_content.Length - 2, 2); 298 | _content.Append(")"); 299 | } 300 | _content.AppendLine(" VALUES"); 301 | 302 | for (int i = 0; i < _items.Count; ++i) 303 | { 304 | SqlItem item = _items[i]; 305 | 306 | _content.AppendFormat("('{0}', ", item.Key); 307 | for (int j = 0; j < item.Count; ++j) 308 | { 309 | _content.AppendFormat(NumberFormatInfo.InvariantInfo, "'{0}', ", item[j]); 310 | } 311 | _content.Remove(_content.Length - 2, 2); 312 | _content.AppendFormat("){0}", i < _items.Count - 1 ? "," : ";").AppendLine(); 313 | } 314 | 315 | return _content + Environment.NewLine; 316 | } 317 | } 318 | } -------------------------------------------------------------------------------- /WowHeadParser/Ressources/CurrencyTypes.db2.csv: -------------------------------------------------------------------------------- 1 | m_ID,Name,MaxQuantity,MaxWeekly,Flags,Description,Category,Unk0,Quality,InventoryIcon 2 | 1,"Test Jeton de système de monnaie 4",0,0,71682,"Un texte qui décrit l'objet figure ici.",1,0,1,133792 3 | 2,"Test Jeton de système de monnaie 2",0,0,12297,"",1,2,1,132092 4 | 4,"Test Jeton de système de monnaie 5",0,0,1,"",1,3,1,133790 5 | 22,"Birmingham Test Objet 3",0,0,0,"",41,0,1,132373 6 | 42,"Ecusson de justice",0,0,0,"",1,0,1,135884 7 | 61,"Marque de joaillerie de Dalaran",0,0,0,"La boutique de Tiffany Kartier à Dalaran accepte avec joie ces marques contre des dessins de joaillerie uniques.",21,0,1,134138 8 | 81,"Récompense de l’épicurien",0,0,0,"Rendez visite aux marchands de fournitures de cuisine à Dalaran et dans les autres capitales pour acheter des recettes de cuisine spéciales des épices et même une superbe toque !",1,0,1,134411 9 | 101,"Emblème d'héroïsme",0,0,0,"",22,0,1,135947 10 | 102,"Emblème de vaillance",0,0,0,"",22,0,1,237547 11 | 103,"Points d'arène",0,0,0,"",2,0,1,135884 12 | 104,"[PÉRIMÉ] Points d'honneur",0,0,0,"Si vous lisez ceci c'est un bug. SIGNALEZ-LE !",2,0,1,135884 13 | 121,"Marque d'honneur de la vallée d'Alterac",0,0,0,"",2,0,1,133308 14 | 122,"Marque d'honneur du bassin Arathi",0,0,0,"",2,0,1,133282 15 | 123,"Marque d'honneur de l'Oeil du cyclone",0,0,0,"",2,0,1,136032 16 | 124,"Marque d'honneur du rivage des Anciens",0,0,0,"",2,0,1,133276 17 | 125,"Marque d'honneur du goulet des Chanteguerres",0,0,0,"",2,0,1,134420 18 | 126,"Marque d'honneur de Joug-d'hiver",0,0,0,"",2,0,1,133408 19 | 161,"Eclat du gardien des pierres",0,0,0,"",2,0,1,134375 20 | 181,"[PÉRIMÉ] Points d'honneur",0,0,0,"Si vous lisez ceci c'est un bug. SIGNALEZ-LE !",2,0,1,132484 21 | 201,"Pièce de la KapitalRisk",0,0,0,"",2,0,1,133799 22 | 221,"Emblème de conquête",0,0,0,"",22,0,1,135885 23 | 241,"Sceau de champion",0,0,0,"Obtenu en récompense d’actes de bravoure au colisée des Croisés.",21,0,1,236246 24 | 301,"Emblème de triomphe",0,0,0,"",22,0,1,135979 25 | 321,"Marque d'honneur de l'île des Conquérants",0,0,0,"",2,0,1,133314 26 | 341,"Emblème de givre",0,0,0,"",22,0,1,334365 27 | 361,"Marque de l'illustre joaillier",0,0,0,"Accordées aux joailliers qui montrent un certain talent ces récompenses peuvent être utilisées pour acheter des dessins de joaillerie uniques et le fabuleux œil de la chimère.",81,0,1,134501 28 | 384,"Fragment archéologique nain",200,0,34,"",82,5,1,441144 29 | 385,"Fragment archéologique troll",200,0,34,"",82,4,1,441149 30 | 391,"Recommandation de Tol Barad",0,0,2,"Obtenue en récompense d’actes de bravoure à Tol Barad.",2,0,1,409548 31 | 393,"Fragment archéologique fossile",200,0,34,"",82,8,1,442734 32 | 394,"Fragment archéologique elfe de la nuit",200,0,34,"",82,9,1,441146 33 | 395,"Points de justice",1,0,8280,"Utilisés pour acheter des armures et armes moyennement puissantes.",142,0,1,463446 34 | 396,"Points de vaillance",300099,100000,8264,"Utilisés pour acheter des armures et armes de JcE puissantes.",142,0,4,463447 35 | 397,"Fragment d'archéologie orc",200,0,34,"",82,10,1,442738 36 | 398,"Fragment d'archéologie draeneï",200,0,34,"",82,11,1,442731 37 | 399,"Fragment d'archéologie vrykul",200,0,34,"",82,12,1,442742 38 | 400,"Fragment d'archéologie nérubien",200,0,34,"",82,13,1,442736 39 | 401,"Fragment d'archéologie tol'vir",200,0,34,"",82,14,1,442739 40 | 402,"Marque de Patte de Fer",0,0,0,"Représente votre mérite auprès de la communauté de la famille de cuisiniers les Patte de Fer. Peut être utilisé pour acheter des ingrédients de cuisine et autres auprès du maître des provisions sur le marché de Micolline.",1,0,1,134912 41 | 416,"Marque de l'Arbre-Monde",0,0,1024,"Obtenue auprès des gardiens d'Hyjal. Peut être utilisée pour acheter des renforts pour l'invasion des terres de Feu.",81,0,1,513195 42 | 483,"Pts de conquête (méta) d'arène",0,0,1484,"",89,0,1,463449 43 | 484,"Pts de conquête (méta) de CdB coté",0,0,1484,"",89,0,1,463449 44 | 515,"Bon(s) pour un prix de Sombrelune",0,0,2,"Obtenu en récompense de jeux ou de services rendus à la foire de Sombrelune.",1,0,1,134481 45 | 614,"Granule de ténèbres",0,0,1024,"Extraite des troupes d’Aile de mort cette énergie sombre peut être utilisée pour générer de puissantes magies.",81,0,1,136192 46 | 615,"Essence d’Aile de mort corrompu",0,0,1024,"Extraite d’Aile de mort lui-même cette énergie sombre alimente les plus effrayantes des incantations.",81,0,1,132851 47 | 676,"Fragment d'archéologie pandarène",200,0,34,"",82,39,1,442742 48 | 677,"Fragment d'archéologie mogu",200,0,34,"",82,40,1,442742 49 | 692,"Pts de conquête (méta) de CdB aléatoire",0,0,1484,"",89,0,1,463449 50 | 697,"Breloque ancienne de bonne fortune",20,0,2114,"Posséder une breloque ancienne de bonne fortune permet à son chanceux propriétaire d’utiliser une pièce pour obtenir un butin supplémentaire aux caveaux Mogu’shan au Cœur de la peur à la terrasse Printanière sur le sha de la colère ou la troupe de guerre de Salyis.",133,0,1,237281 51 | 698,"Marque du joaillier zen",0,0,0,"Accordées aux joailliers qui montrent un certain talent ces récompenses peuvent être utilisées pour acheter des dessins de joaillerie uniques et le magnifique œil de serpent.",133,0,1,442739 52 | 738,"Breloque de bonne fortune inférieure",0,0,64,"Posséder des breloques de bonne fortune inférieures apportera une grande joie à son propriétaire et la possibilité de les convertir en sceaux de guerre qui permettent aux personnages-joueurs d’utiliser une pièce pour obtenir un butin supplémentaire lors des rencontres de raid.",133,0,1,237282 53 | 752,"Rune du destin mogu",20,0,2,"Posséder une rune du destin mogu permet à son chanceux propriétaire de l’utiliser pour obtenir un butin supplémentaire au Trône du tonnerre sur Nalak ou sur Oondasta.",133,0,1,646678 54 | 754,"Fragment d'archéologie mantide",200,0,34,"",82,44,1,839407 55 | 776,"Sceau de guerre",20,0,2,"Posséder un sceau de guerre permet à son chanceux propriétaire de l’utiliser pour obtenir un butin supplémentaire au Siège d’Orgrimmar aux épreuves des Astres vénérables et sur Ordos.",133,0,1,514015 56 | 777,"Pièce du Temps figé",0,0,66,"Vous sentez les doigts des propriétaires passés et à venir de cette pièce comme si le temps lui-même devenait flottant. Dépensez-la sur l’île du Temps figé pour obtenir des récompenses changeantes et puissantes. ",133,0,1,900319 57 | 789,"Pièce sanglante",0,0,66,"Récupérée sur le corps des ennemis vaincus dans les brumes de l’île du Temps figé.",133,0,1,900318 58 | 810,"Fragment de fer noir",0,0,66,"Récupérés sur les armes et armures brisées des envahisseurs de la Horde de Fer.",133,0,1,135241 59 | 821,"Fragment d’archéologie des clans de Draenor",250,0,34,"",82,45,1,970886 60 | 823,"Cristal apogide",0,0,8194,"Héritage tenace d’une civilisation perdue les cristaux apogides contiennent des réserves insoupçonnables de puissance magique.",137,0,2,1061300 61 | 824,"Ressources de fief",10000,0,2,"Obtenez des ressources pour construire et faire prospérer votre fief.",137,0,1,1005027 62 | 828,"Fragment d’archéologie ogre",250,0,34,"",82,47,1,136086 63 | 829,"Fragment d’archéologie arakkoa",250,0,34,"",82,46,1,1002596 64 | 830,"n/a",200,0,34,"",82,48,1,0 65 | 897,"Fragment de cristal",100,0,8194,"",137,0,1,132780 66 | 910,"Secret d’alchimiste de Draenor",0,0,0,"Vous permet d’obtenir de nouvelles recettes d’alchimie au laboratoire d’alchimie.",137,0,1,136240 67 | 944,"Fragment d’artéfact",100000,0,8202,"Un minuscule fragment d’une relique perdue d’A’shran conservé précieusement par les ogres de Cognefort.",137,0,1,1061303 68 | 980,"Pièces de fer ternies",2000000,0,8,"Ils ont peut-être plus de valeur qu’ils ne le paraissent.",137,0,3,133792 69 | 994,"Sceau du destin trempé",20,0,2,"Modifie le destin pour donner l’occasion de trouver un trésor supplémentaire dans les raids de Cognefort ou la fonderie des Rochenoires.",137,0,1,838813 70 | 999,"Secret de couturier de Draenor",0,0,0,"Vous permet d’obtenir des patrons de couture à l’atelier de couture.",137,0,1,136249 71 | 1008,"Secret de joaillier de Draenor",0,0,0,"Permet d'obtenir de nouveaux dessins de joaillerie. ",137,0,1,134071 72 | 1017,"Secret de travailleur du cuir de Draenor",0,0,0,"Vous permet d’obtenir des patrons de travail du cuir à la tannerie.",137,0,1,136247 73 | 1020,"Secret de forgeron de Draenor",0,0,0,"Permet d'obtenir de nouveaux plans de forge.",137,0,1,136241 74 | 1101,"Carburant",100000,0,66,"Trouvé principalement dans la jungle de Tanaan ce carburant est utilisé pour alimenter les navires lors des missions navales.",137,0,1,1131085 75 | 1129,"Sceau du destin inévitable",20,0,2,"Modifie le destin pour donner l’occasion de trouver un trésor supplémentaire dans la citadelle des Flammes infernales ou dans les donjons mythiques de Draenor.",137,0,1,1119886 76 | 1149,"Œil clos",5000,0,2,"Une pièce grossière frappée à la main. Elle est ornée d’un symbole qui rappelle celui du Kirin Tor à un détail près : l’œil est fermé.",141,0,1,801132 77 | 1154,"Pièces ténébreuses",500,0,0,"Prisées des voleurs à la tire comme de leurs cibles. Peuvent être dépensées dans les Entrailles de Dalaran.",141,0,3,646678 78 | 1155,"Mana ancestral",300,0,2359298,"Puissance magique concentrée provenant des lignes telluriques anciennes qui courent sous Suramar.",141,0,1,1377394 79 | 1166,"Insigne distordu dans le temps",0,0,8194,"Obtenu dans les donjons des Marcheurs du temps. Peut être échangé auprès des vendeurs des Marcheurs du temps dans les capitales.",22,0,3,463446 80 | 1171,"Connaissance de l’arme prodigieuse",0,0,525376,"Augmente les gains de puissance prodigieuse.",142,0,6,237446 81 | 1172,"Fragment d’archéologie bien-né",200,0,34,"",82,51,1,441146 82 | 1173,"Fragment d’archéologie taurène de Haut-Roc",200,0,34,"",82,52,1,441146 83 | 1174,"Fragment d’archéologie démoniaque",200,0,34,"",82,54,1,441146 84 | 1191,"Vaillance",5000,0,66,"Une monnaie utilisée pour augmenter la puissance des objets de la citadelle des Flammes infernales de la jungle de Tanaan des donjons de Draenor et de puissants objets d’artisanat.",22,0,4,463447 85 | 1220,"Ressources de domaine",0,0,2,"Utilisées pour recruter des troupes effectuer des missions et rechercher des améliorations pour votre domaine de classe.",141,0,1,1397630 86 | 1226,"Eclat de Néant",0,0,2,"Un fragment de Néant cristallisé apporté sur Azeroth par la Légion.",141,0,1,132775 87 | 1268,"Artéfact érodé",100000,0,8202,"Mystérieux artéfact naga issu des profondeurs de la Grande mer. Le roi Mrgl-Mrgl écume le rivage Érodé à la recherche de tels objets.",141,0,1,1061303 88 | 1273,"Sceau du destin brisé",6,0,2,"Modifie le destin pour donner l’occasion de trouver un trésor supplémentaire sur les boss de raid et de donjon mythiques de Legion.",141,0,1,1604167 89 | 1275,"Pièce curieuse",0,0,2,"Cette monnaie étrange est chaude au toucher et vibre légèrement sous les doigts. Elle est utile pour faire affaire avec Xur’ios à Dalaran.",141,0,4,1604168 90 | 1299,"Or des Bastonneurs",5000,0,2,"Obtenu par les vainqueurs des Bastonneurs. Utilisez-le pour acheter des cartes de bastonnade et autres objets de modification du monde auprès des changeurs d’or des Bastonneurs.",141,0,1,237281 91 | 1314,"Fragment d’âme rémanente",40,20,2097218,"Fragment d’âme ayant autrefois appartenu à un ennemi puissant.",141,0,3,463284 92 | 1324,"Crédit qiraji de la Horde",0,0,1638400,"Terminer cette quête confère à la Horde des crédits pour l’évènement de l’Appel du Scarabée.Les couleurs de la faction ayant gagné le plus de crédits aujourd’hui seront affichées auprès du gong du Scarabée pour le reste de l’année.",142,0,1,255132 93 | 1325,"Crédit qiraji de l’Alliance",0,0,1638400,"Terminer cette quête confère à l’Alliance des crédits pour l’évènement de l’Appel du Scarabée.Les couleurs de la faction ayant gagné le plus de crédits aujourd’hui seront affichées auprès du gong du Scarabée pour le reste de l’année.",142,0,1,255130 94 | 1342,"Fournitures de guerre du Déclin",1000,0,2,"Utilisées pour la construction de bâtiments importants au rivage Brisé.",141,0,2,803763 95 | 1347,"Bâtiment du Déclin - Traqueur personnel - Tour des mages (invisi",0,0,1572864,"",142,0,0,0 96 | 1349,"Bâtiment du Déclin - Traqueur personnel - Base stratégique (invi",0,0,1572864,"",142,0,0,0 97 | 1350,"Bâtiment du Déclin - Traqueur personnel - Tour du Néant (invisib",0,0,1572864,"",142,0,0,0 98 | 1355,"Essence gangrenée",0,0,0,"Essence démoniaque concentrée qui peut être collectée et utilisée pour créer une armure d’une grande puissance.",141,0,1,1044089 99 | 1356,"Échos de bataille",0,0,384,"Utilisés pour acheter des armures de JcJ puissantes. Convertis en pièce d’or à la fin de la saison.",141,0,4,1455891 100 | 1357,"Échos de domination",0,0,384,"Utilisés pour acheter des armures de JcJ d’élite. Convertis en pièce d’or à la fin de la saison.",141,0,4,1455894 101 | 1379,"Marque de l’épreuve du style",200,0,0,"Remportée en participant à l’épreuve du style. Peut être échangée contre de l’équipement transmogrifié à Dalaran.",1,0,1,1500867 102 | 1416,"Pièces d’air",2000000,0,0,"S’évapore dans la brume au bout d’un certain temps.",141,0,3,988196 103 | 1501,"Essence frémissante",0,0,2,"Utilisée pour améliorer les objets légendaires de Legion jusqu’au niveau d’objet 970.",141,0,1,893779 104 | 1506,"Pierre d’accès d’Argus",40,0,0,"Utilisées par les serviteurs de Sargeras pour ouvrir des portails entre Argus et les autres mondes contrôlés par la Légion.",142,0,3,399041 105 | 1508,"Argunite voilée",2000,0,2,"Ce cristal terne et sans vie est très convoité par les marchands éthériens en particulier par le thaumaturge Vashreen à bord du Vindicaar.",141,0,3,1064188 106 | 1533,"Essence d’éveil",0,0,2,"Utilisée pour améliorer les objets légendaires de Legion jusqu’au niveau d’objet 1000.",141,0,1,236521 107 | -------------------------------------------------------------------------------- /WowHeadParser/Entities/Item.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * * Created by Traesh for AshamaneProject (https://github.com/AshamaneProject) 3 | */ 4 | using Newtonsoft.Json; 5 | using Sql; 6 | using System; 7 | using System.Collections.Generic; 8 | 9 | namespace WowHeadParser.Entities 10 | { 11 | class Item : Entity 12 | { 13 | struct ItemParsing 14 | { 15 | public int id; 16 | public string name; 17 | public string namedesc; 18 | public string description; 19 | public List specs; 20 | public int level; 21 | public int classs; 22 | public int subclass; 23 | public int quality; 24 | } 25 | 26 | public struct ItemSpellParsing 27 | { 28 | public int id; 29 | } 30 | 31 | public struct ItemCreateItemParsing 32 | { 33 | public int id; 34 | } 35 | 36 | public struct ItemLootTemplateParsing 37 | { 38 | public int id; 39 | public int count; 40 | public int[] stack; 41 | } 42 | 43 | public struct ItemDroppedByTemplateParsing 44 | { 45 | public int id; 46 | public int count; 47 | public int outof; 48 | } 49 | 50 | public Item() 51 | { 52 | m_data.id = 0; 53 | } 54 | 55 | public Item(int id) 56 | { 57 | m_data.id = id; 58 | } 59 | 60 | public override String GetWowheadUrl() 61 | { 62 | return GetWowheadBaseUrl() + "/item=" + m_data.id + "&bonus=524"; 63 | } 64 | 65 | public override bool ParseSingleJson(int id = 0) 66 | { 67 | if (m_data.id == 0 && id == 0) 68 | return false; 69 | else if (m_data.id == 0 && id != 0) 70 | m_data.id = id; 71 | 72 | String itemHtml = Tools.GetHtmlFromWowhead(GetWowheadUrl()); 73 | 74 | String dataPattern = @"\$\.extend\(g_items\[" + m_data.id + @"\], (.+)\);"; 75 | String qualityPattern = @"_\[" + m_data.id + @"\]" + "={\"name_frfr\":\"(?:.+?)\",\"quality\":([0-9])"; 76 | String itemSpellPattern = @"new Listview\(\{template: 'spell', id: 'reagent-for', name: LANG\.tab_reagentfor, tabs: tabsRelated, parent: 'lkljbjkb574',.*(?:\n)?.*data: (.+)\}\);"; 77 | String itemCreatePattern = @"new Listview\(\{template: 'item', id: 'creates', name: LANG\.tab_creates, tabs: tabsRelated, parent: 'lkljbjkb574', sort:\['name'\],.*(?:\n)?.*data: (.+)}\);"; 78 | String itemLootTemplatePattern = @"new Listview\(\{template: 'item', id: 'contains', name: LANG\.tab_contains, tabs: tabsRelated, parent: 'lkljbjkb574',\n* *extraCols: \[Listview\.extraCols\.count, Listview.extraCols.percent\], sort:\['-percent', 'name'\],\n* *computeDataFunc: Listview\.funcBox\.initLootTable, note: WH\.sprintf\(LANG\.lvnote_itemopening, [0-9]+\),\n* *_totalCount: ([0-9]+), data: (.+)\}\);"; 79 | String itemDroppedByPattern = @"new Listview\(\{template: 'npc', id: 'dropped-by', name: LANG\.tab_droppedby, tabs: tabsRelated, parent: 'lkljbjkb574',\n* *hiddenCols: \['type'\], extraCols: \[Listview.extraCols.count, Listview.extraCols.percent\], sort:\['-percent', '-count', 'name'\],\n* *computeDataFunc: Listview.funcBox.initLootTable, data: (.+)}\);"; 80 | 81 | String itemDataJSon = Tools.ExtractJsonFromWithPattern(itemHtml, dataPattern); 82 | if (itemDataJSon != null) 83 | { 84 | m_data = JsonConvert.DeserializeObject(itemDataJSon); 85 | } 86 | 87 | String itemQuality = Tools.ExtractJsonFromWithPattern(itemHtml, qualityPattern); 88 | if (itemQuality != null) 89 | { 90 | Int32.TryParse(itemQuality, out m_data.quality); 91 | } 92 | 93 | String itemSpellJSon = Tools.ExtractJsonFromWithPattern(itemHtml, itemSpellPattern); 94 | if (itemSpellJSon != null) 95 | { 96 | m_itemSpellDatas = JsonConvert.DeserializeObject(itemSpellJSon); 97 | } 98 | 99 | String itemCreateJSon = Tools.ExtractJsonFromWithPattern(itemHtml, itemCreatePattern); 100 | if (itemCreateJSon != null) 101 | { 102 | m_itemCreateItemDatas = JsonConvert.DeserializeObject(itemCreateJSon); 103 | } 104 | 105 | String lootMaxCountStr = Tools.ExtractJsonFromWithPattern(itemHtml, itemLootTemplatePattern, 0); 106 | m_lootMaxCount = lootMaxCountStr != null ? Int32.Parse(lootMaxCountStr): 0; 107 | String itemLootTemplateJSon = Tools.ExtractJsonFromWithPattern(itemHtml, itemLootTemplatePattern, 1); 108 | if (itemLootTemplateJSon != null) 109 | { 110 | m_itemLootTemplateDatas = JsonConvert.DeserializeObject(itemLootTemplateJSon); 111 | } 112 | 113 | String itemDroppedByJson = Tools.ExtractJsonFromWithPattern(itemHtml, itemDroppedByPattern); 114 | if (itemDroppedByJson != null) 115 | { 116 | m_itemDroppedByDatas = JsonConvert.DeserializeObject(itemDroppedByJson); 117 | } 118 | 119 | return true; 120 | } 121 | 122 | public override String GetSQLRequest() 123 | { 124 | String returnSql = ""; 125 | 126 | if (m_data.id == 0 || isError) 127 | return returnSql; 128 | 129 | if (IsCheckboxChecked("locale")) 130 | { 131 | int localeIndex = Properties.Settings.Default.localIndex; 132 | 133 | if (localeIndex >= 1 && localeIndex <= 10) 134 | { 135 | SqlBuilder m_itemLocalesBuilder = new SqlBuilder("item_sparse_locale", "ID", SqlQueryType.InsertOrUpdate); 136 | 137 | String locale = ""; 138 | 139 | switch (localeIndex) 140 | { 141 | case 1: locale = "koKR"; break; 142 | case 2: locale = "frFR"; break; 143 | case 3: locale = "deDE"; break; 144 | case 4: locale = "zhCN"; break; 145 | case 5: locale = "zhTW"; break; 146 | case 6: locale = "esES"; break; 147 | case 7: locale = "esMX"; break; 148 | case 8: locale = "ruRU"; break; 149 | case 9: locale = "ptPT"; break; 150 | case 10: locale = "itIT"; break; 151 | } 152 | 153 | m_itemLocalesBuilder.SetFieldsNames("Name_" + locale); 154 | m_itemLocalesBuilder.AppendFieldsValue(m_data.id, m_data.name.Substring(1) ?? ""); 155 | returnSql += m_itemLocalesBuilder.ToString() + "\n"; 156 | } 157 | } 158 | 159 | if (IsCheckboxChecked("create item") && m_itemCreateItemDatas != null) 160 | { 161 | m_spellLootTemplateBuilder = new SqlBuilder("spell_loot_template", "entry", SqlQueryType.InsertIgnore); 162 | m_spellLootTemplateBuilder.SetFieldsNames("Item", "Reference", "Chance", "QuestRequired", "LootMode", "GroupId", "MinCount", "MaxCount", "Comment"); 163 | 164 | foreach (ItemCreateItemParsing itemLootData in m_itemCreateItemDatas) 165 | m_spellLootTemplateBuilder.AppendFieldsValue(m_itemSpellDatas[0].id, // Entry 166 | itemLootData.id, // Item 167 | 0, // Reference 168 | "100", // Chance 169 | 0, // QuestRequired 170 | 1, // LootMode 171 | 0, // GroupId 172 | "1", // MinCount 173 | "1", // MaxCount 174 | ""); // Comment 175 | 176 | returnSql += m_spellLootTemplateBuilder.ToString() + "\n"; 177 | } 178 | 179 | if (IsCheckboxChecked("loot") && m_itemLootTemplateDatas != null) 180 | { 181 | m_itemLootTemplateBuilder = new SqlBuilder("item_loot_template", "entry", SqlQueryType.InsertIgnore); 182 | m_itemLootTemplateBuilder.SetFieldsNames("Item", "Reference", "Chance", "QuestRequired", "LootMode", "GroupId", "MinCount", "MaxCount", "Comment"); 183 | 184 | foreach (ItemLootTemplateParsing itemLootData in m_itemLootTemplateDatas) 185 | { 186 | String percent = ((float)itemLootData.count / (float)m_lootMaxCount * 100).ToString().Replace(",", "."); 187 | 188 | int minLootCount = itemLootData.stack.Length >= 1 ? itemLootData.stack[0] : 1; 189 | int maxLootCount = itemLootData.stack.Length >= 2 ? itemLootData.stack[1] : minLootCount; 190 | 191 | m_itemLootTemplateBuilder.AppendFieldsValue(m_data.id, // Entry 192 | itemLootData.id, // Item 193 | 0, // Reference 194 | percent, // Chance 195 | 0, // QuestRequired 196 | 1, // LootMode 197 | 0, // GroupId 198 | minLootCount, // MinCount 199 | maxLootCount, // MaxCount 200 | ""); // Comment 201 | } 202 | 203 | returnSql += m_itemLootTemplateBuilder.ToString() + "\n"; 204 | } 205 | 206 | if (IsCheckboxChecked("dropped by") && m_itemDroppedByDatas != null) 207 | { 208 | m_itemDroppedByBuilder = new SqlBuilder("creature_loot_template", "entry", SqlQueryType.InsertIgnore); 209 | m_itemDroppedByBuilder.SetFieldsNames("item", "ChanceOrQuestChance", "lootmode", "groupid", "mincountOrRef", "maxcount", "itemBonuses"); 210 | 211 | foreach (ItemDroppedByTemplateParsing itemDroppedByData in m_itemDroppedByDatas) 212 | { 213 | float percent = ((float)itemDroppedByData.count / (float)itemDroppedByData.outof) * 100.0f; 214 | String percentStr = Tools.NormalizeFloat(percent); 215 | 216 | m_itemDroppedByBuilder.AppendFieldsValue(itemDroppedByData.id, m_data.id, percentStr, 1, 0, "1", "1", ""); 217 | } 218 | 219 | returnSql += "DELETE FROM creature_loot_template WHERE item = " + m_data.id + ";\n"; 220 | returnSql += m_itemDroppedByBuilder.ToString() + "\n"; 221 | } 222 | 223 | if (IsCheckboxChecked("export pvp")) 224 | { 225 | if (m_data.level != 620 && m_data.level != 660 && // PVP 226 | m_data.level != 630 && m_data.level != 655) // PVE 227 | return ""; 228 | 229 | if ((m_data.level == 620 || m_data.level == 630) && m_data.quality != 3) 230 | return ""; 231 | 232 | if ((m_data.level == 660 || m_data.level == 655) && m_data.quality != 4) 233 | return ""; 234 | 235 | if (m_data.classs != 2 && m_data.classs != 4) 236 | return ""; 237 | 238 | if ((m_data.level == 620 || m_data.level == 660) && m_data.namedesc == "Saison 1 de Warlords") 239 | { 240 | returnSql += "INSERT INTO item_wod (id, ilevel, pvp, spec) VALUES (" + m_data.id + ", " + m_data.level + ", 1, '" + string.Join(" ", m_data.specs) + "');"; 241 | } 242 | 243 | if ((m_data.level == 630 || m_data.level == 655) && m_data.namedesc != "Saison 1 de Warlords") 244 | { 245 | returnSql += "INSERT INTO item_wod (id, ilevel, pvp, spec) VALUES (" + m_data.id + ", " + m_data.level + ", 0, '" + string.Join(" ", m_data.specs) + "');"; 246 | } 247 | } 248 | 249 | return returnSql; 250 | } 251 | 252 | protected int m_lootMaxCount; 253 | 254 | private ItemParsing m_data; 255 | protected ItemSpellParsing[] m_itemSpellDatas; 256 | protected ItemCreateItemParsing[] m_itemCreateItemDatas; 257 | protected ItemLootTemplateParsing[] m_itemLootTemplateDatas; 258 | protected ItemDroppedByTemplateParsing[] m_itemDroppedByDatas; 259 | 260 | protected SqlBuilder m_spellLootTemplateBuilder; 261 | protected SqlBuilder m_itemLootTemplateBuilder; 262 | protected SqlBuilder m_itemDroppedByBuilder; 263 | } 264 | } 265 | -------------------------------------------------------------------------------- /WowHeadParser/Entities/Zone.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * Created by Traesh (http://www.farahlon.com) 3 | */ 4 | using Newtonsoft.Json; 5 | using Sql; 6 | using System; 7 | using System.Collections.Generic; 8 | using System.Linq; 9 | using System.Text; 10 | using System.Text.RegularExpressions; 11 | using System.Threading.Tasks; 12 | using Newtonsoft.Json.Linq; 13 | 14 | namespace WowHeadParser.Entities 15 | { 16 | struct ZoneTemplateParsing 17 | { 18 | public int id; 19 | } 20 | 21 | struct FishingLootParsing 22 | { 23 | public int id; 24 | public int classs; 25 | public int count; 26 | public dynamic modes; 27 | public int[] stack; 28 | 29 | public string percent; 30 | } 31 | 32 | class Zone : Entity 33 | { 34 | public Zone() 35 | { 36 | m_zoneTemplateData.id = 0; 37 | } 38 | 39 | public Zone(int id) 40 | { 41 | m_zoneTemplateData.id = id; 42 | } 43 | 44 | public override String GetWowheadUrl() 45 | { 46 | return GetWowheadBaseUrl() + "/zone=" + m_zoneTemplateData.id; 47 | } 48 | 49 | /*public override List GetIdsFromZone(String zoneId, String zoneHtml) 50 | { 51 | String pattern = @"new Listview\({template: 'npc', id: 'npcs', name: LANG\.tab_npcs, tabs: tabsRelated, parent: 'lkljbjkb574', note: \$WH\.sprintf\(LANG\.lvnote_filterresults, '\/npcs\?filter=cr=6;crs=" + zoneId + @";crv=0'\), data: (.+)}\);"; 52 | String creatureJSon = Tools.ExtractJsonFromWithPattern(zoneHtml, pattern); 53 | 54 | List parsingArray = JsonConvert.DeserializeObject>(creatureJSon); 55 | List tempArray = new List(); 56 | foreach (CreatureTemplateParsing creatureTemplateStruct in parsingArray) 57 | { 58 | Creature creature = new Creature(creatureTemplateStruct.id); 59 | tempArray.Add(creature); 60 | } 61 | 62 | return tempArray; 63 | }*/ 64 | 65 | public override bool ParseSingleJson(int id = 0) 66 | { 67 | if (m_zoneTemplateData.id == 0 && id == 0) 68 | return false; 69 | else if (m_zoneTemplateData.id == 0 && id != 0) 70 | m_zoneTemplateData.id = id; 71 | 72 | String zoneHtml = Tools.GetHtmlFromWowhead(GetWowheadUrl()); 73 | 74 | if (zoneHtml.Contains("inputbox-error")) 75 | return false; 76 | 77 | String dataPattern = @"\$\.extend\(g_npcs\[" + m_creatureTemplateData.id + @"\], (.+)\);"; 78 | String modelPattern = @"ModelViewer\.show\(\{ type: [0-9]+, typeId: " + m_creatureTemplateData.id + @", displayId: ([0-9]+)"; 79 | String vendorPattern = @"new Listview\({template: 'item', id: 'sells', name: LANG.tab_sells, tabs: tabsRelated, parent: 'lkljbjkb574', extraCols: \[Listview\.extraCols\.cost(?:, _)*\], note: \$WH\.sprintf\(LANG.lvnote_filterresults, '\/items\?filter=cr=129;crs=0;crv=" + m_creatureTemplateData.id + @"'\), data: (.+)}\);"; 80 | String creatureLootPattern = @"new Listview\({template: 'item', id: 'drops', name: LANG\.tab_drops, tabs: tabsRelated, parent: 'lkljbjkb574', extraCols: \[Listview\.extraCols\.count, Listview\.extraCols\.percent(?:, Listview.extraCols.mode)?\], showLootSpecs: [0-9],sort:\['-percent', 'name'\], _totalCount: [0-9]+, computeDataFunc: Listview\.funcBox\.initLootTable, onAfterCreate: Listview\.funcBox\.addModeIndicator, data: (.+)}\);"; 81 | String creatureSkinningPattern = @"new Listview\(\{template: 'item', id: 'skinning', name: LANG\.tab_skinning, tabs: tabsRelated, parent: 'lkljbjkb574', extraCols: \[Listview\.extraCols\.count, Listview\.extraCols\.percent\], sort:\['-percent', 'name'\], computeDataFunc: Listview\.funcBox\.initLootTable, note: \$WH\.sprintf\(LANG\.lvnote_npcskinning, [0-9]+\), _totalCount: ([0-9]+), data: (.+)}\);"; 82 | 83 | String creatureTemplateDataJSon = Tools.ExtractJsonFromWithPattern(creatureHtml, dataPattern); 84 | CreatureTemplateParsing creatureTemplateData = JsonConvert.DeserializeObject(creatureTemplateDataJSon); 85 | SetCreatureTemplateData(creatureTemplateData); 86 | 87 | String npcVendorJSon = Tools.ExtractJsonFromWithPattern(creatureHtml, vendorPattern); 88 | if (npcVendorJSon != null) 89 | { 90 | NpcVendorParsing[] npcVendorDatas = JsonConvert.DeserializeObject(npcVendorJSon); 91 | SetNpcVendorData(npcVendorDatas); 92 | } 93 | 94 | String creatureLootJSon = Tools.ExtractJsonFromWithPattern(creatureHtml, creatureLootPattern); 95 | if (creatureLootJSon != null) 96 | { 97 | CreatureLootParsing[] creatureLootDatas = JsonConvert.DeserializeObject(creatureLootJSon); 98 | SetCreatureLootData(creatureLootDatas); 99 | } 100 | 101 | String creatureSkinningCount = Tools.ExtractJsonFromWithPattern(creatureHtml, creatureSkinningPattern, 1); 102 | String creatureSkinningJSon = Tools.ExtractJsonFromWithPattern(creatureHtml, creatureSkinningPattern, 2); 103 | if (creatureSkinningJSon != null) 104 | { 105 | CreatureLootParsing[] creatureLootDatas = JsonConvert.DeserializeObject(creatureSkinningJSon); 106 | SetCreatureSkinningData(creatureLootDatas, Int32.Parse(creatureSkinningCount)); 107 | } 108 | 109 | String modelId = Tools.ExtractJsonFromWithPattern(creatureHtml, modelPattern); 110 | m_modelid = modelId != null ? Int32.Parse(modelId): 0; 111 | return true; 112 | } 113 | 114 | public void SetCreatureTemplateData(CreatureTemplateParsing creatureData) 115 | { 116 | m_creatureTemplateData = creatureData; 117 | 118 | m_isBoss = false; 119 | m_faction = GetFactionFromReact(); 120 | 121 | if (m_creatureTemplateData.minlevel == 9999 || m_creatureTemplateData.maxlevel == 9999) 122 | { 123 | m_isBoss = true; 124 | m_creatureTemplateData.minlevel = 100; 125 | m_creatureTemplateData.maxlevel = 100; 126 | } 127 | 128 | m_subname = m_creatureTemplateData.tag ?? ""; 129 | } 130 | 131 | public void SetNpcVendorData(NpcVendorParsing[] npcVendorDatas) 132 | { 133 | for (uint i = 0; i < npcVendorDatas.Length; ++i) 134 | { 135 | npcVendorDatas[i].avail = npcVendorDatas[i].avail == -1 ? 0 : npcVendorDatas[i].avail; 136 | npcVendorDatas[i].incrTime = npcVendorDatas[i].avail != 0 ? 3600 : 0; 137 | 138 | try 139 | { 140 | int cost = Convert.ToInt32(npcVendorDatas[i].cost[0]); 141 | npcVendorDatas[i].integerCost = cost; 142 | 143 | List itemId = new List(); 144 | List itemCount = new List(); 145 | 146 | List currencyId = new List(); 147 | List currencyCount = new List(); 148 | 149 | foreach (JArray itemCost in npcVendorDatas[i].cost[2]) 150 | { 151 | itemId.Add(Convert.ToInt32(itemCost[0])); 152 | itemCount.Add(Convert.ToInt32(itemCost[1])); 153 | } 154 | 155 | foreach (JArray currencyCost in npcVendorDatas[i].cost[1]) 156 | { 157 | currencyId.Add(Convert.ToInt32(currencyCost[0])); 158 | currencyCount.Add(Convert.ToInt32(currencyCost[1])); 159 | } 160 | 161 | npcVendorDatas[i].integerExtendedCost = (int)Tools.GetExtendedCostId(itemId, itemCount, currencyId, currencyCount); 162 | } 163 | catch (Exception ex) 164 | { 165 | npcVendorDatas[i].integerCost = 0; 166 | npcVendorDatas[i].integerExtendedCost = 0; 167 | } 168 | } 169 | 170 | m_npcVendorDatas = npcVendorDatas; 171 | } 172 | 173 | public void SetCreatureLootData(CreatureLootParsing[] creatureLootDatas) 174 | { 175 | for (uint i = 0; i < creatureLootDatas.Length; ++i) 176 | { 177 | float count = (float)Convert.ToDouble(creatureLootDatas[i].modes["4"]["count"]); 178 | float outof = (float)Convert.ToDouble(creatureLootDatas[i].modes["4"]["outof"]); 179 | float percent = count * 100 / outof; 180 | 181 | if (creatureLootDatas[i].classs == 12) 182 | percent *= -1; 183 | 184 | percent = Tools.NormalizeFloat(percent); 185 | 186 | creatureLootDatas[i].percent = percent.ToString().Replace(",", "."); 187 | } 188 | 189 | m_creatureLootDatas = creatureLootDatas; 190 | } 191 | 192 | public void SetCreatureSkinningData(CreatureLootParsing[] creatureSkinningDatas, int totalCount) 193 | { 194 | for (uint i = 0; i < creatureSkinningDatas.Length; ++i) 195 | { 196 | float percent = (float)creatureSkinningDatas[i].count * 100 / (float)totalCount; 197 | 198 | percent = Tools.NormalizeFloat(percent); 199 | 200 | creatureSkinningDatas[i].percent = percent.ToString().Replace(",", "."); 201 | } 202 | 203 | m_creatureSkinningDatas = creatureSkinningDatas; 204 | } 205 | 206 | private int GetFactionFromReact() 207 | { 208 | if (m_creatureTemplateData.react == null) 209 | return 14; 210 | 211 | if (m_creatureTemplateData.react[(int)reactOrder.ALLIANCE] == "1" && m_creatureTemplateData.react[(int)reactOrder.HORDE] == "1") 212 | return 35; // Ennemis 213 | else if (m_creatureTemplateData.react[(int)reactOrder.ALLIANCE] == "1" && m_creatureTemplateData.react[(int)reactOrder.HORDE] == "-1") 214 | return 11; // Hurlevent 215 | else if (m_creatureTemplateData.react[(int)reactOrder.ALLIANCE] == "-1" && m_creatureTemplateData.react[(int)reactOrder.HORDE] == "1") 216 | return 85; // Orgrimmar 217 | else if (m_creatureTemplateData.react[(int)reactOrder.ALLIANCE] == "0" && m_creatureTemplateData.react[(int)reactOrder.HORDE] == "0") 218 | return 2240; // Neutral 219 | 220 | return 14; 221 | } 222 | 223 | public override String GetSQLRequest() 224 | { 225 | String returnSql = ""; 226 | 227 | if (m_creatureTemplateData.id == 0 || isError) 228 | return returnSql; 229 | 230 | // Creature Template 231 | if (IsCheckboxChecked("template")) 232 | { 233 | m_creatureTemplateBuilder = new SqlBuilder("creature_template", "entry"); 234 | m_creatureTemplateBuilder.SetFieldsNames("minlevel", "maxlevel", "name", "subname", "modelid1", "rank", "type", "family"); 235 | 236 | m_creatureTemplateBuilder.AppendFieldsValue(m_creatureTemplateData.id, m_creatureTemplateData.minlevel, m_creatureTemplateData.maxlevel, m_creatureTemplateData.name, m_subname ?? "", m_modelid, m_isBoss ? "3" : "0", m_creatureTemplateData.type, m_creatureTemplateData.family); 237 | returnSql += m_creatureTemplateBuilder.ToString() + "\n"; 238 | } 239 | 240 | // Locales 241 | if (IsCheckboxChecked("locale")) 242 | { 243 | int localeIndex = Properties.Settings.Default.localIndex; 244 | 245 | if (localeIndex != 0) 246 | { 247 | m_creatureLocalesBuilder = new SqlBuilder("locales_creature", "entry"); 248 | m_creatureLocalesBuilder.SetFieldsNames("name_loc" + localeIndex, "subname_loc" + localeIndex); 249 | 250 | m_creatureLocalesBuilder.AppendFieldsValue(m_creatureTemplateData.id, m_creatureTemplateData.name, m_subname ?? ""); 251 | returnSql += m_creatureLocalesBuilder.ToString() + "\n"; 252 | } 253 | else 254 | { 255 | m_creatureLocalesBuilder = new SqlBuilder("creature_template", "entry"); 256 | m_creatureLocalesBuilder.SetFieldsNames("name", "subname"); 257 | 258 | m_creatureLocalesBuilder.AppendFieldsValue(m_creatureTemplateData.id, m_creatureTemplateData.name, m_subname ?? ""); 259 | returnSql += m_creatureLocalesBuilder.ToString() + "\n"; 260 | } 261 | } 262 | 263 | if (IsCheckboxChecked("vendor") && m_npcVendorDatas != null) 264 | { 265 | m_npcVendorBuilder = new SqlBuilder("npc_vendor", "entry", SqlQueryType.DeleteInsert); 266 | m_npcVendorBuilder.SetFieldsNames("slot", "item", "maxcount", "incrtime", "ExtendedCost", "type", "PlayerConditionID"); 267 | 268 | foreach (NpcVendorParsing npcVendorData in m_npcVendorDatas) 269 | m_npcVendorBuilder.AppendFieldsValue(m_creatureTemplateData.id, npcVendorData.slot, npcVendorData.id, npcVendorData.avail, npcVendorData.incrTime, npcVendorData.integerExtendedCost, 1, 0); 270 | 271 | returnSql += m_npcVendorBuilder.ToString() + "\n"; 272 | } 273 | 274 | if (IsCheckboxChecked("loot") && m_creatureLootDatas != null) 275 | { 276 | m_creatureLootBuilder = new SqlBuilder("creature_loot_template", "entry", SqlQueryType.InsertIgnore); 277 | m_creatureLootBuilder.SetFieldsNames("item", "ChanceOrQuestChance", "lootmode", "groupid", "mincountOrRef", "maxcount", "itemBonuses"); 278 | 279 | returnSql += "UPDATE creature_template SET lootid = " + m_creatureTemplateData.id + " WHERE entry = " + m_creatureTemplateData.id + " AND lootid = 0;\n"; 280 | foreach (CreatureLootParsing creatureLootData in m_creatureLootDatas) 281 | m_creatureLootBuilder.AppendFieldsValue(m_creatureTemplateData.id, creatureLootData.id, creatureLootData.percent, 1, 0, creatureLootData.stack[0], creatureLootData.stack[1], ""); 282 | 283 | returnSql += m_creatureLootBuilder.ToString() + "\n"; 284 | } 285 | 286 | if (IsCheckboxChecked("skinning") && m_creatureSkinningDatas != null) 287 | { 288 | m_creatureSkinningBuilder = new SqlBuilder("skinning_loot_template", "entry", SqlQueryType.InsertIgnore); 289 | m_creatureSkinningBuilder.SetFieldsNames("item", "ChanceOrQuestChance", "lootmode", "groupid", "mincountOrRef", "maxcount", "itemBonuses"); 290 | 291 | returnSql += "UPDATE creature_template SET skinloot = " + m_creatureTemplateData.id + " WHERE entry = " + m_creatureTemplateData.id + " AND skinloot = 0;\n"; 292 | foreach (CreatureLootParsing creatureSkinningData in m_creatureSkinningDatas) 293 | m_creatureSkinningBuilder.AppendFieldsValue(m_creatureTemplateData.id, creatureSkinningData.id, creatureSkinningData.percent, 1, 0, creatureSkinningData.stack[0], creatureSkinningData.stack[1], ""); 294 | 295 | returnSql += m_creatureSkinningBuilder.ToString() + "\n"; 296 | } 297 | 298 | return returnSql; 299 | } 300 | 301 | private int m_faction; 302 | private bool m_isBoss; 303 | private int m_modelid; 304 | private String m_subname; 305 | 306 | protected ZoneTemplateParsing m_zoneTemplateData; 307 | protected NpcVendorParsing[] m_npcVendorDatas; 308 | protected CreatureLootParsing[] m_creatureLootDatas; 309 | protected CreatureLootParsing[] m_creatureSkinningDatas; 310 | 311 | protected SqlBuilder m_creatureTemplateBuilder; 312 | protected SqlBuilder m_creatureLocalesBuilder; 313 | protected SqlBuilder m_npcVendorBuilder; 314 | protected SqlBuilder m_creatureLootBuilder; 315 | protected SqlBuilder m_creatureSkinningBuilder; 316 | } 317 | } 318 | -------------------------------------------------------------------------------- /WowHeadParser/Entities/Gameobject.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * * Created by Traesh for AshamaneProject (https://github.com/AshamaneProject) 3 | */ 4 | using Newtonsoft.Json; 5 | using Sql; 6 | using System; 7 | using System.Collections.Generic; 8 | using static WowHeadParser.MainWindow; 9 | 10 | namespace WowHeadParser.Entities 11 | { 12 | class Gameobject : Entity 13 | { 14 | struct GameObjectParsing 15 | { 16 | public int id; 17 | public string name; 18 | } 19 | 20 | public class GameObjectLootParsing 21 | { 22 | public int id; 23 | public int count; 24 | public dynamic modes; 25 | public int[] stack; 26 | 27 | public string percent; 28 | public string questRequired; 29 | } 30 | 31 | public class GameObjectLootItemParsing : GameObjectLootParsing 32 | { 33 | public int classs; 34 | } 35 | 36 | public class GameObjectLootCurrencyParsing : GameObjectLootParsing 37 | { 38 | public int category; 39 | public string icon; 40 | } 41 | 42 | public Gameobject() 43 | { 44 | m_data.id = 0; 45 | } 46 | 47 | public Gameobject(int id) 48 | { 49 | m_data.id = id; 50 | } 51 | 52 | public override String GetWowheadUrl() 53 | { 54 | return GetWowheadBaseUrl() + "/object=" + m_data.id; 55 | } 56 | 57 | public override List GetIdsFromZone(String zoneId, String zoneHtml) 58 | { 59 | String pattern = @"new Listview\(\{template: 'object', id: 'objects', name: LANG.tab_objects, tabs: tabsRelated, parent: 'lkljbjkb574', note: WH.sprintf\(LANG\.lvnote_filterresults, '\/objects\?filter=cr=1;crs=" + zoneId + @";crv=0'\), data: (.+)\}\);"; 60 | String gameobjectJSon = Tools.ExtractJsonFromWithPattern(zoneHtml, pattern); 61 | 62 | List parsingArray = JsonConvert.DeserializeObject>(gameobjectJSon); 63 | List tempArray = new List(); 64 | foreach (GameObjectParsing gameobjectTemplateStruct in parsingArray) 65 | { 66 | Gameobject gameobject = new Gameobject(gameobjectTemplateStruct.id); 67 | tempArray.Add(gameobject); 68 | } 69 | 70 | return tempArray; 71 | } 72 | 73 | public override bool ParseSingleJson(int id = 0) 74 | { 75 | if (m_data.id == 0 && id == 0) 76 | return false; 77 | else if (m_data.id == 0 && id != 0) 78 | m_data.id = id; 79 | 80 | String gameobjectHtml = Tools.GetHtmlFromWowhead(GetWowheadUrl()); 81 | 82 | String gameobjectDataPattern = @"\$\.extend\(g_objects\[" + m_data.id + @"\], (.+)\);"; 83 | String gameobjectLootPattern = @"new Listview\(\{template: 'item', id: 'contains', name: LANG.tab_contains, tabs: tabsRelated, parent: 'lkljbjkb574', extraCols: \[Listview.extraCols.count, Listview.extraCols.percent(?:, Listview\.extraCols\.mode)?\], sort:\['-percent', 'name'\], _totalCount: [0-9]+, computeDataFunc: Listview.funcBox.initLootTable, onAfterCreate: Listview.funcBox.addModeIndicator, data: (.+)\}\);"; 84 | String gameobjectLootCurrencyPattern = @"new Listview\({template: 'currency', id: 'contains-currency', name: LANG\.tab_currencies, tabs: tabsRelated, parent: 'lkljbjkb574', extraCols: \[Listview\.extraCols\.count, Listview\.extraCols\.percent\], sort:\['-percent', 'name'\], _totalCount: [0-9]+, computeDataFunc: Listview\.funcBox\.initLootTable, onAfterCreate: Listview\.funcBox\.addModeIndicator, data: (.+)}\);"; 85 | String gameobjectHerboPattern = @"new Listview\(\{template: 'item', id: 'herbalism', name: LANG.tab_herbalism, tabs: tabsRelated, parent: 'lkljbjkb574', extraCols: \[Listview.extraCols.count, Listview.extraCols.percent\], sort:\['-percent', 'name'\], computeDataFunc: Listview.funcBox.initLootTable, note: WH\.sprintf\(LANG.lvnote_objectherbgathering, [0-9]+\), _totalCount: ([0-9]+), data: (.+)\}\);"; 86 | String gameobjectMiningPattern = @"new Listview\(\{template: 'item', id: 'mining', name: LANG\.tab_mining, tabs: tabsRelated, parent: 'lkljbjkb574', extraCols: \[Listview\.extraCols\.count, Listview\.extraCols\.percent], sort:\['-percent', 'name'\], computeDataFunc: Listview\.funcBox\.initLootTable, note: WH\.sprintf\(LANG\.lvnote_objectmining, [0-9]+\), _totalCount: ([0-9]+), data: (.+)\}\);"; 87 | 88 | String gameobjectDataJSon = Tools.ExtractJsonFromWithPattern(gameobjectHtml, gameobjectDataPattern); 89 | if (gameobjectDataJSon != null) 90 | { 91 | m_data = JsonConvert.DeserializeObject(gameobjectDataJSon); 92 | } 93 | 94 | String gameobjectLootItemJSon = Tools.ExtractJsonFromWithPattern(gameobjectHtml, gameobjectLootPattern); 95 | String gameobjectLootCurrencyJSon = Tools.ExtractJsonFromWithPattern(gameobjectHtml, gameobjectLootCurrencyPattern); 96 | if (gameobjectLootItemJSon != null || gameobjectLootCurrencyJSon != null) 97 | { 98 | GameObjectLootItemParsing[] gameobjectLootItemDatas = gameobjectLootItemJSon != null ? JsonConvert.DeserializeObject(gameobjectLootItemJSon) : new GameObjectLootItemParsing[0]; 99 | GameObjectLootCurrencyParsing[] gameobjectLootCurrencyDatas = gameobjectLootCurrencyJSon != null ? JsonConvert.DeserializeObject(gameobjectLootCurrencyJSon) : new GameObjectLootCurrencyParsing[0]; 100 | SetGameobjectLootData(gameobjectLootItemDatas, gameobjectLootCurrencyDatas); 101 | } 102 | 103 | String gameobjectHerbalismTotalCount = Tools.ExtractJsonFromWithPattern(gameobjectHtml, gameobjectHerboPattern, 0); 104 | String gameobjectHerbalismJSon = Tools.ExtractJsonFromWithPattern(gameobjectHtml, gameobjectHerboPattern, 1); 105 | if (gameobjectHerbalismJSon != null) 106 | { 107 | GameObjectLootParsing[] gameobjectHerbalismDatas = JsonConvert.DeserializeObject(gameobjectHerbalismJSon); 108 | SetGameobjectHerbalismOrMiningData(gameobjectHerbalismDatas, Int32.Parse(gameobjectHerbalismTotalCount), true); 109 | } 110 | 111 | String gameobjectMiningTotalCount = Tools.ExtractJsonFromWithPattern(gameobjectHtml, gameobjectMiningPattern, 0); 112 | String gameobjectMiningJSon = Tools.ExtractJsonFromWithPattern(gameobjectHtml, gameobjectMiningPattern, 1); 113 | if (gameobjectMiningJSon != null) 114 | { 115 | GameObjectLootParsing[] gameobjectMiningDatas = JsonConvert.DeserializeObject(gameobjectMiningJSon); 116 | SetGameobjectHerbalismOrMiningData(gameobjectMiningDatas, Int32.Parse(gameobjectMiningTotalCount), false); 117 | } 118 | 119 | return true; 120 | } 121 | 122 | public void SetGameobjectLootData(GameObjectLootItemParsing[] gameobjectLootItemDatas, GameObjectLootCurrencyParsing[] gameobjectLootCurrencyDatas) 123 | { 124 | GameObjectLootParsing[] gameobjectLootDatas = new GameObjectLootParsing[gameobjectLootItemDatas.Length + gameobjectLootCurrencyDatas.Length]; 125 | Array.Copy(gameobjectLootItemDatas, gameobjectLootDatas, gameobjectLootItemDatas.Length); 126 | Array.Copy(gameobjectLootCurrencyDatas, 0, gameobjectLootDatas, gameobjectLootItemDatas.Length, gameobjectLootCurrencyDatas.Length); 127 | 128 | for (uint i = 0; i < gameobjectLootDatas.Length; ++i) 129 | { 130 | float count = 0.0f; 131 | float outof = 0.0f; 132 | float percent = 0.0f; 133 | 134 | try 135 | { 136 | count = (float)Convert.ToDouble(gameobjectLootDatas[i].modes["4"]["count"]); 137 | outof = (float)Convert.ToDouble(gameobjectLootDatas[i].modes["4"]["outof"]); 138 | percent = count * 100 / outof; 139 | } 140 | catch (Exception) 141 | { 142 | try 143 | { 144 | count = (float)Convert.ToDouble(gameobjectLootDatas[i].modes["2"]["count"]); 145 | outof = (float)Convert.ToDouble(gameobjectLootDatas[i].modes["2"]["outof"]); 146 | percent = count * 100 / outof; 147 | } 148 | catch (Exception) 149 | { 150 | try 151 | { 152 | count = (float)Convert.ToDouble(gameobjectLootDatas[i].modes["33554432"]["count"]); 153 | outof = (float)Convert.ToDouble(gameobjectLootDatas[i].modes["33554432"]["outof"]); 154 | percent = count * 100 / outof; 155 | } 156 | catch (Exception e) 157 | { 158 | Console.WriteLine(e.Message); 159 | } 160 | } 161 | } 162 | 163 | GameObjectLootItemParsing currentItemParsing = null; 164 | try 165 | { 166 | currentItemParsing = (GameObjectLootItemParsing)gameobjectLootDatas[i]; 167 | } 168 | catch (Exception ex) { } 169 | 170 | gameobjectLootDatas[i].questRequired = currentItemParsing != null && currentItemParsing.classs == 12 ? "1": "0"; 171 | 172 | // Normalize 173 | if (percent > 99.0f) 174 | percent = 100.0f; 175 | 176 | gameobjectLootDatas[i].percent = Tools.NormalizeFloat(percent); 177 | } 178 | 179 | m_gameobjectLootDatas = gameobjectLootDatas; 180 | } 181 | 182 | public void SetGameobjectHerbalismOrMiningData(GameObjectLootParsing[] gameobjectHerbalismOrMiningDatas, int totalCount, bool herbalism) 183 | { 184 | for (uint i = 0; i < gameobjectHerbalismOrMiningDatas.Length; ++i) 185 | { 186 | float percent = (float)gameobjectHerbalismOrMiningDatas[i].count * 100 / (float)totalCount; 187 | 188 | gameobjectHerbalismOrMiningDatas[i].percent = Tools.NormalizeFloat(percent); 189 | } 190 | 191 | if (herbalism) 192 | m_gameobjectHerbalismDatas = gameobjectHerbalismOrMiningDatas; 193 | else 194 | m_gameobjectMiningDatas = gameobjectHerbalismOrMiningDatas; 195 | } 196 | 197 | public override String GetSQLRequest() 198 | { 199 | String returnSql = ""; 200 | 201 | if (m_data.id == 0 || isError) 202 | return returnSql; 203 | 204 | if (IsCheckboxChecked("locale")) 205 | { 206 | LocaleConstant localeIndex = (LocaleConstant)Properties.Settings.Default.localIndex; 207 | 208 | if (localeIndex != 0) 209 | { 210 | m_gameobjectLocalesBuilder = new SqlBuilder("gameobject_template_locale", "entry"); 211 | m_gameobjectLocalesBuilder.SetFieldsNames("locale", "name"); 212 | 213 | m_gameobjectLocalesBuilder.AppendFieldsValue(m_data.id, localeIndex.ToString(), m_data.name); 214 | returnSql += m_gameobjectLocalesBuilder.ToString() + "\n"; 215 | } 216 | else 217 | { 218 | m_gameobjectLocalesBuilder = new SqlBuilder("gameobject_template", "entry"); 219 | m_gameobjectLocalesBuilder.SetFieldsNames("name"); 220 | 221 | m_gameobjectLocalesBuilder.AppendFieldsValue(m_data.id, m_data.name); 222 | returnSql += m_gameobjectLocalesBuilder.ToString() + "\n"; 223 | } 224 | } 225 | 226 | if (IsCheckboxChecked("loot") && m_gameobjectLootDatas != null) 227 | { 228 | m_gameobjectLootBuilder = new SqlBuilder("gameobject_loot_template", "entry", SqlQueryType.DeleteInsert); 229 | m_gameobjectLootBuilder.SetFieldsNames("Item", "Reference", "Chance", "QuestRequired", "LootMode", "GroupId", "MinCount", "MaxCount", "Comment"); 230 | 231 | returnSql += "UPDATE gameobject_template SET data1 = " + m_data.id + " WHERE entry = " + m_data.id + " AND type IN (3, 50);\n"; 232 | foreach (GameObjectLootParsing gameobjectLootData in m_gameobjectLootDatas) 233 | { 234 | GameObjectLootCurrencyParsing currentLootCurrencyData = null; 235 | try 236 | { 237 | currentLootCurrencyData = (GameObjectLootCurrencyParsing)gameobjectLootData; 238 | } 239 | catch (Exception ex) { } 240 | 241 | int idMultiplier = currentLootCurrencyData != null ? -1 : 1; 242 | 243 | if (idMultiplier < 1) 244 | continue; 245 | 246 | int minLootCount = gameobjectLootData.stack.Length >= 1 ? gameobjectLootData.stack[0] : 1; 247 | int maxLootCount = gameobjectLootData.stack.Length >= 2 ? gameobjectLootData.stack[1] : minLootCount; 248 | 249 | 250 | m_gameobjectLootBuilder.AppendFieldsValue( m_data.id, // Entry 251 | gameobjectLootData.id * idMultiplier, // Item 252 | 0, // Reference 253 | gameobjectLootData.percent, // Chance 254 | gameobjectLootData.questRequired, // QuestRequired 255 | 1, // LootMode 256 | 0, // GroupId 257 | minLootCount, // MinCount 258 | maxLootCount, // MaxCount 259 | ""); // Comment 260 | } 261 | 262 | returnSql += m_gameobjectLootBuilder.ToString() + "\n"; 263 | } 264 | 265 | if (IsCheckboxChecked("herbalism") && m_gameobjectHerbalismDatas != null) 266 | { 267 | m_gameobjectHerbalismBuilder = new SqlBuilder("gameobject_loot_template", "entry", SqlQueryType.InsertIgnore); 268 | m_gameobjectHerbalismBuilder.SetFieldsNames("Item", "Reference", "Chance", "QuestRequired", "LootMode", "GroupId", "MinCount", "MaxCount", "Comment"); 269 | 270 | returnSql += "UPDATE gameobject_template SET data1 = " + m_data.id + " WHERE entry = " + m_data.id + " AND type IN (3, 50);\n"; 271 | foreach (GameObjectLootParsing gameobjectHerbalismData in m_gameobjectHerbalismDatas) 272 | m_gameobjectHerbalismBuilder.AppendFieldsValue(m_data.id, // Entry 273 | gameobjectHerbalismData.id, // Item 274 | 0, // Reference 275 | gameobjectHerbalismData.percent, // Chance 276 | 0, // QuestRequired 277 | 1, // LootMode 278 | 0, // GroupId 279 | gameobjectHerbalismData.stack[0], // MinCount 280 | gameobjectHerbalismData.stack[1], // MaxCount 281 | ""); // Comment 282 | 283 | returnSql += m_gameobjectHerbalismBuilder.ToString() + "\n"; 284 | } 285 | 286 | if (IsCheckboxChecked("mining") && m_gameobjectMiningDatas != null) 287 | { 288 | m_gameobjectMiningBuilder = new SqlBuilder("gameobject_loot_template", "entry", SqlQueryType.InsertIgnore); 289 | m_gameobjectMiningBuilder.SetFieldsNames("Item", "Reference", "Chance", "QuestRequired", "LootMode", "GroupId", "MinCount", "MaxCount", "Comment"); 290 | 291 | returnSql += "UPDATE gameobject_template SET data1 = " + m_data.id + " WHERE entry = " + m_data.id + " AND type IN (3, 50);\n"; 292 | foreach (GameObjectLootParsing gameobjectMiningData in m_gameobjectMiningDatas) 293 | m_gameobjectMiningBuilder.AppendFieldsValue(m_data.id, // Entry 294 | gameobjectMiningData.id, // Item 295 | 0, // Reference 296 | gameobjectMiningData.percent, // Chance 297 | 0, // QuestRequired 298 | 1, // LootMode 299 | 0, // GroupId 300 | gameobjectMiningData.stack[0], // MinCount 301 | gameobjectMiningData.stack[1], // MaxCount 302 | ""); // Comment 303 | 304 | returnSql += m_gameobjectMiningBuilder.ToString() + "\n"; 305 | } 306 | 307 | return returnSql; 308 | } 309 | 310 | private GameObjectParsing m_data; 311 | protected GameObjectLootParsing[] m_gameobjectLootDatas; 312 | protected GameObjectLootParsing[] m_gameobjectHerbalismDatas; 313 | protected GameObjectLootParsing[] m_gameobjectMiningDatas; 314 | 315 | protected SqlBuilder m_gameobjectLootBuilder; 316 | protected SqlBuilder m_gameobjectHerbalismBuilder; 317 | protected SqlBuilder m_gameobjectMiningBuilder; 318 | protected SqlBuilder m_gameobjectLocalesBuilder; 319 | } 320 | } 321 | --------------------------------------------------------------------------------