package server; import client.MapleClient; import client.inventory.Equip; import client.inventory.Item; import client.inventory.ItemLoader; import client.inventory.MapleInventoryIdentifier; import client.inventory.MapleInventoryType; import client.inventory.MaplePet; import client.inventory.MapleRing; import constants.GameConstants; import database.DatabaseConnection; import java.io.Serializable; 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 tools.FileoutputUtil; import tools.Pair; import tools.packet.CSPacket; public class CashShop implements Serializable { private static final long serialVersionUID = 231541893513373579L; private final int accountId, characterId; private final ItemLoader factory = ItemLoader.CASHSHOP; private final List<Item> inventory = new ArrayList<>(); private final List<Integer> uniqueids = new ArrayList<>(); public CashShop(int accountId, int characterId, int jobType) throws SQLException { this.accountId = accountId; this.characterId = characterId; for (Pair<Item, MapleInventoryType> item : factory.loadItems(false, accountId).values()) { inventory.add(item.getLeft()); } } public int getItemsSize() { return inventory.size(); } public List<Item> getInventory() { return inventory; } public Item findByCashId(int cashId) { for (Item item : inventory) { if (item.getUniqueId() == cashId) { return item; } } return null; } public void checkExpire(MapleClient c) { List<Item> toberemove = new ArrayList<>(); for (Item item : inventory) { if (item != null && !GameConstants.isPet(item.getItemId()) && item.getExpiration() > 0 && item.getExpiration() < System.currentTimeMillis()) { toberemove.add(item); } } if (toberemove.size() > 0) { for (Item item : toberemove) { removeFromInventory(item); c.getSession().write(CSPacket.cashItemExpired(item.getUniqueId())); } toberemove.clear(); } } public Item toItem(CashItemInfo cItem) { return toItem(cItem, MapleInventoryManipulator.getUniqueId(cItem.getId(), null), ""); } public Item toItem(CashItemInfo cItem, String gift) { return toItem(cItem, MapleInventoryManipulator.getUniqueId(cItem.getId(), null), gift); } public Item toItem(CashItemInfo cItem, int uniqueid) { return toItem(cItem, uniqueid, ""); } public Item toItem(CashItemInfo cItem, int uniqueid, String gift) { if (uniqueid <= 0) { uniqueid = MapleInventoryIdentifier.getInstance(); } long period = cItem.getPeriod(); if ((period <= 0 && GameConstants.getInventoryType(cItem.getId()) != MapleInventoryType.EQUIP) || GameConstants.isPet(cItem.getId())) { period = GameConstants.GMS ? 90 : 45; } if (cItem.getId() >= 5000100 && cItem.getId() < 5000200) { //permanent pet period = 20000; //permanent time millis } Item ret; if (GameConstants.getInventoryType(cItem.getId()) == MapleInventoryType.EQUIP) { Equip eq = (Equip) MapleItemInformationProvider.getInstance().getEquipById(cItem.getId(), uniqueid); if (period > 0) { eq.setExpiration((long) (System.currentTimeMillis() + (long) (period * 24 * 60 * 60 * 1000))); } eq.setGMLog("Cash Shop: " + cItem.getSN() + " on " + FileoutputUtil.CurrentReadable_Date()); eq.setGiftFrom(gift); if (GameConstants.isEffectRing(cItem.getId()) && uniqueid > 0) { MapleRing ring = MapleRing.loadFromDb(uniqueid); if (ring != null) { eq.setRing(ring); } } ret = eq.copy(); } else { Item item = new Item(cItem.getId(), (byte) 0, (short) cItem.getCount(), (byte) 0, uniqueid); if (period > 0) { item.setExpiration((long) (System.currentTimeMillis() + (long) (period * 24 * 60 * 60 * 1000))); } item.setGMLog("Cash Shop: " + cItem.getSN() + " on " + FileoutputUtil.CurrentReadable_Date()); item.setGiftFrom(gift); if (GameConstants.isPet(cItem.getId())) { final MaplePet pet = MaplePet.createPet(cItem.getId(), uniqueid); if (pet != null) { item.setPet(pet); } } ret = item.copy(); } return ret; } public Item toItem(CashItem cItem) { return toItem(cItem, MapleInventoryManipulator.getUniqueId(cItem.getItemId(), null), ""); } public Item toItem(CashItem cItem, int uniqueid, String gift) { if (uniqueid <= 0) { uniqueid = MapleInventoryIdentifier.getInstance(); } long period = cItem.getExpire(); if ((period <= 0 && GameConstants.getInventoryType(cItem.getItemId()) != MapleInventoryType.EQUIP) || GameConstants.isPet(cItem.getItemId())) { period = GameConstants.GMS ? 90 : 45; } if (cItem.getItemId() >= 5000100 && cItem.getItemId() < 5000200) { //permanent pet period = 20000; //permanent time millis } Item ret; if (GameConstants.getInventoryType(cItem.getItemId()) == MapleInventoryType.EQUIP) { Equip eq = (Equip) MapleItemInformationProvider.getInstance().getEquipById(cItem.getItemId(), uniqueid); if (period > 0) { eq.setExpiration((long) (System.currentTimeMillis() + (long) (period * 24 * 60 * 60 * 1000))); } eq.setGMLog("Cash Shop: " + cItem.getSN() + " on " + FileoutputUtil.CurrentReadable_Date()); eq.setGiftFrom(gift); if (GameConstants.isEffectRing(cItem.getItemId()) && uniqueid > 0) { MapleRing ring = MapleRing.loadFromDb(uniqueid); if (ring != null) { eq.setRing(ring); } } ret = eq.copy(); } else { Item item = new Item(cItem.getItemId(), (byte) 0, (short) cItem.getQuantity(), (byte) 0, uniqueid); if (period > 0) { item.setExpiration((long) (System.currentTimeMillis() + (long) (period * 24 * 60 * 60 * 1000))); } item.setGMLog("Cash Shop: " + cItem.getSN() + " on " + FileoutputUtil.CurrentReadable_Date()); item.setGiftFrom(gift); if (GameConstants.isPet(cItem.getItemId())) { final MaplePet pet = MaplePet.createPet(cItem.getItemId(), uniqueid); if (pet != null) { item.setPet(pet); } } ret = item.copy(); } return ret; } public void addToInventory(Item item) { inventory.add(item); } public void removeFromInventory(Item item) { inventory.remove(item); } public void gift(int recipient, String from, String message, int sn) { gift(recipient, from, message, sn, 0); } public void gift(int recipient, String from, String message, int sn, int uniqueid) { try { try (PreparedStatement ps = DatabaseConnection.getConnection().prepareStatement("INSERT INTO `gifts` VALUES (DEFAULT, ?, ?, ?, ?, ?)")) { ps.setInt(1, recipient); ps.setString(2, from); ps.setString(3, message); ps.setInt(4, sn); ps.setInt(5, uniqueid); ps.executeUpdate(); } } catch (SQLException sqle) { } } public List<Pair<Item, String>> loadGifts() { List<Pair<Item, String>> gifts = new ArrayList<>(); Connection con = DatabaseConnection.getConnection(); try { PreparedStatement ps = con.prepareStatement("SELECT * FROM `gifts` WHERE `recipient` = ?"); ps.setInt(1, characterId); ResultSet rs = ps.executeQuery(); while (rs.next()) { CashItemInfo cItem = CashItemFactory.getInstance().getItem(rs.getInt("sn")); if (cItem == null) { continue; } Item item = toItem(cItem, rs.getInt("uniqueid"), rs.getString("from")); gifts.add(new Pair<>(item, rs.getString("message"))); uniqueids.add(item.getUniqueId()); List<Integer> packages = CashItemFactory.getInstance().getPackageItems(cItem.getId()); if (packages != null && packages.size() > 0) { for (int packageItem : packages) { CashItemInfo pack = CashItemFactory.getInstance().getSimpleItem(packageItem); if (pack != null) { addToInventory(toItem(pack, rs.getString("from"))); } } } else { addToInventory(item); } } rs.close(); ps.close(); ps = con.prepareStatement("DELETE FROM `gifts` WHERE `recipient` = ?"); ps.setInt(1, characterId); ps.executeUpdate(); ps.close(); save(); } catch (SQLException sqle) { } return gifts; } public boolean canSendNote(int uniqueid) { return uniqueids.contains(uniqueid); } public void sendedNote(int uniqueid) { for (int i = 0; i < uniqueids.size(); i++) { if (uniqueids.get(i).intValue() == uniqueid) { uniqueids.remove(i); } } } public void save() throws SQLException { List<Pair<Item, MapleInventoryType>> itemsWithType = new ArrayList<>(); for (Item item : inventory) { itemsWithType.add(new Pair<>(item, GameConstants.getInventoryType(item.getItemId()))); } factory.saveItems(itemsWithType, accountId); } }