package client.inventory; import constants.GameConstants; import database.DatabaseConnection; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import server.MapleItemInformationProvider; import tools.Pair; public enum ItemLoader { INVENTORY("inventoryitems", "inventoryequipment", 0, "characterid"), STORAGE("inventoryitems", "inventoryequipment", 1, "accountid"), CASHSHOP("csitems", "csequipment", 2, "accountid"), HIRED_MERCHANT("hiredmerchitems", "hiredmerchequipment", 5, "packageid"), PACKAGE("dueyitems", "dueyequipment", 6, "packageid"); private final int value; private final String table, table_equip, arg; private ItemLoader(String table, String table_equip, int value, String arg) { this.table = table; this.table_equip = table_equip; this.value = value; this.arg = arg; } public int getValue() { return value; } //does not need connection con to be auto commit public Map<Long, Pair<Item, MapleInventoryType>> loadItems(boolean login, int id) throws SQLException { Map<Long, Pair<Item, MapleInventoryType>> items = new LinkedHashMap<>(); StringBuilder query = new StringBuilder(); query.append("SELECT * FROM `"); query.append(table); query.append("` LEFT JOIN `"); query.append(table_equip); query.append("` USING (`inventoryitemid`) WHERE `type` = ?"); query.append(" AND `"); query.append(arg); query.append("` = ?"); if (login) { query.append(" AND `inventorytype` = "); query.append(MapleInventoryType.EQUIPPED.getType()); } try (PreparedStatement ps = DatabaseConnection.getConnection().prepareStatement(query.toString())) { ps.setInt(1, value); ps.setInt(2, id); try (ResultSet rs = ps.executeQuery()) { final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); while (rs.next()) { if (!ii.itemExists(rs.getInt("itemid"))) { //EXPENSIVE continue; } MapleInventoryType mit = MapleInventoryType.getByType(rs.getByte("inventorytype")); if (mit.equals(MapleInventoryType.EQUIP) || mit.equals(MapleInventoryType.EQUIPPED)) { Equip equip = new Equip(rs.getInt("itemid"), rs.getShort("position"), rs.getInt("uniqueid"), rs.getShort("flag")); if (!login && equip.getPosition() != -55) { //monsterbook equip.setQuantity((short) 1); equip.setInventoryId(rs.getLong("inventoryitemid")); equip.setOwner(rs.getString("owner")); equip.setExpiration(rs.getLong("expiredate")); equip.setUpgradeSlots(rs.getByte("upgradeslots")); equip.setLevel(rs.getByte("level")); equip.setStr(rs.getShort("str")); equip.setDex(rs.getShort("dex")); equip.setInt(rs.getShort("int")); equip.setLuk(rs.getShort("luk")); equip.setHp(rs.getShort("hp")); equip.setMp(rs.getShort("mp")); equip.setWatk(rs.getShort("watk")); equip.setMatk(rs.getShort("matk")); equip.setWdef(rs.getShort("wdef")); equip.setMdef(rs.getShort("mdef")); equip.setAcc(rs.getShort("acc")); equip.setAvoid(rs.getShort("avoid")); equip.setHands(rs.getShort("hands")); equip.setSpeed(rs.getShort("speed")); equip.setJump(rs.getShort("jump")); equip.setViciousHammer(rs.getByte("ViciousHammer")); equip.setItemEXP(rs.getLong("itemEXP")); equip.setGMLog(rs.getString("GM_Log")); equip.setDurability(rs.getInt("durability")); equip.setEnhance(rs.getByte("enhance")); equip.setPotential1(rs.getInt("potential1")); equip.setPotential2(rs.getInt("potential2")); equip.setPotential3(rs.getInt("potential3")); equip.setBonusPotential1(rs.getInt("potential4")); equip.setBonusPotential2(rs.getInt("potential5")); equip.setBonusPotential3(rs.getInt("potential6")); equip.setFusionAnvil(rs.getInt("fusionAnvil")); equip.setSocket1(rs.getInt("socket1")); equip.setSocket2(rs.getInt("socket2")); equip.setSocket3(rs.getInt("socket3")); equip.setGiftFrom(rs.getString("sender")); equip.setIncSkill(rs.getInt("incSkill")); equip.setPVPDamage(rs.getShort("pvpDamage")); equip.setCharmEXP(rs.getShort("charmEXP")); equip.setEnhanctBuff(rs.getByte("enhanctBuff")); equip.setReqLevel(rs.getByte("reqLevel")); equip.setYggdrasilWisdom(rs.getByte("yggdrasilWisdom")); equip.setFinalStrike(rs.getByte("finalStrike") > 0); equip.setBossDamage(rs.getByte("bossDamage")); equip.setIgnorePDR(rs.getByte("ignorePDR")); equip.setTotalDamage(rs.getByte("totalDamage")); equip.setAllStat(rs.getByte("allStat")); equip.setKarmaCount(rs.getByte("karmaCount")); if (equip.getCharmEXP() < 0) { //has not been initialized yet equip.setCharmEXP(((Equip) ii.getEquipById(equip.getItemId())).getCharmEXP()); } if (equip.getUniqueId() > -1) { if (GameConstants.isEffectRing(rs.getInt("itemid"))) { MapleRing ring = MapleRing.loadFromDb(equip.getUniqueId(), mit.equals(MapleInventoryType.EQUIPPED)); if (ring != null) { equip.setRing(ring); } } else if (equip.getItemId() / 10000 == 166) { MapleAndroid ring = MapleAndroid.loadFromDb(equip.getItemId(), equip.getUniqueId()); if (ring != null) { equip.setAndroid(ring); } } } } items.put(rs.getLong("inventoryitemid"), new Pair<>(equip.copy(), mit)); } else { Item item = new Item(rs.getInt("itemid"), rs.getShort("position"), rs.getShort("quantity"), rs.getShort("flag"), rs.getInt("uniqueid")); item.setOwner(rs.getString("owner")); item.setInventoryId(rs.getLong("inventoryitemid")); item.setExpiration(rs.getLong("expiredate")); item.setGMLog(rs.getString("GM_Log")); item.setGiftFrom(rs.getString("sender")); //item.setExp(rs.getInt("exp")); //TODO: test if (GameConstants.isPet(item.getItemId())) { if (item.getUniqueId() > -1) { MaplePet pet = MaplePet.loadFromDb(item.getItemId(), item.getUniqueId(), item.getPosition()); if (pet != null) { item.setPet(pet); } } else { //O_O hackish fix item.setPet(MaplePet.createPet(item.getItemId(), MapleInventoryIdentifier.getInstance())); } } items.put(rs.getLong("inventoryitemid"), new Pair<>(item.copy(), mit)); } } } } return items; } public void saveItems(List<Pair<Item, MapleInventoryType>> items, int id) throws SQLException { saveItems(items, DatabaseConnection.getConnection(), id); } public void saveItems(List<Pair<Item, MapleInventoryType>> items, final Connection con, int id) throws SQLException { StringBuilder query = new StringBuilder(); query.append("DELETE FROM `"); query.append(table); query.append("` WHERE `type` = ? AND `"); query.append(arg); query.append("` = ?"); PreparedStatement ps = con.prepareStatement(query.toString()); ps.setInt(1, value); ps.setInt(2, id); ps.executeUpdate(); ps.close(); if (items == null) { return; } StringBuilder query_2 = new StringBuilder("INSERT INTO `"); query_2.append(table); query_2.append("` ("); query_2.append(arg); query_2.append(", itemid, inventorytype, position, quantity, owner, GM_Log, uniqueid, expiredate, flag, `type`, sender) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); ps = con.prepareStatement(query_2.toString(), Statement.RETURN_GENERATED_KEYS); String valueStr = ""; int values = 44; for (int i = 0; i < values; i++) { if (i == (values - 1)) { valueStr += "?"; } else { valueStr += "?, "; } } PreparedStatement pse = con.prepareStatement("INSERT INTO " + table_equip + " VALUES (DEFAULT, " + valueStr + ")"); final Iterator<Pair<Item, MapleInventoryType>> iter = items.iterator(); Pair<Item, MapleInventoryType> pair; while (iter.hasNext()) { pair = iter.next(); Item item = pair.getLeft(); MapleInventoryType mit = pair.getRight(); if (item.getPosition() == -55) { continue; } ps.setInt(1, id); ps.setInt(2, item.getItemId()); ps.setInt(3, mit.getType()); ps.setInt(4, item.getPosition()); ps.setInt(5, item.getQuantity()); ps.setString(6, item.getOwner()); ps.setString(7, item.getGMLog()); if (item.getPet() != null) { //expensif? //item.getPet().saveToDb(); ps.setInt(8, Math.max(item.getUniqueId(), item.getPet().getUniqueId())); } else { ps.setInt(8, item.getUniqueId()); } ps.setLong(9, item.getExpiration()); ps.setShort(10, item.getFlag()); ps.setByte(11, (byte) value); ps.setString(12, item.getGiftFrom()); ps.executeUpdate(); final long iid; try (ResultSet rs = ps.getGeneratedKeys()) { if (!rs.next()) { rs.close(); continue; } iid = rs.getLong(1); } item.setInventoryId(iid); if (mit.equals(MapleInventoryType.EQUIP) || mit.equals(MapleInventoryType.EQUIPPED)) { Equip equip = (Equip) item; int i = 0; pse.setLong(++i, iid); pse.setInt(++i, equip.getUpgradeSlots()); pse.setInt(++i, equip.getLevel()); pse.setInt(++i, equip.getStr()); pse.setInt(++i, equip.getDex()); pse.setInt(++i, equip.getInt()); pse.setInt(++i, equip.getLuk()); pse.setInt(++i, equip.getHp()); pse.setInt(++i, equip.getMp()); pse.setInt(++i, equip.getWatk()); pse.setInt(++i, equip.getMatk()); pse.setInt(++i, equip.getWdef()); pse.setInt(++i, equip.getMdef()); pse.setInt(++i, equip.getAcc()); pse.setInt(++i, equip.getAvoid()); pse.setInt(++i, equip.getHands()); pse.setInt(++i, equip.getSpeed()); pse.setInt(++i, equip.getJump()); pse.setInt(++i, equip.getViciousHammer()); pse.setLong(++i, equip.getItemEXP()); pse.setInt(++i, equip.getDurability()); pse.setByte(++i, equip.getEnhance()); pse.setInt(++i, equip.getPotential1()); pse.setInt(++i, equip.getPotential2()); pse.setInt(++i, equip.getPotential3()); pse.setInt(++i, equip.getBonusPotential1()); pse.setInt(++i, equip.getBonusPotential2()); pse.setInt(++i, equip.getBonusPotential3()); pse.setInt(++i, equip.getFusionAnvil()); pse.setInt(++i, equip.getSocket1()); pse.setInt(++i, equip.getSocket2()); pse.setInt(++i, equip.getSocket3()); pse.setInt(++i, equip.getIncSkill()); pse.setShort(++i, equip.getCharmEXP()); pse.setShort(++i, equip.getPVPDamage()); pse.setByte(++i, equip.getEnhanctBuff()); pse.setByte(++i, equip.getReqLevel()); pse.setByte(++i, equip.getYggdrasilWisdom()); pse.setByte(++i, (byte) (equip.getFinalStrike() ? 1 : 0)); pse.setByte(++i, equip.getBossDamage()); pse.setByte(++i, equip.getIgnorePDR()); pse.setByte(++i, equip.getTotalDamage()); pse.setByte(++i, equip.getAllStat()); pse.setByte(++i, equip.getKarmaCount()); pse.executeUpdate(); } } pse.close(); ps.close(); } }