package javastory.channel.handling; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import javastory.channel.ChannelCharacter; import javastory.channel.ChannelClient; import javastory.channel.server.InventoryManipulator; import javastory.client.GameCharacterUtil; import javastory.db.Database; import javastory.game.Equip; import javastory.game.GameConstants; import javastory.game.Inventory; import javastory.game.InventoryType; import javastory.game.Item; import javastory.game.ItemFlag; import javastory.game.ItemType; import javastory.game.data.ItemInfoProvider; import javastory.io.PacketFormatException; import javastory.io.PacketReader; import javastory.server.DueyActions; import javastory.tools.packets.ChannelPackets; import com.google.common.collect.Lists; public class DueyHandler { /* * 19 = Successful 18 = One-of-a-kind Item is already in Reciever's delivery * 17 = The Character is unable to recieve the parcel 15 = Same account 14 = * Name does not exist */ public static void handleDueyOperation(final PacketReader reader, final ChannelClient c) throws PacketFormatException { final byte operation = reader.readByte(); final ChannelCharacter player = c.getPlayer(); switch (operation) { case 1: { // Start Duey, 13 digit AS // Read 13-digit passport ID. reader.readLengthPrefixedString(); // Theres an int here, value = 1 // int unk = reader.readInt(); // 9 = error final int conv = player.getConversationState(); if (conv == 2) { // Duey c.write(ChannelPackets.sendDuey((byte) 10, loadItems(player))); } break; } case 3: { // Send Item if (player.getConversationState() != 2) { return; } final byte typeByte = reader.readByte(); final short itemPos = reader.readShort(); final short amount = reader.readShort(); final int mesos = reader.readInt(); final String recipient = reader.readLengthPrefixedString(); final boolean quickdelivery = reader.readByte() > 0; final int finalcost = mesos + GameConstants.getTaxAmount(mesos) + (quickdelivery ? 0 : 5000); if (mesos >= 0 && mesos <= 100000000 && player.getMeso() >= finalcost) { final int accid = GameCharacterUtil.getIdByName(recipient); if (accid != -1) { if (accid != c.getAccountId()) { final boolean recipientOn = false; /* * GameClient rClient = null; try { int channel = * ChannelServer * .getInstance().getWorldInterface().find(recipient); * if (channel > -1) { recipientOn = true; ChannelServer * rcserv = ChannelServer.getInstance(channel); rClient * = * rcserv.getPlayerStorage().getCharacterByName(recipient * ).getClient(); } } catch (RemoteException re) { * ChannelServer.getInstance().reconnectWorld(); } */ if (typeByte > 0) { final InventoryType type = InventoryType.fromNumber(typeByte); final Inventory inventory = player.getInventoryByType(type); final Item item = inventory.getItem((byte) itemPos); if (item == null) { c.write(ChannelPackets.sendDuey((byte) 17, null)); // Unsuccessfull return; } final byte flag = item.getFlag(); if (ItemFlag.UNTRADEABLE.check(flag) || ItemFlag.LOCK.check(flag)) { c.write(ChannelPackets.enableActions()); return; } if (player.getItemQuantity(item.getItemId(), false) >= amount) { final ItemInfoProvider ii = ItemInfoProvider.getInstance(); if (!ii.isDropRestricted(item.getItemId())) { if (addItemToDB(item, amount, mesos, player.getName(), accid, recipientOn)) { if (GameConstants.isThrowingStar(item.getItemId()) || GameConstants.isBullet(item.getItemId())) { InventoryManipulator.removeFromSlot(c, inventory, (byte) itemPos, item.getQuantity(), true); } else { InventoryManipulator.removeFromSlot(c, inventory, (byte) itemPos, amount, true, false); } player.gainMeso(-finalcost, false); c.write(ChannelPackets.sendDuey((byte) 19, null)); // Successfull } else { c.write(ChannelPackets.sendDuey((byte) 17, null)); // Unsuccessful } } else { c.write(ChannelPackets.sendDuey((byte) 17, null)); // Unsuccessfull } } else { c.write(ChannelPackets.sendDuey((byte) 17, null)); // Unsuccessfull } } else { if (addMesoToDB(mesos, player.getName(), accid, recipientOn)) { player.gainMeso(-finalcost, false); c.write(ChannelPackets.sendDuey((byte) 19, null)); // Successfull } else { c.write(ChannelPackets.sendDuey((byte) 17, null)); // Unsuccessfull } } // if (recipientOn && rClient != null) { // rClient.write(MaplePacketCreator.sendDueyMSG(Actions.PACKAGE_MSG.getCode())); // } } else { c.write(ChannelPackets.sendDuey((byte) 15, null)); // Same // acc // error } } else { c.write(ChannelPackets.sendDuey((byte) 14, null)); // Name // does // not // exist } } else { c.write(ChannelPackets.sendDuey((byte) 12, null)); // Not enough // mesos } break; } case 5: { // Recieve Package if (player.getConversationState() != 2) { return; } final int packageid = reader.readInt(); final DueyActions dp = loadSingleItem(packageid, player.getId()); if (dp == null) { return; } if (dp.getItem() != null && !InventoryManipulator.checkSpace(c, dp.getItem().getItemId(), dp.getItem().getQuantity(), dp.getItem().getOwner())) { c.write(ChannelPackets.sendDuey((byte) 16, null)); // Not enough // Space return; } else if (dp.getMesos() < 0 || dp.getMesos() + player.getMeso() < 0) { c.write(ChannelPackets.sendDuey((byte) 17, null)); // Unsuccessfull return; } removeItemFromDB(packageid, player.getId()); // Remove first if (dp.getItem() != null) { InventoryManipulator.addFromDrop(c, dp.getItem(), false); } if (dp.getMesos() != 0) { player.gainMeso(dp.getMesos(), false); } c.write(ChannelPackets.removeItemFromDuey(false, packageid)); break; } case 6: { // Remove package if (player.getConversationState() != 2) { return; } final int packageid = reader.readInt(); removeItemFromDB(packageid, player.getId()); c.write(ChannelPackets.removeItemFromDuey(true, packageid)); break; } case 8: { // Close Duey player.setConversationState(0); break; } default: { System.out.println("Unhandled Duey operation : " + reader.toString()); break; } } } private static boolean addMesoToDB(final int mesos, final String sName, final int recipientID, final boolean isOn) { final Connection con = Database.getConnection(); try { final String insertPackage = "INSERT INTO dueypackages (RecieverId, SenderName, Mesos, TimeStamp, Checked, Type) VALUES (?, ?, ?, ?, ?, ?)"; final PreparedStatement ps = con.prepareStatement(insertPackage); ps.setInt(1, recipientID); ps.setString(2, sName); ps.setInt(3, mesos); ps.setLong(4, System.currentTimeMillis()); ps.setInt(5, isOn ? 0 : 1); ps.setInt(6, 3); ps.executeUpdate(); ps.close(); return true; } catch (final SQLException se) { return false; } } private static boolean addItemToDB(final Item item, final int quantity, final int mesos, final String sName, final int recipientID, final boolean isOn) { final Connection con = Database.getConnection(); try { final String insertPackage = "INSERT INTO dueypackages (RecieverId, SenderName, Mesos, TimeStamp, Checked, Type) VALUES (?, ?, ?, ?, ?, ?)"; final PreparedStatement ps = con.prepareStatement(insertPackage, Statement.RETURN_GENERATED_KEYS); ps.setInt(1, recipientID); ps.setString(2, sName); ps.setInt(3, mesos); ps.setLong(4, System.currentTimeMillis()); ps.setInt(5, isOn ? 0 : 1); ps.setInt(6, item.getType().asNumber()); ps.executeUpdate(); final ResultSet rs = ps.getGeneratedKeys(); rs.next(); PreparedStatement ps2; if (item.getType() == ItemType.EQUIP) { // equips final String insertEquip = "INSERT INTO dueyitems (PackageId, itemid, quantity, upgradeslots, level, str, dex, `int`, luk, hp, mp, watk, matk, wdef, mdef, acc, avoid, hands, speed, jump, owner, GM_Log, flag, expiredate, ViciousHammer, itemLevel, itemEXP) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; ps2 = con.prepareStatement(insertEquip); final Equip eq = (Equip) item; ps2.setInt(1, rs.getInt(1)); ps2.setInt(2, eq.getItemId()); ps2.setInt(3, 1); // Quantity ps2.setInt(4, eq.getUpgradeSlots()); ps2.setInt(5, eq.getLevel()); ps2.setInt(6, eq.getStr()); ps2.setInt(7, eq.getDex()); ps2.setInt(8, eq.getInt()); ps2.setInt(9, eq.getLuk()); ps2.setInt(10, eq.getHp()); ps2.setInt(11, eq.getMp()); ps2.setInt(12, eq.getWatk()); ps2.setInt(13, eq.getMatk()); ps2.setInt(14, eq.getWdef()); ps2.setInt(15, eq.getMdef()); ps2.setInt(16, eq.getAcc()); ps2.setInt(17, eq.getAvoid()); ps2.setInt(18, eq.getHands()); ps2.setInt(19, eq.getSpeed()); ps2.setInt(20, eq.getJump()); ps2.setString(21, eq.getOwner()); ps2.setString(22, eq.getGMLog()); ps2.setInt(23, eq.getFlag()); ps2.setLong(24, eq.getExpiration()); ps2.setInt(25, eq.getViciousHammer()); ps2.setInt(26, eq.getItemLevel()); ps2.setInt(27, eq.getItemEXP()); } else { final String insertItem = "INSERT INTO dueyitems (PackageId, itemid, quantity, owner, GM_Log, flag, expiredate) VALUES (?, ?, ?, ?, ?, ?, ?)"; ps2 = con.prepareStatement(insertItem); ps2.setInt(1, rs.getInt(1)); ps2.setInt(2, item.getItemId()); ps2.setInt(3, quantity); ps2.setString(4, item.getOwner()); ps2.setString(5, item.getGMLog()); ps2.setInt(6, item.getFlag()); ps2.setLong(7, item.getExpiration()); } ps2.executeUpdate(); ps2.close(); rs.close(); ps.close(); return true; } catch (final SQLException se) { se.printStackTrace(); return false; } } public static List<DueyActions> loadItems(final ChannelCharacter chr) { final List<DueyActions> packages = Lists.newLinkedList(); final Connection con = Database.getConnection(); final String selectPackageByReceiver = "SELECT * FROM dueypackages LEFT JOIN dueyitems USING (PackageId) WHERE RecieverId = ?"; try (PreparedStatement ps = con.prepareStatement(selectPackageByReceiver)) { ps.setInt(1, chr.getId()); final ResultSet rs = ps.executeQuery(); while (rs.next()) { final DueyActions dueypack = getItemByPID(rs); dueypack.setSender(rs.getString("SenderName")); dueypack.setMesos(rs.getInt("Mesos")); dueypack.setSentTime(rs.getLong("TimeStamp")); packages.add(dueypack); } rs.close(); ps.close(); return packages; } catch (final SQLException se) { se.printStackTrace(); return null; } } public static DueyActions loadSingleItem(final int packageid, final int charid) { final List<DueyActions> packages = Lists.newLinkedList(); final Connection con = Database.getConnection(); try { final String selectPackageByIdAndReceiver = "SELECT * FROM dueypackages LEFT JOIN dueyitems USING (PackageId) WHERE PackageId = ? and RecieverId = ?"; final PreparedStatement ps = con.prepareStatement(selectPackageByIdAndReceiver); ps.setInt(1, packageid); ps.setInt(2, charid); final ResultSet rs = ps.executeQuery(); if (rs.next()) { final DueyActions dueypack = getItemByPID(rs); dueypack.setSender(rs.getString("SenderName")); dueypack.setMesos(rs.getInt("Mesos")); dueypack.setSentTime(rs.getLong("TimeStamp")); packages.add(dueypack); rs.close(); ps.close(); return dueypack; } else { rs.close(); ps.close(); return null; } } catch (final SQLException se) { // se.printStackTrace(); return null; } } public static void reciveMsg(final ChannelClient c, final int recipientId) { final Connection con = Database.getConnection(); try (PreparedStatement ps = con.prepareStatement("UPDATE dueypackages SET Checked = 0 where RecieverId = ?")) { ps.setInt(1, recipientId); ps.executeUpdate(); } catch (final SQLException se) { se.printStackTrace(); } } private static void removeItemFromDB(final int packageid, final int charid) { final Connection con = Database.getConnection(); try (PreparedStatement ps = con.prepareStatement("DELETE FROM dueypackages WHERE PackageId = ? and RecieverId = ?")) { ps.setInt(1, packageid); ps.setInt(2, charid); ps.executeUpdate(); } catch (final SQLException se) { se.printStackTrace(); } } private static DueyActions getItemByPID(final ResultSet rs) { try { DueyActions dueypack; if (rs.getInt("type") == 1) { final Equip eq = new Equip(rs.getInt("itemid"), (byte) 0, -1, (byte) 0); eq.setUpgradeSlots(rs.getByte("upgradeslots")); eq.setLevel(rs.getByte("level")); eq.setStr(rs.getShort("str")); eq.setDex(rs.getShort("dex")); eq.setInt(rs.getShort("int")); eq.setLuk(rs.getShort("luk")); eq.setHp(rs.getShort("hp")); eq.setMp(rs.getShort("mp")); eq.setWatk(rs.getShort("watk")); eq.setMatk(rs.getShort("matk")); eq.setWdef(rs.getShort("wdef")); eq.setMdef(rs.getShort("mdef")); eq.setAcc(rs.getShort("acc")); eq.setAvoid(rs.getShort("avoid")); eq.setHands(rs.getShort("hands")); eq.setSpeed(rs.getShort("speed")); eq.setJump(rs.getShort("jump")); eq.setOwner(rs.getString("owner")); eq.setFlag(rs.getByte("flag")); eq.setExpiration(rs.getLong("expiredate")); eq.setViciousHammer(rs.getByte("ViciousHammer")); eq.setItemLevel(rs.getByte("itemLevel")); eq.setItemEXP(rs.getShort("itemEXP")); eq.setGMLog(rs.getString("GM_Log")); dueypack = new DueyActions(rs.getInt("PackageId"), eq); } else if (rs.getInt("type") == 2) { final Item newItem = new Item(rs.getInt("itemid"), (byte) 0, (short) rs.getInt("quantity"), (byte) 0); newItem.setOwner(rs.getString("owner")); newItem.setFlag(rs.getByte("flag")); newItem.setExpiration(rs.getLong("expiredate")); newItem.setGMLog(rs.getString("GM_Log")); dueypack = new DueyActions(rs.getInt("PackageId"), newItem); } else { dueypack = new DueyActions(rs.getInt("PackageId")); } return dueypack; } catch (final SQLException se) { se.printStackTrace(); return null; } } }