package javastory.channel.handling;
import java.rmi.RemoteException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import javastory.channel.ChannelCharacter;
import javastory.channel.ChannelClient;
import javastory.channel.ChannelServer;
import javastory.channel.packet.PlayerShopPacket;
import javastory.channel.server.InventoryManipulator;
import javastory.db.Database;
import javastory.game.Equip;
import javastory.game.GameConstants;
import javastory.game.InventoryType;
import javastory.game.Item;
import javastory.io.PacketFormatException;
import javastory.io.PacketReader;
import javastory.server.MerchItemPackage;
import com.google.common.collect.Lists;
public final class HiredMerchantHandler {
private HiredMerchantHandler() {
}
public static void handleUseHiredMerchant(final PacketReader reader, final ChannelClient c) {
final ChannelCharacter player = c.getPlayer();
// reader.readInt(); // TimeStamp
if (player.getMap().allowPersonalShop()) {
final byte state = checkExistance(c.getAccountId());
switch (state) {
case 1:
player.sendNotice(1, "Please claim your items from Fredrick first.");
break;
case 0:
boolean merch = true;
try {
merch = ChannelServer.getWorldInterface().hasMerchant(c.getAccountId());
} catch (final RemoteException re) {
ChannelServer.pingWorld();
}
if (!merch) {
// c.getPlayer().dropMessage(1, "The Hired Merchant is temporary disabled until it's fixed.");
c.write(PlayerShopPacket.sendTitleBox());
} else {
player.sendNotice(1, "Please close the existing store and try again.");
}
break;
default:
player.sendNotice(1, "An unknown error occured.");
break;
}
} else {
c.disconnect(true);
}
}
private static byte checkExistance(final int accid) {
final Connection con = Database.getConnection();
try {
final PreparedStatement ps = con.prepareStatement("SELECT * from hiredmerch where accountid = ?");
ps.setInt(1, accid);
if (ps.executeQuery().next()) {
ps.close();
return 1;
}
ps.close();
return 0;
} catch (final SQLException se) {
return -1;
}
}
public static void handleMerchantItemStore(final PacketReader reader, final ChannelClient c) throws PacketFormatException {
final byte operation = reader.readByte();
final ChannelCharacter player = c.getPlayer();
switch (operation) {
case 20: {
// 13-digit passport ID.
reader.readLengthPrefixedString();
final int conv = player.getConversationState();
if (conv == 3) { // Hired Merch
final MerchItemPackage pack = loadItemFrom_Database(player.getId());
if (pack == null) {
player.sendNotice(1, "You do not have any item(s) with Fredrick.");
player.setConversationState(0);
} else {
c.write(PlayerShopPacket.merchItemStore_ItemData(pack));
}
}
break;
}
case 25: { // Request take out iteme
if (player.getConversationState() != 3) {
return;
}
c.write(PlayerShopPacket.merchItemStore((byte) 0x24));
break;
}
case 26: { // Take out item
if (player.getConversationState() != 3) {
return;
}
final MerchItemPackage pack = loadItemFrom_Database(player.getId());
if (!check(player, pack)) {
c.write(PlayerShopPacket.merchItem_Message((byte) 0x21));
return;
}
if (deletePackage(player.getId())) {
player.gainMeso(pack.getMesos(), false);
for (final Item item : pack.getItems()) {
InventoryManipulator.addFromDrop(c, item, false);
}
c.write(PlayerShopPacket.merchItem_Message((byte) 0x1d));
} else {
player.sendNotice(1, "An unknown error occured.");
}
break;
}
case 27: { // Exit
player.setConversationState(0);
break;
}
}
}
private static boolean check(final ChannelCharacter chr, final MerchItemPackage pack) {
if (chr.getMeso() + pack.getMesos() < 0) {
return false;
}
byte eq = 0, use = 0, setup = 0, etc = 0, cash = 0;
for (final Item item : pack.getItems()) {
final InventoryType invtype = GameConstants.getInventoryType(item.getItemId());
if (invtype == InventoryType.EQUIP) {
eq++;
} else if (invtype == InventoryType.USE) {
use++;
} else if (invtype == InventoryType.SETUP) {
setup++;
} else if (invtype == InventoryType.ETC) {
etc++;
} else if (invtype == InventoryType.CASH) {
cash++;
}
}
if (chr.getEquipInventory().getNumFreeSlot() <= eq || chr.getUseInventory().getNumFreeSlot() <= use
|| chr.getSetupInventory().getNumFreeSlot() <= setup || chr.getEtcInventory().getNumFreeSlot() <= etc
|| chr.getCashInventory().getNumFreeSlot() <= cash) {
return false;
}
return true;
}
private static boolean deletePackage(final int charid) {
final Connection con = Database.getConnection();
try {
final PreparedStatement ps = con.prepareStatement("DELETE from hiredmerch where characterid = ?");
ps.setInt(1, charid);
ps.execute();
ps.close();
return true;
} catch (final SQLException e) {
return false;
}
}
private static MerchItemPackage loadItemFrom_Database(final int charid) {
final Connection con = Database.getConnection();
try {
final PreparedStatement ps = con.prepareStatement("SELECT * from hiredmerch where characterid = ?");
ps.setInt(1, charid);
final ResultSet rs = ps.executeQuery();
if (!rs.next()) {
ps.close();
rs.close();
return null;
}
final int packageid = rs.getInt("PackageId");
final MerchItemPackage pack = new MerchItemPackage();
pack.setPackageid(packageid);
pack.setMesos(rs.getInt("Mesos"));
pack.setSentTime(rs.getLong("time"));
ps.close();
rs.close();
final List<Item> items = Lists.newArrayList();
// TODO: Load these properly when I generalize item loading.
final PreparedStatement ps2 = con.prepareStatement("SELECT * from hiredmerchitems where PackageId = ?");
ps2.setInt(1, packageid);
final ResultSet rs2 = ps2.executeQuery();
while (rs2.next()) {
final int itemid = rs2.getInt("itemid");
final InventoryType type = GameConstants.getInventoryType(itemid);
if (type == InventoryType.EQUIP) {
final Equip equip = new Equip(rs2.getInt("itemid"), (byte) 0, -1, rs2.getByte("flag"));
equip.setOwner(rs2.getString("owner"));
equip.setQuantity(rs2.getShort("quantity"));
equip.setAcc(rs2.getShort("acc"));
equip.setAvoid(rs2.getShort("avoid"));
equip.setDex(rs2.getShort("dex"));
equip.setHands(rs2.getShort("hands"));
equip.setHp(rs2.getShort("hp"));
equip.setInt(rs2.getShort("int"));
equip.setJump(rs2.getShort("jump"));
equip.setLuk(rs2.getShort("luk"));
equip.setMatk(rs2.getShort("matk"));
equip.setMdef(rs2.getShort("mdef"));
equip.setMp(rs2.getShort("mp"));
equip.setSpeed(rs2.getShort("speed"));
equip.setStr(rs2.getShort("str"));
equip.setWatk(rs2.getShort("watk"));
equip.setWdef(rs2.getShort("wdef"));
equip.setItemLevel(rs2.getByte("itemLevel"));
equip.setItemEXP(rs2.getShort("itemEXP"));
equip.setViciousHammer(rs2.getByte("ViciousHammer"));
equip.setUpgradeSlots(rs2.getByte("upgradeslots"));
equip.setLevel(rs2.getByte("level"));
equip.setFlag(rs2.getByte("flag"));
equip.setExpiration(rs2.getLong("expiredate"));
equip.setGMLog(rs2.getString("GM_Log"));
items.add(equip);
} else {
final Item item = new Item(rs2.getInt("itemid"), (byte) 0, rs2.getShort("quantity"), rs2.getByte("flag"));
item.setOwner(rs2.getString("owner"));
item.setFlag(rs2.getByte("flag"));
item.setExpiration(rs2.getLong("expiredate"));
item.setGMLog(rs2.getString("GM_Log"));
items.add(item);
}
}
ps.close();
rs.close();
pack.setItems(items);
return pack;
} catch (final SQLException e) {
e.printStackTrace();
return null;
}
}
}