package server; import java.sql.Connection; import java.sql.ResultSet; import java.sql.PreparedStatement; import database.DatabaseConnection; import java.io.File; import java.sql.SQLException; import java.util.List; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Collection; import java.util.LinkedList; import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; import server.CashItemInfo.CashModInfo; public class CashItemFactory { private final static CashItemFactory instance = new CashItemFactory(); private final static int[] bestItems = new int[]{10003055, 10003090, 10103464, 10002960, 10103363}; private final Map<Integer, CashItemInfo> itemStats = new HashMap<>(); private final Map<Integer, List<Integer>> itemPackage = new HashMap<>(); private final Map<Integer, CashModInfo> itemMods = new HashMap<>(); private final Map<Integer, List<Integer>> openBox = new HashMap<>(); private final MapleDataProvider data = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Etc.wz")); private final List<CashCategory> categories = new LinkedList<>(); private final Map<Integer, CashItem> menuItems = new HashMap<>(); private final Map<Integer, CashItem> categoryItems = new HashMap<>(); public static CashItemFactory getInstance() { return instance; } public void initialize() { final List<MapleData> cccc = data.getData("Commodity.img").getChildren(); for (MapleData field : cccc) { final int SN = MapleDataTool.getIntConvert("SN", field, 0); final CashItemInfo stats = new CashItemInfo(MapleDataTool.getIntConvert("ItemId", field, 0), MapleDataTool.getIntConvert("Count", field, 1), MapleDataTool.getIntConvert("Price", field, 0), SN, MapleDataTool.getIntConvert("Period", field, 0), MapleDataTool.getIntConvert("Gender", field, 2), MapleDataTool.getIntConvert("OnSale", field, 0) > 0 && MapleDataTool.getIntConvert("Price", field, 0) > 0, 0); if (SN > 0) { itemStats.put(SN, stats); } } final MapleData b = data.getData("CashPackage.img"); for (MapleData c : b.getChildren()) { if (c.getChildByPath("SN") == null) { continue; } final List<Integer> packageItems = new ArrayList<>(); for (MapleData d : c.getChildByPath("SN").getChildren()) { packageItems.add(MapleDataTool.getIntConvert(d)); } itemPackage.put(Integer.parseInt(c.getName()), packageItems); } try { Connection con = DatabaseConnection.getConnection(); try (PreparedStatement ps = con.prepareStatement("SELECT * FROM cashshop_modified_items"); ResultSet rs = ps.executeQuery()) { if (rs.next()) { CashModInfo ret = new CashModInfo(rs.getInt("serial"), rs.getInt("discount_price"), rs.getInt("mark"), rs.getInt("showup") > 0, rs.getInt("itemid"), rs.getInt("priority"), rs.getInt("package") > 0, rs.getInt("period"), rs.getInt("gender"), rs.getInt("count"), rs.getInt("meso"), rs.getInt("unk_1"), rs.getInt("unk_2"), rs.getInt("unk_3"), rs.getInt("extra_flags")); itemMods.put(ret.sn, ret); if (ret.showUp) { final CashItemInfo cc = itemStats.get(Integer.valueOf(ret.sn)); if (cc != null) { ret.toCItem(cc); //init } } } } } catch (SQLException e) { } List<Integer> availableSN = new LinkedList<>(); availableSN.add(20001141); availableSN.add(20001142); availableSN.add(20001143); availableSN.add(20001144); availableSN.add(20001145); availableSN.add(20001146); availableSN.add(20001147); openBox.put(5533003, availableSN); // Rainbow Visor Box availableSN = new LinkedList<>(); availableSN.add(20000462); availableSN.add(20000463); availableSN.add(20000464); availableSN.add(20000465); availableSN.add(20000466); availableSN.add(20000467); availableSN.add(20000468); availableSN.add(20000469); openBox.put(5533000, availableSN); // Korean stuffs.. availableSN = new LinkedList<>(); availableSN.add(20800259); availableSN.add(20800260); availableSN.add(20800263); availableSN.add(20800264); availableSN.add(20800265); availableSN.add(20800267); openBox.put(5533001, availableSN); // Angelic Beam Weapon Box availableSN = new LinkedList<>(); availableSN.add(20800270); availableSN.add(20800271); availableSN.add(20800272); availableSN.add(20800273); availableSN.add(20800274); openBox.put(5533002, availableSN); // Chief Knight Weapon Box try { Connection con = DatabaseConnection.getConnection(); try (PreparedStatement ps = con.prepareStatement("SELECT * FROM cashshop_categories"); ResultSet rs = ps.executeQuery()) { while (rs.next()) { CashCategory cat = new CashCategory(rs.getInt("categoryid"), rs.getString("name"), rs.getInt("parent"), rs.getInt("flag"), rs.getInt("sold")); categories.add(cat); } } } catch (SQLException e) { System.out.println("Failed to load cash shop categories. " + e); } try { Connection con = DatabaseConnection.getConnection(); try (PreparedStatement ps = con.prepareStatement("SELECT * FROM cashshop_menuitems"); ResultSet rs = ps.executeQuery()) { while (rs.next()) { CashItem item = new CashItem(rs.getInt("category"), rs.getInt("subcategory"), rs.getInt("parent"), rs.getString("image"), rs.getInt("sn"), rs.getInt("itemid"), rs.getInt("flag"), rs.getInt("price"), rs.getInt("discountPrice"), rs.getInt("quantity"), rs.getInt("expire"), rs.getInt("gender"), rs.getInt("likes")); menuItems.put(item.getSN(), item); } } } catch (SQLException e) { System.out.println("Failed to load cash shop categories. " + e); } try { Connection con = DatabaseConnection.getConnection(); try (PreparedStatement ps = con.prepareStatement("SELECT * FROM cashshop_items"); ResultSet rs = ps.executeQuery()) { while (rs.next()) { CashItem item = new CashItem(rs.getInt("category"), rs.getInt("subcategory"), rs.getInt("parent"), rs.getString("image"), rs.getInt("sn"), rs.getInt("itemid"), rs.getInt("flag"), rs.getInt("price"), rs.getInt("discountPrice"), rs.getInt("quantity"), rs.getInt("expire"), rs.getInt("gender"), rs.getInt("likes")); categoryItems.put(item.getSN(), item); } } } catch (SQLException e) { System.out.println("Failed to load cash shop categories. " + e); } } public final CashItemInfo getSimpleItem(int sn) { return itemStats.get(sn); } public final CashItemInfo getItem(int sn) { final CashItemInfo stats = itemStats.get(Integer.valueOf(sn)); final CashModInfo z = getModInfo(sn); if (z != null && z.showUp) { return z.toCItem(stats); //null doesnt matter } if (stats == null || !stats.onSale()) { return null; } return stats; } public final CashItem getMenuItem(int sn) { for (CashItem ci : getMenuItems()) { if (ci.getSN() == sn) { return ci; } } return null; } public final CashItem getAllItem(int sn) { for (CashItem ci : getAllItems()) { if (ci.getSN() == sn) { return ci; } } return null; } public final List<Integer> getPackageItems(int itemId) { return itemPackage.get(itemId); } public final CashModInfo getModInfo(int sn) { return itemMods.get(sn); } public final Collection<CashModInfo> getAllModInfo() { return itemMods.values(); } public final Map<Integer, List<Integer>> getRandomItemInfo() { return openBox; } public final int[] getBestItems() { return bestItems; } public final List<CashCategory> getCategories() { return categories; } public final List<CashItem> getMenuItems(int type) { List<CashItem> items = new LinkedList(); for (CashItem ci : menuItems.values()) { if (ci.getSubCategory() / 10000 == type) { items.add(ci); } } return items; } public final List<CashItem> getMenuItems() { List<CashItem> items = new LinkedList(); for (CashItem ci : menuItems.values()) { items.add(ci); } return items; } public final List<CashItem> getAllItems(int type) { List<CashItem> items = new LinkedList(); for (CashItem ci : categoryItems.values()) { if (ci.getSubCategory() / 10000 == type) { items.add(ci); } } return items; } public final List<CashItem> getAllItems() { List<CashItem> items = new LinkedList(); for (CashItem ci : categoryItems.values()) { items.add(ci); } return items; } public final List<CashItem> getCategoryItems(int subcategory) { List<CashItem> items = new LinkedList(); for (CashItem ci : categoryItems.values()) { if (ci.getSubCategory() == subcategory) { items.add(ci); } } return items; } }