package server; import clientside.MapleCharacter; import clientside.MapleTrait; import client.inventory.Equip; import client.inventory.Item; import client.inventory.ItemFlag; import client.inventory.MapleInventoryIdentifier; import client.inventory.MapleInventoryType; import constants.GameConstants; 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.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import provider.MapleData; import provider.MapleDataDirectoryEntry; import provider.MapleDataEntry; import provider.MapleDataFileEntry; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; import provider.MapleDataType; import server.StructSetItem.SetItem; import tools.Pair; import tools.Triple; public class MapleItemInformationProvider { private static final MapleItemInformationProvider instance = new MapleItemInformationProvider(); protected final MapleDataProvider chrData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("net.sf.odinms.wzpath") + "/Character.wz")); protected final MapleDataProvider etcData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("net.sf.odinms.wzpath") + "/Etc.wz")); protected final MapleDataProvider itemData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("net.sf.odinms.wzpath") + "/Item.wz")); protected final MapleDataProvider stringData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("net.sf.odinms.wzpath") + "/String.wz")); protected final Map<Integer, ItemInformation> dataCache = new HashMap(); protected final Map<String, List<Triple<String, Point, Point>>> afterImage = new HashMap(); protected final Map<Integer, List<StructItemOption>> potentialCache = new HashMap(); protected final Map<Integer, Map<Integer, StructItemOption>> socketCache = new HashMap(); protected final Map<Integer, MapleStatEffect> itemEffects = new HashMap(); protected final Map<Integer, MapleStatEffect> itemEffectsEx = new HashMap(); protected final Map<Integer, Integer> mobIds = new HashMap(); protected final Map<Integer, Pair<Integer, Integer>> potLife = new HashMap(); protected final Map<Integer, StructFamiliar> familiars = new HashMap(); protected final Map<Integer, StructFamiliar> familiars_Item = new HashMap(); protected final Map<Integer, StructFamiliar> familiars_Mob = new HashMap(); protected final Map<Integer, Pair<List<Integer>, List<Integer>>> androids = new HashMap(); protected final Map<Integer, Triple<Integer, List<Integer>, List<Integer>>> monsterBookSets = new HashMap(); protected final Map<Integer, StructSetItem> setItems = new HashMap(); private ItemInformation tmpInfo = null; public void runEtc() { if (!setItems.isEmpty() || !potentialCache.isEmpty() || !socketCache.isEmpty()) { return; } final MapleData setsData = etcData.getData("SetItemInfo.img"); StructSetItem itemz; SetItem itez; for (MapleData dat : setsData) { itemz = new StructSetItem(); itemz.setItemID = Integer.parseInt(dat.getName()); itemz.completeCount = (byte) MapleDataTool.getIntConvert("completeCount", dat, 0); for (MapleData level : dat.getChildByPath("ItemID")) { if (level.getType() != MapleDataType.INT) { for (MapleData leve : level) { if (!leve.getName().equals("representName") && !leve.getName().equals("typeName")) { itemz.itemIDs.add(MapleDataTool.getInt(leve)); } } } else { itemz.itemIDs.add(MapleDataTool.getInt(level)); } } for (MapleData level : dat.getChildByPath("Effect")) { itez = new SetItem(); itez.incPDD = MapleDataTool.getIntConvert("incPDD", level, 0); itez.incMDD = MapleDataTool.getIntConvert("incMDD", level, 0); itez.incSTR = MapleDataTool.getIntConvert("incSTR", level, 0); itez.incDEX = MapleDataTool.getIntConvert("incDEX", level, 0); itez.incINT = MapleDataTool.getIntConvert("incINT", level, 0); itez.incLUK = MapleDataTool.getIntConvert("incLUK", level, 0); itez.incACC = MapleDataTool.getIntConvert("incACC", level, 0); itez.incPAD = MapleDataTool.getIntConvert("incPAD", level, 0); itez.incMAD = MapleDataTool.getIntConvert("incMAD", level, 0); itez.incSpeed = MapleDataTool.getIntConvert("incSpeed", level, 0); itez.incMHP = MapleDataTool.getIntConvert("incMHP", level, 0); itez.incMMP = MapleDataTool.getIntConvert("incMMP", level, 0); itez.incMHPr = MapleDataTool.getIntConvert("incMHPr", level, 0); itez.incMMPr = MapleDataTool.getIntConvert("incMMPr", level, 0); itez.incAllStat = MapleDataTool.getIntConvert("incAllStat", level, 0); itez.option1 = MapleDataTool.getIntConvert("Option/1/option", level, 0); itez.option2 = MapleDataTool.getIntConvert("Option/2/option", level, 0); itez.option1Level = MapleDataTool.getIntConvert("Option/1/level", level, 0); itez.option2Level = MapleDataTool.getIntConvert("Option/2/level", level, 0); itemz.items.put(Integer.parseInt(level.getName()), itez); } setItems.put(itemz.setItemID, itemz); } StructItemOption item; final MapleData potsData = itemData.getData("ItemOption.img"); List<StructItemOption> items; for (MapleData dat : potsData) { items = new LinkedList<>(); for (MapleData potLevel : dat.getChildByPath("level")) { item = new StructItemOption(); item.opID = Integer.parseInt(dat.getName()); item.optionType = MapleDataTool.getIntConvert("info/optionType", dat, 0); item.reqLevel = MapleDataTool.getIntConvert("info/reqLevel", dat, 0); item.opString = MapleDataTool.getString("info/string", dat, ""); for (final String i : StructItemOption.types) { if (i.equals("face")) { item.face = MapleDataTool.getString("face", potLevel, ""); } else { final int level = MapleDataTool.getIntConvert(i, potLevel, 0); if (level > 0) { // Save memory item.data.put(i, level); } } } switch (item.opID) { case 31001: // Haste case 31002: // Mystic Door case 31003: // Sharp Eyes case 31004: // Hyper Body item.data.put("skillID", (item.opID - 23001)); break; case 41005: // Combat Orders case 41006: // Advanced Blessing case 41007: // Speed Infusion item.data.put("skillID", (item.opID - 33001)); break; } items.add(item); } potentialCache.put(Integer.parseInt(dat.getName()), items); } final Map<Integer, StructItemOption> gradeS = new HashMap<>(); final Map<Integer, StructItemOption> gradeA = new HashMap<>(); final Map<Integer, StructItemOption> gradeB = new HashMap<>(); final Map<Integer, StructItemOption> gradeC = new HashMap<>(); final Map<Integer, StructItemOption> gradeD = new HashMap<>(); final MapleData nebuliteData = itemData.getData("Install/0306.img"); for (MapleData dat : nebuliteData) { item = new StructItemOption(); item.opID = Integer.parseInt(dat.getName()); // Item Id item.optionType = MapleDataTool.getInt("optionType", dat.getChildByPath("socket"), 0); item.opString = MapleDataTool.getString("socket/string", dat, ""); for (MapleData info : dat.getChildByPath("socket/option")) { final String optionString = MapleDataTool.getString("optionString", info, ""); final int level = MapleDataTool.getInt("level", info, 0); if (level > 0) { // Save memory item.data.put(optionString, level); } } switch (item.opID) { case 3063370: // Haste item.data.put("skillID", 8000); break; case 3063380: // Mystic Door item.data.put("skillID", 8001); break; case 3063390: // Sharp Eyes item.data.put("skillID", 8002); break; case 3063400: // Hyper Body item.data.put("skillID", 8003); break; case 3064470: // Combat Orders item.data.put("skillID", 8004); break; case 3064480: // Advanced Blessing item.data.put("skillID", 8005); break; case 3064490: // Speed Infusion item.data.put("skillID", 8006); break; } switch (GameConstants.getNebuliteGrade(item.opID)) { case 4: //S gradeS.put(Integer.parseInt(dat.getName()), item); break; case 3: //A gradeA.put(Integer.parseInt(dat.getName()), item); break; case 2: //B gradeB.put(Integer.parseInt(dat.getName()), item); break; case 1: //C gradeC.put(Integer.parseInt(dat.getName()), item); break; case 0: //D gradeD.put(Integer.parseInt(dat.getName()), item); break; // impossible to be -1 since we're looping in 306.img.xml } } socketCache.put(4, gradeS); socketCache.put(3, gradeA); socketCache.put(2, gradeB); socketCache.put(1, gradeC); socketCache.put(0, gradeD); final MapleDataDirectoryEntry e = (MapleDataDirectoryEntry) etcData.getRoot().getEntry("Android"); for (MapleDataEntry d : e.getFiles()) { final MapleData iz = etcData.getData("Android/" + d.getName()); final List<Integer> hair = new ArrayList<Integer>(), face = new ArrayList<Integer>(); for (MapleData ds : iz.getChildByPath("costume/hair")) { hair.add(MapleDataTool.getInt(ds, 30000)); } for (MapleData ds : iz.getChildByPath("costume/face")) { face.add(MapleDataTool.getInt(ds, 20000)); } androids.put(Integer.parseInt(d.getName().substring(0, 4)), new Pair<List<Integer>, List<Integer>>(hair, face)); } final MapleData lifesData = etcData.getData("ItemPotLifeInfo.img"); for (MapleData d : lifesData) { if (d.getChildByPath("info") != null && MapleDataTool.getInt("type", d.getChildByPath("info"), 0) == 1) { potLife.put(MapleDataTool.getInt("counsumeItem", d.getChildByPath("info"), 0), new Pair<Integer, Integer>(Integer.parseInt(d.getName()), d.getChildByPath("level").getChildren().size())); } } List<Triple<String, Point, Point>> thePointK = new ArrayList<Triple<String, Point, Point>>(); List<Triple<String, Point, Point>> thePointA = new ArrayList<Triple<String, Point, Point>>(); final MapleDataDirectoryEntry a = (MapleDataDirectoryEntry) chrData.getRoot().getEntry("Afterimage"); for (MapleDataEntry b : a.getFiles()) { final MapleData iz = chrData.getData("Afterimage/" + b.getName()); List<Triple<String, Point, Point>> thePoint = new ArrayList<Triple<String, Point, Point>>(); Map<String, Pair<Point, Point>> dummy = new HashMap<String, Pair<Point, Point>>(); for (MapleData i : iz) { for (MapleData xD : i) { if (xD.getName().contains("prone") || xD.getName().contains("double") || xD.getName().contains("triple")) { continue; } if ((b.getName().contains("bow") || b.getName().contains("Bow")) && !xD.getName().contains("shoot")) { continue; } if ((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 = 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 = 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, 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<Point, Point>(lt, rb)); } } } for (Entry<String, Pair<Point, Point>> ez : dummy.entrySet()) { if (ez.getKey().length() > 2 && ez.getKey().substring(ez.getKey().length() - 2, ez.getKey().length() - 1).equals("D")) { //D = double weapon thePointK.add(new Triple<String, Point, Point>(ez.getKey(), ez.getValue().left, ez.getValue().right)); } else if (ez.getKey().contains("PoleArm")) { //D = double weapon thePointA.add(new Triple<String, Point, Point>(ez.getKey(), ez.getValue().left, ez.getValue().right)); } else { thePoint.add(new Triple<String, Point, Point>(ez.getKey(), ez.getValue().left, ez.getValue().right)); } } afterImage.put(b.getName().substring(0, b.getName().length() - 4), thePoint); } afterImage.put("katara", thePointK); //hackish afterImage.put("aran", thePointA); //hackish } public void runItems() { if (GameConstants.GMS) { //these must be loaded before items.. final MapleData fData = etcData.getData("FamiliarInfo.img"); for (MapleData d : fData) { StructFamiliar f = new StructFamiliar(); f.grade = 0; f.mob = MapleDataTool.getInt("mob", d, 0); f.passive = MapleDataTool.getInt("passive", d, 0); f.itemid = MapleDataTool.getInt("consume", d, 0); f.familiar = Integer.parseInt(d.getName()); familiars.put(f.familiar, f); familiars_Item.put(f.itemid, f); familiars_Mob.put(f.mob, f); } final MapleDataDirectoryEntry e = (MapleDataDirectoryEntry) chrData.getRoot().getEntry("Familiar"); for (MapleDataEntry d : e.getFiles()) { final int id = Integer.parseInt(d.getName().substring(0, d.getName().length() - 4)); if (familiars.containsKey(id)) { familiars.get(id).grade = (byte) MapleDataTool.getInt("grade", chrData.getData("Familiar/" + d.getName()).getChildByPath("info"), 0); } } final MapleData mSetsData = etcData.getData("MonsterBookSet.img"); for (MapleData d : mSetsData.getChildByPath("setList")) { if (MapleDataTool.getInt("deactivated", d, 0) > 0) { continue; } final List<Integer> set = new ArrayList<Integer>(), potential = new ArrayList<Integer>(3); for (MapleData ds : d.getChildByPath("stats/potential")) { if (ds.getType() != MapleDataType.STRING && MapleDataTool.getInt(ds, 0) > 0) { potential.add(MapleDataTool.getInt(ds, 0)); if (potential.size() >= 5) { break; } } } for (MapleData ds : d.getChildByPath("cardList")) { set.add(MapleDataTool.getInt(ds, 0)); } monsterBookSets.put(Integer.parseInt(d.getName()), new Triple<Integer, List<Integer>, List<Integer>>(MapleDataTool.getInt("setScore", d, 0), set, potential)); } } try { Connection con = DatabaseConnection.getConnection(); // Load Item Data PreparedStatement ps = con.prepareStatement("SELECT * FROM wz_itemdata"); ResultSet rs = ps.executeQuery(); while (rs.next()) { initItemInformation(rs); } rs.close(); ps.close(); // Load Item Equipment Data ps = con.prepareStatement("SELECT * FROM wz_itemequipdata ORDER BY itemid"); rs = ps.executeQuery(); while (rs.next()) { initItemEquipData(rs); } rs.close(); ps.close(); // Load Item Addition Data ps = con.prepareStatement("SELECT * FROM wz_itemadddata ORDER BY itemid"); rs = ps.executeQuery(); while (rs.next()) { initItemAddData(rs); } rs.close(); ps.close(); // Load Item Reward Data ps = con.prepareStatement("SELECT * FROM wz_itemrewarddata ORDER BY itemid"); rs = ps.executeQuery(); while (rs.next()) { initItemRewardData(rs); } rs.close(); ps.close(); // Finalize all Equipments for (Entry<Integer, ItemInformation> entry : dataCache.entrySet()) { if (GameConstants.getInventoryType(entry.getKey()) == MapleInventoryType.EQUIP) { finalizeEquipData(entry.getValue()); } } } catch (SQLException ex) { ex.printStackTrace(); } System.out.println(dataCache.size() + " items loaded."); } public final List<StructItemOption> getPotentialInfo(int potId) { return (List) potentialCache.get(Integer.valueOf(potId)); } public final Map<Integer, List<StructItemOption>> getAllPotentialInfo() { return this.potentialCache; } public final StructItemOption getSocketInfo(int potId) { int grade = GameConstants.getNebuliteGrade(potId); if (grade == -1) { return null; } return (StructItemOption) ((Map) this.socketCache.get(Integer.valueOf(grade))).get(Integer.valueOf(potId)); } public final Map<Integer, StructItemOption> getAllSocketInfo(int grade) { return (Map) this.socketCache.get(Integer.valueOf(grade)); } public final Collection<Integer> getMonsterBookList() { return this.mobIds.values(); } public final Map<Integer, Integer> getMonsterBook() { return this.mobIds; } public final Pair<Integer, Integer> getPot(int f) { return (Pair) this.potLife.get(Integer.valueOf(f)); } public final StructFamiliar getFamiliar(int f) { return (StructFamiliar) this.familiars.get(Integer.valueOf(f)); } public final Map<Integer, StructFamiliar> getFamiliars() { return this.familiars; } public final StructFamiliar getFamiliarByItem(int f) { return (StructFamiliar) this.familiars_Item.get(Integer.valueOf(f)); } public final StructFamiliar getFamiliarByMob(int f) { return (StructFamiliar) this.familiars_Mob.get(Integer.valueOf(f)); } public static final MapleItemInformationProvider getInstance() { return instance; } public final Collection<ItemInformation> getAllItems() { return this.dataCache.values(); } public final Pair<List<Integer>, List<Integer>> getAndroidInfo(int i) { return (Pair) this.androids.get(Integer.valueOf(i)); } public final Triple<Integer, List<Integer>, List<Integer>> getMonsterBookInfo(int i) { return (Triple) this.monsterBookSets.get(Integer.valueOf(i)); } public final Map<Integer, Triple<Integer, List<Integer>, List<Integer>>> getAllMonsterBookInfo() { return this.monsterBookSets; } protected final 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; } } } MapleDataDirectoryEntry topDir; return ret; } public Integer getItemIdByMob(int mobId) { return (Integer) this.mobIds.get(Integer.valueOf(mobId)); } public Integer getSetId(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return null; } return Integer.valueOf(i.cardSet); } public List<Pair<Integer, String>> getAllItems2() { List itemPairs = new ArrayList(); MapleData itemsData = this.stringData.getData("Cash.img"); for (MapleData itemFolder : itemsData.getChildren()) { itemPairs.add(new Pair(Integer.valueOf(Integer.parseInt(itemFolder.getName())), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); } itemsData = this.stringData.getData("Consume.img"); for (MapleData itemFolder : itemsData.getChildren()) { itemPairs.add(new Pair(Integer.valueOf(Integer.parseInt(itemFolder.getName())), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); } itemsData = this.stringData.getData("Eqp.img").getChildByPath("Eqp"); for (MapleData eqpType : itemsData.getChildren()) { for (MapleData itemFolder : eqpType.getChildren()) { itemPairs.add(new Pair(Integer.valueOf(Integer.parseInt(itemFolder.getName())), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); } } itemsData = this.stringData.getData("Etc.img").getChildByPath("Etc"); for (MapleData itemFolder : itemsData.getChildren()) { itemPairs.add(new Pair(Integer.valueOf(Integer.parseInt(itemFolder.getName())), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); } itemsData = this.stringData.getData("Ins.img"); for (MapleData itemFolder : itemsData.getChildren()) { itemPairs.add(new Pair(Integer.valueOf(Integer.parseInt(itemFolder.getName())), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); } itemsData = this.stringData.getData("Pet.img"); for (MapleData itemFolder : itemsData.getChildren()) { itemPairs.add(new Pair(Integer.valueOf(Integer.parseInt(itemFolder.getName())), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); } return itemPairs; } public final short getSlotMax(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return 0; } return i.slotMax; } public final int getWholePrice(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return 0; } return i.wholePrice; } public final 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()) { if (((String) stat.getKey()).equals("STRMin")) { nEquip.setStr((short) (nEquip.getStr() + rand(((Integer) stat.getValue()).intValue(), ((Integer) sta.get("STRMax")).intValue()))); } else if (((String) stat.getKey()).equals("DEXMin")) { nEquip.setDex((short) (nEquip.getDex() + rand(((Integer) stat.getValue()).intValue(), ((Integer) sta.get("DEXMax")).intValue()))); } else if (((String) stat.getKey()).equals("INTMin")) { nEquip.setInt((short) (nEquip.getInt() + rand(((Integer) stat.getValue()).intValue(), ((Integer) sta.get("INTMax")).intValue()))); } else if (((String) stat.getKey()).equals("LUKMin")) { nEquip.setLuk((short) (nEquip.getLuk() + rand(((Integer) stat.getValue()).intValue(), ((Integer) sta.get("LUKMax")).intValue()))); } else if (((String) stat.getKey()).equals("PADMin")) { nEquip.setWatk((short) (nEquip.getWatk() + rand(((Integer) stat.getValue()).intValue(), ((Integer) sta.get("PADMax")).intValue()))); } else if (((String) stat.getKey()).equals("PDDMin")) { nEquip.setWdef((short) (nEquip.getWdef() + rand(((Integer) stat.getValue()).intValue(), ((Integer) sta.get("PDDMax")).intValue()))); } else if (((String) stat.getKey()).equals("MADMin")) { nEquip.setMatk((short) (nEquip.getMatk() + rand(((Integer) stat.getValue()).intValue(), ((Integer) sta.get("MADMax")).intValue()))); } else if (((String) stat.getKey()).equals("MDDMin")) { nEquip.setMdef((short) (nEquip.getMdef() + rand(((Integer) stat.getValue()).intValue(), ((Integer) sta.get("MDDMax")).intValue()))); } else if (((String) stat.getKey()).equals("ACCMin")) { nEquip.setAcc((short) (nEquip.getAcc() + rand(((Integer) stat.getValue()).intValue(), ((Integer) sta.get("ACCMax")).intValue()))); } else if (((String) stat.getKey()).equals("EVAMin")) { nEquip.setAvoid((short) (nEquip.getAvoid() + rand(((Integer) stat.getValue()).intValue(), ((Integer) sta.get("EVAMax")).intValue()))); } else if (((String) stat.getKey()).equals("SpeedMin")) { nEquip.setSpeed((short) (nEquip.getSpeed() + rand(((Integer) stat.getValue()).intValue(), ((Integer) sta.get("SpeedMax")).intValue()))); } else if (((String) stat.getKey()).equals("JumpMin")) { nEquip.setJump((short) (nEquip.getJump() + rand(((Integer) stat.getValue()).intValue(), ((Integer) sta.get("JumpMax")).intValue()))); } else if (((String) stat.getKey()).equals("MHPMin")) { nEquip.setHp((short) (nEquip.getHp() + rand(((Integer) stat.getValue()).intValue(), ((Integer) sta.get("MHPMax")).intValue()))); } else if (((String) stat.getKey()).equals("MMPMin")) { nEquip.setMp((short) (nEquip.getMp() + rand(((Integer) stat.getValue()).intValue(), ((Integer) sta.get("MMPMax")).intValue()))); } else if (((String) stat.getKey()).equals("MaxHPMin")) { nEquip.setHp((short) (nEquip.getHp() + rand(((Integer) stat.getValue()).intValue(), ((Integer) sta.get("MaxHPMax")).intValue()))); } else if (((String) stat.getKey()).equals("MaxMPMin")) { nEquip.setMp((short) (nEquip.getMp() + rand(((Integer) stat.getValue()).intValue(), ((Integer) sta.get("MaxMPMax")).intValue()))); } } } catch (NullPointerException e) { e.printStackTrace(); } return nEquip; } public final List<Triple<String, String, String>> getEquipAdditions(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return null; } return i.equipAdditions; } public final 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 final Map<Integer, Map<String, Integer>> getEquipIncrements(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return null; } return i.equipIncs; } public final List<Integer> getEquipSkills(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return null; } return i.incSkill; } public final Map<String, Integer> getEquipStats(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return null; } return i.equipStats; } public final 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") ? ((Integer) stats.get("reqLevel")).intValue() : 0)) { if (str >= (stats.containsKey("reqSTR") ? ((Integer) stats.get("reqSTR")).intValue() : 0)) { if (dex >= (stats.containsKey("reqDEX") ? ((Integer) stats.get("reqDEX")).intValue() : 0)) { if (luk >= (stats.containsKey("reqLUK") ? ((Integer) stats.get("reqLUK")).intValue() : 0)) { if (int_ >= (stats.containsKey("reqINT") ? ((Integer) stats.get("reqINT")).intValue() : 0)) { Integer fameReq = (Integer) stats.get("reqPOP"); if ((fameReq != null) && (fame < fameReq.intValue())) { return false; } return true; } } } } } return false; } public final int getReqLevel(int itemId) { if ((getEquipStats(itemId) == null) || (!getEquipStats(itemId).containsKey("reqLevel"))) { return 0; } return ((Integer) getEquipStats(itemId).get("reqLevel")).intValue(); } public final int getSlots(int itemId) { if ((getEquipStats(itemId) == null) || (!getEquipStats(itemId).containsKey("tuc"))) { return 0; } return ((Integer) getEquipStats(itemId).get("tuc")).intValue(); } public final Integer getSetItemID(int itemId) { if ((getEquipStats(itemId) == null) || (!getEquipStats(itemId).containsKey("setItemID"))) { return Integer.valueOf(0); } return (Integer) getEquipStats(itemId).get("setItemID"); } public final StructSetItem getSetItem(int setItemId) { return (StructSetItem) this.setItems.get(Byte.valueOf((byte) setItemId)); } public final List<Integer> getScrollReqs(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return null; } return i.scrollReqs; } public final Item scrollEquipWithId(Item equip, Item scrollId, boolean ws, MapleCharacter chr, int vegas) { if (equip.getType() == 1) { Equip nEquip = (Equip) equip; final Map<String, Integer> stats = getEquipStats(scrollId.getItemId()); final Map<String, Integer> eqstats = getEquipStats(equip.getItemId()); int succ = (GameConstants.isEquipScroll(scrollId.getItemId())) || (GameConstants.isPotentialScroll(scrollId.getItemId())) || (!stats.containsKey("success")) ? 0 : GameConstants.isTablet(scrollId.getItemId()) ? GameConstants.getSuccessTablet(scrollId.getItemId(), nEquip.getLevel()) : ((Integer) stats.get("success")).intValue(); int curse = (GameConstants.isEquipScroll(scrollId.getItemId())) || (GameConstants.isPotentialScroll(scrollId.getItemId())) || (!stats.containsKey("cursed")) ? 0 : GameConstants.isTablet(scrollId.getItemId()) ? GameConstants.getCurseTablet(scrollId.getItemId(), nEquip.getLevel()) : ((Integer) stats.get("cursed")).intValue(); int added = (ItemFlag.LUCKS_KEY.check(equip.getFlag()) ? 10 : 0) + chr.getTrait(MapleTrait.MapleTraitType.craft).getLevel() / 10; int success = succ + ((vegas == 5610001) && (succ == 60) ? 30 : (vegas == 5610000) && (succ == 10) ? 20 : 0) + added; if ((ItemFlag.LUCKS_KEY.check(equip.getFlag())) && (!GameConstants.isPotentialScroll(scrollId.getItemId())) && (!GameConstants.isEquipScroll(scrollId.getItemId())) && (!GameConstants.isSpecialScroll(scrollId.getItemId()))) { equip.setFlag((short) (equip.getFlag() - ItemFlag.LUCKS_KEY.getValue())); } if ((GameConstants.isPotentialScroll(scrollId.getItemId())) || (GameConstants.isEquipScroll(scrollId.getItemId())) || (GameConstants.isSpecialScroll(scrollId.getItemId())) || (Randomizer.nextInt(100) <= success)) { short flag; switch (scrollId.getItemId()) { case 2049000: case 2049001: case 2049002: case 2049003: case 2049004: case 2049005: if ((eqstats.containsKey("tuc")) && (nEquip.getLevel() + nEquip.getUpgradeSlots() < ((Integer) eqstats.get("tuc")).intValue())) { nEquip.setUpgradeSlots((byte) (nEquip.getUpgradeSlots() + 1)); } break; case 2049006: case 2049007: case 2049008: if ((eqstats.containsKey("tuc")) && (nEquip.getLevel() + nEquip.getUpgradeSlots() < ((Integer) eqstats.get("tuc")).intValue())) { nEquip.setUpgradeSlots((byte) (nEquip.getUpgradeSlots() + 2)); } break; case 2040727: flag = nEquip.getFlag(); flag = (short) (flag | ItemFlag.SPIKES.getValue()); nEquip.setFlag(flag); break; case 2041058: flag = nEquip.getFlag(); flag = (short) (flag | ItemFlag.COLD.getValue()); nEquip.setFlag(flag); break; case 2530000: case 2530001: case 5063000: flag = nEquip.getFlag(); flag = (short) (flag | ItemFlag.LUCKS_KEY.getValue()); nEquip.setFlag(flag); break; case 2531000: case 5064000: case 5064002: case 5064003: case 5064004: flag = nEquip.getFlag(); flag = (short) (flag | ItemFlag.SHIELD_WARD.getValue()); nEquip.setFlag(flag); break; case 5064100: case 5064101: flag = nEquip.getFlag(); flag = (short) (flag | ItemFlag.SLOTS_PROTECT.getValue()); nEquip.setFlag(flag); break; case 2049600: case 2049601: case 2049604: case 2049605: case 2049606: case 2049607: case 2049608: case 2049609: case 2049610: case 2049611: Item item; MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); item = ii.getStats((Equip) ii.getEquipById(nEquip.getItemId()), nEquip.getPotential1(), nEquip.getPotential2(), nEquip.getPotential3(), nEquip.getPotential4(), nEquip.getPotential5(), nEquip.getSocket1(), nEquip.getSocket2(), nEquip.getSocket3()); if (chr.getInventory(GameConstants.getInventoryType(item.getItemId())).getNextFreeSlot() > 0 && !isMSI(nEquip, (short) 32760)) { MapleInventoryManipulator.addbyItem(chr.getClient(), item); } else { break; } break; default: if (GameConstants.isChaosScroll(scrollId.getItemId())) { int z = GameConstants.getChaosNumber(scrollId.getItemId()); if (nEquip.getStr() > 0) { nEquip.setStr((short) (nEquip.getStr() + Randomizer.nextInt(z) * (Randomizer.nextBoolean() ? 1 : -1))); } if (nEquip.getDex() > 0) { nEquip.setDex((short) (nEquip.getDex() + Randomizer.nextInt(z) * (Randomizer.nextBoolean() ? 1 : -1))); } if (nEquip.getInt() > 0) { nEquip.setInt((short) (nEquip.getInt() + Randomizer.nextInt(z) * (Randomizer.nextBoolean() ? 1 : -1))); } if (nEquip.getLuk() > 0) { nEquip.setLuk((short) (nEquip.getLuk() + Randomizer.nextInt(z) * (Randomizer.nextBoolean() ? 1 : -1))); } if (nEquip.getWatk() > 0) { nEquip.setWatk((short) (nEquip.getWatk() + Randomizer.nextInt(z) * (Randomizer.nextBoolean() ? 1 : -1))); } if (nEquip.getWdef() > 0) { nEquip.setWdef((short) (nEquip.getWdef() + Randomizer.nextInt(z) * (Randomizer.nextBoolean() ? 1 : -1))); } if (nEquip.getMatk() > 0) { nEquip.setMatk((short) (nEquip.getMatk() + Randomizer.nextInt(z) * (Randomizer.nextBoolean() ? 1 : -1))); } if (nEquip.getMdef() > 0) { nEquip.setMdef((short) (nEquip.getMdef() + Randomizer.nextInt(z) * (Randomizer.nextBoolean() ? 1 : -1))); } if (nEquip.getAcc() > 0) { nEquip.setAcc((short) (nEquip.getAcc() + Randomizer.nextInt(z) * (Randomizer.nextBoolean() ? 1 : -1))); } if (nEquip.getAvoid() > 0) { nEquip.setAvoid((short) (nEquip.getAvoid() + Randomizer.nextInt(z) * (Randomizer.nextBoolean() ? 1 : -1))); } if (nEquip.getSpeed() > 0) { nEquip.setSpeed((short) (nEquip.getSpeed() + Randomizer.nextInt(z) * (Randomizer.nextBoolean() ? 1 : -1))); } if (nEquip.getJump() > 0) { nEquip.setJump((short) (nEquip.getJump() + Randomizer.nextInt(z) * (Randomizer.nextBoolean() ? 1 : -1))); } if (nEquip.getHp() > 0) { nEquip.setHp((short) (nEquip.getHp() + Randomizer.nextInt(z) * (Randomizer.nextBoolean() ? 1 : -1))); } if (nEquip.getMp() > 0) { nEquip.setMp((short) (nEquip.getMp() + Randomizer.nextInt(z) * (Randomizer.nextBoolean() ? 1 : -1))); } } else if (GameConstants.isEquipScroll(scrollId.getItemId())) { int chanc = Math.max((scrollId.getItemId() == 2049305 ? 60 : (scrollId.getItemId() == 2049300) || (scrollId.getItemId() == 2049303) ? 100 : 80) - nEquip.getEnhance() * 10, 10) + added; if (Randomizer.nextInt(100) > chanc) { return null; } for (int i = 0; i < (scrollId.getItemId() == 2049304 ? 3 : scrollId.getItemId() == 2049305 ? 4 : scrollId.getItemId() == 2049308 ? 5 : 1); i++) { if ((nEquip.getStr() > 0) || (Randomizer.nextInt(50) == 1)) { nEquip.setStr((short) (nEquip.getStr() + Randomizer.nextInt(5))); } if ((nEquip.getDex() > 0) || (Randomizer.nextInt(50) == 1)) { nEquip.setDex((short) (nEquip.getDex() + Randomizer.nextInt(5))); } if ((nEquip.getInt() > 0) || (Randomizer.nextInt(50) == 1)) { nEquip.setInt((short) (nEquip.getInt() + Randomizer.nextInt(5))); } if ((nEquip.getLuk() > 0) || (Randomizer.nextInt(50) == 1)) { nEquip.setLuk((short) (nEquip.getLuk() + Randomizer.nextInt(5))); } if ((nEquip.getWatk() > 0) && (GameConstants.isWeapon(nEquip.getItemId()))) { nEquip.setWatk((short) (nEquip.getWatk() + Randomizer.nextInt(5))); } if ((nEquip.getWdef() > 0) || (Randomizer.nextInt(40) == 1)) { nEquip.setWdef((short) (nEquip.getWdef() + Randomizer.nextInt(5))); } if ((nEquip.getMatk() > 0) && (GameConstants.isWeapon(nEquip.getItemId()))) { nEquip.setMatk((short) (nEquip.getMatk() + Randomizer.nextInt(5))); } 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.nextInt(5))); } if ((nEquip.getMp() > 0) || (Randomizer.nextInt(5) == 1)) { nEquip.setMp((short) (nEquip.getMp() + Randomizer.nextInt(5))); } nEquip.setEnhance((byte) (nEquip.getEnhance() + 1)); } } else if (GameConstants.isPotentialScroll(scrollId.getItemId())) { if ((nEquip.getState() <= 17) && (scrollId.getItemId() / 100 == 20497)) { int chanc = (scrollId.getItemId() == 2049700 ? 100 : 80) + added; if (Randomizer.nextInt(100) > chanc) { return null; } nEquip.renewPotential(2); } else if (nEquip.getState() == 0) { int chanc = (scrollId.getItemId() == 2049400 ? 90 : (scrollId.getItemId() == 5534000) || (scrollId.getItemId() == 2049402) || (scrollId.getItemId() == 2049406) ? 100 : 70) + added; if (Randomizer.nextInt(100) > chanc) { return null; } nEquip.resetPotential(); } } else { for (Map.Entry stat : stats.entrySet()) { String key = (String) stat.getKey(); if (key.equals("STR")) { nEquip.setStr((short) (nEquip.getStr() + ((Integer) stat.getValue()).intValue())); } else if (key.equals("DEX")) { nEquip.setDex((short) (nEquip.getDex() + ((Integer) stat.getValue()).intValue())); } else if (key.equals("INT")) { nEquip.setInt((short) (nEquip.getInt() + ((Integer) stat.getValue()).intValue())); } else if (key.equals("LUK")) { nEquip.setLuk((short) (nEquip.getLuk() + ((Integer) stat.getValue()).intValue())); } else if (key.equals("PAD")) { nEquip.setWatk((short) (nEquip.getWatk() + ((Integer) stat.getValue()).intValue())); } else if (key.equals("PDD")) { nEquip.setWdef((short) (nEquip.getWdef() + ((Integer) stat.getValue()).intValue())); } else if (key.equals("MAD")) { nEquip.setMatk((short) (nEquip.getMatk() + ((Integer) stat.getValue()).intValue())); } else if (key.equals("MDD")) { nEquip.setMdef((short) (nEquip.getMdef() + ((Integer) stat.getValue()).intValue())); } else if (key.equals("ACC")) { nEquip.setAcc((short) (nEquip.getAcc() + ((Integer) stat.getValue()).intValue())); } else if (key.equals("EVA")) { nEquip.setAvoid((short) (nEquip.getAvoid() + ((Integer) stat.getValue()).intValue())); } else if (key.equals("Speed")) { nEquip.setSpeed((short) (nEquip.getSpeed() + ((Integer) stat.getValue()).intValue())); } else if (key.equals("Jump")) { nEquip.setJump((short) (nEquip.getJump() + ((Integer) stat.getValue()).intValue())); } else if (key.equals("MHP")) { nEquip.setHp((short) (nEquip.getHp() + ((Integer) stat.getValue()).intValue())); } else if (key.equals("MMP")) { nEquip.setMp((short) (nEquip.getMp() + ((Integer) stat.getValue()).intValue())); } } } break; } if (GameConstants.isInnocence(scrollId.getItemId())) { nEquip.setAcc((short) 6969); } if ((!GameConstants.isCleanSlate(scrollId.getItemId())) && !GameConstants.isInnocence(scrollId.getItemId()) && (!GameConstants.isSpecialScroll(scrollId.getItemId())) && (!GameConstants.isEquipScroll(scrollId.getItemId())) && (!GameConstants.isPotentialScroll(scrollId.getItemId()))) { nEquip.setUpgradeSlots((byte) (nEquip.getUpgradeSlots() - 1)); nEquip.setLevel((byte) (nEquip.getLevel() + 1)); } } else { if ((!ws) && !GameConstants.isInnocence(scrollId.getItemId()) && (!GameConstants.isCleanSlate(scrollId.getItemId())) && (!GameConstants.isSpecialScroll(scrollId.getItemId())) && (!GameConstants.isEquipScroll(scrollId.getItemId())) && (!GameConstants.isPotentialScroll(scrollId.getItemId()))) { if (ItemFlag.SLOTS_PROTECT.check(nEquip.getFlag())) { chr.dropMessage(5, "Item has successfully been protected."); } else { nEquip.setUpgradeSlots((byte) (nEquip.getUpgradeSlots() - 1)); } } if (Randomizer.nextInt(99) < curse) { return null; } } } return equip; } public final Item getEquipById(int equipId) { return getEquipById(equipId, -1); } public final 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 final 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 final 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 final 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 final 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 final 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 final 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 final 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 final MapleStatEffect getItemEffect(int itemId) { MapleStatEffect ret = (MapleStatEffect) 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(Integer.valueOf(itemId), ret); } return ret; } public final 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(Integer.valueOf(itemId), ret); } return ret; } public final int getCreateId(int id) { ItemInformation i = getItemInformation(id); if (i == null) { return 0; } return i.create; } public final int getCardMobId(int id) { ItemInformation i = getItemInformation(id); if (i == null) { return 0; } return i.monsterBook; } public final int getBagType(int id) { ItemInformation i = getItemInformation(id); if (i == null) { return 0; } return i.flag & 0xF; } public final int getWatkForProjectile(int itemId) { ItemInformation i = getItemInformation(itemId); if ((i == null) || (i.equipStats == null) || (i.equipStats.get("incPAD") == null)) { return 0; } return ((Integer) i.equipStats.get("incPAD")).intValue(); } public final boolean canScroll(int scrollid, int itemid) { return scrollid / 100 % 100 == itemid / 10000 % 100; } public final String getName(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return null; } return i.name; } public final String getDesc(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return null; } return i.desc; } public final String getMsg(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return null; } return i.msg; } public final short getItemMakeLevel(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return 0; } return i.itemMakeLevel; } // // public final boolean isDropRestricted(int itemId) { // ItemInformation i = getItemInformation(itemId); // if (i == null) { // return false; // } // return (((i.flag & 0x200) != 0) || ((i.flag & 0x400) != 0) || (GameConstants.isDropRestricted(itemId))) && ((itemId == 3012000) || (itemId == 3012015) || (itemId / 10000 != 301)) && (itemId != 2041200) && (itemId != 5640000) && (itemId != 4170023) && (itemId != 2040124) && (itemId != 2040125) && (itemId != 2040126) && (itemId != 2040211) && (itemId != 2040212) && (itemId != 2040227) && (itemId != 2040228) && (itemId != 2040229) && (itemId != 2040230) && (itemId != 1002926) && (itemId != 1002906) && (itemId != 1002927); // } // // public final boolean isPickupRestricted(int itemId) { // ItemInformation i = getItemInformation(itemId); // if (i == null) { // return false; // } // return (((i.flag & 0x80) != 0) || (GameConstants.isPickupRestricted(itemId))) && (itemId != 4001168) && (itemId != 4031306) && (itemId != 4031307); // } // // public final boolean isAccountShared(int itemId) { // ItemInformation i = getItemInformation(itemId); // if (i == null) { // return false; // } // return (i.flag & 0x100) != 0; // } public final int getStateChangeItem(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return 0; } return i.stateChange; } public final int getMeso(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return 0; } return i.meso; } // public final boolean isShareTagEnabled(int itemId) { // ItemInformation i = getItemInformation(itemId); // if (i == null) { // return false; // } // return (i.flag & 0x800) != 0; // } public final boolean isKarmaEnabled(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return false; } return i.karmaEnabled == 1; } public final boolean isPKarmaEnabled(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return false; } return i.karmaEnabled == 2; } // public final boolean isPickupBlocked(int itemId) { // ItemInformation i = getItemInformation(itemId); // if (i == null) { // return false; // } // return (i.flag & 0x40) != 0; // } // // public final boolean isLogoutExpire(int itemId) { // ItemInformation i = getItemInformation(itemId); // if (i == null) { // return false; // } // return (i.flag & 0x20) != 0; // } // // public final boolean cantSell(int itemId) { // ItemInformation i = getItemInformation(itemId); // if (i == null) { // return false; // } // return (i.flag & 0x10) != 0; // } public final Pair<Integer, List<StructRewardItem>> getRewardItem(int itemid) { ItemInformation i = getItemInformation(itemid); if (i == null) { return null; } return new Pair(Integer.valueOf(i.totalprob), i.rewardItems); } public final boolean isMobHP(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return false; } return (i.flag & 0x1000) != 0; } public final boolean isQuestItem(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return false; } return ((i.flag & 0x200) != 0) && (itemId / 10000 != 301); } public final Pair<Integer, List<Integer>> questItemInfo(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return null; } return new Pair(Integer.valueOf(i.questId), i.questItems); } public final Pair<Integer, String> replaceItemInfo(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return null; } return new Pair(Integer.valueOf(i.replaceItem), i.replaceMsg); } public final List<Triple<String, Point, Point>> getAfterImage(String after) { return (List) this.afterImage.get(after); } public final String getAfterImage(int itemId) { ItemInformation i = getItemInformation(itemId); if (i == null) { return null; } return i.afterImage; } public final boolean itemExists(int itemId) { if (GameConstants.getInventoryType(itemId) == MapleInventoryType.UNDEFINED) { return false; } return getItemInformation(itemId) != null; } public final boolean isCash(int itemId) { if (getEquipStats(itemId) == null) { return GameConstants.getInventoryType(itemId) == MapleInventoryType.CASH; } return (GameConstants.getInventoryType(itemId) == MapleInventoryType.CASH) || (getEquipStats(itemId).get("cash") != null); } public final ItemInformation getItemInformation(int itemId) { if (itemId <= 0) { return null; } return (ItemInformation) this.dataCache.get(Integer.valueOf(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(Integer.valueOf(itemID))) { System.out.println("[initItemRewardData] Tried to load an item while this is not in the cache: " + itemID); return; } this.tmpInfo = ((ItemInformation) this.dataCache.get(Integer.valueOf(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 = 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(Integer.valueOf(itemID))) { System.out.println("[initItemAddData] Tried to load an item while this is not in the cache: " + itemID); return; } this.tmpInfo = ((ItemInformation) this.dataCache.get(Integer.valueOf(itemID))); } if (this.tmpInfo.equipAdditions == null) { this.tmpInfo.equipAdditions = new LinkedList(); } while (sqlAddData.next()) { 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(Integer.valueOf(itemID))) { System.out.println("[initItemEquipData] Tried to load an item while this is not in the cache: " + itemID); return; } this.tmpInfo = ((ItemInformation) this.dataCache.get(Integer.valueOf(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"), Integer.valueOf(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(Integer.valueOf(itemLevel), toAdd); } toAdd.put(sqlEquipData.getString("key"), Integer.valueOf(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 = GameConstants.getStat(itemId, 0); if (stats > 0) { item.eq.setStr(stats); item.eq.setDex(stats); item.eq.setInt(stats); item.eq.setLuk(stats); } stats = GameConstants.getATK(itemId, 0); if (stats > 0) { item.eq.setWatk(stats); item.eq.setMatk(stats); } stats = GameConstants.getHpMp(itemId, 0); if (stats > 0) { item.eq.setHp(stats); item.eq.setMp(stats); } stats = GameConstants.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(); if (key.equals("STR")) { item.eq.setStr(GameConstants.getStat(itemId, ((Integer) stat.getValue()).intValue())); } else if (key.equals("DEX")) { item.eq.setDex(GameConstants.getStat(itemId, ((Integer) stat.getValue()).intValue())); } else if (key.equals("INT")) { item.eq.setInt(GameConstants.getStat(itemId, ((Integer) stat.getValue()).intValue())); } else if (key.equals("LUK")) { item.eq.setLuk(GameConstants.getStat(itemId, ((Integer) stat.getValue()).intValue())); } else if (key.equals("PAD")) { item.eq.setWatk(GameConstants.getATK(itemId, ((Integer) stat.getValue()).intValue())); } else if (key.equals("PDD")) { item.eq.setWdef(GameConstants.getDEF(itemId, ((Integer) stat.getValue()).intValue())); } else if (key.equals("MAD")) { item.eq.setMatk(GameConstants.getATK(itemId, ((Integer) stat.getValue()).intValue())); } else if (key.equals("MDD")) { item.eq.setMdef(GameConstants.getDEF(itemId, ((Integer) stat.getValue()).intValue())); } else if (key.equals("ACC")) { item.eq.setAcc((short) ((Integer) stat.getValue()).intValue()); } else if (key.equals("EVA")) { item.eq.setAvoid((short) ((Integer) stat.getValue()).intValue()); } else if (key.equals("Speed")) { item.eq.setSpeed((short) ((Integer) stat.getValue()).intValue()); } else if (key.equals("Jump")) { item.eq.setJump((short) ((Integer) stat.getValue()).intValue()); } else if (key.equals("MHP")) { item.eq.setHp(GameConstants.getHpMp(itemId, ((Integer) stat.getValue()).intValue())); } else if (key.equals("MMP")) { item.eq.setMp(GameConstants.getHpMp(itemId, ((Integer) stat.getValue()).intValue())); } else if (key.equals("tuc")) { item.eq.setUpgradeSlots(((Integer) stat.getValue()).byteValue()); } else if (key.equals("Craft")) { item.eq.setHands(((Integer) stat.getValue()).shortValue()); } else if (key.equals("durability")) { item.eq.setDurability(((Integer) stat.getValue()).intValue()); } else if (key.equals("charmEXP")) { item.eq.setCharmEXP(((Integer) stat.getValue()).shortValue()); } else if (key.equals("PVPDamage")) { item.eq.setPVPDamage(((Integer) stat.getValue()).shortValue()); } } if ((item.equipStats.get("cash") != null) && (item.eq.getCharmEXP() <= 0)) { short exp = 0; int identifier = itemId / 10000; if ((GameConstants.isWeapon(itemId)) || (identifier == 106)) { exp = 60; } else if (identifier == 100) { exp = 50; } else if ((GameConstants.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 = (GameConstants.getSlotMax(itemId) > 0 ? GameConstants.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.monsterBook = sqlItemData.getInt("monsterBook"); 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; if ((ret.monsterBook > 0) && (itemId / 10000 == 238)) { this.mobIds.put(Integer.valueOf(ret.monsterBook), Integer.valueOf(itemId)); for (Map.Entry set : this.monsterBookSets.entrySet()) { if (((List) ((Triple) set.getValue()).mid).contains(Integer.valueOf(itemId))) { ret.cardSet = ((Integer) set.getKey()).intValue(); break; } } } 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.valueOf(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.valueOf(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.valueOf(Integer.parseInt(s))); } } } this.dataCache.put(Integer.valueOf(itemId), ret); } public Equip voteitem(Equip equip) { short stat = 100; equip.setStr((short) (equip.getStr() + stat)); equip.setDex((short) (equip.getDex() + stat)); equip.setInt((short) (equip.getInt() + stat)); equip.setLuk((short) (equip.getLuk() + stat)); equip.setMatk((short) (equip.getMatk() + stat)); equip.setWatk((short) (equip.getWatk() + stat)); equip.setAcc((short) (equip.getAcc() + stat)); equip.setAvoid((short) (equip.getAvoid() + stat)); equip.setJump((short) (equip.getJump() + stat)); equip.setHands((short) (equip.getHands() + stat)); equip.setSpeed((short) (equip.getSpeed() + stat)); equip.setWdef((short) (equip.getWdef() + stat)); equip.setMdef((short) (equip.getMdef() + stat)); equip.setHp((short) (equip.getHp() + stat)); equip.setMp((short) (equip.getMp() + stat)); return equip; } public Equip MSI(Equip equip, short stat) { final int uid = MapleInventoryIdentifier.getInstance(); equip.setStr(stat); equip.setDex(stat); equip.setInt(stat); equip.setLuk(stat); equip.setMatk(stat); equip.setWatk(stat); equip.setAcc(stat); equip.setAvoid(stat); equip.setJump(stat); equip.setSpeed(stat); equip.setWdef(stat); equip.setMdef(stat); equip.setHp(stat); equip.setMp(stat); equip.setUpgradeSlots((byte) 0); equip.setViciousHammer((byte) 2); equip.setGiftFrom(Integer.toString(uid)); return equip; } public boolean isMSI(Equip equip, short stat) { if (equip.getStr() > stat && equip.getDex() > stat && equip.getInt() > stat && equip.getLuk() > stat && equip.getMatk() > stat && equip.getWatk() > stat && equip.getAcc() > stat && equip.getAvoid() > stat && equip.getSpeed() > stat && equip.getJump() > stat && equip.getWdef() > stat && equip.getMdef() > stat && equip.getMp() > stat && equip.getHp() > stat) { return true; } else { return false; } } public Equip SRB2(Equip equip) { // short stat = ; equip.setStr((short) Math.max(3000, (Randomizer.nextInt(20000)))); equip.setDex((short) Math.max(3000, (Randomizer.nextInt(20000)))); equip.setInt((short) Math.max(3000, (Randomizer.nextInt(20000)))); equip.setLuk((short) Math.max(3000, (Randomizer.nextInt(20000)))); equip.setMatk((short) Math.max(50, (Randomizer.nextInt(200)))); equip.setWatk((short) Math.max(50, (Randomizer.nextInt(200)))); equip.setAcc((short) Math.max(3000, (Randomizer.nextInt(20000)))); equip.setAvoid((short) Math.max(3000, (Randomizer.nextInt(20000)))); equip.setJump((short) Math.max(3000, (Randomizer.nextInt(20000)))); equip.setSpeed((short) Math.max(3000, (Randomizer.nextInt(20000)))); equip.setWdef((short) Math.max(3000, (Randomizer.nextInt(20000)))); equip.setMdef((short) Math.max(3000, (Randomizer.nextInt(20000)))); equip.setHp((short) Math.max(3000, (Randomizer.nextInt(20000)))); equip.setMp((short) Math.max(3000, (Randomizer.nextInt(20000)))); return equip; } public Equip SRB3(Equip equip) { // short stat = ; equip.setStr((short) Math.max(20000, (Randomizer.nextInt(32767)))); equip.setDex((short) Math.max(20000, (Randomizer.nextInt(32767)))); equip.setInt((short) Math.max(20000, (Randomizer.nextInt(32767)))); equip.setLuk((short) Math.max(20000, (Randomizer.nextInt(32767)))); equip.setMatk((short) Math.max(200, (Randomizer.nextInt(500)))); equip.setWatk((short) Math.max(200, (Randomizer.nextInt(500)))); equip.setAcc((short) Math.max(20000, (Randomizer.nextInt(32767)))); equip.setAvoid((short) Math.max(20000, (Randomizer.nextInt(32767)))); equip.setJump((short) Math.max(20000, (Randomizer.nextInt(32767)))); equip.setSpeed((short) Math.max(20000, (Randomizer.nextInt(32767)))); equip.setWdef((short) Math.max(20000, (Randomizer.nextInt(32767)))); equip.setMdef((short) Math.max(20000, (Randomizer.nextInt(32767)))); equip.setHp((short) Math.max(20000, (Randomizer.nextInt(32767)))); equip.setMp((short) Math.max(20000, (Randomizer.nextInt(32767)))); return equip; } public boolean isEquip(int itemId) { return itemId / 1000000 == 1; } public Equip getStats(Equip equip, int pot1, int pot2, int pot3, int pot4, int pot5, int sock1, int sock2, int sock3) { equip.setStr(equip.getStr()); equip.setDex(equip.getDex()); equip.setInt(equip.getInt()); equip.setLuk(equip.getLuk()); equip.setMatk(equip.getMatk()); equip.setWatk(equip.getWatk()); equip.setAcc(equip.getAcc()); equip.setAvoid(equip.getAvoid()); equip.setJump(equip.getJump()); equip.setHands(equip.getHands()); equip.setSpeed(equip.getSpeed()); equip.setWdef(equip.getWdef()); equip.setMdef(equip.getMdef()); equip.setHp(equip.getHp()); equip.setMp(equip.getMp()); equip.setPotential1(pot1); equip.setPotential2(pot2); equip.setPotential3(pot3); equip.setPotential4(pot4); equip.setPotential5(pot5); equip.setSocket1(sock1); equip.setSocket2(sock2); equip.setSocket3(sock3); return equip; } }