package net.maximemeire.rs2pro.io.file;
import net.maximemeire.rs2pro.util.Logger;
import net.maximemeire.rs2pro.util.RsRandomAccesFile;
import net.maximemeire.rs2pro.world.items.ItemManager;
import net.maximemeire.rs2pro.world.items.defs.*;
import java.io.*;
import java.net.URLConnection;
import java.net.URL;
/**
* Created by IntelliJ IDEA.
* Author : Serenity
* From : Rune-server.org
* Date : 21-mrt-2010
* Time : 19:02:08
* Package : net.maximemeire.rs2pro.io.file
*/
public class ItemListLoader {
private static Logger logger = new Logger(ItemListLoader.class);
private static ItemListLoader instance;
public static ItemListLoader getInstance() {
if (instance == null)
instance = new ItemListLoader();
return instance;
}
public void initialize() {
logger.info("Loading itemInfo");
File file = new File("./data/itemDefinitions.dat");
if (file.exists()) {
logger.info("File exsists and starts loading..");
importDefinitions(file);
logger.info("Done loading the ItemDefinitions..");
} else {
try {
logger.info("file doesn't exists");
logger.info("start downloading the file");
logger.info(download("http://tigerden.uppit.com/0110/iff0r6iz/itemInfo.dat", "./data/itemDefinitions.dat"));
importDefinitions(new File("./data/itemDefinitions.dat"));
logger.info("Done loading the ItemDefinitions..");
} catch (Exception e) {
e.printStackTrace();
}
}
}
private static String download(String address, String localFileName) {
OutputStream out = null;
URLConnection conn = null;
InputStream in = null;
try {
URL url = new URL(address);
out = new BufferedOutputStream(new FileOutputStream(localFileName));
conn = url.openConnection();
in = conn.getInputStream();
byte[] buffer = new byte[1024];
int numRead;
long numWritten = 0;
while ((numRead = in.read(buffer)) != -1) {
out.write(buffer, 0, numRead);
numWritten += numRead;
}
} catch (Exception exception) {
exception.printStackTrace();
return "Error while downloading file!";
} finally {
try {
if (in != null)
in.close();
if (out != null)
out.close();
return "File downloaded sucsessfully!";
} catch (IOException ignored) {
}
}
return "Unknown error!";
}
private static void importDefinitions(File f) {
try {
RsRandomAccesFile raf = new RsRandomAccesFile(f, "r");
ItemManager.getInstance().setItemDefinitionsSize(raf.readInt());
int definitionSize = raf.readInt();
for (int i = 0; i < definitionSize; i++) {
WeaponDefinitions weaponDefinitions = null;
GrandExchangePrices exchangePrices = null;
EquipmentDefinition equipmentDefinition = null;
int itemId = raf.readInt();
String itemName = raf.readString();
String itemExamine = raf.readString();
boolean noted = raf.readBoolean();
boolean stackAble = raf.readBoolean();
boolean members = raf.readBoolean();
boolean tradeAble = raf.readBoolean();
int parentId = raf.readInt();
int noteId = raf.readInt();
int shopValue = raf.readInt();
int lowAlchValue = raf.readInt();
int highAlchValue = raf.readInt();
double weight = raf.readDouble();
if (raf.readBoolean()) { // if true there is an EquipmentDefinition
EquipmentDefinition(raf);
}
if (raf.readBoolean()) { // if true there is a GrandExchangePrices
GrandExchangePrices(raf);
}
if (raf.readBoolean()) // if true there is a WeaponDefinitions
WeaponDefinitions(raf);
ItemManager.getInstance().setItemDefinition(itemId, new ItemDefinition(itemId, itemName, itemExamine, noted, stackAble, members,
tradeAble, parentId, noteId, shopValue, lowAlchValue, highAlchValue,
weight, equipmentDefinition, weaponDefinitions,
exchangePrices));
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static EquipmentDefinition EquipmentDefinition(RsRandomAccesFile raf) throws IOException {
int[][] skillRequirements = null;
int[] bonus = null;
int equipId = raf.readInt();
int slot = raf.readInt();
boolean hasSkillrequirements = raf.readBoolean();
if (hasSkillrequirements) {
int amountOfSkills = raf.readInt();
skillRequirements = new int[amountOfSkills][2];
for (int k = 0; k < amountOfSkills; k++) {
skillRequirements[k][0] = raf.readInt();
skillRequirements[k][1] = raf.readInt();
}
}
if (raf.readBoolean()) {
bonus = new int[14];
for (int k = 0; k < bonus.length; k++) {
bonus[k] = raf.readShort();
}
}
boolean isFullBody = raf.readBoolean();
boolean isFullHat = raf.readBoolean();
boolean isFullHelm = raf.readBoolean();
return new EquipmentDefinition(equipId, slot, skillRequirements, bonus, isFullBody, isFullHat, isFullHelm);
}
private static WeaponDefinitions WeaponDefinitions(RsRandomAccesFile raf) throws IOException {
int tabId = raf.readInt();
int walkEmote = raf.readInt();
int runEmote = raf.readInt();
int standEmote = raf.readInt();
int weaponId = raf.readInt();
int childOfSpecBar = raf.readInt();
int crushEmote = raf.readInt();
int stabEmote = raf.readInt();
int slashEmote = raf.readInt();
int blockEmote = raf.readInt();
int attackSpeed = raf.readInt();
boolean isMelee = raf.readBoolean();
boolean is2H = raf.readBoolean();
return new WeaponDefinitions(tabId, walkEmote, runEmote, standEmote, weaponId,
childOfSpecBar, crushEmote, stabEmote, slashEmote, blockEmote, attackSpeed, isMelee, is2H);
}
private static GrandExchangePrices GrandExchangePrices(RsRandomAccesFile raf) throws IOException {
int lowPrice = raf.readInt();
int midPrice = raf.readInt();
int highPrice = raf.readInt();
return new GrandExchangePrices(lowPrice, midPrice, highPrice);
}
}