package server;
import client.MapleCharacter;
import client.inventory.Equip;
import client.inventory.Item;
import client.inventory.ItemFlag;
import client.inventory.MapleInventoryType;
import constants.GameConstants;
import constants.ItemConstants;
import database.DatabaseConnection;
import java.awt.Point;
import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TimeZone;
import java.util.TreeMap;
import provider.MapleData;
import provider.MapleDataDirectoryEntry;
import provider.MapleDataEntry;
import provider.MapleDataFileEntry;
import provider.MapleDataProvider;
import provider.MapleDataProviderFactory;
import provider.MapleDataTool;
import provider.wz.MapleDataType;
import tools.*;
public class MapleItemInformationProvider {
private static final MapleItemInformationProvider instance = new MapleItemInformationProvider();
protected MapleDataProvider chrData;
protected MapleDataProvider etcData;
protected MapleDataProvider itemData;
protected final MapleDataProvider stringData;
protected Map<Integer, ItemInformation> dataCache;
protected Map<String, List<Triple<String, Point, Point>>> afterImage;
protected Map<Integer, List<StructItemOption>> potentialCache;
protected Map<Integer, Map<Integer, StructItemOption>> socketCache;
protected Map<Integer, MapleStatEffect> itemEffects;
protected Map<Integer, MapleStatEffect> itemEffectsEx;
protected Map<Integer, Integer> mobIds;
protected Map<Integer, Pair<Integer, Integer>> potLife;
protected Map<Integer, StructFamiliar> familiars;
protected Map<Integer, StructFamiliar> familiars_Item;
protected Map<Integer, StructFamiliar> familiars_Mob;
protected Map<Integer, StructSetItem> SetItemInfo;
protected Map<Integer, Map<String, String>> getExpCardTimes;
protected Map<Integer, ScriptedItem> scriptedItemCache;
protected Map<Integer, Boolean> floatCashItem;
protected Map<Integer, Short> petFlagInfo;
protected Map<Integer, Integer> petSetItemID;
protected Map<Integer, Integer> successRates;
protected Map<Integer, Integer> forceUpgrade;
protected Map<Integer, Integer> ScrollLimitBreak;
protected Map<Integer, Pair<Integer, Integer>> chairRecovery;
protected Map<Integer, Integer> exclusiveEquip;
protected Map<Integer, StructExclusiveEquip> exclusiveEquipInfo;
protected Map<Integer, Boolean> noCursedScroll;
protected Map<Integer, Boolean> noNegativeScroll;
private ItemInformation tmpInfo;
protected Map<Integer, String> faceList;
protected Map<Integer, String> hairList;
public MapleItemInformationProvider() {
this.chrData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath", "wz") + "/Character.wz"));
this.etcData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath", "wz") + "/Etc.wz"));
this.itemData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath", "wz") + "/Item.wz"));
this.stringData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath", "wz") + "/String.wz"));
this.dataCache = new HashMap();
this.afterImage = new HashMap();
this.potentialCache = new HashMap();
this.socketCache = new HashMap();
this.itemEffects = new HashMap();
this.itemEffectsEx = new HashMap();
this.mobIds = new HashMap();
this.potLife = new HashMap();
this.familiars = new HashMap();
this.familiars_Item = new HashMap();
this.familiars_Mob = new HashMap();
this.SetItemInfo = new HashMap();
this.getExpCardTimes = new HashMap();
this.scriptedItemCache = new HashMap();
this.floatCashItem = new HashMap();
this.petFlagInfo = new HashMap();
this.petSetItemID = new HashMap();
this.successRates = new HashMap();
this.forceUpgrade = new HashMap();
this.ScrollLimitBreak = new HashMap();
this.chairRecovery = new HashMap();
this.exclusiveEquip = new HashMap();
this.exclusiveEquipInfo = new HashMap();
this.noCursedScroll = new HashMap();
this.noNegativeScroll = new HashMap();
this.faceList = new TreeMap();
this.hairList = new TreeMap();
this.tmpInfo = null;
}
public void runEtc(boolean reload) {
if (reload) {
potentialCache.clear();
socketCache.clear();
potLife.clear();
afterImage.clear();
}
if (!potentialCache.isEmpty() || !socketCache.isEmpty() || !potLife.isEmpty() || !afterImage.isEmpty()) {
return;
}
List thePointK = new ArrayList();
List thePointA = new ArrayList();
MapleDataDirectoryEntry a = (MapleDataDirectoryEntry) this.chrData.getRoot().getEntry("Afterimage");
for (MapleDataEntry b : a.getFiles()) {
MapleData iz = this.chrData.getData("Afterimage/" + b.getName());
List thePoint = new ArrayList();
Map<String, Pair> dummy = new HashMap();
for (MapleData i : iz) {
for (MapleData xD : i) {
if ((xD.getName().contains("prone")) || (xD.getName().contains("double")) || (xD.getName().contains("triple")) || (((b.getName().contains("bow")) || (b.getName().contains("Bow"))) && ((!xD.getName().contains("shoot")) || (((b.getName().contains("gun")) || (b.getName().contains("cannon"))) && (!xD.getName().contains("shot")))))) {
continue;
}
if (dummy.containsKey(xD.getName())) {
if (xD.getChildByPath("lt") != null) {
Point lt = (Point) xD.getChildByPath("lt").getData();
Point ourLt = (Point) ((Pair) dummy.get(xD.getName())).left;
if (lt.x < ourLt.x) {
ourLt.x = lt.x;
}
if (lt.y < ourLt.y) {
ourLt.y = lt.y;
}
}
if (xD.getChildByPath("rb") != null) {
Point rb = (Point) xD.getChildByPath("rb").getData();
Point ourRb = (Point) ((Pair) dummy.get(xD.getName())).right;
if (rb.x > ourRb.x) {
ourRb.x = rb.x;
}
if (rb.y > ourRb.y) {
ourRb.y = rb.y;
}
}
} else {
Point lt = null;
Point rb = null;
if (xD.getChildByPath("lt") != null) {
lt = (Point) xD.getChildByPath("lt").getData();
}
if (xD.getChildByPath("rb") != null) {
rb = (Point) xD.getChildByPath("rb").getData();
}
dummy.put(xD.getName(), new Pair(lt, rb));
}
}
}
for (Entry<String, Pair> ez : dummy.entrySet()) {
if ((((String) ez.getKey()).length() > 2) && (((String) ez.getKey()).substring(((String) ez.getKey()).length() - 2, ((String) ez.getKey()).length() - 1).equals("D"))) {
thePointK.add(new Triple(ez.getKey(), ((Pair) ez.getValue()).left, ((Pair) ez.getValue()).right));
} else if (((String) ez.getKey()).contains("PoleArm")) {
thePointA.add(new Triple(ez.getKey(), ((Pair) ez.getValue()).left, ((Pair) ez.getValue()).right));
} else {
thePoint.add(new Triple(ez.getKey(), ((Pair) ez.getValue()).left, ((Pair) ez.getValue()).right));
}
}
this.afterImage.put(b.getName().substring(0, b.getName().length() - 4), thePoint);
}
this.afterImage.put("katara", thePointK);
this.afterImage.put("aran", thePointA);
}
public void runItems(boolean reload) {
if (reload) {
dataCache.clear();
}
if (!dataCache.isEmpty()) {
return;
}
try {
Connection con = DatabaseConnection.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM wz_itemdata");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
initItemInformation(rs);
}
rs.close();
ps.close();
ps = con.prepareStatement("SELECT * FROM wz_itemequipdata ORDER BY itemid");
rs = ps.executeQuery();
while (rs.next()) {
initItemEquipData(rs);
}
rs.close();
ps.close();
ps = con.prepareStatement("SELECT * FROM wz_itemadddata ORDER BY itemid");
rs = ps.executeQuery();
while (rs.next()) {
initItemAddData(rs);
}
rs.close();
ps.close();
ps = con.prepareStatement("SELECT * FROM wz_itemrewarddata ORDER BY itemid");
rs = ps.executeQuery();
while (rs.next()) {
initItemRewardData(rs);
}
rs.close();
ps.close();
for (Map.Entry entry : this.dataCache.entrySet()) {
if (ItemConstants.getInventoryType(((Integer) entry.getKey())) == MapleInventoryType.EQUIP) {
finalizeEquipData((ItemInformation) entry.getValue());
}
}
} catch (SQLException ex) {
FileoutputUtil.log("[ItemLoader] 加载装备数据出错." + ex);
}
}
public final void loadHairFace(boolean reload) {
if (reload) {
hairList.clear();
faceList.clear();
}
if (!hairList.isEmpty() || !faceList.isEmpty()) {
return;
}
String[] types = {"Hair", "Face"};
for (String type : types) {
MapleDataDirectoryEntry data = null;
for (MapleDataDirectoryEntry d : chrData.getRoot().getSubdirectories()) {
if (d.getName().equals(type)) {
data = d;
break;
}
}
if (data == null) {
continue;
}
for (MapleData c : stringData.getData("Item.img").getChildByPath("Eqp/" + type)) {
if (data.getEntry(StringUtil.getLeftPaddedStr(c.getName() + ".img", '0', 12)) != null) {
int dataid = Integer.parseInt(c.getName());
String name = MapleDataTool.getString("name", c, "无名字");
if (type.equals("Hair")) {
hairList.put(dataid, name);
} else {
faceList.put(dataid, name);
}
}
}
}
}
public boolean hairExists(int hair) {
return hairList.containsKey(hair);
}
public boolean faceExists(int face) {
return faceList.containsKey(face);
}
public final Map<Integer, String> getHairList() {
Map<Integer, String> list = new TreeMap();
list.putAll(hairList);
return list;
}
public final Map<Integer, String> getFaceList() {
Map<Integer, String> list = new TreeMap();
list.putAll(faceList);
return list;
}
public Map<Integer, StructItemOption> getAllSocketInfo(int grade) {
return (Map) this.socketCache.get(grade);
}
public Pair<Integer, Integer> getPot(int f) {
return (Pair) this.potLife.get(f);
}
public StructFamiliar getFamiliar(int f) {
return (StructFamiliar) this.familiars.get(f);
}
public Map<Integer, StructFamiliar> getFamiliars() {
return this.familiars;
}
public StructFamiliar getFamiliarByItem(int f) {
return (StructFamiliar) this.familiars_Item.get(f);
}
public StructFamiliar getFamiliarByMob(int f) {
return (StructFamiliar) this.familiars_Mob.get(f);
}
public static MapleItemInformationProvider getInstance() {
return instance;
}
public Collection<ItemInformation> getAllItems() {
Map<Integer, ItemInformation> mapVK = new TreeMap<>(
new Comparator<Integer>() {
@Override
public int compare(Integer obj1, Integer obj2) {
Integer v1 = obj1;
Integer v2 = obj2;
int s = v1.compareTo(v2);
return s;
}
}
);
Set col = dataCache.keySet();
Iterator iter = col.iterator();
while (iter.hasNext()) {
Integer key = (Integer) iter.next();
ItemInformation value = (ItemInformation) dataCache.get(key);
mapVK.put(key, value);
}
return mapVK.values();
}
protected MapleData getItemData(int itemId) {
MapleData ret = null;
String idStr = "0" + String.valueOf(itemId);
MapleDataDirectoryEntry root = this.itemData.getRoot();
for (MapleDataDirectoryEntry topDir : root.getSubdirectories()) {
for (MapleDataFileEntry iFile : topDir.getFiles()) {
if (iFile.getName().equals(idStr.substring(0, 4) + ".img")) {
ret = this.itemData.getData(topDir.getName() + "/" + iFile.getName());
if (ret == null) {
return null;
}
ret = ret.getChildByPath(idStr);
return ret;
}
if (iFile.getName().equals(idStr.substring(1) + ".img")) {
ret = this.itemData.getData(topDir.getName() + "/" + iFile.getName());
return ret;
}
}
}
root = this.chrData.getRoot();
for (final MapleDataDirectoryEntry topDir : root.getSubdirectories()) {
for (MapleDataFileEntry iFile : topDir.getFiles()) {
if (iFile.getName().equals(idStr + ".img")) {
ret = this.chrData.getData(topDir.getName() + "/" + iFile.getName());
return ret;
}
}
}
return ret;
}
public Integer getItemIdByMob(int mobId) {
return this.mobIds.get(mobId);
}
public Integer getSetId(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return null;
}
return i.cardSet;
}
public short getSlotMax(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return 0;
}
return i.slotMax;
}
public int getWholePrice(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return 0;
}
return i.wholePrice;
}
public double getPrice(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return -1.0D;
}
return i.price;
}
protected int rand(int min, int max) {
return Math.abs(Randomizer.rand(min, max));
}
public Equip levelUpEquip(Equip equip, Map<String, Integer> sta) {
Equip nEquip = (Equip) equip.copy();
try {
for (Map.Entry stat : sta.entrySet()) {
switch ((String) stat.getKey()) {
case "STRMin":
nEquip.setStr((short) (nEquip.getStr() + rand(((Integer) stat.getValue()), (sta.get("STRMax")))));
break;
case "DEXMin":
nEquip.setDex((short) (nEquip.getDex() + rand(((Integer) stat.getValue()), (sta.get("DEXMax")))));
break;
case "INTMin":
nEquip.setInt((short) (nEquip.getInt() + rand(((Integer) stat.getValue()), (sta.get("INTMax")))));
break;
case "LUKMin":
nEquip.setLuk((short) (nEquip.getLuk() + rand(((Integer) stat.getValue()), (sta.get("LUKMax")))));
break;
case "PADMin":
nEquip.setWatk((short) (nEquip.getWatk() + rand(((Integer) stat.getValue()), (sta.get("PADMax")))));
break;
case "PDDMin":
nEquip.setWdef((short) (nEquip.getWdef() + rand(((Integer) stat.getValue()), (sta.get("PDDMax")))));
break;
case "MADMin":
nEquip.setMatk((short) (nEquip.getMatk() + rand(((Integer) stat.getValue()), (sta.get("MADMax")))));
break;
case "MDDMin":
nEquip.setMdef((short) (nEquip.getMdef() + rand(((Integer) stat.getValue()), (sta.get("MDDMax")))));
break;
case "ACCMin":
nEquip.setAcc((short) (nEquip.getAcc() + rand(((Integer) stat.getValue()), (sta.get("ACCMax")))));
break;
case "EVAMin":
nEquip.setAvoid((short) (nEquip.getAvoid() + rand(((Integer) stat.getValue()), (sta.get("EVAMax")))));
break;
case "SpeedMin":
nEquip.setSpeed((short) (nEquip.getSpeed() + rand(((Integer) stat.getValue()), (sta.get("SpeedMax")))));
break;
case "JumpMin":
nEquip.setJump((short) (nEquip.getJump() + rand(((Integer) stat.getValue()), (sta.get("JumpMax")))));
break;
case "MHPMin":
nEquip.setHp((short) (nEquip.getHp() + rand(((Integer) stat.getValue()), (sta.get("MHPMax")))));
break;
case "MMPMin":
nEquip.setMp((short) (nEquip.getMp() + rand(((Integer) stat.getValue()), (sta.get("MMPMax")))));
break;
case "MaxHPMin":
nEquip.setHp((short) (nEquip.getHp() + rand(((Integer) stat.getValue()), (sta.get("MaxHPMax")))));
break;
case "MaxMPMin":
nEquip.setMp((short) (nEquip.getMp() + rand(((Integer) stat.getValue()), (sta.get("MaxMPMax")))));
break;
}
}
} catch (NullPointerException e) {
e.printStackTrace();
}
return nEquip;
}
public List<Triple<String, String, String>> getEquipAdditions(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return null;
}
return i.equipAdditions;
}
public String getEquipAddReqs(int itemId, String key, String sub) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return null;
}
for (Triple data : i.equipAdditions) {
if ((((String) data.getLeft()).equals("key")) && (((String) data.getMid()).equals("con:" + sub))) {
return (String) data.getRight();
}
}
return null;
}
public Map<Integer, Map<String, Integer>> getEquipIncrements(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return null;
}
return i.equipIncs;
}
public Map<String, Integer> getEquipStats(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return null;
}
return i.equipStats;
}
public boolean canEquip(Map<String, Integer> stats, int itemid, int level, int job, int fame, int str, int dex, int luk, int int_, int supremacy) {
if (level + supremacy >= (stats.containsKey("reqLevel") ? (stats.get("reqLevel")) : 0)) {
if (str >= (stats.containsKey("reqSTR") ? (stats.get("reqSTR")) : 0)) {
if (dex >= (stats.containsKey("reqDEX") ? (stats.get("reqDEX")) : 0)) {
if (luk >= (stats.containsKey("reqLUK") ? (stats.get("reqLUK")) : 0)) {
if (int_ >= (stats.containsKey("reqINT") ? (stats.get("reqINT")) : 0)) {
Integer fameReq = stats.get("reqPOP");
return (fameReq == null) || (fame >= fameReq);
}
}
}
}
}
return false;
}
public int getReqLevel(int itemId) {
if ((getEquipStats(itemId) == null) || (!getEquipStats(itemId).containsKey("reqLevel"))) {
return 0;
}
return (getEquipStats(itemId).get("reqLevel"));
}
public int getReqJob(int itemId) {
if ((getEquipStats(itemId) == null) || (!getEquipStats(itemId).containsKey("reqJob"))) {
return 0;
}
return (getEquipStats(itemId).get("reqJob"));
}
public int getSlots(int itemId) {
if ((getEquipStats(itemId) == null) || (!getEquipStats(itemId).containsKey("tuc"))) {
return 0;
}
return (getEquipStats(itemId).get("tuc"));
}
public Integer getSetItemID(int itemId) {
if ((getEquipStats(itemId) == null) || (!getEquipStats(itemId).containsKey("setItemID"))) {
return 0;
}
return getEquipStats(itemId).get("setItemID");
}
public StructSetItem getSetItem(int setItemId) {
return (StructSetItem) this.SetItemInfo.get(setItemId);
}
public List<Integer> getScrollReqs(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return null;
}
return i.scrollReqs;
}
public int getScrollSuccess(int itemId) {
if ((itemId / 10000 != 204) || (getEquipStats(itemId) == null) || (!getEquipStats(itemId).containsKey("success"))) {
return 0;
}
return (getEquipStats(itemId).get("success"));
}
/**
* 对装备进行砸卷
* @param equip
* @param scroll
* @param whiteScroll
* @param chr
* @param vegas
* @return
*/
public Item scrollEquipWithId(Item equip, Item scroll, boolean whiteScroll, MapleCharacter chr, int vegas) {
if (equip.getType() == 1) {
int scrollId = scroll.getItemId();
final Equip nEquip = (Equip) equip;
final Map<String, Integer> scrollStats = getEquipStats(scrollId); //卷轴信息
final Map<String, Integer> equipStats = getEquipStats(equip.getItemId()); // 装备信息
int succ = scrollStats == null || !scrollStats.containsKey("success") ? 0 : ItemConstants.isTablet(scrollId) ? ItemConstants.getSuccessTablet(scrollId, nEquip.getLevel()) : scrollStats.get("success");
//诅咒卷轴
int curse = scrollStats == null || !scrollStats.containsKey("cursed") ? 0 : ItemConstants.isTablet(scrollId) ? ItemConstants.getCurseTablet(scrollId, nEquip.getLevel()) : scrollStats.get("cursed");
int limitedLv = scrollStats == null || !scrollStats.containsKey("limitedLv") ? 0 : scrollStats.get("limitedLv");
if (limitedLv > 0 && nEquip.getLevel() < limitedLv) {
chr.dropMessage(1,"装备等级不够:"+limitedLv );
return nEquip;
}
if (nEquip.getUpgradeSlots()<=0) {
chr.dropMessage(1,"装备已经没有升级次数了:"+nEquip.getUpgradeSlots() );
return nEquip;
}
int success = succ + succ * (getSuccessRates(scroll.getItemId())) / 100;
if (chr.isShowPacket()) {
chr.dropSpouseMessage(11, "普通卷轴 - 默认几率: " + succ + "% 最终概率: " + success + "% 失败消失几率: " + curse + "%");
}
nEquip.setUpgradeSlots((byte) (nEquip.getUpgradeSlots() - 1));
if (Randomizer.nextInt(100) <= success) {
for (Map.Entry stat : scrollStats.entrySet()) {
String key = (String) stat.getKey();
switch (key) {
case "STR":
nEquip.setStr((short) (nEquip.getStr() + ((Integer) stat.getValue())));
break;
case "DEX":
nEquip.setDex((short) (nEquip.getDex() + ((Integer) stat.getValue())));
break;
case "INT":
nEquip.setInt((short) (nEquip.getInt() + ((Integer) stat.getValue())));
break;
case "LUK":
nEquip.setLuk((short) (nEquip.getLuk() + ((Integer) stat.getValue())));
break;
case "PAD":
nEquip.setWatk((short) (nEquip.getWatk() + ((Integer) stat.getValue())));
break;
case "PDD":
nEquip.setWdef((short) (nEquip.getWdef() + ((Integer) stat.getValue())));
break;
case "MAD":
nEquip.setMatk((short) (nEquip.getMatk() + ((Integer) stat.getValue())));
break;
case "MDD":
nEquip.setMdef((short) (nEquip.getMdef() + ((Integer) stat.getValue())));
break;
case "ACC":
nEquip.setAcc((short) (nEquip.getAcc() + ((Integer) stat.getValue())));
break;
case "EVA":
nEquip.setAvoid((short) (nEquip.getAvoid() + ((Integer) stat.getValue())));
break;
case "Speed":
nEquip.setSpeed((short) (nEquip.getSpeed() + ((Integer) stat.getValue())));
break;
case "Jump":
nEquip.setJump((short) (nEquip.getJump() + ((Integer) stat.getValue())));
break;
case "MHP":
nEquip.setHp((short) (nEquip.getHp() + ((Integer) stat.getValue())));
break;
case "MMP":
nEquip.setMp((short) (nEquip.getMp() + ((Integer) stat.getValue())));
break;
}
}
nEquip.setLevel((byte) (nEquip.getLevel() + 1));
} else {
if (Randomizer.nextInt(99) < curse) {
return null;
}
}
}
return equip;
}
public Item scrollEnhance(Item equip, Item scroll, MapleCharacter chr) {
if (equip.getType() != 1) {
return equip;
}
Equip nEquip = (Equip) equip;
int scrollId = scroll.getItemId();
Map scrollStats = getEquipStats(scrollId);
boolean noCursed = isNoCursedScroll(scrollId);
int scrollForceUpgrade = getForceUpgrade(scrollId);
int succ = scrollStats == null || !scrollStats.containsKey("success") ? 0 : (Integer) scrollStats.get("success");
int curse = noCursed ? 0 : scrollStats == null || !scrollStats.containsKey("cursed") ? 100 : ((Integer) scrollStats.get("cursed"));
if ((scrollForceUpgrade == 1) && (succ == 0)) {
succ = Math.max(((scroll.getItemId() == 2049301) || (scroll.getItemId() == 2049307) ? 80 : 100) - nEquip.getEnhance() * 10, 5);
}
int success = succ;
if (chr.isShowPacket()) {
chr.dropSpouseMessage(11, "装备强化卷轴 - 默认几率: " + succ + "% 倾向加成: " + 0 + "% 最终几率: " + success + "% 失败消失几率: " + curse + "%" + " 卷轴是否失败不消失装备: " + noCursed);
}
if (Randomizer.nextInt(100) > success) {
return Randomizer.nextInt(99) < curse ? null : nEquip;
}
int mixStats = isSuperiorEquip(nEquip.getItemId()) ? 3 : 0;
int maxStats = isSuperiorEquip(nEquip.getItemId()) ? 8 : 5;
for (int i = 0; i < scrollForceUpgrade; i++) {
if (nEquip.getStr() > 0 || Randomizer.nextInt(50) == 1) {
nEquip.setStr((short) (nEquip.getStr() + Randomizer.rand(mixStats, maxStats)));
}
if (nEquip.getDex() > 0 || Randomizer.nextInt(50) == 1) {
nEquip.setDex((short) (nEquip.getDex() + Randomizer.rand(mixStats, maxStats)));
}
if (nEquip.getInt() > 0 || Randomizer.nextInt(50) == 1) {
nEquip.setInt((short) (nEquip.getInt() + Randomizer.rand(mixStats, maxStats)));
}
if (nEquip.getLuk() > 0 || Randomizer.nextInt(50) == 1) {
nEquip.setLuk((short) (nEquip.getLuk() + Randomizer.rand(mixStats, maxStats)));
}
if (nEquip.getWatk() > 0 && (ItemConstants.isWeapon(nEquip.getItemId()))) {
if (nEquip.getWatk() < 150) {
nEquip.setWatk((short) (nEquip.getWatk() + 3));
} else if (nEquip.getWatk() < 200) {
nEquip.setWatk((short) (nEquip.getWatk() + 4));
} else if (nEquip.getWatk() < 250) {
nEquip.setWatk((short) (nEquip.getWatk() + 5));
} else {
nEquip.setWatk((short) (nEquip.getWatk() + 5 + (Randomizer.nextBoolean() ? 1 : 0)));
}
}
if (nEquip.getWdef() > 0 || Randomizer.nextInt(40) == 1) {
nEquip.setWdef((short) (nEquip.getWdef() + Randomizer.nextInt(5)));
}
if (nEquip.getMatk() > 0 && ItemConstants.isWeapon(nEquip.getItemId())) {
if (nEquip.getMatk() < 50) {
nEquip.setMatk((short) (nEquip.getMatk() + 1));
} else if (nEquip.getMatk() < 100) {
nEquip.setMatk((short) (nEquip.getMatk() + 2));
} else if (nEquip.getMatk() < 150) {
nEquip.setMatk((short) (nEquip.getMatk() + 3));
} else if (nEquip.getMatk() < 200) {
nEquip.setMatk((short) (nEquip.getMatk() + 4));
} else if (nEquip.getMatk() < 250) {
nEquip.setMatk((short) (nEquip.getMatk() + 5));
} else {
nEquip.setMatk((short) (nEquip.getMatk() + 5 + (Randomizer.nextBoolean() ? 1 : 0)));
}
}
if (nEquip.getMdef() > 0 || Randomizer.nextInt(40) == 1) {
nEquip.setMdef((short) (nEquip.getMdef() + Randomizer.nextInt(5)));
}
if (nEquip.getAcc() > 0 || Randomizer.nextInt(20) == 1) {
nEquip.setAcc((short) (nEquip.getAcc() + Randomizer.nextInt(5)));
}
if (nEquip.getAvoid() > 0 || Randomizer.nextInt(20) == 1) {
nEquip.setAvoid((short) (nEquip.getAvoid() + Randomizer.nextInt(5)));
}
if (nEquip.getSpeed() > 0 || Randomizer.nextInt(10) == 1) {
nEquip.setSpeed((short) (nEquip.getSpeed() + Randomizer.nextInt(5)));
}
if (nEquip.getJump() > 0 || Randomizer.nextInt(10) == 1) {
nEquip.setJump((short) (nEquip.getJump() + Randomizer.nextInt(5)));
}
if (nEquip.getHp() > 0 || Randomizer.nextInt(5) == 1) {
nEquip.setHp((short) (nEquip.getHp() + Randomizer.rand(mixStats, maxStats)));
}
if (nEquip.getMp() > 0 || Randomizer.nextInt(5) == 1) {
nEquip.setMp((short) (nEquip.getMp() + Randomizer.rand(mixStats, maxStats)));
}
nEquip.setEnhance((byte) (nEquip.getEnhance() + 1));
}
return nEquip;
}
public Equip resetEquipStats(Equip oldEquip) {
Equip newEquip = (Equip) getEquipById(oldEquip.getItemId());
oldEquip.reset(newEquip);
return newEquip;
}
public Item getEquipById(int equipId) {
return getEquipById(equipId, -1);
}
public Item getEquipById(int equipId, int ringId) {
ItemInformation i = getItemInformation(equipId);
if (i == null) {
return new Equip(equipId, (short) 0, ringId, (short) 0);
}
Item eq = i.eq.copy();
eq.setUniqueId(ringId);
return eq;
}
protected short getRandStatFusion(short defaultValue, int value1, int value2) {
if (defaultValue == 0) {
return 0;
}
int range = (value1 + value2) / 2 - defaultValue;
int rand = Randomizer.nextInt(Math.abs(range) + 1);
return (short) (defaultValue + (range < 0 ? -rand : rand));
}
protected short getRandStat(short defaultValue, int maxRange) {
if (defaultValue == 0) {
return 0;
}
int lMaxRange = (int) Math.min(Math.ceil(defaultValue * 0.1D), maxRange);
return (short) (defaultValue - lMaxRange + Randomizer.nextInt(lMaxRange * 2 + 1));
}
protected short getRandStatAbove(short defaultValue, int maxRange) {
if (defaultValue <= 0) {
return 0;
}
int lMaxRange = (int) Math.min(Math.ceil(defaultValue * 0.1D), maxRange);
return (short) (defaultValue + Randomizer.nextInt(lMaxRange + 1));
}
public Equip randomizeStats(Equip equip) {
equip.setStr(getRandStat(equip.getStr(), 5));
equip.setDex(getRandStat(equip.getDex(), 5));
equip.setInt(getRandStat(equip.getInt(), 5));
equip.setLuk(getRandStat(equip.getLuk(), 5));
equip.setMatk(getRandStat(equip.getMatk(), 5));
equip.setWatk(getRandStat(equip.getWatk(), 5));
equip.setAcc(getRandStat(equip.getAcc(), 5));
equip.setAvoid(getRandStat(equip.getAvoid(), 5));
equip.setJump(getRandStat(equip.getJump(), 5));
equip.setHands(getRandStat(equip.getHands(), 5));
equip.setSpeed(getRandStat(equip.getSpeed(), 5));
equip.setWdef(getRandStat(equip.getWdef(), 10));
equip.setMdef(getRandStat(equip.getMdef(), 10));
equip.setHp(getRandStat(equip.getHp(), 10));
equip.setMp(getRandStat(equip.getMp(), 10));
return equip;
}
public Equip randomizeStats_Above(Equip equip) {
equip.setStr(getRandStatAbove(equip.getStr(), 5));
equip.setDex(getRandStatAbove(equip.getDex(), 5));
equip.setInt(getRandStatAbove(equip.getInt(), 5));
equip.setLuk(getRandStatAbove(equip.getLuk(), 5));
equip.setMatk(getRandStatAbove(equip.getMatk(), 5));
equip.setWatk(getRandStatAbove(equip.getWatk(), 5));
equip.setAcc(getRandStatAbove(equip.getAcc(), 5));
equip.setAvoid(getRandStatAbove(equip.getAvoid(), 5));
equip.setJump(getRandStatAbove(equip.getJump(), 5));
equip.setHands(getRandStatAbove(equip.getHands(), 5));
equip.setSpeed(getRandStatAbove(equip.getSpeed(), 5));
equip.setWdef(getRandStatAbove(equip.getWdef(), 10));
equip.setMdef(getRandStatAbove(equip.getMdef(), 10));
equip.setHp(getRandStatAbove(equip.getHp(), 10));
equip.setMp(getRandStatAbove(equip.getMp(), 10));
return equip;
}
public Equip fuse(Equip equip1, Equip equip2) {
if (equip1.getItemId() != equip2.getItemId()) {
return equip1;
}
Equip equip = (Equip) getEquipById(equip1.getItemId());
equip.setStr(getRandStatFusion(equip.getStr(), equip1.getStr(), equip2.getStr()));
equip.setDex(getRandStatFusion(equip.getDex(), equip1.getDex(), equip2.getDex()));
equip.setInt(getRandStatFusion(equip.getInt(), equip1.getInt(), equip2.getInt()));
equip.setLuk(getRandStatFusion(equip.getLuk(), equip1.getLuk(), equip2.getLuk()));
equip.setMatk(getRandStatFusion(equip.getMatk(), equip1.getMatk(), equip2.getMatk()));
equip.setWatk(getRandStatFusion(equip.getWatk(), equip1.getWatk(), equip2.getWatk()));
equip.setAcc(getRandStatFusion(equip.getAcc(), equip1.getAcc(), equip2.getAcc()));
equip.setAvoid(getRandStatFusion(equip.getAvoid(), equip1.getAvoid(), equip2.getAvoid()));
equip.setJump(getRandStatFusion(equip.getJump(), equip1.getJump(), equip2.getJump()));
equip.setHands(getRandStatFusion(equip.getHands(), equip1.getHands(), equip2.getHands()));
equip.setSpeed(getRandStatFusion(equip.getSpeed(), equip1.getSpeed(), equip2.getSpeed()));
equip.setWdef(getRandStatFusion(equip.getWdef(), equip1.getWdef(), equip2.getWdef()));
equip.setMdef(getRandStatFusion(equip.getMdef(), equip1.getMdef(), equip2.getMdef()));
equip.setHp(getRandStatFusion(equip.getHp(), equip1.getHp(), equip2.getHp()));
equip.setMp(getRandStatFusion(equip.getMp(), equip1.getMp(), equip2.getMp()));
return equip;
}
public int get休彼德蔓徽章点数(int itemId) {
switch (itemId) {
case 1182000:
return 3;
case 1182001:
return 5;
case 1182002:
return 7;
case 1182003:
return 9;
case 1182004:
return 13;
case 1182005:
return 16;
}
return 0;
}
public Equip randomize休彼德蔓徽章(Equip equip) {
int stats = get休彼德蔓徽章点数(equip.getItemId());
if (stats > 0) {
int prob = equip.getItemId() - 1182000;
if (Randomizer.nextInt(15) <= prob) {
equip.setStr((short) Randomizer.nextInt(stats + prob));
}
if (Randomizer.nextInt(15) <= prob) {
equip.setDex((short) Randomizer.nextInt(stats + prob));
}
if (Randomizer.nextInt(15) <= prob) {
equip.setInt((short) Randomizer.nextInt(stats + prob));
}
if (Randomizer.nextInt(15) <= prob) {
equip.setLuk((short) Randomizer.nextInt(stats + prob));
}
if (Randomizer.nextInt(30) <= prob) {
equip.setWatk((short) Randomizer.nextInt(stats));
}
if (Randomizer.nextInt(10) <= prob) {
equip.setWdef((short) Randomizer.nextInt(stats * 8));
}
if (Randomizer.nextInt(30) <= prob) {
equip.setMatk((short) Randomizer.nextInt(stats));
}
if (Randomizer.nextInt(10) <= prob) {
equip.setMdef((short) Randomizer.nextInt(stats * 8));
}
if (Randomizer.nextInt(8) <= prob) {
equip.setAcc((short) Randomizer.nextInt(stats * 5));
}
if (Randomizer.nextInt(8) <= prob) {
equip.setAvoid((short) Randomizer.nextInt(stats * 5));
}
if (Randomizer.nextInt(10) <= prob) {
equip.setSpeed((short) Randomizer.nextInt(stats));
}
if (Randomizer.nextInt(10) <= prob) {
equip.setJump((short) Randomizer.nextInt(stats));
}
if (Randomizer.nextInt(8) <= prob) {
equip.setHp((short) Randomizer.nextInt(stats * 10));
}
if (Randomizer.nextInt(8) <= prob) {
equip.setMp((short) Randomizer.nextInt(stats * 10));
}
}
return equip;
}
public int getTotalStat(Equip equip) {
return equip.getStr() + equip.getDex() + equip.getInt() + equip.getLuk() + equip.getMatk() + equip.getWatk() + equip.getAcc() + equip.getAvoid() + equip.getJump() + equip.getHands() + equip.getSpeed() + equip.getHp() + equip.getMp() + equip.getWdef() + equip.getMdef();
}
public MapleStatEffect getItemEffect(int itemId) {
MapleStatEffect ret = this.itemEffects.get(Integer.valueOf(itemId));
if (ret == null) {
MapleData item = getItemData(itemId);
if ((item == null) || (item.getChildByPath("spec") == null)) {
return null;
}
ret = MapleStatEffect.loadItemEffectFromData(item.getChildByPath("spec"), itemId);
this.itemEffects.put(itemId, ret);
}
return ret;
}
public MapleStatEffect getItemEffectEX(int itemId) {
MapleStatEffect ret = (MapleStatEffect) this.itemEffectsEx.get(Integer.valueOf(itemId));
if (ret == null) {
MapleData item = getItemData(itemId);
if ((item == null) || (item.getChildByPath("specEx") == null)) {
return null;
}
ret = MapleStatEffect.loadItemEffectFromData(item.getChildByPath("specEx"), itemId);
this.itemEffectsEx.put(itemId, ret);
}
return ret;
}
public int getCreateId(int id) {
ItemInformation i = getItemInformation(id);
if (i == null) {
return 0;
}
return i.create;
}
public int getBagType(int id) {
ItemInformation i = getItemInformation(id);
if (i == null) {
return 0;
}
return i.flag & 0xF;
}
public int getWatkForProjectile(int itemId) {
ItemInformation i = getItemInformation(itemId);
if ((i == null) || (i.equipStats == null) || (i.equipStats.get("PAD") == null)) {
return 0;
}
return (i.equipStats.get("PAD"));
}
public boolean canScroll(int scrollid, int itemid) {
return (scrollid / 100 % 100 == itemid / 10000 % 100) || ((itemid >= 1672000) && (itemid <= 1672010));
}
public String getName(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return null;
}
return i.name;
}
public String getDesc(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return null;
}
return i.desc;
}
public String getMsg(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return null;
}
return i.msg;
}
public short getItemMakeLevel(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return 0;
}
return i.itemMakeLevel;
}
public boolean cantSell(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return false;
}
return (i.flag & 0x10) != 0;
}
public boolean isLogoutExpire(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return false;
}
return (i.flag & 0x20) != 0;
}
public boolean isPickupBlocked(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return false;
}
return (i.flag & 0x40) != 0;
}
public boolean isPickupRestricted(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return false;
}
return (((i.flag & 0x80) != 0) || (ItemConstants.isPickupRestricted(itemId))) && (itemId != 4001168);
}
public boolean isAccountShared(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return false;
}
return (i.flag & 0x100) != 0;
}
public boolean isQuestItem(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return false;
}
return ((i.flag & 0x200) != 0) && (itemId / 10000 != 301);
}
public boolean isDropRestricted(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return false;
}
return ((i.flag & 0x200) != 0) || ((i.flag & 0x400) != 0) || (ItemConstants.isDropRestricted(itemId));
}
public boolean isShareTagEnabled(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return false;
}
return (i.flag & 0x800) != 0;
}
public boolean isMobHP(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return false;
}
return (i.flag & 0x1000) != 0;
}
public boolean isActivatedSocketItem(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return false;
}
return (i.flag & 0x2000) != 0;
}
public boolean isSuperiorEquip(int itemId) {
Map<String, Integer> equipStats = getEquipStats(itemId);
if (equipStats == null) {
return false;
}
return equipStats.containsKey("superiorEqp") && equipStats.get("superiorEqp") == 1;
}
public boolean isOnlyEquip(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return false;
}
return (i.flag & 0x8000) != 0;
}
public int getStateChangeItem(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return 0;
}
return i.stateChange;
}
public int getMeso(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return 0;
}
return i.meso;
}
public boolean isKarmaEnabled(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return false;
}
return i.karmaEnabled == 1;
}
public boolean isPKarmaEnabled(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return false;
}
return i.karmaEnabled == 2;
}
public Pair<Integer, List<StructRewardItem>> getRewardItem(int itemid) {
ItemInformation i = getItemInformation(itemid);
if (i == null) {
return null;
}
return new Pair(i.totalprob, i.rewardItems);
}
public Pair<Integer, List<Integer>> questItemInfo(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return null;
}
return new Pair(i.questId, i.questItems);
}
public Pair<Integer, String> replaceItemInfo(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return null;
}
return new Pair(i.replaceItem, i.replaceMsg);
}
public List<Triple<String, Point, Point>> getAfterImage(String after) {
return (List) this.afterImage.get(after);
}
public String getAfterImage(int itemId) {
ItemInformation i = getItemInformation(itemId);
if (i == null) {
return null;
}
return i.afterImage;
}
public boolean itemExists(int itemId) {
if (ItemConstants.getInventoryType(itemId) == MapleInventoryType.UNDEFINED) {
return false;
}
return getItemInformation(itemId) != null;
}
public boolean isCash(int itemId) {
if (getEquipStats(itemId) == null) {
return ItemConstants.getInventoryType(itemId) == MapleInventoryType.CASH;
}
return (ItemConstants.getInventoryType(itemId) == MapleInventoryType.CASH) || (getEquipStats(itemId).get("cash") != null);
}
public ItemInformation getItemInformation(int itemId) {
if (itemId <= 0) {
return null;
}
return this.dataCache.get(itemId);
}
public void initItemRewardData(ResultSet sqlRewardData)
throws SQLException {
int itemID = sqlRewardData.getInt("itemid");
if ((this.tmpInfo == null) || (this.tmpInfo.itemId != itemID)) {
if (!this.dataCache.containsKey(itemID)) {
FileoutputUtil.log("[initItemRewardData] Tried to load an item while this is not in the cache: " + itemID);
return;
}
this.tmpInfo = ((ItemInformation) this.dataCache.get(itemID));
}
if (this.tmpInfo.rewardItems == null) {
this.tmpInfo.rewardItems = new ArrayList();
}
StructRewardItem add = new StructRewardItem();
add.itemid = sqlRewardData.getInt("item");
add.period = (add.itemid == 1122017 ? Math.max(sqlRewardData.getInt("period"), 7200) : sqlRewardData.getInt("period"));
add.prob = (add.itemid == 2511117 ? 3 : sqlRewardData.getInt("prob"));
add.quantity = sqlRewardData.getShort("quantity");
add.worldmsg = (sqlRewardData.getString("worldMsg").length() <= 0 ? null : sqlRewardData.getString("worldMsg"));
add.effect = sqlRewardData.getString("effect");
this.tmpInfo.rewardItems.add(add);
}
public void initItemAddData(ResultSet sqlAddData) throws SQLException {
int itemID = sqlAddData.getInt("itemid");
if ((this.tmpInfo == null) || (this.tmpInfo.itemId != itemID)) {
if (!this.dataCache.containsKey(itemID)) {
FileoutputUtil.log("[initItemAddData] Tried to load an item while this is not in the cache: " + itemID);
return;
}
this.tmpInfo = ((ItemInformation) this.dataCache.get(itemID));
}
if (this.tmpInfo.equipAdditions == null) {
this.tmpInfo.equipAdditions = new LinkedList();
}
this.tmpInfo.equipAdditions.add(new Triple(sqlAddData.getString("key"), sqlAddData.getString("subKey"), sqlAddData.getString("value")));
}
public void initItemEquipData(ResultSet sqlEquipData) throws SQLException {
int itemID = sqlEquipData.getInt("itemid");
if ((this.tmpInfo == null) || (this.tmpInfo.itemId != itemID)) {
if (!this.dataCache.containsKey(itemID)) {
FileoutputUtil.log("[initItemEquipData] Tried to load an item while this is not in the cache: " + itemID);
return;
}
this.tmpInfo = ((ItemInformation) this.dataCache.get(itemID));
}
if (this.tmpInfo.equipStats == null) {
this.tmpInfo.equipStats = new HashMap();
}
int itemLevel = sqlEquipData.getInt("itemLevel");
if (itemLevel == -1) {
this.tmpInfo.equipStats.put(sqlEquipData.getString("key"), sqlEquipData.getInt("value"));
} else {
if (this.tmpInfo.equipIncs == null) {
this.tmpInfo.equipIncs = new HashMap();
}
Map toAdd = (Map) this.tmpInfo.equipIncs.get(Integer.valueOf(itemLevel));
if (toAdd == null) {
toAdd = new HashMap();
this.tmpInfo.equipIncs.put(itemLevel, toAdd);
}
toAdd.put(sqlEquipData.getString("key"), sqlEquipData.getInt("value"));
}
}
public void finalizeEquipData(ItemInformation item) {
int itemId = item.itemId;
if (item.equipStats == null) {
item.equipStats = new HashMap();
}
item.eq = new Equip(itemId, (short) 0, -1, (short) 0);
short stats = ItemConstants.getStat(itemId, 0);
if (stats > 0) {
item.eq.setStr(stats);
item.eq.setDex(stats);
item.eq.setInt(stats);
item.eq.setLuk(stats);
}
stats = ItemConstants.getATK(itemId, 0);
if (stats > 0) {
item.eq.setWatk(stats);
item.eq.setMatk(stats);
}
stats = ItemConstants.getHpMp(itemId, 0);
if (stats > 0) {
item.eq.setHp(stats);
item.eq.setMp(stats);
}
stats = ItemConstants.getDEF(itemId, 0);
if (stats > 0) {
item.eq.setWdef(stats);
item.eq.setMdef(stats);
}
if (item.equipStats.size() > 0) {
for (Map.Entry stat : item.equipStats.entrySet()) {
String key = (String) stat.getKey();
switch (key) {
case "STR":
item.eq.setStr(ItemConstants.getStat(itemId, ((int) stat.getValue())));
break;
case "DEX":
item.eq.setDex(ItemConstants.getStat(itemId, ((int) stat.getValue())));
break;
case "INT":
item.eq.setInt(ItemConstants.getStat(itemId, ((int) stat.getValue())));
break;
case "LUK":
item.eq.setLuk(ItemConstants.getStat(itemId, ((int) stat.getValue())));
break;
case "PAD":
item.eq.setWatk(ItemConstants.getATK(itemId, ((int) stat.getValue())));
break;
case "PDD":
item.eq.setWdef(ItemConstants.getDEF(itemId, ((int) stat.getValue())));
break;
case "MAD":
item.eq.setMatk(ItemConstants.getATK(itemId, ((int) stat.getValue())));
break;
case "MDD":
item.eq.setMdef(ItemConstants.getDEF(itemId, ((int) stat.getValue())));
break;
case "ACC":
item.eq.setAcc((short) (int) stat.getValue());
break;
case "EVA":
item.eq.setAvoid((short) (int) stat.getValue());
break;
case "Speed":
item.eq.setSpeed((short) (int) stat.getValue());
break;
case "Jump":
item.eq.setJump((short) (int) stat.getValue());
break;
case "MHP":
item.eq.setHp(ItemConstants.getHpMp(itemId, ((int) stat.getValue())));
break;
case "MMP":
item.eq.setMp(ItemConstants.getHpMp(itemId, ((int) stat.getValue())));
break;
case "tuc":
item.eq.setUpgradeSlots(((Integer) stat.getValue()).byteValue());
break;
case "Craft":
item.eq.setHands(((Integer) stat.getValue()).shortValue());
break;
case "charmEXP":
item.eq.setCharmEXP(((Integer) stat.getValue()).shortValue());
break;
case "bdR":
item.eq.setBossDamage(((Integer) stat.getValue()).shortValue());
break;
case "imdR":
item.eq.setIgnorePDR(((Integer) stat.getValue()).shortValue());
break;
}
}
if ((item.equipStats.get("cash") != null) && (item.eq.getCharmEXP() <= 0)) {
short exp = 0;
int identifier = itemId / 10000;
if ((ItemConstants.isWeapon(itemId)) || (identifier == 106)) {
exp = 60;
} else if (identifier == 100) {
exp = 50;
} else if ((ItemConstants.isAccessory(itemId)) || (identifier == 102) || (identifier == 108) || (identifier == 107)) {
exp = 40;
} else if ((identifier == 104) || (identifier == 105) || (identifier == 110)) {
exp = 30;
}
item.eq.setCharmEXP(exp);
}
}
}
public void initItemInformation(ResultSet sqlItemData) throws SQLException {
ItemInformation ret = new ItemInformation();
int itemId = sqlItemData.getInt("itemid");
ret.itemId = itemId;
ret.slotMax = (ItemConstants.getSlotMax(itemId) > 0 ? ItemConstants.getSlotMax(itemId) : sqlItemData.getShort("slotMax"));
ret.price = Double.parseDouble(sqlItemData.getString("price"));
ret.wholePrice = sqlItemData.getInt("wholePrice");
ret.stateChange = sqlItemData.getInt("stateChange");
ret.name = sqlItemData.getString("name");
ret.desc = sqlItemData.getString("desc");
ret.msg = sqlItemData.getString("msg");
ret.flag = sqlItemData.getInt("flags");
ret.karmaEnabled = sqlItemData.getByte("karma");
ret.meso = sqlItemData.getInt("meso");
ret.itemMakeLevel = sqlItemData.getShort("itemMakeLevel");
ret.questId = sqlItemData.getInt("questId");
ret.create = sqlItemData.getInt("create");
ret.replaceItem = sqlItemData.getInt("replaceId");
ret.replaceMsg = sqlItemData.getString("replaceMsg");
ret.afterImage = sqlItemData.getString("afterImage");
ret.cardSet = 0;
String scrollRq = sqlItemData.getString("scrollReqs");
if (scrollRq.length() > 0) {
ret.scrollReqs = new ArrayList();
String[] scroll = scrollRq.split(",");
for (String s : scroll) {
if (s.length() > 1) {
ret.scrollReqs.add(Integer.parseInt(s));
}
}
}
String consumeItem = sqlItemData.getString("consumeItem");
if (consumeItem.length() > 0) {
ret.questItems = new ArrayList();
String[] scroll = scrollRq.split(",");
for (String s : scroll) {
if (s.length() > 1) {
ret.questItems.add(Integer.parseInt(s));
}
}
}
ret.totalprob = sqlItemData.getInt("totalprob");
String incRq = sqlItemData.getString("incSkill");
if (incRq.length() > 0) {
ret.incSkill = new ArrayList();
String[] scroll = incRq.split(",");
for (String s : scroll) {
if (s.length() > 1) {
ret.incSkill.add(Integer.parseInt(s));
}
}
}
this.dataCache.put(itemId, ret);
}
public boolean isExpOrDropCardTime(int itemId) {
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/ShangHai"));
String day = MapleDayInt.getDayInt(cal.get(7));
Map times;
if (this.getExpCardTimes.containsKey(itemId)) {
times = (Map) this.getExpCardTimes.get(itemId);
} else {
List<MapleData> data = getItemData(itemId).getChildByPath("info").getChildByPath("time").getChildren();
Map hours = new HashMap();
for (MapleData childdata : data) {
String[] time = MapleDataTool.getString(childdata).split(":");
hours.put(time[0], time[1]);
}
times = hours;
this.getExpCardTimes.put(itemId, hours);
cal.get(7);
}
if (times.containsKey(day)) {
String[] hourspan = ((String) times.get(day)).split("-");
int starthour = Integer.parseInt(hourspan[0]);
int endhour = Integer.parseInt(hourspan[1]);
if ((cal.get(11) >= starthour) && (cal.get(11) <= endhour)) {
return true;
}
}
return false;
}
public ScriptedItem getScriptedItemInfo(int itemId) {
if (scriptedItemCache.containsKey(itemId)) {
return (ScriptedItem) scriptedItemCache.get(itemId);
}
if (itemId / 10000 != 243 && itemId / 10000 != 568) {
return null;
}
ScriptedItem script = new ScriptedItem(MapleDataTool.getInt("spec/npc", getItemData(itemId), 0), MapleDataTool.getString("spec/script", getItemData(itemId), ""), MapleDataTool.getInt("spec/runOnPickup", getItemData(itemId), 0) == 1);
scriptedItemCache.put(itemId, script);
return (ScriptedItem) scriptedItemCache.get(itemId);
}
public boolean isFloatCashItem(int itemId) {
if (this.floatCashItem.containsKey(itemId)) {
return (floatCashItem.get(itemId));
}
if (itemId / 10000 != 512) {
return false;
}
boolean floatType = MapleDataTool.getIntConvert("info/floatType", getItemData(itemId), 0) > 0;
floatCashItem.put(itemId, floatType);
return floatType;
}
public short getPetFlagInfo(int itemId) {
if (this.petFlagInfo.containsKey(itemId)) {
return (this.petFlagInfo.get(itemId));
}
short flag = 0;
if (itemId / 10000 != 500) {
return flag;
}
MapleData item = getItemData(itemId);
if (item == null) {
return flag;
}
if (MapleDataTool.getIntConvert("info/pickupItem", item, 0) > 0) {
flag = (short) (flag | 0x1);
}
if (MapleDataTool.getIntConvert("info/longRange", item, 0) > 0) {
flag = (short) (flag | 0x2);
}
if (MapleDataTool.getIntConvert("info/pickupAll", item, 0) > 0) {
flag = (short) (flag | 0x4);
}
if (MapleDataTool.getIntConvert("info/sweepForDrop", item, 0) > 0) {
flag = (short) (flag | 0x10);
}
if (MapleDataTool.getIntConvert("info/consumeHP", item, 0) > 0) {
flag = (short) (flag | 0x20);
}
if (MapleDataTool.getIntConvert("info/consumeMP", item, 0) > 0) {
flag = (short) (flag | 0x40);
}
if (MapleDataTool.getIntConvert("info/autoBuff", item, 0) > 0) {
flag = (short) (flag | 0x200);
}
this.petFlagInfo.put(itemId, flag);
return flag;
}
public int getPetSetItemID(int itemId) {
if (this.petSetItemID.containsKey(itemId)) {
return (this.petSetItemID.get(itemId));
}
int ret = -1;
if (itemId / 10000 != 500) {
return ret;
}
ret = MapleDataTool.getIntConvert("info/setItemID", getItemData(itemId), 0);
this.petSetItemID.put(itemId, ret);
return ret;
}
public int getItemIncMHPr(int itemId) {
if ((getEquipStats(itemId) == null) || (!getEquipStats(itemId).containsKey("MHPr"))) {
return 0;
}
return (getEquipStats(itemId).get("MHPr"));
}
public int getItemIncMMPr(int itemId) {
if ((getEquipStats(itemId) == null) || (!getEquipStats(itemId).containsKey("MMPr"))) {
return 0;
}
return (getEquipStats(itemId).get("MMPr"));
}
public int getSuccessRates(int itemId) {
if (this.successRates.containsKey(itemId)) {
return (this.successRates.get(itemId));
}
int success = 0;
if (itemId / 10000 != 204) {
return success;
}
success = MapleDataTool.getIntConvert("info/successRates/0", getItemData(itemId), 0);
this.successRates.put(itemId, success);
return success;
}
public int getForceUpgrade(int itemId) {
if (this.forceUpgrade.containsKey(itemId)) {
return (this.forceUpgrade.get(itemId));
}
int upgrade = 0;
if (itemId / 100 != 20493) {
return upgrade;
}
upgrade = MapleDataTool.getIntConvert("info/forceUpgrade", getItemData(itemId), 1);
this.forceUpgrade.put(itemId, upgrade);
return upgrade;
}
public Pair<Integer, Integer> getChairRecovery(int itemId) {
if (itemId / 10000 != 301) {
return null;
}
if (this.chairRecovery.containsKey(itemId)) {
return (Pair) this.chairRecovery.get(itemId);
}
int recoveryHP = MapleDataTool.getIntConvert("info/recoveryHP", getItemData(itemId), 0);
int recoveryMP = MapleDataTool.getIntConvert("info/recoveryMP", getItemData(itemId), 0);
Pair ret = new Pair(Integer.valueOf(recoveryHP), Integer.valueOf(recoveryMP));
this.chairRecovery.put(itemId, ret);
return ret;
}
public int getLimitBreak(int itemId) {
if ((getEquipStats(itemId) == null) || (!getEquipStats(itemId).containsKey("limitBreak"))) {
return 999999;
}
return (getEquipStats(itemId).get("limitBreak"));
}
public int getBossDamageRate(int itemId) {
if ((getEquipStats(itemId) == null) || (!getEquipStats(itemId).containsKey("bdR"))) {
return 0;
}
return (getEquipStats(itemId).get("bdR"));
}
public int getIgnoreMobDmageRate(int itemId) {
if ((getEquipStats(itemId) == null) || (!getEquipStats(itemId).containsKey("imdR"))) {
return 0;
}
return (getEquipStats(itemId).get("imdR"));
}
public int getScrollLimitBreak(int itemId) {
if (this.ScrollLimitBreak.containsKey(itemId)) {
return (this.ScrollLimitBreak.get(itemId));
}
int upgrade = 0;
if (itemId / 100 != 26140) {
return upgrade;
}
upgrade = MapleDataTool.getIntConvert("info/incALB", getItemData(itemId), 0);
this.forceUpgrade.put(itemId, upgrade);
return upgrade;
}
public boolean isNoCursedScroll(int itemId) {
if (this.noCursedScroll.containsKey(itemId)) {
return (this.noCursedScroll.get(itemId));
}
if (itemId / 10000 != 204) {
return false;
}
boolean noCursed = MapleDataTool.getIntConvert("info/noCursed", getItemData(itemId), 0) > 0;
this.noCursedScroll.put(itemId, noCursed);
return noCursed;
}
public boolean isNegativeScroll(int itemId) {
if (this.noNegativeScroll.containsKey(itemId)) {
return (this.noNegativeScroll.get(itemId));
}
if (itemId / 10000 != 204) {
return false;
}
boolean noNegative = MapleDataTool.getIntConvert("info/noNegative", getItemData(itemId), 0) > 0;
this.noNegativeScroll.put(itemId, noNegative);
return noNegative;
}
public boolean isExclusiveEquip(int itemId) {
return this.exclusiveEquip.containsKey(itemId);
}
public StructExclusiveEquip getExclusiveEquipInfo(int itemId) {
if (this.exclusiveEquip.containsKey(itemId)) {
int exclusiveId = (this.exclusiveEquip.get(Integer.valueOf(itemId)));
if (this.exclusiveEquipInfo.containsKey(exclusiveId)) {
return (StructExclusiveEquip) this.exclusiveEquipInfo.get(exclusiveId);
}
}
return null;
}
public Iterable<Pair<Integer, String>> getAllItems2() {
//if (!itemNameCache.isEmpty()) {
// return itemNameCache;
//}
List<Pair<Integer, String>> itemPairs = new ArrayList<>();
MapleData itemsData;
itemsData = stringData.getData("Cash.img");
for (MapleData itemFolder : itemsData.getChildren()) {
itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME")));
}
itemsData = stringData.getData("Consume.img");
for (MapleData itemFolder : itemsData.getChildren()) {
itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME")));
}
itemsData = stringData.getData("Eqp.img").getChildByPath("Eqp");
for (MapleData eqpType : itemsData.getChildren()) {
for (MapleData itemFolder : eqpType.getChildren()) {
itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME")));
}
}
itemsData = stringData.getData("Etc.img").getChildByPath("Etc");
for (MapleData itemFolder : itemsData.getChildren()) {
itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME")));
}
itemsData = stringData.getData("Ins.img");
for (MapleData itemFolder : itemsData.getChildren()) {
itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME")));
}
itemsData = stringData.getData("Pet.img");
for (MapleData itemFolder : itemsData.getChildren()) {
itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME")));
}
return itemPairs;
}
public static class MapleDayInt {
public static String getDayInt(int day) {
if (day == 1) {
return "SUN";
}
if (day == 2) {
return "MON";
}
if (day == 3) {
return "TUE";
}
if (day == 4) {
return "WED";
}
if (day == 5) {
return "THU";
}
if (day == 6) {
return "FRI";
}
if (day == 7) {
return "SAT";
}
return null;
}
}
}