I haven't found any items that shouldn't be there or any wrong but if you do please post on this thread thanks.
This is current for 317 items. If you have higher items then I posted a class which dumps the data so you could add items to it and dump it.
LevelDefinition
Code:
package org.game.content.item;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Map;
import org.game.content.skill.Skill;
import org.game.model.player.Player;
import org.game.util.XStreamUtil;
/**
*
* @author 2012 <http://www.rune-server.org/members/dexter+morgan/>
*
*/
public class LevelDefinition {
/**
* The levels
*/
private LevelRequirement[] levels;
/**
* Checks if player has correct level
*
* @param player
* the player
* @param item
* the item
* @return has level
*/
public static boolean hasLevel(Player player, int item) {
/**
* Item definition
*/
ItemDefinition itemD = ItemDefinition.forId(item);
/**
* Invalid item
*/
if (itemD == null) {
return false;
}
/**
* The levels
*/
LevelDefinition def = LevelDefinitionLoader.getLevel(item);
/**
* Has no requirements
*/
if(def == null) {
return true;
}
/**
* The levels
*/
for (int i = 0; i < def.getLevels().length; i++) {
if (def.getLevels()[i].getLevel() > player.getSkill().getLevel(
def.getLevels()[i].getId())) {
player.getPacketSender()
.sendMessage(
"You don't have the required "
+ Skill.SKILL_NAME[def.getLevels()[i]
.getId()]
+ " level to "
+ (def.getLevels()[i].getId() == 0
|| def.getLevels()[i].getId() == 2 ? "wield"
: "wear") + " "
+ itemD.getName());
player.getPacketSender()
.sendMessage(
"You need the "
+ Skill.SKILL_NAME[def.getLevels()[i]
.getId()]
+ " of at least "
+ def.getLevels()[i].getLevel()
+ " to "
+ (def.getLevels()[i].getId() == 0
|| def.getLevels()[i].getId() == 2 ? "wield"
: "wear") + " "
+ itemD.getName());
return false;
}
}
return true;
}
/**
* Sets the levels
*
* @param levels
* the new levels
*/
public void setLevels(LevelRequirement[] levels) {
this.levels = levels;
}
/**
* Gets the levels
*
* @return the levels
*/
public LevelRequirement[] getLevels() {
return levels;
}
/**
* A level requirement
*/
public static class LevelRequirement {
/**
* The skill id
*/
private int id;
/**
* The skill level
*/
private int level;
/**
* Sets the id
*
* @param id
* the new id
*/
public void setId(int id) {
this.id = id;
}
/**
* Gets the id
*
* @return the id
*/
public int getId() {
return id;
}
/**
* Sets the level
*
* @param level
* the new level
*/
public void setLevel(int level) {
this.level = level;
}
/**
* Gets the level
*
* @return the level
*/
public int getLevel() {
return level;
}
}
/**
* Loads the definitions
*/
public static class LevelDefinitionLoader {
/**
* The LevelDefinition
*/
private static Map<Integer, LevelDefinition> levels;
/**
* Gets the LevelDefinition
*
* @param id
* the id
* @return the LevelDefinition
*/
public static LevelDefinition getLevel(final int id) {
return levels.get(id);
}
@SuppressWarnings("unchecked")
public static void init() throws FileNotFoundException {
levels = (Map<Integer, LevelDefinition>) XStreamUtil.getXStream()
.fromXML(new FileInputStream("./data/levelDefinition.xml"));
}
}
}
This is what I used to dump the data
Code:
package org.game.content.item;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import org.game.content.combat.range.RangedWeapon;
import org.game.content.item.container.Equipment;
/**
*
* @author 2012 <http://www.rune-server.org/members/dexter+morgan/>
*
*/
public class LevelDefinitionDumper {
/**
* Invalid items
*/
public static final String[] INVALID = { "skirt", "robe", "gauntlets",
"apron", "partyhat", };
/**
* All the throwing range ammo
*/
public static final String[] AMMO = { "dart", "knife", "thrownaxe",
"javelin", "chinchompas", "tokz-xil-ul", "arrow", };
/**
* Gets the magic level
*
* @param id
* the item id
* @return the magicl level
*/
public static int getRange(int id) {
/**
* Definition
*/
ItemDefinition def = ItemDefinition.forId(id);
/**
* Invalid def
*/
if (def == null) {
return 0;
}
/**
* The name
*/
String name = def.getName().toLowerCase();
for (int i = 0; i < INVALID.length; i++) {
if (name.contains(INVALID[i])) {
return 0;
}
}
for (int i = 0; i < AMMO.length; i++) {
if (name.contains(AMMO[i])) {
return 0;
}
}
if (name.contains("hardleather")) {
return 10;
} else if (name.contains("studded")) {
return 20;
} else if (name.contains("snakeskin")) {
return 30;
} else if (name.contains("spined")) {
return 50;
} else if (name.contains("d'hide")) {
if (name.contains("green")) {
return 40;
} else if (name.contains("blue")) {
return 50;
} else if (name.contains("red")) {
return 60;
} else if (name.contains("black")) {
return 70;
}
} else if (name.contains("karils")) {
return 70;
} else if (name.contains("robin") || name.contains("rangers")) {
return 40;
}
return 0;
}
/**
* Gets the magic level
*
* @param id
* the item id
* @return the magicl level
*/
public static int getMagic(int id) {
/**
* Definition
*/
ItemDefinition def = ItemDefinition.forId(id);
/**
* Invalid def
*/
if (def == null) {
return 0;
}
/**
* The name
*/
String name = def.getName().toLowerCase();
/**
* Invalids
*/
for (int i = 0; i < AMMO.length; i++) {
if (name.contains(AMMO[i])) {
return 0;
}
}
for (int i = 0; i < INVALID.length; i++) {
if (name.contains(INVALID[i])) {
return 0;
}
}
/**
* Gets the level
*/
if (name.contains("wizard boots")) {
return 20;
} else if (name.contains("mystic")) {
return 30;
} else if (name.contains("splitbark") || name.contains("enchanted")) {
return 40;
} else if (name.contains("skeletal")) {
return 50;
} else if (name.contains("inifnity")) {
return 55;
} else if (name.contains("ahrim's")) {
return 70;
}
return 0;
}
// defence arrows
/**
* Gets the defence level
*
* @param id
* the item id
* @return the defence level
*/
public static int getDefence(int id) {
/**
* Definition
*/
ItemDefinition def = ItemDefinition.forId(id);
/**
* Invalid def
*/
if (def == null) {
return 0;
}
/**
* The name
*/
String name = def.getName().toLowerCase();
/**
* Invalids
*/
for (int i = 0; i < AMMO.length; i++) {
if (name.contains(AMMO[i])) {
return 0;
}
}
for (int i = 0; i < INVALID.length; i++) {
if (name.contains(INVALID[i])) {
return 0;
}
}
if (def.getEquipmentType().getSlot() == Equipment.WEAPON_SLOT) {
return 0;
}
/**
* Gets the level
*/
if (name.contains("d'hide body")) {
if (name.contains("green")) {
return 40;
} else if (name.contains("blue")) {
return 50;
} else if (name.contains("red")) {
return 60;
} else if (name.contains("black")) {
return 70;
}
} else if (name.contains("steel") || name.contains("spiny")) {
return 5;
} else if (name.contains("black") && !name.contains("robe")
&& !name.contains("d'hide")) {
return 10;
} else if (name.contains("white")) {
return 10;
} else if (name.contains("mithril")) {
return 20;
} else if (name.contains("adamant")) {
return 30;
} else if (name.contains("rune")) {
return 40;
} else if (name.contains("dragon")) {
return 60;
} else if (name.contains("yak") || name.contains("initiate")
|| name.contains("mirror") || name.contains("enchante")) {
return 20;
} else if (name.contains("infinity") || name.contains("frog-leather")) {
return 25;
} else if (name.contains("snakeskin")) {
return 30;
} else if (name.contains("spinned")) {
return 40;
} else if (name.contains("warrior helm")
|| name.contains("berserker helm")
|| name.contains("farseer helm")
|| name.contains("archer helm")) {
return 45;
} else if (name.contains("granite")) {
return 50;
} else if (name.contains("toktz")) {
return 60;
} else if (name.contains("crystal")) {
return 70;
} else if (name.contains("verac") || name.contains("torag")
|| name.contains("dharok") || name.contains("ahrim")
|| name.contains("karils") || name.contains("guthan")) {
return 70;
}
return 0;
}
/**
* Gets the required level for item
*
* @param itemId
* the item id
* @return the required level
*/
public static int getStrength(int itemId) {
/**
* Item definition
*/
ItemDefinition def = ItemDefinition.forId(itemId);
/**
* Invalid def
*/
if (def == null) {
return 0;
}
/**
* Item name
*/
String name = def.getName().toLowerCase();
/**
* Invalids
*/
for (int i = 0; i < AMMO.length; i++) {
if (name.contains(AMMO[i])) {
return 0;
}
}
for (int i = 0; i < INVALID.length; i++) {
if (name.contains(INVALID[i])) {
return 0;
}
}
/**
* Gets the level
*/
if (name.contains("halberd")) {
if (name.contains("steel")) {
return 5;
} else if (name.contains("black") ) {
return 10;
} else if (name.contains("white")) {
return 10;
} else if (name.contains("mithril")) {
return 20;
} else if (name.contains("adamant")) {
return 30;
} else if (name.contains("rune")) {
return 40;
} else if (name.contains("dragon")) {
return 60;
}
} else if (name.equals("tzhaar-ket-om")) {
return 60;
} else if (name.contains("granite")) {
return 50;
} else if (name.contains("torag")) {
return 70;
} else if (name.contains("dharok")) {
return 70;
} else if (name.contains("torva")) {
return 80;
} else if (name.contains("slayer helm")) {
return 20;
} else if (name.contains("black mask")) {
return 20;
}
return 0;
}
/**
* Gets the required level for item
*
* @param player
* the player
* @param itemId
* the item id
* @return the required level
*/
public static int getAttack(int itemId) {
/**
* Item definition
*/
ItemDefinition def = ItemDefinition.forId(itemId);
/**
* Invalid def
*/
if (def == null) {
return 0;
}
/**
* Item name
*/
String name = def.getName().toLowerCase();
/**
* Invalids
*/
for (int i = 0; i < AMMO.length; i++) {
if (name.contains(AMMO[i])) {
return 0;
}
}
for (int i = 0; i < INVALID.length; i++) {
if (name.contains(INVALID[i])) {
return 0;
}
}
/**
* Gets the level
*/
if (name.contains("steel")) {
return 5;
} else if (name.contains("black") && !name.contains("d'hide")) {
return 10;
} else if (name.contains("white")) {
return 10;
} else if (name.contains("mithril")) {
return 20;
} else if (name.contains("adamant")) {
return 30;
} else if (name.contains("rune")) {
return 40;
} else if (name.contains("granite")) {
return 50;
} else if (name.contains("toktz") && !name.contains("tzhaar-ket-om")) {
return 60;
} else if (name.contains("dragon")) {
return 60;
} else if (name.contains("dharok")) {
return 70;
} else if (name.contains("torag")) {
return 70;
} else if (name.contains("guthan")) {
return 70;
} else if (name.contains("verac")) {
return 70;
} else if (name.contains("whip")) {
return 70;
} else if (name.contains("leaf-blade")) {
return 50;
} else if (name.contains("iban's staff")) {
return 50;
}
return 0;
}
/**
* Dumps the definitions
*
* @param args
* the shit
* @throws IOException
*/
public static void main(String[] args) throws IOException {
ItemDefinition.init();
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(
"./data/levelDefinition.xml/", false));
bw.write("<map>");
bw.newLine();
int dump = 1;
for (int i = 0; i < 7996; i++) {
if (hasLevels(i)
&& ItemDefinition.forId(i).getEquipmentType().getSlot() >= 0
&& !ItemDefinition.forId(i).isNoted()) {
dump++;
bw.write(" <entry>");
bw.newLine();
bw.write(" <int>" + i + "</int>");
bw.newLine();
bw.write(" <levelDef>");
bw.newLine();
bw.write(" <levels>");
bw.newLine();
if (getAttack(i) > 0) {
bw.write(" <levelReq>");
bw.newLine(); // attack
bw.write(" <id>0</id>");
bw.newLine();
bw.write(" <level>" + getAttack(i) + "</level>");
bw.newLine();
bw.write(" </levelReq>");
bw.newLine();
}
if (getDefence(i) > 0) {
bw.write(" <levelReq>");
bw.newLine();// defence
bw.write(" <id>1</id>");
bw.newLine();
bw.write(" <level>" + getDefence(i) + "</level>");
bw.newLine();
bw.write(" </levelReq>");
bw.newLine();
}
if (getStrength(i) > 0) {
bw.write(" <levelReq>");
bw.newLine(); // strength
bw.write(" <id>2</id>");
bw.newLine();
bw.write(" <level>" + getStrength(i) + "</level>");
bw.newLine();
bw.write(" </levelReq>");
bw.newLine();
}
if (getRange(i) > 0) {
bw.write(" <levelReq>");
bw.newLine(); // strength
bw.write(" <id>4</id>");
bw.newLine();
bw.write(" <level>" + getRange(i) + "</level>");
bw.newLine();
bw.write(" </levelReq>");
bw.newLine();
}
if (getMagic(i) > 0) {
bw.write(" <levelReq>");
bw.newLine(); // strength
bw.write(" <id>6</id>");
bw.newLine();
bw.write(" <level>" + getMagic(i) + "</level>");
bw.newLine();
bw.write(" </levelReq>");
bw.newLine();
}
bw.write(" </levels>");
bw.newLine();
bw.write(" </levelDef>");
bw.newLine();
bw.write(" </entry>");
bw.newLine();
}
}
System.out.println("total dump: " + dump);
bw.write("</map>");
bw.newLine();
bw.close();
} catch (IOException ioe) {
System.out.println("Error: " + ioe.getMessage());
}
}
/**
* Checks if has a required level
*
* @param id
* the item
* @return has required
*/
private static boolean hasLevels(int id) {
return getMagic(id) > 0 || getRange(id) > 0 || getStrength(id) > 0
|| getAttack(id) > 0 || getDefence(id) > 0;
}
}
File download:
V1Download level.Definition.xml @ UppIT
V2
Fixed d'hide items: Download level.Definition.xml @ UppIT
I understand that this might not be the best way of doing and that I could just used the methods in the dumper class to check for level but this is my personal preference and I'm just sharing, but I also accept constructive criticism.