package handling.channel.handler; import clientside.MapleCharacter; import clientside.MapleClient; import client.inventory.Item; import client.inventory.ItemLoader; import client.inventory.MapleInventoryType; import constants.GameConstants; import database.DatabaseConnection; import handling.world.World; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Map; import server.MapleInventoryManipulator; import server.MapleItemInformationProvider; import server.MerchItemPackage; import tools.Pair; import tools.StringUtil; import tools.data.LittleEndianAccessor; import tools.packet.CWvsContext; import tools.packet.PlayerShopPacket; public class HiredMerchantHandler { public static final boolean UseHiredMerchant(MapleClient c, boolean packet) { if ((c.getPlayer().getMap() != null) && (c.getPlayer().getMap().allowPersonalShop())) { byte state = checkExistance(c.getPlayer().getAccountID(), c.getPlayer().getId()); switch (state) { case 1: c.getPlayer().dropMessage(1, "Please claim your items from Fredrick first."); break; case 0: boolean merch = World.hasMerchant(c.getPlayer().getAccountID(), c.getPlayer().getId()); if (!merch) { if (c.getChannelServer().isShutdown()) { c.getPlayer().dropMessage(1, "The server is about to shut down."); return false; } if (packet) { c.getSession().write(PlayerShopPacket.sendTitleBox()); } return true; } c.getPlayer().dropMessage(1, "Please close the existing store and try again."); break; default: c.getPlayer().dropMessage(1, "An unknown error occured."); } } else { c.getSession().close(true); } return false; } private static final byte checkExistance(int accid, int cid) { Connection con = DatabaseConnection.getConnection(); try { PreparedStatement ps = con.prepareStatement("SELECT * from hiredmerch where accountid = ? OR characterid = ?"); ps.setInt(1, accid); ps.setInt(2, cid); ResultSet rs = ps.executeQuery(); if (rs.next()) { ps.close(); rs.close(); return 1; } rs.close(); ps.close(); return 0; } catch (SQLException se) { } return -1; } public static void displayMerch(MapleClient c) { int conv = c.getPlayer().getConversation(); boolean merch = World.hasMerchant(c.getPlayer().getAccountID(), c.getPlayer().getId()); MerchItemPackage pack; if (merch) { c.getPlayer().dropMessage(1, "Please close the existing store and try again."); c.getPlayer().setConversation(0); } else if (c.getChannelServer().isShutdown()) { c.getPlayer().dropMessage(1, "The world is going to shut down."); c.getPlayer().setConversation(0); } else if (conv == 3) { pack = loadItemFrom_Database(c.getPlayer().getAccountID()); if (pack == null) { c.getPlayer().dropMessage(1, "You do not have any item(s) with Fredrick."); c.getPlayer().setConversation(0); } else if (pack.getItems().size() <= 0) { if (!check(c.getPlayer(), pack)) { c.getSession().write(PlayerShopPacket.merchItem_Message(33)); return; } if (deletePackage(c.getPlayer().getAccountID(), pack.getPackageid(), c.getPlayer().getId())) { c.getPlayer().fakeRelog(); c.getPlayer().gainMeso(pack.getMesos(), false); c.getSession().write(PlayerShopPacket.merchItem_Message(29)); c.getPlayer().dropMessage(1, "You have retrieved your mesos."); } else { c.getPlayer().dropMessage(1, "An unknown error occured."); } c.getPlayer().setConversation(0); } else { c.getSession().write(PlayerShopPacket.merchItemStore_ItemData(pack)); MapleInventoryManipulator.checkSpace(c, conv, conv, null); for (Item item : pack.getItems()) { if (c.getPlayer().getInventory(GameConstants.getInventoryType(item.getItemId())).isFull()) { c.removeClickedNPC(); c.getPlayer().dropMessage(1, "Your inventory is full (Please relog)"); break; } MapleInventoryManipulator.addFromDrop(c, item, true); deletePackage(c.getPlayer().getAccountID(), pack.getPackageid(), c.getPlayer().getId()); c.removeClickedNPC(); } c.getPlayer().dropMessage(1, "Items have been returned to you, please relog."); } } c.getSession().write(CWvsContext.enableActions()); } public static final void MerchantItemStore(LittleEndianAccessor slea, MapleClient c) { if (c.getPlayer() == null) { return; } byte operation = slea.readByte(); if ((operation == 27) || (operation == 28)) { requestItems(c, operation == 27); } else if (operation == 30) { c.getPlayer().setConversation(0); } } private static void requestItems(MapleClient c, boolean request) { if (c.getPlayer().getConversation() != 3) { return; } boolean merch = World.hasMerchant(c.getPlayer().getAccountID(), c.getPlayer().getId()); if (merch) { c.getPlayer().dropMessage(1, "Please close the existing store and try again."); c.getPlayer().setConversation(0); return; } MerchItemPackage pack = loadItemFrom_Database(c.getPlayer().getAccountID()); if (pack == null) { c.getPlayer().dropMessage(1, "An unknown error occured."); return; } if (c.getChannelServer().isShutdown()) { c.getPlayer().dropMessage(1, "The world is going to shut down."); c.getPlayer().setConversation(0); return; } int days = StringUtil.getDaysAmount(pack.getSavedTime(), System.currentTimeMillis()); double percentage = days / 100.0D; int fee = (int) Math.ceil(percentage * pack.getMesos()); if ((request) && (days > 0) && (percentage > 0.0D) && (pack.getMesos() > 0) && (fee > 0)) { c.getSession().write(PlayerShopPacket.merchItemStore((byte) 38, days, fee)); return; } if (fee < 0) { c.getSession().write(PlayerShopPacket.merchItem_Message(33)); return; } if (c.getPlayer().getMeso() < fee) { c.getSession().write(PlayerShopPacket.merchItem_Message(35)); return; } if (!check(c.getPlayer(), pack)) { c.getSession().write(PlayerShopPacket.merchItem_Message(36)); return; } if (deletePackage(c.getPlayer().getAccountID(), pack.getPackageid(), c.getPlayer().getId())) { if (fee > 0) { c.getPlayer().gainMeso(-fee, true); } c.getPlayer().gainMeso(pack.getMesos(), false); for (Item item : pack.getItems()) { MapleInventoryManipulator.addFromDrop(c, item, false); } c.getSession().write(PlayerShopPacket.merchItem_Message(32)); } else { c.getPlayer().dropMessage(1, "An unknown error occured."); } } private static final boolean check(MapleCharacter chr, MerchItemPackage pack) { if (chr.getMeso() + pack.getMesos() < 0L) { return false; } byte eq = 0; byte use = 0; byte setup = 0; byte etc = 0; byte cash = 0; for (Item item : pack.getItems()) { MapleInventoryType invtype = GameConstants.getInventoryType(item.getItemId()); if (invtype == MapleInventoryType.EQUIP) { eq = (byte) (eq + 1); } else if (invtype == MapleInventoryType.USE) { use = (byte) (use + 1); } else if (invtype == MapleInventoryType.SETUP) { setup = (byte) (setup + 1); } else if (invtype == MapleInventoryType.ETC) { etc = (byte) (etc + 1); } else if (invtype == MapleInventoryType.CASH) { cash = (byte) (cash + 1); } } if ((chr.getInventory(MapleInventoryType.EQUIP).getNumFreeSlot() < eq) || (chr.getInventory(MapleInventoryType.USE).getNumFreeSlot() < use) || (chr.getInventory(MapleInventoryType.SETUP).getNumFreeSlot() < setup) || (chr.getInventory(MapleInventoryType.ETC).getNumFreeSlot() < etc) || (chr.getInventory(MapleInventoryType.CASH).getNumFreeSlot() < cash)) { return false; } return true; } private static final boolean deletePackage(int accid, int packageid, int chrId) { Connection con = DatabaseConnection.getConnection(); try { PreparedStatement ps = con.prepareStatement("DELETE from hiredmerch where accountid = ? OR packageid = ? OR characterid = ?"); ps.setInt(1, accid); ps.setInt(2, packageid); ps.setInt(3, chrId); ps.executeUpdate(); ps.close(); ItemLoader.HIRED_MERCHANT.saveItems(null, packageid); return true; } catch (SQLException e) { } return false; } private static final MerchItemPackage loadItemFrom_Database(int accountid) { Connection con = DatabaseConnection.getConnection(); try { PreparedStatement ps = con.prepareStatement("SELECT * from hiredmerch where accountid = ?"); ps.setInt(1, accountid); ResultSet rs = ps.executeQuery(); if (!rs.next()) { ps.close(); rs.close(); return null; } int packageid = rs.getInt("PackageId"); MerchItemPackage pack = new MerchItemPackage(); pack.setPackageid(packageid); pack.setMesos(rs.getInt("Mesos")); pack.setSavedTime(rs.getLong("time")); ps.close(); rs.close(); Map<Long, Pair<Item, MapleInventoryType>> items = ItemLoader.HIRED_MERCHANT.loadItems(false, packageid); if (items != null) { List iters = new ArrayList(); for (Pair z : items.values()) { iters.add(z.left); } pack.setItems(iters); } return pack; } catch (SQLException e) { e.printStackTrace(); } return null; } }