package server; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import provider.MapleData; import provider.MapleDataProviderFactory; import provider.MapleDataTool; import tools.Pair; public class ItemMakerFactory { private final static ItemMakerFactory instance = new ItemMakerFactory(); protected Map<Integer, ItemMakerCreateEntry> createCache = new HashMap<>(); protected Map<Integer, GemCreateEntry> gemCache = new HashMap<>(); public static ItemMakerFactory getInstance() { // DO ItemMakerFactory.getInstance() on ChannelServer startup. return instance; } protected ItemMakerFactory() { // 0 = Item upgrade crystals // 1 / 2/ 4/ 8 = Item creation final MapleData info = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Etc.wz")).getData("ItemMake.img"); byte totalupgrades, reqMakerLevel; int reqLevel, cost, quantity, stimulator; GemCreateEntry ret; ItemMakerCreateEntry imt; for (MapleData dataType : info.getChildren()) { int type = Integer.parseInt(dataType.getName()); switch (type) { case 0: { // Caching of gem for (MapleData itemFolder : dataType.getChildren()) { reqLevel = MapleDataTool.getInt("reqLevel", itemFolder, 0); reqMakerLevel = (byte) MapleDataTool.getInt("reqSkillLevel", itemFolder, 0); cost = MapleDataTool.getInt("meso", itemFolder, 0); quantity = MapleDataTool.getInt("itemNum", itemFolder, 0); // totalupgrades = MapleDataTool.getInt("tuc", itemFolder, 0); // Gem is always 0 ret = new GemCreateEntry(cost, reqLevel, reqMakerLevel, quantity); for (MapleData rewardNRecipe : itemFolder.getChildren()) { for (MapleData ind : rewardNRecipe.getChildren()) { switch (rewardNRecipe.getName()) { case "randomReward": ret.addRandomReward(MapleDataTool.getInt("item", ind, 0), MapleDataTool.getInt("prob", ind, 0)); // MapleDataTool.getInt("itemNum", ind, 0) break; case "recipe": ret.addReqRecipe(MapleDataTool.getInt("item", ind, 0), MapleDataTool.getInt("count", ind, 0)); break; } } } gemCache.put(Integer.parseInt(itemFolder.getName()), ret); } break; } case 1: // Warrior case 2: // Magician case 4: // Bowman case 8: // Thief case 16: { // Pirate for (MapleData itemFolder : dataType.getChildren()) { reqLevel = MapleDataTool.getInt("reqLevel", itemFolder, 0); reqMakerLevel = (byte) MapleDataTool.getInt("reqSkillLevel", itemFolder, 0); cost = MapleDataTool.getInt("meso", itemFolder, 0); quantity = MapleDataTool.getInt("itemNum", itemFolder, 0); totalupgrades = (byte) MapleDataTool.getInt("tuc", itemFolder, 0); stimulator = MapleDataTool.getInt("catalyst", itemFolder, 0); imt = new ItemMakerCreateEntry(cost, reqLevel, reqMakerLevel, quantity, totalupgrades, stimulator); for (MapleData Recipe : itemFolder.getChildren()) { for (MapleData ind : Recipe.getChildren()) { if (Recipe.getName().equals("recipe")) { imt.addReqItem(MapleDataTool.getInt("item", ind, 0), MapleDataTool.getInt("count", ind, 0)); } } } createCache.put(Integer.parseInt(itemFolder.getName()), imt); } break; } } } } public GemCreateEntry getGemInfo(int itemid) { return gemCache.get(itemid); } public ItemMakerCreateEntry getCreateInfo(int itemid) { return createCache.get(itemid); } public static class GemCreateEntry { private final int reqLevel, reqMakerLevel; private final int cost, quantity; private final List<Pair<Integer, Integer>> randomReward = new ArrayList<>(); private final List<Pair<Integer, Integer>> reqRecipe = new ArrayList<>(); public GemCreateEntry(int cost, int reqLevel, int reqMakerLevel, int quantity) { this.cost = cost; this.reqLevel = reqLevel; this.reqMakerLevel = reqMakerLevel; this.quantity = quantity; } public int getRewardAmount() { return quantity; } public List<Pair<Integer, Integer>> getRandomReward() { return randomReward; } public List<Pair<Integer, Integer>> getReqRecipes() { return reqRecipe; } public int getReqLevel() { return reqLevel; } public int getReqSkillLevel() { return reqMakerLevel; } public int getCost() { return cost; } protected void addRandomReward(int itemId, int prob) { randomReward.add(new Pair<>(itemId, prob)); } protected void addReqRecipe(int itemId, int count) { reqRecipe.add(new Pair<>(itemId, count)); } } public static class ItemMakerCreateEntry { private final int reqLevel; private final int cost, quantity, stimulator; private final byte tuc, reqMakerLevel; private final List<Pair<Integer, Integer>> reqItems = new ArrayList<>(); // itemId / amount private final List<Integer> reqEquips = new ArrayList<>(); public ItemMakerCreateEntry(int cost, int reqLevel, byte reqMakerLevel, int quantity, byte tuc, int stimulator) { this.cost = cost; this.tuc = tuc; this.reqLevel = reqLevel; this.reqMakerLevel = reqMakerLevel; this.quantity = quantity; this.stimulator = stimulator; } public byte getTUC() { return tuc; } public int getRewardAmount() { return quantity; } public List<Pair<Integer, Integer>> getReqItems() { return reqItems; } public List<Integer> getReqEquips() { return reqEquips; } public int getReqLevel() { return reqLevel; } public byte getReqSkillLevel() { return reqMakerLevel; } public int getCost() { return cost; } public int getStimulator() { return stimulator; } protected void addReqItem(int itemId, int amount) { reqItems.add(new Pair<>(itemId, amount)); } } }