RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
BonusParser.java
1package com.osroyale.util.tools.wiki.impl;
2
3import com.google.gson.JsonArray;
4import com.google.gson.JsonElement;
5import com.google.gson.JsonObject;
6import com.osroyale.game.world.items.ItemDefinition;
7import com.osroyale.game.world.items.containers.equipment.Equipment;
8import com.osroyale.util.tools.wiki.parser.WikiTable;
9import com.osroyale.util.tools.wiki.parser.WikiTableParser;
10import org.jsoup.nodes.Document;
11import org.jsoup.nodes.Element;
12import org.jsoup.select.Elements;
13
14import java.util.*;
15
44
45public class BonusParser extends WikiTableParser {
46
48 private static final String[] TABLE_LINKS = {
49 "http://oldschoolrunescape.wikia.com/wiki/Ammunition_slot_table",
50 "http://oldschoolrunescape.wikia.com/wiki/Body_slot_table",
51 "http://oldschoolrunescape.wikia.com/wiki/Cape_slot_table",
52 "http://oldschoolrunescape.wikia.com/wiki/Feet_slot_table",
53 "http://oldschoolrunescape.wikia.com/wiki/Hand_slot_table",
54 "http://oldschoolrunescape.wikia.com/wiki/Head_slot_table",
55 "http://oldschoolrunescape.wikia.com/wiki/Legwear_slot_table",
56 "http://oldschoolrunescape.wikia.com/wiki/Neck_slot_table",
57 "http://oldschoolrunescape.wikia.com/wiki/Ring_slot_table",
58 "http://oldschoolrunescape.wikia.com/wiki/Shield_slot_table",
59 "http://oldschoolrunescape.wikia.com/wiki/Two-handed_slot_table",
60 "http://oldschoolrunescape.wikia.com/wiki/Weapons_table"
61 };
62
63 private BonusParser() {
64 super(generateTables());
65 }
66
67 private static LinkedList<WikiTable> generateTables() {
68 LinkedList<WikiTable> tables = new LinkedList<>();
69
70 for (String link : TABLE_LINKS) {
71 tables.add(new WikiTable(link) {
72 @Override
73 public void parseDocument(Document document) {
74 for (Element wikiTable : document.select(".wikitable")) {
75 for (Element children : wikiTable.children()) {
76 Iterator<Element> iterator = children.children().iterator();
77 iterator.next();
78 while (iterator.hasNext()) {
79 Element child = iterator.next();
80 Elements bonuses = child.children();
81 String name = bonuses.remove(0).text();
82 try {
83 JsonObject object = new JsonObject();
84 object.addProperty("name", name);
85
86 int idx = 0;
87 int[] bonusArray = new int[Equipment.SIZE];
88 for (Element data : bonuses) {
89
90 if (data.text().isEmpty()) {
91 idx++;
92 continue;
93 }
94
95 if (data.text().contains("trimmed"))
96 continue;
97
98 if (idx >= bonusArray.length)
99 break;
100
101 if ((link.contains("Neck") || link.contains("Body") || link.contains("Leg") || link.contains("Feet") || link.contains("Head") || link.contains("Cape") || link.contains("Ammu") || link.contains("Hand")) && idx == Equipment.RANGED_STRENGTH) {
102 bonusArray[Equipment.PRAYER_BONUS] = Integer.parseInt(data.text());
103 } else {
104 bonusArray[idx++] = Integer.parseInt(data.text());
105 }
106 }
107 object.add("bonuses", GSON.toJsonTree(bonusArray));
108 table.add(object);
109 } catch (Exception e) {
110 System.err.println("Failed to parse " + name + " --- " + e.toString());
111 }
112 }
113 }
114 }
115 }
116 });
117 }
118
119 return tables;
120 }
121
122 @Override
123 protected void finish() {
124 Map<String, Integer[]> bonusMap = new HashMap<>(tables.size());
125 JsonArray array = new JsonArray();
126
127 for (WikiTable table : tables) {
128 JsonArray tableData = table.getTable();
129 array.addAll(tableData);
130
131 for (JsonElement data : tableData) {
132 JsonObject next = (JsonObject) data;
133 String name = next.get("name").getAsString();
134 Integer[] bonuses = GSON.fromJson(next.get("bonuses"), Integer[].class);
135 if (bonusMap.containsKey(name)) {
136 System.err.println("Conflicting item: " + name);
137 System.err.println(Arrays.toString(bonuses));
138 System.err.println(Arrays.toString(bonusMap.get(name)));
139 System.err.println();
140 } else {
141 bonusMap.put(name, bonuses);
142 }
143 }
144 }
145
146 writeToJson("wiki_dump", array);
147
148 ItemDefinition.createParser().run();
149 for (ItemDefinition definition : ItemDefinition.DEFINITIONS) {
150 if (definition == null) continue;
151 Integer[] bonuses = bonusMap.get(definition.getName());
152 if (bonuses != null) {
153 Arrays.setAll(definition.getBonuses(), index -> bonuses[index]);
154 } else {
155 Arrays.setAll(definition.getBonuses(), index -> 0);
156 }
157 }
158 ItemDefinition.dump("wiki/bonus_dump");
159 }
160
161 public static void main(String[] args) throws InterruptedException {
162 BonusParser parser = new BonusParser();
163 parser.begin();
164 }
165
166}
static void writeToJson(String name, JsonElement array)