Skip to content

Instantly share code, notes, and snippets.

@razer86
Last active Aug 8, 2021
Embed
What would you like to do?
using System;
using LogDataCollector;
namespace th_salvageupdater
{
class Program
{
static void Main(string[] args)
{
//Console.WriteLine("Hello World!");
SalvageFromIcyVeins data = new SalvageFromIcyVeins();
data.LoadData("D:\\Games\\th_salvageupdater");
}
}
}
// SalvageFromIcyVeins.cs "$Revision: 2505 $" "$Date: 2021-07-23 21:05:00 +1000 $"
// https://www.nuget.org/packages/HtmlAgilityPack/
using HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.XPath;
namespace LogDataCollector
{
public enum HeroClass : int
{
DemonHunter = 0,
Barbarian = 1,
Wizard = 2,
WitchDoctor = 3,
Monk = 4,
Crusader = 5,
Necromancer = 6,
Follower = 7, // For our convenience only.
Total = 8,
None = 9, // Change Follower -> None for final output.
}
public class SalvageFromIcyVeins
{
private class Build
{
public readonly HeroClass HeroClass;
public readonly List<string> BuildNames;
public Build(HeroClass heroClass, string buildName)
{
HeroClass = heroClass;
BuildNames = new List<string>() { buildName };
}
}
private const string html = "https://www.icy-veins.com/d3/legendary-item-salvage-guide";
public bool SkipLoN = false; // You can skip LoN build in the UI as well so include them by default.
public bool FileTest = false;
public HashSet<HeroClass> HeroClasses = new HashSet<HeroClass>()
{
HeroClass.DemonHunter,
HeroClass.Barbarian,
HeroClass.Wizard,
HeroClass.WitchDoctor,
HeroClass.Monk,
HeroClass.Crusader,
HeroClass.Necromancer,
HeroClass.Follower,
};
// Replace with Console.WriteLine for simple work around to write somewhere or {} to disable.
private void WriteLine(object value) { Console.WriteLine(value.ToString()); }
private void WriteLine(string value = null) { Console.WriteLine(value); }
private void WriteLine(string format, params object[] arg) { Console.WriteLine(string.Format(format, arg)); }
public void LoadData(string _dataDir)
{
var filename = Path.Combine(_dataDir, "salvage-guide.html");
var cacheDir = Path.Combine(_dataDir, "htmlCache");
var salvageItemsDataFile = Path.Combine(_dataDir, "SalvageItemsData.cs");
if (!Directory.Exists(cacheDir))
{
Directory.CreateDirectory(cacheDir);
}
var htmlDoc = (HtmlDocument)null;
if (FileTest && File.Exists(filename))
{
this.WriteLine("Load HTML from: {0}", html);
htmlDoc = new HtmlDocument();
htmlDoc.Load(filename);
}
else
{
// Must create in this order.
var htmlWeb = new HtmlWeb();
htmlWeb.CachePath = cacheDir;
htmlWeb.UsingCache = true;
this.WriteLine("Load HTML from: {0}", html);
htmlDoc = htmlWeb.Load(html);
this.WriteLine("Load HTML took: {0} ms", htmlWeb.RequestDuration);
}
var salvageTable = XPathExpression.Compile("//table[@class='salvage_table']");
var table = htmlDoc.DocumentNode.SelectSingleNode(salvageTable);
if (table == null)
{
this.WriteLine("TABLE not found in HTML document, expr={0}", salvageTable.Expression);
return;
}
try
{
Dictionary<string, List<Build>> itemBuilds = new Dictionary<string, List<Build>>();
parseTable(table, itemBuilds);
printItemsAndBuilds(itemBuilds, salvageItemsDataFile);
}
catch (Exception x)
{
this.WriteLine(x);
if (Debugger.IsAttached) Debugger.Break();
return;
}
}
// private List<ItemData> loadItemData()
// {
// return new List<ItemData>();
// }
private void parseTable(HtmlNode table, Dictionary<string, List<Build>> itemBuilds)
{
var rowCount = 0;
foreach (var row in table.SelectNodes("//tr"))
{
rowCount += 1;
var elements = row.Elements("td");
var columns = elements?.ToList();
if (columns?.Count != 2)
{
if (rowCount > 1)
{
this.WriteLine("row{0,4} INVALID columns={1}", rowCount, columns?.Count);
}
continue;
}
// Find item name from link
var links = columns[0].SelectNodes("./span/a")?.ToList();
if (links?.Count != 1)
{
this.WriteLine("row{0,4} INVALID links={1}", rowCount, links?.Count);
continue;
}
var itemName = links[0].InnerText;
if (itemName.StartsWith("Hellfire ")) // Ignore Hellfire Amulet and Ring because they are so special and must be judged by the user!
{
this.WriteLine("row{0,4} {1} SKIPPED", rowCount, itemName);
continue;
}
this.WriteLine("row{0,4} {1}", rowCount, itemName);
// Find build names for unordered list (inside a link).
var items = columns[1].SelectNodes("./ul/li")?.ToList();
if (items?.Count == 0)
{
this.WriteLine("row{0,4} INVALID items={1}", rowCount, items?.Count);
continue;
}
if (!itemBuilds.TryGetValue(itemName, out var buildList))
{
buildList = new List<Build>();
itemBuilds.Add(itemName, buildList);
}
foreach (var item in items)
{
var buildNameText = item.InnerText.Trim(); // Trim to be sure.
while (buildNameText.Contains(" ")) // InnerText can return double spaces which we must fix for parser.
{
buildNameText = buildNameText.Replace(" ", " ");
}
while (buildNameText.Contains("WD (")) // InnerText can return double spaces which we must fix for parser.
{
buildNameText = buildNameText.Replace("WD (", "Witch Doctor (");
}
if (SkipLoN && buildNameText.StartsWith("LoN ")) // Filter LoN builds
continue;
if (buildNameText.EndsWith("outdated")) // outdated!
continue;
if (buildNameText.EndsWith(" (Cube)")) // Only for Cube!
continue;
if (buildNameText.Contains("Dungeon Guide")) // Set Dungeon Guide skipped!
continue;
if (buildNameText.Contains("The Thrill")) // The Thrill Conquest Build!
continue;
var tuple = parseBuild(buildNameText);
if (tuple != null)
{
var heroClass = tuple.Item1;
if (!HeroClasses.Contains(heroClass)) // Filter builds by class.
continue;
var buildName = tuple.Item2;
this.WriteLine(" {0,-11} {1}", heroClass, buildName);
var build = buildList.FirstOrDefault(x => x.HeroClass == heroClass);
if (build == null)
{
build = new Build(heroClass, buildName);
buildList.Add(build);
}
else
{
build.BuildNames.Add(buildName);
}
}
}
}
this.WriteLine("{0} rows processed", rowCount);
}
private void printItemsAndBuilds(Dictionary<string, List<Build>> itemBuilds, string salvageItemsDataFile)
{
// HeroClass -> build name -> item name
var counters = new int[(int)HeroClass.Total + 1];
var totalIndex = (int)HeroClass.Total;
var builder = new StringBuilder().AppendLine();
var keys = itemBuilds.Keys.ToList();
keys.Sort();
builder
.Append("using System.Collections.Generic;").AppendLine()
.Append("").AppendLine()
.Append("namespace Turbo.Plugins.JarJar.DefaultUI").AppendLine()
.Append("{").AppendLine()
.Append(" public class Build").AppendLine()
.Append(" {").AppendLine()
.Append(" public readonly HeroClass HeroClass;").AppendLine()
.Append(" public readonly string[] BuildNames;").AppendLine()
.Append("").AppendLine()
.Append(" public Build(HeroClass heroClass, params string[] buildNames)").AppendLine()
.Append(" {").AppendLine()
.Append(" HeroClass = heroClass;").AppendLine()
.Append(" BuildNames = buildNames;").AppendLine()
.Append(" }").AppendLine()
.Append(" }").AppendLine()
.Append(" public sealed class SalvageItemsData").AppendLine()
.Append(" {").AppendLine()
.Append(" public readonly Dictionary<string, Build[]> HeroBuilds = new Dictionary<string, Build[]>()").AppendLine()
.Append(" {").AppendLine();
foreach (var itemName in keys)
{
var builds = itemBuilds[itemName];
if (builds.Count == 0)
{
continue;
}
// Item name.
builder
.Append(" { ")
.AppendFormat("\"{0}\", new Build[] ", itemName)
.Append("{")
.AppendLine();
counters[totalIndex] += 1;
builds.Sort((a, b) => a.HeroClass.CompareTo(b.HeroClass));
foreach (var build in builds)
{
// Hero class, convert Follower to None.
var heroClass = build.HeroClass == HeroClass.Follower ? HeroClass.None : build.HeroClass;
builder
.AppendFormat(" new Build(HeroClass.{0},", heroClass.ToString())
.AppendLine();
// Build names - sort and loop.
build.BuildNames.Sort();
var heroIndex = (int)build.HeroClass;
var lastIndex = build.BuildNames.Count - 1;
for (var i = 0; i < build.BuildNames.Count; ++i)
{
var buildName = build.BuildNames[i];
builder
.AppendFormat(" \"{0}\"", buildName);
if (i < lastIndex)
{
builder
.Append(",")
.AppendLine();
}
else
{
builder
.Append("),")
.AppendLine();
}
counters[heroIndex] += 1;
}
}
builder
.Append(" }},").AppendLine();
}
builder
.Append(" };").AppendLine()
.Append(" }").AppendLine()
.Append("}").AppendLine();
var result = builder.ToString();
File.WriteAllText(salvageItemsDataFile, result);
this.WriteLine(result);
this.WriteLine("{0} items processed", keys.Count);
builder
.Clear().AppendLine();
for (int i = 0; i < counters.Length; ++i)
{
var heroClass = (HeroClass)i;
builder
.AppendFormat("{0,-11}", heroClass.ToString())
.AppendFormat("{0,5}", counters[i])
.AppendLine();
}
builder
.AppendFormat("{0,-11}", "Skipped")
.AppendFormat("{0,5}", keys.Count - counters[totalIndex])
.AppendLine();
this.WriteLine(builder.ToString());
}
private static Tuple<HeroClass, string> parseBuild(string buildNameText)
{
string[] tokens = parseAsTokens(buildNameText);
if (!Enum.TryParse(tokens[1], out HeroClass heroClass))
throw new InvalidOperationException(tokens[1]);
var name = tokens[0];
if (name == "Support")
{
name += " " + tokens[1]; // Support build is class specific!
}
var spec = tokens[2];
spec = spec.Replace(" + ", "+").Replace(" variation)", ")").Replace(" variations)", ")");
return new Tuple<HeroClass, string>(heroClass, name + " " + spec);
}
private static string[] parseAsTokens(string buildName)
{
var pos2 = buildName.IndexOf(" (");
if (pos2 == -1)
throw new InvalidOperationException(buildName);
var pos1 = buildName.IndexOf(" Demon Hunter (");
if (pos1 == -1)
pos1 = buildName.IndexOf(" Barbarian (");
if (pos1 == -1)
pos1 = buildName.IndexOf(" Wizard (");
if (pos1 == -1)
pos1 = buildName.IndexOf(" Witch Doctor (");
if (pos1 == -1)
pos1 = buildName.IndexOf(" Monk (");
if (pos1 == -1)
pos1 = buildName.IndexOf(" Crusader (");
if (pos1 == -1)
pos1 = buildName.IndexOf(" Necromancer (");
if (pos1 == -1 && buildName.Contains("Follower Guide ("))
{
return new string[] {
"Follower",
HeroClass.Follower.ToString(),
buildName.Substring(pos2 + 1),
};
}
if (pos1 == -1 && buildName.Contains("Enchantress Guide ("))
{
return new string[] {
"Follower",
HeroClass.Follower.ToString(),
buildName.Substring(pos2 + 1),
};
}
if (pos1 == -1 && buildName.Contains("Scoundrel Guide ("))
{
return new string[] {
"Follower",
HeroClass.Follower.ToString(),
buildName.Substring(pos2 + 1),
};
}
if (pos1 == -1 && buildName.Contains("Templar Guide ("))
{
return new string[] {
"Follower",
HeroClass.Follower.ToString(),
buildName.Substring(pos2 + 1),
};
}
if (pos1 == -1)
throw new InvalidOperationException(buildName);
return new string[] {
buildName.Substring(0, pos1),
buildName.Substring(pos1 + 1, pos2 - pos1 - 1).Replace(" ", ""),
buildName.Substring(pos2 + 1),
};
}
private static string parseBaseName(string buildName)
{
var pos = buildName.IndexOf(" (");
if (pos == -1)
throw new InvalidOperationException(buildName);
return buildName.Substring(0, pos);
}
}
}
// SalvageItems.cs "$Revision: 2502 $" "$Date: 2021-07-10 15:15:00 +1000 (la, 17 elo 2019) $"
// https://www.ownedcore.com/forums/diablo-3/turbohud/turbohud-community-plugins/792083-intl-jarjar-salvageitems.html
// https://pastebin.com/E9RhzxhT
// https://www.icy-veins.com/d3/legendary-item-salvage-guide
using System.Collections.Generic;
using System.Linq;
using SharpDX;
using SharpDX.Direct2D1;
using Turbo.Plugins.Default;
namespace Turbo.Plugins.JarJar.DefaultUI
{
public enum BuildKind : uint
{
Class = 0, // => ClassBrush
Other = 1, // => OtherBrush
Special = 2, // => SpecialBrush
None = 3, // => DarkenBrush
}
public class SalvageItems : BasePlugin, IInGameTopPainter
{
public bool SkipLoN { get; set; } = false; // Ignore LoN builds.
public bool HighlightInventory { get; set; } = true; // Draw a coloured rectable around item type in bottom-right item rect corner.
public IBrush ClassBrush { get; set; } // Build item is for current class.
public IBrush OtherBrush { get; set; } // Build item is for other class.
public IBrush SpecialBrush { get; set; } // Build item without class, like folower items and extra special items.
public float OffsetTop { get; set; } = 18f; // Hard coded for 1200 screen height.
public float OffsetBottom { get; set; } = 2f;
public bool HighlightLegendary { get; set; } = true; // Extra highlight for legendary items
public bool HighlightAncient { get; set; } = false; // Extra highlight for ancient and primary items
public IBrush HighlightBrush { get; set; }
public float HighlightOffset { get; set; } = 1.5f;
public bool CheckItems { get; set; } = true; // Mark items for easier detection what to salvage.
public bool SkipJewelryCheck { get; set; } = true;
public string CheckItemIndicator1 { get; set; } = ""; // ✪ circled white star (more than one item with same main stat)
public string CheckItemIndicator2 { get; set; } = ""; // ✪ circled white star (more than one item with same main stat and only in Inventory)
public string SingleLegendary { get; set; } = ""; // ◇ white diamond (really the only item found)
public string SingleAncient { get; set; } = "⦿"; // ⦿ circled bullet (really the only item found)
public string SkippedJewelryIndicator { get; set; } = ""; // ✤ Jewelry ambiguous marker.
public string SameCountPrefix { get; set; } = "+"; // Prefix for similar items in stash.
public float FontMargin { get; set; } = 3f; // Item rect marker offset from top-right.
public IFont CheckItemFont1 { get; set; }
public IFont CheckItemFont2 { get; set; }
public IFont SameCountFont { get; set; }
public IFont SingleItemFont { get; set; }
public IFont SkippedJewelryFont { get; set; }
public bool DarkenInventory { get; set; } = true;
public bool DarkenStash { get; set; } = true;
public IBrush DarkenBrush { get; set; }
public string[] ExtraSpecialItems { get; set; } = { // These are considered like build items but without a specific build!
"Broken Crown", // Gem farming.
"Hellfire Amulet", // Special item for certain builds.
"Leoric's Signet", // XP/leveling ring
"Hellfire Ring", // XP/leveling ring
};
public string[] NoDarkenItems { get; set; } = { // Do not darken for these as they are useful!
"Puzzle Ring",
"Bovine Bardiche",
};
private Dictionary<string, Build[]> heroBuilds;
public SalvageItems() { Enabled = true; Order = 1000; }
public override void Load(IController hud)
{
base.Load(hud);
ClassBrush = createBrush(Color.OrangeRed);
OtherBrush = createBrush(Color.GreenYellow, alpha: 200);
SpecialBrush = createBrush(Color.MediumPurple);
HighlightBrush = createBrush(Color.Silver, dash: DashStyle.Dash);
CheckItemFont1 = createFont("arial", 9, Color.DodgerBlue, bold: true, shadow: true);
CheckItemFont2 = createFont("arial", 9, Color.LightSeaGreen, bold: true, shadow: true);
SameCountFont = createFont("arial", 9, Color.DarkOrange, bold: true, shadow: true);
SingleItemFont = createFont("arial", 9, Color.Gold, bold: true, shadow: true);
SkippedJewelryFont = createFont("arial", 9, Color.LightSkyBlue, bold: true, shadow: true);
DarkenBrush = Hud.Render.CreateBrush(148, 38, 38, 38, 0);
heroBuilds = new SalvageItemsData().HeroBuilds;
foreach (var itemName in ExtraSpecialItems)
{
heroBuilds.Add(itemName, new Build[] { new Build(HeroClass.None, itemName) });
}
}
private IBrush createBrush(Color textColor, float brushWidth = -1f, DashStyle dash = DashStyle.Solid, int alpha = 255)
{
return Hud.Render.CreateBrush(alpha, textColor.R, textColor.G, textColor.B, brushWidth, dash);
}
private IFont createFont(string fontFamily, float size, Color textColor, bool bold = false, bool shadow = false)
{
if (shadow)
return Hud.Render.CreateFont(fontFamily, size, textColor.A, textColor.R, textColor.G, textColor.B, bold, false, 220, 032, 032, 032, true);
return Hud.Render.CreateFont(fontFamily, size, textColor.A, textColor.R, textColor.G, textColor.B, bold, false, true);
}
public void PaintTopInGame(ClipState clipState)
{
if (clipState != ClipState.Inventory)
return;
if (!Hud.Game.IsInTown || Hud.Render.UiHidden || Hud.Game.MapMode == MapMode.WaypointMap || Hud.Game.MapMode == MapMode.ActMap || Hud.Game.MapMode == MapMode.Map)
return;
var stashTab = Hud.Inventory.SelectedStashTabIndex;
var stashPage = Hud.Inventory.SelectedStashPageIndex;
var stashTabAbs = stashTab + (stashPage * Hud.Inventory.MaxStashTabCountPerPage);
var items = Hud.Game.Items.Where(x => x.Location == ItemLocation.Inventory || x.Location == ItemLocation.Stash);
foreach (var item in items)
{
if (item.Location == ItemLocation.Stash)
{
var tabIndex = item.InventoryY / 10;
if (tabIndex != stashTabAbs)
continue;
}
if (!item.IsLegendary)
continue;
if (item.SnoItem.Kind == ItemKind.gem)
continue;
if (item.SnoItem.Kind == ItemKind.craft)
continue;
if (item.SnoItem.Kind == ItemKind.uberstuff)
continue;
if (item.SnoItem.MainGroupCode == "potion" || item.SnoItem.MainGroupCode == "healthpotions")
continue;
if (item.SnoItem.MainGroupCode == "gems_unique")
continue;
if (item.SnoItem.MainGroupCode == "consumable")
continue;
if (item.SnoItem.MainGroupCode == "horadriccache")
continue;
var rect = Hud.Inventory.GetItemRect(item);
if (rect != System.Drawing.RectangleF.Empty)
{
var buildKind = BuildKind.None;
if (heroBuilds.TryGetValue(item.SnoItem.NameEnglish, out var builds))
{
var build = SkipLoN
? builds.FirstOrDefault(x => x.HeroClass == Hud.Game.Me.HeroClassDefinition.HeroClass && x.BuildNames.Count(y => y.StartsWith("LoN ")) == 0)
: builds.FirstOrDefault(x => x.HeroClass == Hud.Game.Me.HeroClassDefinition.HeroClass);
if (build != null)
{
buildKind = BuildKind.Class;
}
else
{
buildKind = builds.Any(x => x.HeroClass == HeroClass.None) ? BuildKind.Special : BuildKind.Other;
}
}
if (buildKind == BuildKind.None)
{
DarkenItem(item, rect);
}
if (HighlightInventory && buildKind != BuildKind.None)
{
HighlightItem(item, rect, buildKind);
}
}
}
}
private void HighlightItem(IItem item, System.Drawing.RectangleF rect, BuildKind buildKind)
{
if (item.CaldesannRank == 0)
{
var brush = (IBrush)null;
switch (buildKind)
{
case BuildKind.Class:
brush = ClassBrush;
break;
case BuildKind.Other:
brush = OtherBrush;
break;
case BuildKind.Special:
brush = SpecialBrush;
break;
default:
return;
}
if ((item.AncientRank == 0 && HighlightLegendary) || (item.AncientRank > 0 && HighlightAncient))
{
HighlightBrush.DrawRectangle(rect.Right - OffsetTop - HighlightOffset, rect.Bottom - OffsetTop - HighlightOffset, OffsetTop - OffsetBottom + (2 * HighlightOffset), OffsetTop - OffsetBottom + (2 * HighlightOffset));
}
brush.DrawRectangle(rect.Right - OffsetTop, rect.Bottom - OffsetTop, OffsetTop - OffsetBottom, OffsetTop - OffsetBottom);
}
if (CheckItems)
{
if (SkipJewelryCheck && (item.SnoItem.MainGroupCode == "amulet" || item.SnoItem.MainGroupCode == "ring"))
{
// Skip checking until we know what we want!
showMarker(rect, SkippedJewelryIndicator, SkippedJewelryFont);
}
else
{
var showCheckMark = false;
var matchedItems = new List<IItem>();
var ranks = countItemRanks(item, ref matchedItems);
if (ranks[2] > 0)
{
if (item.AncientRank >= 1)
{
if (item.Location == ItemLocation.Inventory)
{
// Check ancient/primal!
showCheckMark = true;
}
else
{
// Count ancient/primal!
showMarker(rect, SameCountPrefix + (ranks[1] + ranks[2]).ToString(), SameCountFont);
}
}
}
else if (ranks[1] > 0)
{
if (item.AncientRank == 1)
{
if (item.Location == ItemLocation.Inventory)
{
// Check ancient.
showCheckMark = true;
}
else
{
// Count ancient.
showMarker(rect, SameCountPrefix + ranks[1].ToString(), SameCountFont);
}
}
}
else if (ranks[0] > 0)
{
if (item.AncientRank == 0)
{
// We have only legendaries.
showCheckMark = true;
}
}
else
{
if (item.Location == ItemLocation.Inventory)
{
showMarker(rect, item.AncientRank == 0 ? SingleLegendary : SingleAncient, SingleItemFont);
}
}
if (showCheckMark)
{
var nonInventory = matchedItems.Any(x => x.Location != ItemLocation.Inventory);
if (nonInventory)
{
showMarker(rect, CheckItemIndicator1, CheckItemFont1);
}
else
{
showMarker(rect, CheckItemIndicator2, CheckItemFont2);
}
}
}
}
}
private void DarkenItem(IItem item, System.Drawing.RectangleF rect)
{
if (item.CaldesannRank > 0)
{
return;
}
if (NoDarkenItems.Contains(item.SnoItem.NameEnglish))
{
HighlightBrush.DrawRectangle(rect.Right - OffsetTop, rect.Bottom - OffsetTop, OffsetTop - OffsetBottom, OffsetTop - OffsetBottom);
return;
}
DarkenBrush.DrawRectangle(rect.X, rect.Y, rect.Width, rect.Height);
}
private void showMarker(System.Drawing.RectangleF rect, string symbol, IFont font)
{
// Top right corner.
if (!string.IsNullOrEmpty(symbol))
{
var layout = font.GetTextLayout(symbol);
font.DrawText(layout, rect.Right - FontMargin - layout.Metrics.Width, rect.Top + FontMargin);
}
}
private IItemPerfection getMainStat(IItem item)
{
if (item != null && !item.Unidentified && item.Perfections != null)
{
foreach (var perfection in item.Perfections)
{
if (perfection.Attribute.Code == "Dexterity_Item" || perfection.Attribute.Code == "Intelligence_Item" || perfection.Attribute.Code == "Strength_Item")
{
return perfection;
}
}
}
return null;
}
private bool hasMainStat(IItemPerfection mainStat ,IItem item)
{
if (item != null && !item.Unidentified && item.Perfections != null)
{
foreach (var perfection in item.Perfections)
{
if (perfection.Attribute.Code == "Dexterity_Item" || perfection.Attribute.Code == "Intelligence_Item" || perfection.Attribute.Code == "Strength_Item")
{
return mainStat == null ? false : mainStat.Attribute.Code == perfection.Attribute.Code;
}
}
}
return mainStat == null ? true : false;
}
private int[] countItemRanks(IItem item, ref List<IItem> items)
{
// We always match main stat!
var ranks = new int[] { 0, 0, 0 };
var itemMainStat = getMainStat(item);
foreach (var x in Hud.Game.Items)
{
if (x.SnoItem.NameEnglish == item.SnoItem.NameEnglish &&
x.Location != ItemLocation.Merchant && x.Location != ItemLocation.Floor &&
x.Seed != item.Seed && hasMainStat(itemMainStat, x))
{
ranks[x.AncientRank] += 1;
items.Add(x);
}
}
return ranks;
}
}
}
using System.Collections.Generic;
namespace Turbo.Plugins.JarJar.DefaultUI
{
public class Build
{
public readonly HeroClass HeroClass;
public readonly string[] BuildNames;
public Build(HeroClass heroClass, params string[] buildNames)
{
HeroClass = heroClass;
BuildNames = buildNames;
}
}
public sealed class SalvageItemsData
{
public readonly Dictionary<string, Build[]> HeroBuilds = new Dictionary<string, Build[]>()
{
{ "Accursed Visage", new Build[] {
new Build(HeroClass.DemonHunter,
"Chakram (BiS+1)",
"Unhallowed Essence Grenades (BiS+1)",
"Unhallowed Essence Multishot (BiS+1)"),
}},
{ "Akarat's Awakening", new Build[] {
new Build(HeroClass.Crusader,
"Invoker Thorns (BiS+Cube+1)"),
}},
{ "Akkhan's Manacles", new Build[] {
new Build(HeroClass.Crusader,
"LoD Blessed Shield (BiS)"),
}},
{ "Ambo's Pride", new Build[] {
new Build(HeroClass.Barbarian,
"Rend Wastes (Cube+1)"),
}},
{ "Ancient Parthan Defenders", new Build[] {
new Build(HeroClass.Barbarian,
"Leap/Earthquake MotE (BiS)"),
new Build(HeroClass.Wizard,
"DMO Arcane Orbit (BiS)",
"LoD Mammoth Hydra (Alt)"),
new Build(HeroClass.Necromancer,
"LoD Corpse Explosion (Alt)",
"LoD Poison Scythe (BiS)",
"Trag'Oul Blood Mages (BiS)"),
}},
{ "Andariel's Visage", new Build[] {
new Build(HeroClass.Barbarian,
"Frenzy Thorns LoN (Alt+1)",
"HotA GR LoD (Alt)"),
new Build(HeroClass.Wizard,
"LoD Energy Twister (BiS)",
"LoD Mammoth Hydra (Alt)"),
new Build(HeroClass.Crusader,
"LoD Blessed Shield (Alt)"),
new Build(HeroClass.Necromancer,
"LoD Blood Nova (Alt)",
"LoD Corpse Lance (Alt)",
"LoD Poison Scythe (BiS+1)",
"LoD Singularity (Alt+1)",
"LoD Thorns Skeletons (BiS)"),
new Build(HeroClass.None,
"Follower (Alt)"),
}},
{ "Antique Vintage Boots", new Build[] {
new Build(HeroClass.DemonHunter,
"GoD Hungering Arrow (BiS+2)"),
}},
{ "Aquila Cuirass", new Build[] {
new Build(HeroClass.Barbarian,
"Frenzy Thorns LoN (BiS+1)"),
new Build(HeroClass.Wizard,
"LoD Energy Twister (BiS)",
"LoD Frozen Orb (BiS)",
"LoD Mammoth Hydra (BiS)"),
new Build(HeroClass.WitchDoctor,
"LoD Carnevil DoD (BiS)",
"LoD Spirit Barrage (BiS+2)",
"Spirit Barrage Mundunugu (Cube+1)"),
new Build(HeroClass.Crusader,
"Invoker Thorns (BiS+1)",
"LoD Blessed Shield (BiS)"),
new Build(HeroClass.Necromancer,
"LoD Blood Nova (BiS)",
"LoD Corpse Explosion (BiS+1)",
"LoD Corpse Lance (BiS)",
"LoD Poison Scythe (BiS+1)",
"LoD Thorns Skeletons (BiS)",
"Support Necromancer (BiS)"),
}},
{ "Arachyr's Carapace", new Build[] {
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (BiS+2)"),
}},
{ "Arachyr's Claws", new Build[] {
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (BiS+2)"),
}},
{ "Arachyr's Legs", new Build[] {
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (BiS+2)"),
}},
{ "Arachyr's Mantle", new Build[] {
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (BiS+2)"),
}},
{ "Arachyr's Stride", new Build[] {
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (BiS+2)"),
}},
{ "Arachyr's Visage", new Build[] {
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (BiS+2)"),
}},
{ "Ashnagarr's Blood Bracer", new Build[] {
new Build(HeroClass.Wizard,
"DMO Frozen Orb (BiS)",
"Explosive Blast Farming (BiS)",
"Firebird Flame Blades (BiS+2)",
"LoD Energy Twister (BiS)",
"LoD Frozen Orb (BiS)",
"LoD Mammoth Hydra (BiS)",
"Typhon Frost Hydra (BiS)",
"Vyr Archon (BiS+1)"),
}},
{ "Aughild's Power", new Build[] {
new Build(HeroClass.DemonHunter,
"Natalya Rapid Fire (BiS)",
"Shadow Impale (BiS+1)"),
new Build(HeroClass.Barbarian,
"Frenzy HotNS (BiS+1)"),
new Build(HeroClass.Wizard,
"Firebird Flame Blades (BiS)",
"Firebird Flame Blades (BiS)"),
new Build(HeroClass.WitchDoctor,
"Zuni Carnevil Poison Dart (BiS)"),
new Build(HeroClass.Monk,
"Inna Mystic Ally (BiS)"),
new Build(HeroClass.Crusader,
"Akkhan Condemn (BiS)"),
}},
{ "Aughild's Search", new Build[] {
new Build(HeroClass.DemonHunter,
"Natalya Rapid Fire (BiS)",
"Shadow Impale (BiS+1)"),
new Build(HeroClass.Barbarian,
"Frenzy HotNS (BiS+1)"),
new Build(HeroClass.Wizard,
"Firebird Flame Blades (BiS)",
"Firebird Flame Blades (BiS)"),
new Build(HeroClass.WitchDoctor,
"Zuni Carnevil Poison Dart (BiS)"),
new Build(HeroClass.Monk,
"Inna Mystic Ally (BiS)"),
new Build(HeroClass.Crusader,
"Akkhan Condemn (BiS)"),
}},
{ "Avarice Band", new Build[] {
new Build(HeroClass.DemonHunter,
"Chakram (BiS+Cube)",
"GoD Hungering Arrow (BiS)",
"GoD Hungering Arrow (BiS)",
"Natalya Rain of Vengeance (BiS)",
"Shadow Impale (BiS)",
"Unhallowed Essence Grenades (BiS)",
"Unhallowed Essence Multishot (BiS)"),
new Build(HeroClass.Barbarian,
"Frenzy HotNS (BiS)",
"Furious Charge IK/Raekor (BiS)",
"HotA Raekor (BiS)",
"Rend Wastes (BiS)",
"Seismic Slam (BiS)"),
new Build(HeroClass.Wizard,
"Explosive Blast Farming (BiS)",
"Firebird Flame Blades (BiS)"),
new Build(HeroClass.WitchDoctor,
"Helltooth Acid Cloud (BiS)",
"Helltooth Gargantuan (BiS)",
"Helltooth Zombie Bears (BiS)",
"LoD Spirit Barrage (BiS)",
"Spirit Barrage Mundunugu (BiS)",
"Zuni Carnevil Poison Dart (BiS)"),
new Build(HeroClass.Monk,
"PoJ Tempest Rush (BiS)",
"Sunwuko Wave of Light (BiS)",
"SWK LTK (BiS)",
"SWK Tempest Rush (BiS)",
"Uliana Seven-Sided Strike (BiS)"),
new Build(HeroClass.Crusader,
"Aegis of Valor Fist of the Heavens (BiS)",
"Aegis of Valor Heaven's Fury (BiS)",
"Akkhan Condemn (BiS)",
"Blessed Hammer (BiS)",
"Roland's Shield Bash (BiS)",
"Roland's Sweep Attack (BiS)",
"Thorns Bombardment (BiS)"),
new Build(HeroClass.Necromancer,
"Generator (BiS)",
"LoD Corpse Explosion (BiS)",
"LoD Singularity (BiS)",
"Masquerade Bone Spear (BiS)",
"Trag'Oul Blood Mages (BiS)"),
new Build(HeroClass.None,
"Follower (BiS)"),
}},
{ "Azurewrath", new Build[] {
new Build(HeroClass.Monk,
"PoJ Tempest Rush (Alt)"),
}},
{ "Bakuli Jungle Wraps", new Build[] {
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (BiS+1)"),
}},
{ "Balance", new Build[] {
new Build(HeroClass.Monk,
"PoJ Tempest Rush (Cube+1)"),
}},
{ "Band of Might", new Build[] {
new Build(HeroClass.Barbarian,
"Frenzy HotNS (BiS+2)",
"Furious Charge IK/Raekor (BiS+1)",
"HotA GR LoD (BiS)",
"HotA IK (Alt+Cube)",
"HotA Raekor (Alt+Cube+1)",
"Rend Wastes (BiS+1)",
"Support Barbarian (BiS)"),
}},
{ "Bastion's Revered", new Build[] {
new Build(HeroClass.Barbarian,
"Frenzy HotNS (Cube+3)",
"Frenzy Thorns LoN (Cube+1)"),
}},
{ "Bazubands of Justice", new Build[] {
new Build(HeroClass.Monk,
"PoJ Tempest Rush (BiS+1)"),
}},
{ "Belt of the Trove", new Build[] {
new Build(HeroClass.Crusader,
"Invoker Thorns (Cube+1)",
"Thorns Bombardment (Cube+1)"),
}},
{ "Belt of Transcendence", new Build[] {
new Build(HeroClass.WitchDoctor,
"Helltooth Acid Cloud (BiS)",
"Zuni Gargantuan (BiS+1)"),
}},
{ "Bindings of the Lesser Gods", new Build[] {
new Build(HeroClass.Monk,
"Inna Mystic Ally (Alt+Cube+2)",
"LoD LTK (BiS)",
"LoD WoL (Alt)"),
}},
{ "Blackthorne's Jousting Mail", new Build[] {
new Build(HeroClass.Barbarian,
"Frenzy Thorns LoN (BiS+1)",
"HotA GR LoD (BiS)"),
new Build(HeroClass.Wizard,
"LoD Energy Twister (BiS)",
"LoD Frozen Orb (BiS)",
"LoD Mammoth Hydra (BiS)"),
new Build(HeroClass.WitchDoctor,
"LoD Spirit Barrage (BiS)"),
new Build(HeroClass.Monk,
"LoD LTK (BiS)"),
new Build(HeroClass.Crusader,
"LoD Blessed Shield (BiS)",
"LoD Condemn (BiS)"),
new Build(HeroClass.Necromancer,
"LoD Blood Nova (BiS)",
"LoD Corpse Explosion (BiS+1)",
"LoD Corpse Lance (BiS)"),
}},
{ "Blade of Prophecy", new Build[] {
new Build(HeroClass.Crusader,
"Akkhan Condemn (Cube+1)"),
}},
{ "Blade of the Tribes", new Build[] {
new Build(HeroClass.Barbarian,
"Leap/Earthquake MotE (Cube+1)"),
}},
{ "Blind Faith", new Build[] {
new Build(HeroClass.None,
"Follower (BiS)"),
}},
{ "Bombardier's Rucksack", new Build[] {
new Build(HeroClass.DemonHunter,
"Marauder Cluster Arrow (BiS+2)",
"Natalya Marauder Sentry (BiS)"),
}},
{ "Bonds of C'Lena", new Build[] {
new Build(HeroClass.Necromancer,
"Rathma Army of the Dead (BiS+3)"),
}},
{ "Bone Ringer", new Build[] {
new Build(HeroClass.Necromancer,
"LoD Thorns Skeletons (BiS)"),
}},
{ "Born's Furious Wrath", new Build[] {
new Build(HeroClass.Monk,
"Support Monk (BiS)"),
}},
{ "Born's Privilege", new Build[] {
new Build(HeroClass.Monk,
"Support Monk (BiS)"),
}},
{ "Bracer of Fury", new Build[] {
new Build(HeroClass.Crusader,
"Aegis of Valor Heaven's Fury (BiS+2)"),
}},
{ "Bracers of Destruction", new Build[] {
new Build(HeroClass.Barbarian,
"Seismic Slam (BiS+1)"),
}},
{ "Bracers of the First Men", new Build[] {
new Build(HeroClass.Barbarian,
"HotA GR LoD (Alt+Cube)",
"HotA IK (BiS+1)",
"HotA Raekor (BiS+1)"),
}},
{ "Breastplate of Akkhan", new Build[] {
new Build(HeroClass.Crusader,
"Akkhan Condemn (BiS+1)",
"Thorns Bombardment (BiS+1)"),
}},
{ "Brigandine of Valor", new Build[] {
new Build(HeroClass.Crusader,
"Aegis of Valor Fist of the Heavens (BiS+1)",
"Aegis of Valor Heaven's Fury (BiS+2)"),
}},
{ "Briggs' Wrath", new Build[] {
new Build(HeroClass.Necromancer,
"LoD Corpse Explosion (Alt)",
"Rathma Army of the Dead (BiS)"),
}},
{ "Bul-Kathos's Solemn Vow", new Build[] {
new Build(HeroClass.Barbarian,
"Rend Wastes (BiS)",
"Whirlwind GR Wastes (BiS+1)"),
}},
{ "Bul-Kathos's Warrior Blood", new Build[] {
new Build(HeroClass.Barbarian,
"Rend Wastes (BiS)",
"Whirlwind GR Wastes (BiS+1)"),
}},
{ "Burden of the Invoker", new Build[] {
new Build(HeroClass.Crusader,
"Invoker Thorns (BiS+1)",
"Thorns Bombardment (BiS)"),
}},
{ "Buriza-Do Kyanon", new Build[] {
new Build(HeroClass.None,
"Follower (BiS for Scoundrel)"),
}},
{ "Cage of the Hellborn", new Build[] {
new Build(HeroClass.DemonHunter,
"Chakram (BiS+1)",
"Unhallowed Essence Grenades (BiS+1)",
"Unhallowed Essence Multishot (BiS+1)"),
}},
{ "Cain's Habit", new Build[] {
new Build(HeroClass.Barbarian,
"Support Barbarian (BiS)"),
new Build(HeroClass.None,
"Follower (BiS)",
"Follower (BiS)"),
}},
{ "Cain's Scrivener", new Build[] {
new Build(HeroClass.Barbarian,
"Support Barbarian (BiS)"),
new Build(HeroClass.None,
"Follower (BiS)",
"Follower (BiS)"),
}},
{ "Cain's Travelers", new Build[] {
new Build(HeroClass.None,
"Follower (BiS)"),
}},
{ "Captain Crimson's Silk Girdle", new Build[] {
new Build(HeroClass.DemonHunter,
"Chakram (BiS)",
"Unhallowed Essence Multishot (BiS)"),
new Build(HeroClass.Barbarian,
"Rend Wastes (Alt)",
"Seismic Slam (BiS)"),
new Build(HeroClass.Wizard,
"Firebird Flame Blades (BiS)",
"Firebird Flame Blades (BiS)",
"Firebird Flame Blades (BiS)"),
new Build(HeroClass.WitchDoctor,
"Helltooth Zombie Bears (BiS+1)",
"Jade Harvester (BiS)",
"Spirit Barrage Mundunugu (BiS+1)"),
new Build(HeroClass.Monk,
"PoJ Tempest Rush (BiS)",
"Raiment Shenlong Generator (BiS)",
"Sunwuko Wave of Light (BiS)",
"Support Monk (BiS)",
"SWK Tempest Rush (BiS)",
"Uliana Seven-Sided Strike (BiS)"),
new Build(HeroClass.Crusader,
"Aegis of Valor Fist of the Heavens (BiS)",
"Aegis of Valor Heaven's Fury (BiS+1)",
"Akkhan Condemn (BiS)",
"Invoker Thorns (BiS)",
"Roland's Shield Bash (BiS)",
"Roland's Sweep Attack (BiS)",
"Thorns Bombardment (BiS)"),
new Build(HeroClass.Necromancer,
"Corpse Lance (BiS+2)",
"Masquerade Bone Spear (BiS)",
"Rathma Army of the Dead (BiS+3)",
"Support Necromancer (BiS)"),
new Build(HeroClass.None,
"Follower (BiS)"),
}},
{ "Captain Crimson's Thrust", new Build[] {
new Build(HeroClass.DemonHunter,
"Chakram (BiS)",
"Unhallowed Essence Multishot (BiS)"),
new Build(HeroClass.Barbarian,
"Rend Wastes (Alt)",
"Seismic Slam (BiS)"),
new Build(HeroClass.Wizard,
"Firebird Flame Blades (BiS)",
"Firebird Flame Blades (BiS)",
"Firebird Flame Blades (BiS)"),
new Build(HeroClass.WitchDoctor,
"Helltooth Zombie Bears (BiS+1)",
"Jade Harvester (BiS)",
"Spirit Barrage Mundunugu (BiS+1)"),
new Build(HeroClass.Monk,
"Raiment Shenlong Generator (BiS)",
"Support Monk (BiS)",
"Uliana Seven-Sided Strike (BiS)"),
new Build(HeroClass.Crusader,
"Aegis of Valor Fist of the Heavens (BiS)",
"Aegis of Valor Heaven's Fury (BiS+1)",
"Akkhan Condemn (BiS)",
"Invoker Thorns (BiS)",
"Roland's Shield Bash (BiS)",
"Roland's Sweep Attack (BiS)"),
new Build(HeroClass.Necromancer,
"Corpse Lance (BiS+2)",
"Masquerade Bone Spear (BiS)",
"Rathma Army of the Dead (BiS+3)",
"Support Necromancer (BiS)"),
new Build(HeroClass.None,
"Follower (BiS)"),
}},
{ "Captain Crimson's Waders", new Build[] {
new Build(HeroClass.Monk,
"PoJ Tempest Rush (BiS)",
"Sunwuko Wave of Light (BiS)",
"SWK Tempest Rush (BiS)"),
new Build(HeroClass.Crusader,
"Thorns Bombardment (BiS)"),
}},
{ "Carnevil", new Build[] {
new Build(HeroClass.WitchDoctor,
"LoD Carnevil DoD (BiS)",
"Zuni Carnevil Poison Dart (BiS+1)"),
}},
{ "Cesar's Memento", new Build[] {
new Build(HeroClass.Monk,
"PoJ Tempest Rush (BiS+1)",
"SWK Tempest Rush (BiS+1)"),
}},
{ "Chain of Shadows", new Build[] {
new Build(HeroClass.DemonHunter,
"Shadow Impale (BiS+1)"),
}},
{ "Chantodo's Force", new Build[] {
new Build(HeroClass.Wizard,
"Vyr Archon (BiS+2)"),
}},
{ "Chantodo's Will", new Build[] {
new Build(HeroClass.Wizard,
"Vyr Archon (BiS+2)"),
}},
{ "Chausses of Valor", new Build[] {
new Build(HeroClass.Crusader,
"Aegis of Valor Fist of the Heavens (BiS)",
"Aegis of Valor Heaven's Fury (BiS)"),
}},
{ "Chilanik's Chain", new Build[] {
new Build(HeroClass.Barbarian,
"Frenzy HotNS (Alt+Cube)",
"Frenzy Thorns LoN (BiS)",
"Leap/Earthquake MotE (BiS)",
"Seismic Slam (BiS)",
"Support Barbarian (Alt+Cube+2)"),
}},
{ "Cindercoat", new Build[] {
new Build(HeroClass.Barbarian,
"HotA GR LoD (BiS)"),
new Build(HeroClass.Wizard,
"LoD Mammoth Hydra (Alt)"),
new Build(HeroClass.Monk,
"LoD LTK (BiS)",
"LoD WoL (BiS)"),
}},
{ "Circle of Nailuj's Evol", new Build[] {
new Build(HeroClass.Necromancer,
"LoD Singularity (BiS+1)",
"Trag'Oul Blood Mages (BiS+1)"),
}},
{ "Claws of Savages", new Build[] {
new Build(HeroClass.Barbarian,
"Frenzy HotNS (BiS+3)"),
}},
{ "Cluckeye", new Build[] {
new Build(HeroClass.None,
"Follower (BiS)"),
}},
{ "Cold Cathode Trousers", new Build[] {
new Build(HeroClass.DemonHunter,
"GoD Hungering Arrow (BiS+1)"),
}},
{ "Convention of Elements", new Build[] {
new Build(HeroClass.DemonHunter,
"Marauder Cluster Arrow (BiS+1)",
"Natalya Rapid Fire (Alt)",
"Shadow Impale (BiS+2)",
"Unhallowed Essence Grenades (BiS)"),
new Build(HeroClass.Barbarian,
"Frenzy HotNS (BiS)",
"Frenzy HotNS (BiS)",
"Furious Charge IK/Raekor (BiS)",
"HotA GR LoD (Alt+Cube)",
"HotA IK (BiS)",
"HotA Raekor (BiS)",
"Rend Wastes (BiS)",
"Whirlwind GR Wastes (BiS)"),
new Build(HeroClass.Wizard,
"DMO Arcane Orbit (BiS)",
"DMO Energy Twister (BiS)",
"DMO Frozen Orb (BiS)",
"Firebird Flame Blades (Cube+1)",
"LoD Energy Twister (BiS)",
"LoD Frozen Orb (BiS)",
"LoD Mammoth Hydra (BiS)",
"Typhon Frost Hydra (BiS)",
"Vyr Archon (BiS+1)"),
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (Alt+Cube)",
"Helltooth Grasp (BiS)",
"LoD Carnevil DoD (BiS)",
"LoD Spirit Barrage (BiS)",
"Spirit Barrage Mundunugu (BiS)",
"Zuni Gargantuan (Alt+Cube)"),
new Build(HeroClass.Monk,
"Inna Mystic Ally (BiS+1)",
"LoD LTK (BiS)",
"LoD WoL (BiS)",
"PoJ Tempest Rush (BiS)",
"Sunwuko Wave of Light (BiS)",
"SWK Tempest Rush (BiS)",
"Uliana Seven-Sided Strike (BiS)"),
new Build(HeroClass.Crusader,
"Aegis of Valor Fist of the Heavens (BiS)",
"Aegis of Valor Heaven's Fury (BiS+1)",
"Blessed Hammer (BiS)",
"LoD Blessed Shield (BiS)",
"LoD Condemn (BiS)",
"Roland's Shield Bash (BiS)",
"Roland's Sweep Attack (BiS)",
"Thorns Bombardment (BiS)"),
new Build(HeroClass.Necromancer,
"Corpse Lance (BiS+2)",
"Generator (BiS)",
"LoD Blood Nova (BiS)",
"LoD Corpse Explosion (BiS)",
"LoD Corpse Lance (Alt+Cube)",
"LoD Poison Scythe (BiS+1)",
"LoD Singularity (BiS+1)",
"LoD Thorns Skeletons (Alt+Cube)",
"Masquerade Bone Spear (BiS)",
"Rathma Army of the Dead (BiS+2)"),
}},
{ "Cord of the Sherma", new Build[] {
new Build(HeroClass.None,
"Follower (BiS)"),
}},
{ "Corpsewhisper Pauldrons", new Build[] {
new Build(HeroClass.Necromancer,
"Corpse Lance (Cube+3)",
"LoD Corpse Lance (BiS)"),
}},
{ "Crown of the Invoker", new Build[] {
new Build(HeroClass.Crusader,
"Invoker Thorns (BiS+1)"),
}},
{ "Crown of the Light", new Build[] {
new Build(HeroClass.Crusader,
"Blessed Hammer (BiS+1)"),
}},
{ "Crown of Valor", new Build[] {
new Build(HeroClass.Crusader,
"Aegis of Valor Fist of the Heavens (BiS+1)",
"Aegis of Valor Heaven's Fury (BiS+2)"),
}},
{ "Crystal Fist", new Build[] {
new Build(HeroClass.Monk,
"Inna Mystic Ally (BiS)"),
}},
{ "Cuirass of the Wastes", new Build[] {
new Build(HeroClass.Barbarian,
"Rend Wastes (BiS+1)",
"Whirlwind GR Wastes (BiS+1)"),
}},
{ "Cuisses of Akkhan", new Build[] {
new Build(HeroClass.Crusader,
"Thorns Bombardment (BiS+1)"),
}},
{ "Danetta's Revenge", new Build[] {
new Build(HeroClass.DemonHunter,
"Unhallowed Essence Grenades (BiS)"),
}},
{ "Danetta's Spite", new Build[] {
new Build(HeroClass.DemonHunter,
"Unhallowed Essence Grenades (BiS)"),
}},
{ "Darklight", new Build[] {
new Build(HeroClass.Crusader,
"Aegis of Valor Fist of the Heavens (Cube+1)"),
}},
{ "Dashing Pauldrons of Despair", new Build[] {
new Build(HeroClass.Wizard,
"DMO Arcane Orbit (BiS+1)",
"DMO Energy Twister (BiS)",
"DMO Frozen Orb (BiS)"),
}},
{ "Dawn", new Build[] {
new Build(HeroClass.DemonHunter,
"Chakram (BiS+1)",
"GoD Hungering Arrow (Cube+1)",
"Marauder Cluster Arrow (Cube+2)",
"Natalya Rain of Vengeance (BiS)",
"Natalya Rapid Fire (BiS)",
"Shadow Impale (Cube+2)",
"Unhallowed Essence Grenades (BiS+Cube+1)"),
}},
{ "Dayntee's Binding", new Build[] {
new Build(HeroClass.Necromancer,
"Generator (BiS)",
"LoD Corpse Explosion (BiS)",
"LoD Poison Scythe (BiS+1)",
"LoD Singularity (BiS)",
"LoD Thorns Skeletons (BiS)",
"Trag'Oul Blood Mages (BiS)"),
}},
{ "Dead Man's Legacy", new Build[] {
new Build(HeroClass.DemonHunter,
"Natalya Rain of Vengeance (BiS)",
"Unhallowed Essence Multishot (BiS+1)"),
}},
{ "Deadly Rebirth", new Build[] {
new Build(HeroClass.WitchDoctor,
"Helltooth Grasp (BiS)"),
}},
{ "Death Watch Mantle", new Build[] {
new Build(HeroClass.Barbarian,
"Frenzy Thorns LoN (BiS)"),
}},
{ "Deathwish", new Build[] {
new Build(HeroClass.Wizard,
"Firebird Flame Blades (BiS)"),
}},
{ "Decree of Justice", new Build[] {
new Build(HeroClass.Monk,
"PoJ Tempest Rush (BiS+1)"),
}},
{ "Defender of Westmarch", new Build[] {
new Build(HeroClass.None,
"Follower (Alt for Templar)"),
}},
{ "Denial", new Build[] {
new Build(HeroClass.Crusader,
"Roland's Sweep Attack (BiS+1)"),
}},
{ "Depth Diggers", new Build[] {
new Build(HeroClass.DemonHunter,
"GoD Hungering Arrow (Cube+2)",
"Unhallowed Essence Grenades (BiS+1)"),
new Build(HeroClass.Barbarian,
"Frenzy HotNS (Cube+3)"),
new Build(HeroClass.WitchDoctor,
"LoD Carnevil DoD (BiS)",
"Zuni Carnevil Poison Dart (BiS+1)"),
new Build(HeroClass.Monk,
"Raiment Shenlong Generator (Cube+1)"),
new Build(HeroClass.Necromancer,
"Generator (BiS+Cube+1)",
"LoD Poison Scythe (BiS+1)"),
}},
{ "Drakon's Lesson", new Build[] {
new Build(HeroClass.Crusader,
"Roland's Shield Bash (BiS+1)"),
}},
{ "Dystopian Goggles", new Build[] {
new Build(HeroClass.DemonHunter,
"GoD Hungering Arrow (BiS+2)"),
}},
{ "Echoing Fury", new Build[] {
new Build(HeroClass.Barbarian,
"Frenzy HotNS (Alt)",
"Frenzy HotNS (BiS)",
"HotA GR LoD (BiS)",
"HotA IK (BiS)",
"HotA Raekor (BiS)",
"Rend Wastes (BiS)",
"Seismic Slam (BiS)",
"Support Barbarian (BiS)"),
new Build(HeroClass.WitchDoctor,
"Zuni Carnevil Poison Dart (Cube+1)"),
}},
{ "Eight-Demon Boots", new Build[] {
new Build(HeroClass.Monk,
"Raiment Shenlong Generator (BiS+1)"),
}},
{ "Elegant Pants", new Build[] {
new Build(HeroClass.Necromancer,
"Masquerade Bone Spear (BiS)"),
}},
{ "Elusive Ring", new Build[] {
new Build(HeroClass.DemonHunter,
"Marauder Cluster Arrow (Alt+Cube)",
"Natalya Rapid Fire (BiS)",
"Shadow Impale (Alt+1)"),
}},
{ "Emimei's Duffel", new Build[] {
new Build(HeroClass.DemonHunter,
"GoD Hungering Arrow (BiS)",
"GoD/Marauder Support (BiS)"),
}},
{ "Enchanting Favor", new Build[] {
new Build(HeroClass.None,
"Follower (BiS for Templar)",
"Follower (BiS)"),
}},
{ "Etched Sigil", new Build[] {
new Build(HeroClass.Wizard,
"DMO Energy Twister (BiS)",
"LoD Energy Twister (BiS)"),
}},
{ "Eun-jang-do", new Build[] {
new Build(HeroClass.None,
"Follower (BiS for Templar)"),
}},
{ "Extravagant Shoes", new Build[] {
new Build(HeroClass.Necromancer,
"Masquerade Bone Spear (BiS)"),
}},
{ "Eyes of the Earth", new Build[] {
new Build(HeroClass.Barbarian,
"Leap/Earthquake MotE (BiS+1)",
"Seismic Slam (BiS+1)"),
}},
{ "Faithful Memory", new Build[] {
new Build(HeroClass.Crusader,
"Blessed Hammer (Cube+1)"),
}},
{ "Fate of the Fell", new Build[] {
new Build(HeroClass.Crusader,
"Aegis of Valor Heaven's Fury (Cube+2)"),
}},
{ "Fate's Vow", new Build[] {
new Build(HeroClass.Necromancer,
"Rathma Army of the Dead (Cube+3)"),
}},
{ "Fazula's Improbable Chain", new Build[] {
new Build(HeroClass.Wizard,
"Vyr Archon (BiS+2)"),
}},
{ "Fiendish Grips", new Build[] {
new Build(HeroClass.DemonHunter,
"Chakram (BiS+1)",
"Unhallowed Essence Grenades (BiS+1)",
"Unhallowed Essence Multishot (BiS+1)"),
}},
{ "Fierce Gauntlets", new Build[] {
new Build(HeroClass.Wizard,
"DMO Arcane Orbit (BiS+1)",
"DMO Energy Twister (BiS)",
"DMO Frozen Orb (BiS)"),
}},
{ "Firebird's Breast", new Build[] {
new Build(HeroClass.Wizard,
"Firebird Flame Blades (BiS+3)"),
}},
{ "Firebird's Down", new Build[] {
new Build(HeroClass.Wizard,
"Firebird Flame Blades (BiS)"),
}},
{ "Firebird's Eye", new Build[] {
new Build(HeroClass.Wizard,
"Firebird Flame Blades (BiS)",
"Firebird Flame Blades (BiS)"),
}},
{ "Firebird's Pinions", new Build[] {
new Build(HeroClass.Wizard,
"Explosive Blast Farming (BiS)",
"Firebird Flame Blades (BiS+1)"),
}},
{ "Firebird's Plume", new Build[] {
new Build(HeroClass.Wizard,
"Firebird Flame Blades (BiS+3)"),
}},
{ "Firebird's Talons", new Build[] {
new Build(HeroClass.Wizard,
"Firebird Flame Blades (BiS+3)"),
}},
{ "Firebird's Tarsi", new Build[] {
new Build(HeroClass.Wizard,
"Explosive Blast Farming (BiS)",
"Firebird Flame Blades (BiS+3)"),
}},
{ "Fists of Thunder", new Build[] {
new Build(HeroClass.Monk,
"Raiment Shenlong Generator (BiS+2)"),
}},
{ "Fjord Cutter", new Build[] {
new Build(HeroClass.Barbarian,
"Seismic Slam (BiS+1)"),
}},
{ "Flail of the Ascended", new Build[] {
new Build(HeroClass.Crusader,
"Roland's Shield Bash (BiS+1)"),
}},
{ "Flail of the Charge", new Build[] {
new Build(HeroClass.Crusader,
"Aegis of Valor Fist of the Heavens (BiS+1)",
"Invoker Thorns (BiS+1)",
"Thorns Bombardment (BiS+1)"),
}},
{ "Flying Dragon", new Build[] {
new Build(HeroClass.Monk,
"Inna Mystic Ally (Cube+2)",
"Raiment Shenlong Generator (Cube+1)"),
}},
{ "Focus", new Build[] {
new Build(HeroClass.DemonHunter,
"Chakram (BiS)",
"GoD Hungering Arrow (BiS+2)",
"Marauder Cluster Arrow (BiS)",
"Marauder Cluster Arrow (BiS)",
"Natalya Rain of Vengeance (BiS)",
"Unhallowed Essence Multishot (BiS)"),
new Build(HeroClass.Barbarian,
"Frenzy HotNS (Alt)",
"HotA IK (BiS)",
"HotA Raekor (Alt)",
"Leap/Earthquake MotE (BiS+1)"),
new Build(HeroClass.Wizard,
"DMO Arcane Orbit (BiS)",
"Explosive Blast Farming (BiS)",
"Firebird Flame Blades (BiS+1)"),
new Build(HeroClass.WitchDoctor,
"Helltooth Acid Cloud (BiS)"),
new Build(HeroClass.Monk,
"Inna Mystic Ally (BiS)",
"Raiment Shenlong Generator (BiS)"),
new Build(HeroClass.Crusader,
"Akkhan Condemn (BiS)"),
}},
{ "Fortress Ballista", new Build[] {
new Build(HeroClass.DemonHunter,
"Unhallowed Essence Grenades (BiS)"),
}},
{ "Foundation of the Earth", new Build[] {
new Build(HeroClass.Barbarian,
"Leap/Earthquake MotE (BiS+1)",
"Seismic Slam (BiS+1)"),
}},
{ "Foundation of the Light", new Build[] {
new Build(HeroClass.Crusader,
"Blessed Hammer (BiS+1)"),
}},
{ "Fragment of Destiny", new Build[] {
new Build(HeroClass.Wizard,
"Firebird Flame Blades (BiS+1)"),
}},
{ "Freeze of Deflection", new Build[] {
new Build(HeroClass.None,
"Follower (BiS for Templar)",
"Follower (BiS)"),
}},
{ "Frostburn", new Build[] {
new Build(HeroClass.Wizard,
"LoD Frozen Orb (BiS)"),
new Build(HeroClass.WitchDoctor,
"LoD Spirit Barrage (BiS+2)"),
new Build(HeroClass.Necromancer,
"LoD Corpse Lance (BiS)"),
}},
{ "Frydehr's Wrath", new Build[] {
new Build(HeroClass.Crusader,
"Akkhan Condemn (BiS+1)",
"LoD Condemn (BiS)"),
}},
{ "Fury of the Ancients", new Build[] {
new Build(HeroClass.Barbarian,
"HotA GR LoD (BiS)",
"HotA IK (BiS+1)"),
}},
{ "Fury of the Vanished Peak", new Build[] {
new Build(HeroClass.Barbarian,
"Seismic Slam (Cube+1)"),
}},
{ "Gabriel's Vambraces", new Build[] {
new Build(HeroClass.Crusader,
"Blessed Hammer (BiS+1)"),
}},
{ "Galvanized Vest", new Build[] {
new Build(HeroClass.DemonHunter,
"GoD Hungering Arrow (BiS+2)",
"GoD/Marauder Support (BiS)"),
}},
{ "Gas Powered Automail Forearm", new Build[] {
new Build(HeroClass.DemonHunter,
"GoD Hungering Arrow (BiS+2)",
"GoD/Marauder Support (BiS)"),
}},
{ "Gauntlet of the Wastes", new Build[] {
new Build(HeroClass.Barbarian,
"Rend Wastes (BiS+1)",
"Whirlwind GR Wastes (BiS+1)"),
}},
{ "Gauntlets of Akkhan", new Build[] {
new Build(HeroClass.Crusader,
"Akkhan Condemn (BiS+1)",
"Thorns Bombardment (BiS+1)"),
}},
{ "Gauntlets of Valor", new Build[] {
new Build(HeroClass.Crusader,
"Aegis of Valor Fist of the Heavens (BiS+1)",
"Aegis of Valor Heaven's Fury (BiS+1)"),
}},
{ "Gazing Demise", new Build[] {
new Build(HeroClass.WitchDoctor,
"LoD Spirit Barrage (BiS+2)",
"Spirit Barrage Mundunugu (BiS+2)"),
}},
{ "Gelmindor's Marrow Guards", new Build[] {
new Build(HeroClass.Necromancer,
"Masquerade Bone Spear (BiS+1)"),
}},
{ "Girdle of Giants", new Build[] {
new Build(HeroClass.Barbarian,
"Leap/Earthquake MotE (BiS)"),
}},
{ "Glamorous Gigot", new Build[] {
new Build(HeroClass.Necromancer,
"Masquerade Bone Spear (BiS+1)"),
}},
{ "Gloves of Worship", new Build[] {
new Build(HeroClass.DemonHunter,
"Shadow Impale (BiS)"),
new Build(HeroClass.WitchDoctor,
"Spirit Barrage Mundunugu (BiS)"),
new Build(HeroClass.Crusader,
"Aegis of Valor Heaven's Fury (BiS)"),
new Build(HeroClass.None,
"Follower (BiS)",
"Follower (BiS)"),
}},
{ "Goldskin", new Build[] {
new Build(HeroClass.None,
"Follower (BiS)"),
}},
{ "Goldwrap", new Build[] {
new Build(HeroClass.DemonHunter,
"Natalya Rain of Vengeance (BiS)"),
new Build(HeroClass.Barbarian,
"Leap/Earthquake MotE (Alt)",
"Seismic Slam (Alt)"),
new Build(HeroClass.Wizard,
"DMO Arcane Orbit (BiS)"),
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (BiS)",
"Helltooth Acid Cloud (BiS)",
"Helltooth Gargantuan (Alt+1)",
"Jade Harvester (BiS)",
"LoD Spirit Barrage (BiS+Cube)",
"Spirit Barrage Mundunugu (BiS)",
"Zuni Carnevil Poison Dart (BiS)"),
new Build(HeroClass.Monk,
"Raiment Shenlong Generator (BiS)",
"SWK LTK (BiS)"),
new Build(HeroClass.Crusader,
"Aegis of Valor Fist of the Heavens (BiS)",
"Aegis of Valor Heaven's Fury (BiS)",
"Blessed Hammer (BiS)"),
new Build(HeroClass.Necromancer,
"Corpse Lance (BiS)",
"Generator (BiS)",
"LoD Corpse Explosion (BiS)",
"LoD Singularity (BiS)",
"Masquerade Bone Spear (BiS)",
"Trag'Oul Blood Mages (BiS)"),
}},
{ "Golemskin Breeches", new Build[] {
new Build(HeroClass.Necromancer,
"LoD Thorns Skeletons (BiS)"),
}},
{ "Grasps of Essence", new Build[] {
new Build(HeroClass.Necromancer,
"LoD Corpse Explosion (BiS+1)"),
}},
{ "Greaves of Valor", new Build[] {
new Build(HeroClass.Crusader,
"Aegis of Valor Fist of the Heavens (BiS+1)",
"Aegis of Valor Heaven's Fury (BiS+2)"),
}},
{ "Guard of Johanna", new Build[] {
new Build(HeroClass.Crusader,
"Blessed Hammer (BiS+1)"),
}},
{ "Gungdo Gear", new Build[] {
new Build(HeroClass.Monk,
"Uliana Seven-Sided Strike (BiS+1)"),
}},
{ "Gyana Na Kashu", new Build[] {
new Build(HeroClass.Monk,
"LoD LTK (BiS)",
"SWK LTK (BiS)"),
}},
{ "Gyrfalcon's Foote", new Build[] {
new Build(HeroClass.Crusader,
"LoD Blessed Shield (BiS)"),
}},
{ "Hack", new Build[] {
new Build(HeroClass.Barbarian,
"Frenzy Thorns LoN (BiS+1)"),
}},
{ "Halcyon's Ascent", new Build[] {
new Build(HeroClass.Necromancer,
"Support Necromancer (Alt)"),
}},
{ "Halo of Karini", new Build[] {
new Build(HeroClass.Wizard,
"DMO Energy Twister (Alt+Cube)",
"LoD Energy Twister (BiS)",
"LoD Frozen Orb (BiS)",
"LoD Mammoth Hydra (BiS)",
"Typhon Frost Hydra (BiS)",
"Vyr Archon (BiS+2)"),
}},
{ "Hammer Jammers", new Build[] {
new Build(HeroClass.Crusader,
"Blessed Hammer (Cube+1)"),
}},
{ "Hand of the Prophet", new Build[] {
new Build(HeroClass.None,
"Follower (BiS)"),
}},
{ "Harness of Truth", new Build[] {
new Build(HeroClass.Wizard,
"DMO Arcane Orbit (BiS+1)",
"DMO Energy Twister (BiS)",
"DMO Frozen Orb (BiS)"),
}},
{ "Haunted Visions", new Build[] {
new Build(HeroClass.Necromancer,
"Generator (BiS+1)",
"LoD Blood Nova (BiS)",
"LoD Poison Scythe (BiS+2)",
"LoD Singularity (BiS+2)",
"Masquerade Bone Spear (BiS+1)",
"Rathma Army of the Dead (Alt)",
"Rathma Army of the Dead (Alt)"),
}},
{ "Heart of the Crashing Wave", new Build[] {
new Build(HeroClass.Monk,
"Raiment Shenlong Generator (BiS+1)"),
}},
{ "Heart of the Light", new Build[] {
new Build(HeroClass.Crusader,
"Blessed Hammer (BiS+1)"),
}},
{ "Heel of Savages", new Build[] {
new Build(HeroClass.Barbarian,
"Frenzy HotNS (BiS+3)"),
}},
{ "Hell Walkers", new Build[] {
new Build(HeroClass.DemonHunter,
"Chakram (BiS)",
"Unhallowed Essence Grenades (BiS+1)",
"Unhallowed Essence Multishot (BiS)"),
}},
{ "Hellcat Waistguard", new Build[] {
new Build(HeroClass.DemonHunter,
"Marauder Cluster Arrow (Alt+Cube)",
"Natalya Rain of Vengeance (BiS)",
"Natalya Rapid Fire (BiS)",
"Unhallowed Essence Grenades (BiS+Cube+2)"),
}},
{ "Hellrack", new Build[] {
new Build(HeroClass.None,
"Follower (Alt for Scoundrel)"),
}},
{ "Helltooth Gauntlets", new Build[] {
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (Alt)",
"Helltooth Acid Cloud (BiS+1)",
"Helltooth Gargantuan (BiS+1)",
"Helltooth Grasp (BiS)",
"Helltooth Zombie Bears (BiS+1)"),
}},
{ "Helltooth Greaves", new Build[] {
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (Alt)",
"Helltooth Acid Cloud (BiS+1)",
"Helltooth Gargantuan (BiS+1)",
"Helltooth Grasp (BiS)",
"Helltooth Zombie Bears (BiS+1)"),
}},
{ "Helltooth Leg Guards", new Build[] {
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (Alt)",
"Helltooth Acid Cloud (BiS+1)",
"Helltooth Gargantuan (BiS+1)",
"Helltooth Grasp (BiS)"),
}},
{ "Helltooth Mantle", new Build[] {
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (Alt)",
"Helltooth Acid Cloud (BiS+1)",
"Helltooth Gargantuan (BiS+1)",
"Helltooth Grasp (BiS)",
"Helltooth Zombie Bears (BiS+1)"),
}},
{ "Helltooth Mask", new Build[] {
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (Alt)",
"Helltooth Acid Cloud (BiS+1)",
"Helltooth Gargantuan (BiS+1)",
"Helltooth Grasp (BiS)",
"Helltooth Zombie Bears (BiS+1)"),
}},
{ "Helltooth Tunic", new Build[] {
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (Alt)",
"Helltooth Acid Cloud (BiS+1)",
"Helltooth Gargantuan (BiS+1)",
"Helltooth Grasp (BiS)",
"Helltooth Zombie Bears (BiS+1)"),
}},
{ "Helm of Akkhan", new Build[] {
new Build(HeroClass.Crusader,
"Akkhan Condemn (BiS+1)",
"Thorns Bombardment (BiS)"),
}},
{ "Helm of the Wastes", new Build[] {
new Build(HeroClass.Barbarian,
"Rend Wastes (BiS+1)",
"Whirlwind GR Wastes (BiS+1)"),
}},
{ "Henri's Perquisition", new Build[] {
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (BiS)",
"Helltooth Gargantuan (BiS)",
"Jade Harvester (BiS+1)"),
}},
{ "Hergbrash's Binding", new Build[] {
new Build(HeroClass.Wizard,
"DMO Energy Twister (BiS)",
"LoD Energy Twister (Alt)"),
}},
{ "Hexing Pants of Mr. Yan", new Build[] {
new Build(HeroClass.Barbarian,
"Rend Wastes (Alt)"),
new Build(HeroClass.Monk,
"SWK Tempest Rush (BiS)"),
new Build(HeroClass.Crusader,
"Akkhan Condemn (BiS)"),
new Build(HeroClass.Necromancer,
"LoD Singularity (BiS+2)",
"LoD Thorns Skeletons (Alt+Cube)"),
}},
{ "Holy Point Shot", new Build[] {
new Build(HeroClass.DemonHunter,
"Shadow Impale (BiS+2)"),
}},
{ "Homing Pads", new Build[] {
new Build(HeroClass.DemonHunter,
"Natalya Rain of Vengeance (BiS)"),
new Build(HeroClass.Barbarian,
"Frenzy Thorns LoN (BiS)"),
new Build(HeroClass.WitchDoctor,
"Zuni Gargantuan (BiS)"),
new Build(HeroClass.None,
"Follower (BiS)",
"Follower (BiS)",
"Follower (BiS)"),
}},
{ "Hunter's Wrath", new Build[] {
new Build(HeroClass.DemonHunter,
"GoD Hungering Arrow (BiS+2)",
"Unhallowed Essence Grenades (Alt+Cube+2)"),
}},
{ "Ice Climbers", new Build[] {
new Build(HeroClass.Barbarian,
"Frenzy Thorns LoN (Alt+1)"),
new Build(HeroClass.Wizard,
"LoD Energy Twister (BiS)",
"LoD Frozen Orb (BiS)",
"LoD Mammoth Hydra (BiS)"),
new Build(HeroClass.Crusader,
"LoD Blessed Shield (BiS)"),
new Build(HeroClass.Necromancer,
"LoD Blood Nova (BiS)",
"LoD Corpse Explosion (BiS)",
"LoD Poison Scythe (BiS)",
"LoD Singularity (BiS)"),
new Build(HeroClass.None,
"Follower (BiS)",
"Follower (BiS)",
"Follower (BiS)"),
}},
{ "Illusory Boots", new Build[] {
new Build(HeroClass.Barbarian,
"Frenzy Thorns LoN (BiS+1)",
"HotA GR LoD (BiS)",
"Support Barbarian (BiS+1)"),
new Build(HeroClass.Wizard,
"LoD Mammoth Hydra (Alt)"),
new Build(HeroClass.WitchDoctor,
"LoD Carnevil DoD (BiS)",
"LoD Spirit Barrage (BiS+2)"),
new Build(HeroClass.Monk,
"Support Monk (BiS)"),
new Build(HeroClass.Crusader,
"LoD Condemn (BiS)"),
new Build(HeroClass.Necromancer,
"LoD Corpse Explosion (Alt)",
"LoD Corpse Lance (Alt)",
"LoD Poison Scythe (Alt+Cube+1)",
"LoD Thorns Skeletons (BiS)"),
}},
{ "Immortal King's Boulder Breaker", new Build[] {
new Build(HeroClass.Barbarian,
"Furious Charge IK/Raekor (BiS+1)"),
}},
{ "Immortal King's Eternal Reign", new Build[] {
new Build(HeroClass.Barbarian,
"Furious Charge IK/Raekor (BiS+1)",
"HotA IK (BiS+1)"),
}},
{ "Immortal King's Irons", new Build[] {
new Build(HeroClass.Barbarian,
"Furious Charge IK/Raekor (BiS+1)",
"HotA IK (BiS+1)"),
}},
{ "Immortal King's Stature", new Build[] {
new Build(HeroClass.Barbarian,
"Furious Charge IK/Raekor (BiS+1)",
"HotA IK (BiS+1)"),
}},
{ "Immortal King's Stride", new Build[] {
new Build(HeroClass.Barbarian,
"HotA IK (BiS+1)"),
}},
{ "Immortal King's Tribal Binding", new Build[] {
new Build(HeroClass.Barbarian,
"Furious Charge IK/Raekor (BiS+1)",
"HotA IK (BiS+1)"),
}},
{ "Immortal King's Triumph", new Build[] {
new Build(HeroClass.Barbarian,
"HotA IK (BiS+1)"),
}},
{ "Inarius's Conviction", new Build[] {
new Build(HeroClass.Necromancer,
"Generator (BiS+1)"),
}},
{ "Inarius's Martyrdom", new Build[] {
new Build(HeroClass.Necromancer,
"Generator (BiS+1)"),
}},
{ "Inarius's Perseverance", new Build[] {
new Build(HeroClass.Necromancer,
"Generator (BiS+1)"),
}},
{ "Inarius's Understanding", new Build[] {
new Build(HeroClass.Necromancer,
"Generator (BiS+1)"),
}},
{ "Inarius's Will", new Build[] {
new Build(HeroClass.Necromancer,
"Generator (BiS+1)"),
}},
{ "Incense Torch of the Grand Temple", new Build[] {
new Build(HeroClass.Monk,
"Sunwuko Wave of Light (Cube+2)"),
}},
{ "In-geom", new Build[] {
new Build(HeroClass.Barbarian,
"Frenzy HotNS (BiS)",
"Frenzy HotNS (BiS)",
"HotA IK (BiS)",
"HotA Raekor (BiS)",
"Seismic Slam (BiS)",
"Support Barbarian (BiS)"),
new Build(HeroClass.Wizard,
"Firebird Flame Blades (BiS)"),
new Build(HeroClass.WitchDoctor,
"Jade Harvester (BiS)"),
new Build(HeroClass.Monk,
"Inna Mystic Ally (BiS)",
"Sunwuko Wave of Light (BiS)",
"Uliana Seven-Sided Strike (BiS)"),
new Build(HeroClass.Crusader,
"Aegis of Valor Heaven's Fury (BiS)"),
new Build(HeroClass.Necromancer,
"Generator (BiS)",
"LoD Corpse Explosion (BiS)",
"Support Necromancer (BiS)"),
}},
{ "Inna's Favor", new Build[] {
new Build(HeroClass.Monk,
"Inna Mystic Ally (BiS+2)",
"Raiment Shenlong Generator (BiS)",
"Sunwuko Wave of Light (BiS)"),
}},
{ "Inna's Hold", new Build[] {
new Build(HeroClass.Monk,
"Inna Mystic Ally (BiS+2)",
"Sunwuko Wave of Light (BiS)",
"Support Monk (BiS)"),
}},
{ "Inna's Radiance", new Build[] {
new Build(HeroClass.Monk,
"Inna Mystic Ally (BiS+2)",
"Raiment Shenlong Generator (BiS)",
"Support Monk (BiS)"),
}},
{ "Inna's Reach", new Build[] {
new Build(HeroClass.Monk,
"Inna Mystic Ally (BiS)"),
}},
{ "Inna's Sandals", new Build[] {
new Build(HeroClass.Monk,
"Raiment Shenlong Generator (BiS)",
"Sunwuko Wave of Light (BiS)"),
}},
{ "Inna's Temperance", new Build[] {
new Build(HeroClass.Monk,
"Inna Mystic Ally (BiS+2)",
"Raiment Shenlong Generator (BiS)",
"Sunwuko Wave of Light (BiS)"),
}},
{ "Inna's Vast Expanse", new Build[] {
new Build(HeroClass.Monk,
"Inna Mystic Ally (BiS+2)",
"Raiment Shenlong Generator (BiS)",
"Sunwuko Wave of Light (BiS)",
"Support Monk (BiS)"),
}},
{ "Iron Rose", new Build[] {
new Build(HeroClass.Necromancer,
"LoD Blood Nova (BiS)",
"LoD Corpse Explosion (BiS+1)"),
}},
{ "Jade Harvester's Courage", new Build[] {
new Build(HeroClass.WitchDoctor,
"Jade Harvester (BiS)"),
}},
{ "Jade Harvester's Joy", new Build[] {
new Build(HeroClass.WitchDoctor,
"Jade Harvester (BiS+1)"),
}},
{ "Jade Harvester's Mercy", new Build[] {
new Build(HeroClass.WitchDoctor,
"Jade Harvester (BiS+1)"),
}},
{ "Jade Harvester's Peace", new Build[] {
new Build(HeroClass.WitchDoctor,
"Jade Harvester (BiS+1)"),
}},
{ "Jade Harvester's Swiftness", new Build[] {
new Build(HeroClass.WitchDoctor,
"Jade Harvester (BiS+1)"),
}},
{ "Jade Harvester's Wisdom", new Build[] {
new Build(HeroClass.WitchDoctor,
"Jade Harvester (BiS+1)"),
}},
{ "Jekangbord", new Build[] {
new Build(HeroClass.Crusader,
"LoD Blessed Shield (BiS)"),
}},
{ "Jeram's Bracers", new Build[] {
new Build(HeroClass.WitchDoctor,
"Helltooth Acid Cloud (BiS+1)"),
}},
{ "Jesseth Skullscythe", new Build[] {
new Build(HeroClass.Necromancer,
"Corpse Lance (BiS+3)",
"Rathma Army of the Dead (BiS+3)",
"Trag'Oul Blood Mages (BiS+1)"),
}},
{ "Jesseth Skullshield", new Build[] {
new Build(HeroClass.Necromancer,
"Corpse Lance (BiS+3)",
"Rathma Army of the Dead (BiS+3)",
"Trag'Oul Blood Mages (BiS+1)"),
}},
{ "Johanna's Argument", new Build[] {
new Build(HeroClass.Crusader,
"Aegis of Valor Heaven's Fury (BiS)"),
}},
{ "Justice Lantern", new Build[] {
new Build(HeroClass.Crusader,
"LoD Blessed Shield (BiS)",
"Roland's Shield Bash (BiS)",
"Thorns Bombardment (BiS)"),
new Build(HeroClass.None,
"Follower (Alt for Templar)"),
}},
{ "Karlei's Point", new Build[] {
new Build(HeroClass.DemonHunter,
"Shadow Impale (BiS+2)"),
}},
{ "Khassett's Cord of Righteousness", new Build[] {
new Build(HeroClass.Crusader,
"Aegis of Valor Fist of the Heavens (Cube+1)"),
}},
{ "Krelm's Buff Belt", new Build[] {
new Build(HeroClass.WitchDoctor,
"Helltooth Gargantuan (Alt+1)"),
}},
{ "Krelm's Buff Bracers", new Build[] {
new Build(HeroClass.Necromancer,
"Generator (BiS+1)",
"LoD Blood Nova (BiS)",
"LoD Corpse Explosion (BiS)",
"LoD Corpse Lance (BiS)",
"LoD Poison Scythe (BiS)"),
}},
{ "Krysbin's Sentence", new Build[] {
new Build(HeroClass.Necromancer,
"Corpse Lance (BiS+3)",
"Generator (BiS+1)",
"LoD Blood Nova (BiS)",
"LoD Corpse Explosion (BiS+2)",
"LoD Corpse Lance (BiS)",
"LoD Poison Scythe (BiS+1)",
"LoD Singularity (Alt+Cube+2)",
"LoD Thorns Skeletons (BiS)",
"Masquerade Bone Spear (BiS+1)",
"Rathma Army of the Dead (BiS+3)",
"Trag'Oul Blood Mages (Alt+Cube+2)"),
}},
{ "Kyoshiro's Blade", new Build[] {
new Build(HeroClass.Monk,
"LoD WoL (BiS)",
"Sunwuko Wave of Light (BiS+1)"),
}},
{ "Lacuni Prowlers", new Build[] {
new Build(HeroClass.Necromancer,
"Corpse Lance (BiS+3)",
"Trag'Oul Blood Mages (BiS)"),
}},
{ "Lakumba's Ornament", new Build[] {
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (BiS+1)",
"Helltooth Gargantuan (BiS)",
"Helltooth Grasp (BiS)",
"Helltooth Zombie Bears (BiS)",
"Jade Harvester (BiS)",
"LoD Carnevil DoD (BiS)",
"LoD Spirit Barrage (BiS+2)",
"Spirit Barrage Mundunugu (BiS+1)",
"Zuni Gargantuan (BiS)"),
}},
{ "Lamellars of Justice", new Build[] {
new Build(HeroClass.Monk,
"PoJ Tempest Rush (BiS+1)"),
}},
{ "Lamentation", new Build[] {
new Build(HeroClass.Barbarian,
"Rend Wastes (BiS+2)"),
}},
{ "Lavishing Gloves", new Build[] {
new Build(HeroClass.Necromancer,
"Masquerade Bone Spear (BiS+1)"),
}},
{ "Lefebvre's Soliloquy", new Build[] {
new Build(HeroClass.Monk,
"Inna Mystic Ally (BiS+2)",
"LoD LTK (BiS)",
"LoD WoL (BiS)"),
}},
{ "Leg Guards of Mystery", new Build[] {
new Build(HeroClass.Wizard,
"DMO Arcane Orbit (BiS+1)",
"DMO Energy Twister (BiS)",
"DMO Frozen Orb (BiS)"),
}},
{ "Leger's Disdain", new Build[] {
new Build(HeroClass.Necromancer,
"Generator (BiS+1)",
"LoD Poison Scythe (BiS+1)"),
}},
{ "Leggings of Savages", new Build[] {
new Build(HeroClass.Barbarian,
"Frenzy HotNS (BiS+2)"),
}},
{ "Leonine Bow of Hashir", new Build[] {
new Build(HeroClass.DemonHunter,
"GoD Hungering Arrow (BiS)",
"GoD/Marauder Support (BiS)"),
}},
{ "Leoric's Crown", new Build[] {
new Build(HeroClass.DemonHunter,
"GoD/Marauder Support (BiS)"),
new Build(HeroClass.Barbarian,
"Frenzy Thorns LoN (BiS+Cube+1)",
"HotA GR LoD (BiS)",
"Support Barbarian (BiS)"),
new Build(HeroClass.Wizard,
"LoD Energy Twister (Alt)"),
new Build(HeroClass.WitchDoctor,
"LoD Spirit Barrage (BiS+1)"),
new Build(HeroClass.Crusader,
"LoD Blessed Shield (BiS)",
"LoD Condemn (BiS)",
"Thorns Bombardment (BiS)"),
new Build(HeroClass.Necromancer,
"LoD Blood Nova (BiS)",
"LoD Corpse Explosion (BiS+1)",
"LoD Corpse Lance (BiS)",
"LoD Singularity (BiS+1)",
"Support Necromancer (BiS)"),
new Build(HeroClass.None,
"Follower (BiS)",
"Follower (BiS)",
"Follower (BiS)"),
}},
{ "Lidless Wall", new Build[] {
new Build(HeroClass.Crusader,
"Aegis of Valor Fist of the Heavens (BiS)"),
new Build(HeroClass.None,
"Follower (Alt for Templar)"),
}},
{ "Lion's Claw", new Build[] {
new Build(HeroClass.Monk,
"Uliana Seven-Sided Strike (BiS)"),
}},
{ "Litany of the Undaunted", new Build[] {
new Build(HeroClass.Barbarian,
"Frenzy Thorns LoN (BiS+1)"),
new Build(HeroClass.WitchDoctor,
"LoD Spirit Barrage (BiS)"),
new Build(HeroClass.Monk,
"LoD WoL (Alt)"),
}},
{ "Little Rogue", new Build[] {
new Build(HeroClass.Barbarian,
"Rend Wastes (BiS)",
"Support Barbarian (BiS)"),
}},
{ "Lost Time", new Build[] {
new Build(HeroClass.Necromancer,
"Corpse Lance (BiS+3)",
"LoD Corpse Lance (BiS)",
"LoD Singularity (BiS+2)",
"Masquerade Bone Spear (BiS+1)",
"Rathma Army of the Dead (BiS+3)",
"Trag'Oul Blood Mages (BiS+1)"),
}},
{ "Lut Socks", new Build[] {
new Build(HeroClass.Barbarian,
"Leap/Earthquake MotE (Cube+1)"),
}},
{ "Luxurious Bauta", new Build[] {
new Build(HeroClass.Necromancer,
"Masquerade Bone Spear (BiS+1)"),
}},
{ "Magefist", new Build[] {
new Build(HeroClass.Barbarian,
"HotA GR LoD (BiS)"),
new Build(HeroClass.Monk,
"LoD LTK (BiS)",
"LoD WoL (BiS)"),
}},
{ "Manajuma's Carving Knife", new Build[] {
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (BiS)",
"Helltooth Gargantuan (BiS)"),
}},
{ "Manajuma's Gory Fetch", new Build[] {
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (BiS)",
"Helltooth Gargantuan (BiS)"),
}},
{ "Manticore", new Build[] {
new Build(HeroClass.DemonHunter,
"Marauder Cluster Arrow (BiS+1)"),
}},
{ "Mantle of Channeling", new Build[] {
new Build(HeroClass.DemonHunter,
"Natalya Rain of Vengeance (BiS)"),
new Build(HeroClass.Wizard,
"LoD Energy Twister (BiS)"),
new Build(HeroClass.WitchDoctor,
"Arachyr Firebats (Cube+1)",
"Zuni Gargantuan (BiS)"),
new Build(HeroClass.Monk,
"SWK Tempest Rush (BiS)"),
new Build(HeroClass.Necromancer,
"LoD Blood Nova (BiS)",
"LoD Corpse Explosion (BiS+1)"),
}},
{ "Mantle of the Upside-Down Sinners", new Build[] {
new Build(HeroClass.Monk,
"Raiment Shenlong Generator (BiS+2)"),
}},