package handling.channel.handler; import client.MapleCharacter; import client.MapleClient; import client.MapleQuestStatus; import client.MapleTrait; import client.PlayerStats; import client.SkillEntry; import client.SkillFactory; import client.inventory.Equip; import client.inventory.Item; import client.inventory.ItemFlag; import client.inventory.MapleImp; import client.inventory.MapleInventoryType; import constants.GameConstants; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import server.ItemMakerFactory; import server.MapleInventoryManipulator; import server.MapleItemInformationProvider; import server.MapleStatEffect; import server.Randomizer; import server.maps.MapleExtractor; import server.maps.MapleReactor; import server.quest.MapleQuest; import tools.FileoutputUtil; import tools.Pair; import tools.Triple; import tools.data.LittleEndianAccessor; import tools.packet.CField; import tools.packet.CWvsContext; public class ItemMakerHandler { private static final Map<String, Integer> craftingEffects = new HashMap(); public static final void ItemMaker(LittleEndianAccessor slea, MapleClient c) { int makerType = slea.readInt(); switch (makerType) { case 1: int toCreate = slea.readInt(); if (GameConstants.isGem(toCreate)) { ItemMakerFactory.GemCreateEntry gem = ItemMakerFactory.getInstance().getGemInfo(toCreate); if (gem == null) { return; } if (!hasSkill(c, gem.getReqSkillLevel())) { return; } if (c.getPlayer().getMeso() < gem.getCost()) { return; } int randGemGiven = getRandomGem(gem.getRandomReward()); if (c.getPlayer().getInventory(GameConstants.getInventoryType(randGemGiven)).isFull()) { return; } int taken = checkRequiredNRemove(c, gem.getReqRecipes()); if (taken == 0) { return; } c.getPlayer().gainMeso(-gem.getCost(), false); MapleInventoryManipulator.addById(c, randGemGiven, (short) (byte) (taken == randGemGiven ? 9 : 1), "Made by Gem " + toCreate + " on " + FileoutputUtil.CurrentReadable_Date()); c.getSession().write(CField.EffectPacket.ItemMaker_Success()); c.getPlayer().getMap().broadcastMessage(c.getPlayer(), CField.EffectPacket.ItemMaker_Success_3rdParty(c.getPlayer().getId()), false); } else if (GameConstants.isOtherGem(toCreate)) { ItemMakerFactory.GemCreateEntry gem = ItemMakerFactory.getInstance().getGemInfo(toCreate); if (gem == null) { return; } if (!hasSkill(c, gem.getReqSkillLevel())) { return; } if (c.getPlayer().getMeso() < gem.getCost()) { return; } if (c.getPlayer().getInventory(GameConstants.getInventoryType(toCreate)).isFull()) { return; } if (checkRequiredNRemove(c, gem.getReqRecipes()) == 0) { return; } c.getPlayer().gainMeso(-gem.getCost(), false); if (GameConstants.getInventoryType(toCreate) == MapleInventoryType.EQUIP) { MapleInventoryManipulator.addbyItem(c, MapleItemInformationProvider.getInstance().getEquipById(toCreate)); } else { MapleInventoryManipulator.addById(c, toCreate, (short) 1, "Made by Gem " + toCreate + " on " + FileoutputUtil.CurrentReadable_Date()); } c.getSession().write(CField.EffectPacket.ItemMaker_Success()); c.getPlayer().getMap().broadcastMessage(c.getPlayer(), CField.EffectPacket.ItemMaker_Success_3rdParty(c.getPlayer().getId()), false); } else { boolean stimulator = slea.readByte() > 0; int numEnchanter = slea.readInt(); ItemMakerFactory.ItemMakerCreateEntry create = ItemMakerFactory.getInstance().getCreateInfo(toCreate); if (create == null) { return; } if (numEnchanter > create.getTUC()) { return; } if (!hasSkill(c, create.getReqSkillLevel())) { return; } if (c.getPlayer().getMeso() < create.getCost()) { return; } if (c.getPlayer().getInventory(GameConstants.getInventoryType(toCreate)).isFull()) { return; } if (checkRequiredNRemove(c, create.getReqItems()) == 0) { return; } c.getPlayer().gainMeso(-create.getCost(), false); MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); Equip toGive = (Equip) ii.getEquipById(toCreate); if ((stimulator) || (numEnchanter > 0)) { if (c.getPlayer().haveItem(create.getStimulator(), 1, false, true)) { ii.randomizeStats_Above(toGive); MapleInventoryManipulator.removeById(c, MapleInventoryType.ETC, create.getStimulator(), 1, false, false); } for (int i = 0; i < numEnchanter; i++) { int enchant = slea.readInt(); if (c.getPlayer().haveItem(enchant, 1, false, true)) { Map stats = ii.getEquipStats(enchant); if (stats != null) { addEnchantStats(stats, toGive); MapleInventoryManipulator.removeById(c, MapleInventoryType.ETC, enchant, 1, false, false); } } } } if ((!stimulator) || (Randomizer.nextInt(10) != 0)) { MapleInventoryManipulator.addbyItem(c, toGive); c.getPlayer().getMap().broadcastMessage(c.getPlayer(), CField.EffectPacket.ItemMaker_Success_3rdParty(c.getPlayer().getId()), false); } else { c.getPlayer().dropMessage(5, "The item was overwhelmed by the stimulator."); } c.getSession().write(CField.EffectPacket.ItemMaker_Success()); } break; case 3: int etc = slea.readInt(); if (c.getPlayer().haveItem(etc, 100, false, true)) { MapleInventoryManipulator.addById(c, getCreateCrystal(etc), (short) 1, "Made by Maker " + etc + " on " + FileoutputUtil.CurrentReadable_Date()); MapleInventoryManipulator.removeById(c, MapleInventoryType.ETC, etc, 100, false, false); c.getSession().write(CField.EffectPacket.ItemMaker_Success()); c.getPlayer().getMap().broadcastMessage(c.getPlayer(), CField.EffectPacket.ItemMaker_Success_3rdParty(c.getPlayer().getId()), false); } break; case 4: int itemId = slea.readInt(); slea.readInt(); byte slot = (byte) slea.readInt(); Item toUse = c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem((short) slot); if ((toUse == null) || (toUse.getItemId() != itemId) || (toUse.getQuantity() < 1)) { return; } MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); int[] toGive = getCrystal(itemId, ii.getReqLevel(itemId)); MapleInventoryManipulator.addById(c, toGive[0], (short) (byte) toGive[1], "Made by disassemble " + itemId + " on " + FileoutputUtil.CurrentReadable_Date()); MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.EQUIP, (short) slot, (short) 1, false); c.getSession().write(CField.EffectPacket.ItemMaker_Success()); c.getPlayer().getMap().broadcastMessage(c.getPlayer(), CField.EffectPacket.ItemMaker_Success_3rdParty(c.getPlayer().getId()), false); break; case 2: } } private static final int getCreateCrystal(final int etc) { int itemid; final short level = MapleItemInformationProvider.getInstance().getItemMakeLevel(etc); if (level >= 31 && level <= 50) { itemid = 4260000; } else if (level >= 51 && level <= 60) { itemid = 4260001; } else if (level >= 61 && level <= 70) { itemid = 4260002; } else if (level >= 71 && level <= 80) { itemid = 4260003; } else if (level >= 81 && level <= 90) { itemid = 4260004; } else if (level >= 91 && level <= 100) { itemid = 4260005; } else if (level >= 101 && level <= 110) { itemid = 4260006; } else if (level >= 111 && level <= 120) { itemid = 4260007; } else if (level >= 121) { itemid = 4260008; } else { throw new RuntimeException("Invalid Item Maker id"); } return itemid; } private static final int[] getCrystal(int itemid, int level) { int[] all = new int[2]; all[0] = -1; if ((level >= 31) && (level <= 50)) { all[0] = 4260000; } else if ((level >= 51) && (level <= 60)) { all[0] = 4260001; } else if ((level >= 61) && (level <= 70)) { all[0] = 4260002; } else if ((level >= 71) && (level <= 80)) { all[0] = 4260003; } else if ((level >= 81) && (level <= 90)) { all[0] = 4260004; } else if ((level >= 91) && (level <= 100)) { all[0] = 4260005; } else if ((level >= 101) && (level <= 110)) { all[0] = 4260006; } else if ((level >= 111) && (level <= 120)) { all[0] = 4260007; } else if ((level >= 121) && (level <= 200)) { all[0] = 4260008; } else { throw new RuntimeException("Invalid Item Maker type" + level); } if ((GameConstants.isWeapon(itemid)) || (GameConstants.isOverall(itemid))) { all[1] = Randomizer.rand(5, 11); } else { all[1] = Randomizer.rand(3, 7); } return all; } private static final void addEnchantStats(Map<String, Integer> stats, Equip item) { Integer s = (Integer) stats.get("PAD"); if ((s != null) && (s.intValue() != 0)) { item.setWatk((short) (item.getWatk() + s.intValue())); } s = (Integer) stats.get("MAD"); if ((s != null) && (s.intValue() != 0)) { item.setMatk((short) (item.getMatk() + s.intValue())); } s = (Integer) stats.get("ACC"); if ((s != null) && (s.intValue() != 0)) { item.setAcc((short) (item.getAcc() + s.intValue())); } s = (Integer) stats.get("EVA"); if ((s != null) && (s.intValue() != 0)) { item.setAvoid((short) (item.getAvoid() + s.intValue())); } s = (Integer) stats.get("Speed"); if ((s != null) && (s.intValue() != 0)) { item.setSpeed((short) (item.getSpeed() + s.intValue())); } s = (Integer) stats.get("Jump"); if ((s != null) && (s.intValue() != 0)) { item.setJump((short) (item.getJump() + s.intValue())); } s = (Integer) stats.get("MaxHP"); if ((s != null) && (s.intValue() != 0)) { item.setHp((short) (item.getHp() + s.intValue())); } s = (Integer) stats.get("MaxMP"); if ((s != null) && (s.intValue() != 0)) { item.setMp((short) (item.getMp() + s.intValue())); } s = (Integer) stats.get("STR"); if ((s != null) && (s.intValue() != 0)) { item.setStr((short) (item.getStr() + s.intValue())); } s = (Integer) stats.get("DEX"); if ((s != null) && (s.intValue() != 0)) { item.setDex((short) (item.getDex() + s.intValue())); } s = (Integer) stats.get("INT"); if ((s != null) && (s.intValue() != 0)) { item.setInt((short) (item.getInt() + s.intValue())); } s = (Integer) stats.get("LUK"); if ((s != null) && (s.intValue() != 0)) { item.setLuk((short) (item.getLuk() + s.intValue())); } s = (Integer) stats.get("randOption"); if ((s != null) && (s.intValue() != 0)) { int ma = item.getMatk(); int wa = item.getWatk(); if (wa > 0) { item.setWatk((short) (Randomizer.nextBoolean() ? wa + s.intValue() : wa - s.intValue())); } if (ma > 0) { item.setMatk((short) (Randomizer.nextBoolean() ? ma + s.intValue() : ma - s.intValue())); } } s = (Integer) stats.get("randStat"); if ((s != null) && (s.intValue() != 0)) { int str = item.getStr(); int dex = item.getDex(); int luk = item.getLuk(); int int_ = item.getInt(); if (str > 0) { item.setStr((short) (Randomizer.nextBoolean() ? str + s.intValue() : str - s.intValue())); } if (dex > 0) { item.setDex((short) (Randomizer.nextBoolean() ? dex + s.intValue() : dex - s.intValue())); } if (int_ > 0) { item.setInt((short) (Randomizer.nextBoolean() ? int_ + s.intValue() : int_ - s.intValue())); } if (luk > 0) { item.setLuk((short) (Randomizer.nextBoolean() ? luk + s.intValue() : luk - s.intValue())); } } } private static final int getRandomGem(List<Pair<Integer, Integer>> rewards) { List items = new ArrayList(); for (Pair p : rewards) { int itemid = ((Integer) p.getLeft()).intValue(); for (int i = 0; i < ((Integer) p.getRight()).intValue(); i++) { items.add(Integer.valueOf(itemid)); } } return ((Integer) items.get(Randomizer.nextInt(items.size()))).intValue(); } private static final int checkRequiredNRemove(MapleClient c, List<Pair<Integer, Integer>> recipe) { int itemid = 0; for (Pair p : recipe) { if (!c.getPlayer().haveItem(((Integer) p.getLeft()).intValue(), ((Integer) p.getRight()).intValue(), false, true)) { return 0; } } for (Pair p : recipe) { itemid = ((Integer) p.getLeft()).intValue(); MapleInventoryManipulator.removeById(c, GameConstants.getInventoryType(itemid), itemid, ((Integer) p.getRight()).intValue(), false, false); } return itemid; } private static final boolean hasSkill(MapleClient c, int reqlvl) { c.getPlayer().getStat(); return c.getPlayer().getSkillLevel(SkillFactory.getSkill(PlayerStats.getSkillByJob(1007, c.getPlayer().getJob()))) >= reqlvl; } public static final void UseRecipe(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { if ((chr == null) || (!chr.isAlive()) || (chr.getMap() == null) || (chr.hasBlockedInventory())) { c.getSession().write(CWvsContext.enableActions()); return; } slea.readInt(); byte slot = (byte) slea.readShort(); int itemId = slea.readInt(); Item toUse = chr.getInventory(MapleInventoryType.USE).getItem((short) slot); if ((toUse == null) || (toUse.getQuantity() < 1) || (toUse.getItemId() != itemId) || (itemId / 10000 != 251)) { c.getSession().write(CWvsContext.enableActions()); return; } if (MapleItemInformationProvider.getInstance().getItemEffect(toUse.getItemId()).applyTo(chr)) { MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, (short) slot, (short) 1, false); } } public static final void MakeExtractor(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { if ((chr == null) || (!chr.isAlive()) || (chr.getMap() == null) || (chr.hasBlockedInventory())) { c.getSession().write(CWvsContext.enableActions()); return; } int itemId = slea.readInt(); int fee = slea.readInt(); Item toUse = chr.getInventory(MapleInventoryType.SETUP).findById(itemId); if ((toUse == null) || (toUse.getQuantity() < 1) || (itemId / 10000 != 304) || (fee <= 0) || (chr.getExtractor() != null) || (!chr.getMap().isTown())) { c.getSession().write(CWvsContext.enableActions()); return; } chr.setExtractor(new MapleExtractor(chr, itemId, fee, chr.getFH())); chr.getMap().spawnExtractor(chr.getExtractor()); } public static final void UseBag(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { if ((chr == null) || (!chr.isAlive()) || (chr.getMap() == null) || (chr.hasBlockedInventory())) { c.getSession().write(CWvsContext.enableActions()); return; } slea.readInt(); byte slot = (byte) slea.readShort(); int itemId = slea.readInt(); Item toUse = chr.getInventory(MapleInventoryType.ETC).getItem((short) slot); if ((toUse == null) || (toUse.getQuantity() < 1) || (toUse.getItemId() != itemId) || (itemId / 10000 != 433)) { c.getSession().write(CWvsContext.enableActions()); return; } boolean firstTime = !chr.getExtendedSlots().contains(Integer.valueOf(itemId)); if (firstTime) { chr.getExtendedSlots().add(Integer.valueOf(itemId)); chr.changedExtended(); short flag = toUse.getFlag(); flag = (short) (flag | ItemFlag.LOCK.getValue()); flag = (short) (flag | ItemFlag.UNTRADEABLE.getValue()); toUse.setFlag(flag); c.getSession().write(CWvsContext.InventoryPacket.updateSpecialItemUse(toUse, (byte) 4, toUse.getPosition(), true, chr)); } c.getSession().write(CField.openBag(chr.getExtendedSlots().indexOf(Integer.valueOf(itemId)), itemId, firstTime)); c.getSession().write(CWvsContext.enableActions()); } public static final void StartHarvest(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { MapleReactor reactor = c.getPlayer().getMap().getReactorByOid(slea.readInt()); if ((reactor != null) && (reactor.isAlive()) && (reactor.getReactorId() <= 200011) && (chr.getStat().harvestingTool > 0) && (reactor.getTruePosition().distanceSq(chr.getTruePosition()) <= 10000.0D)) { if (c.getPlayer().getFatigue() < (GameConstants.GMS ? 200 : 100)); } else { return; } Item item = c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem((short) c.getPlayer().getStat().harvestingTool); if ((item == null) || (((Equip) item).getDurability() == 0)) { c.getPlayer().getStat().handleProfessionTool(c.getPlayer()); return; } MapleQuestStatus marr = c.getPlayer().getQuestNAdd(MapleQuest.getInstance(122501)); if (marr.getCustomData() == null) { marr.setCustomData("0"); } long lastTime = Long.parseLong(marr.getCustomData()); if (lastTime + 5000L > System.currentTimeMillis()) { c.getPlayer().dropMessage(5, "You may not harvest yet."); } else { marr.setCustomData(String.valueOf(System.currentTimeMillis())); c.getSession().write(CField.harvestMessage(reactor.getObjectId(), GameConstants.GMS ? 13 : 11)); c.getPlayer().getMap().broadcastMessage(chr, CField.showHarvesting(chr.getId(), item.getItemId()), false); } } public static final void StopHarvest(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { } public static final void ProfessionInfo(LittleEndianAccessor slea, MapleClient c) { try { String asdf = slea.readMapleAsciiString(); int level1 = slea.readInt(); c.getSession().write(CWvsContext.professionInfo(asdf, level1, slea.readInt(), Math.max(0, 100 - (level1 + 1 - c.getPlayer().getProfessionLevel(Integer.parseInt(asdf))) * 20))); } catch (NumberFormatException nfe) { } } public static final void CraftEffect(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { if ((chr.getMapId() != 910001000) && (chr.getMap().getExtractorSize() <= 0)) { return; } String effect = slea.readMapleAsciiString(); Integer profession = (Integer) craftingEffects.get(effect); if ((profession != null) && ((c.getPlayer().getProfessionLevel(profession.intValue()) > 0) || ((profession.intValue() == 92040000) && (chr.getMap().getExtractorSize() > 0)))) { int time = slea.readInt(); if ((time > 6000) || (time < 3000)) { time = 4000; } c.getSession().write(CField.EffectPacket.showOwnCraftingEffect(effect, time, effect.endsWith("Extract") ? 1 : 0)); chr.getMap().broadcastMessage(chr, CField.EffectPacket.showCraftingEffect(chr.getId(), effect, time, effect.endsWith("Extract") ? 1 : 0), false); } } public static final void CraftMake(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { if ((chr.getMapId() != 910001000) && (chr.getMap().getExtractorSize() <= 0)) { return; } int something = slea.readInt(); int time = slea.readInt(); if ((time > 6000) || (time < 3000)) { time = 4000; } chr.getMap().broadcastMessage(CField.craftMake(chr.getId(), something, time)); } public static final void CraftComplete(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { int craftID = slea.readInt(); SkillFactory.CraftingEntry ce = SkillFactory.getCraft(craftID); MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); if (((chr.getMapId() == 910001000) || ((craftID == 92049000) && (chr.getMap().getExtractorSize() > 0))) && (ce != null)) { if (chr.getFatigue() < (GameConstants.GMS ? 200 : 100)); } else { return; } int theLevl = c.getPlayer().getProfessionLevel(craftID / 10000 * 10000); if ((theLevl <= 0) && (craftID != 92049000)) { return; } int toGet = 0; int expGain = 0; int fatigue = 0; short quantity = 1; CraftRanking cr = CraftRanking.GOOD; if (craftID == 92049000) { int extractorId = slea.readInt(); int itemId = slea.readInt(); long invId = slea.readLong(); int reqLevel = ii.getReqLevel(itemId); Item item = chr.getInventory(MapleInventoryType.EQUIP).findByInventoryId(invId, itemId); if ((item == null) || (chr.getInventory(MapleInventoryType.ETC).isFull())) { return; } if (extractorId <= 0) { if (theLevl != 0) { if (theLevl >= (reqLevel > 130 ? 6 : (reqLevel - 30) / 20)); } else { return; } } if (extractorId > 0) { MapleCharacter extract = chr.getMap().getCharacterById(extractorId); if ((extract == null) || (extract.getExtractor() == null)) { return; } MapleExtractor extractor = extract.getExtractor(); if (extractor.owner != chr.getId()) { if (chr.getMeso() < extractor.fee) { return; } MapleStatEffect eff = ii.getItemEffect(extractor.itemId); if ((eff != null) && (eff.getUseLevel() < reqLevel)) { return; } chr.gainMeso(-extractor.fee, true); MapleCharacter owner = chr.getMap().getCharacterById(extractor.owner); if ((owner != null) && (owner.getMeso() < 2147483647 - extractor.fee)) { owner.gainMeso(extractor.fee, false); } } } toGet = 4021016; quantity = (short) Randomizer.rand(3, (GameConstants.isWeapon(itemId)) || (GameConstants.isOverall(itemId)) ? 11 : 7); if (reqLevel <= 60) { toGet = 4021013; } else if (reqLevel <= 90) { toGet = 4021014; } else if (reqLevel <= 120) { toGet = 4021015; } if (quantity <= 5) { cr = CraftRanking.SOSO; } if ((Randomizer.nextInt(5) == 0) && (toGet != 4021016)) { toGet++; quantity = 1; cr = CraftRanking.COOL; } fatigue = 3; MapleInventoryManipulator.addById(c, toGet, quantity, "Made by disassemble " + itemId + " on " + FileoutputUtil.CurrentReadable_Date()); MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.EQUIP, item.getPosition(), (short) 1, false); } else if (craftID == 92049001) { int itemId = slea.readInt(); long invId1 = slea.readLong(); long invId2 = slea.readLong(); int reqLevel = ii.getReqLevel(itemId); Equip item1 = (Equip) chr.getInventory(MapleInventoryType.EQUIP).findByInventoryIdOnly(invId1, itemId); Equip item2 = (Equip) chr.getInventory(MapleInventoryType.EQUIP).findByInventoryIdOnly(invId2, itemId); for (short i = 0; i < chr.getInventory(MapleInventoryType.EQUIP).getSlotLimit(); i = (short) (i + 1)) { Item item = chr.getInventory(MapleInventoryType.EQUIP).getItem(i); if ((item != null) && (item.getItemId() == itemId) && (item != item1) && (item != item2)) { if (item1 == null) { item1 = (Equip) item; } else if (item2 == null) { item2 = (Equip) item; break; } } } if ((item1 == null) || (item2 == null)) { return; } if (theLevl < (reqLevel > 130 ? 6 : (reqLevel - 30) / 20)) { return; } int potentialState = 17; int potentialChance = theLevl * 2; if ((item1.getState() > 0) && (item2.getState() > 0)) { potentialChance = 100; } else if ((item1.getState() > 0) || (item2.getState() > 0)) { potentialChance *= 2; } if ((item1.getState() == item2.getState()) && (item1.getState() > 17)) { potentialState = item1.getState(); } Equip newEquip = ii.fuse(item1.getLevel() > 0 ? (Equip) ii.getEquipById(itemId) : item1, item2.getLevel() > 0 ? (Equip) ii.getEquipById(itemId) : item2); int newStat = ii.getTotalStat(newEquip); if ((newStat > ii.getTotalStat(item1)) || (newStat > ii.getTotalStat(item2))) { cr = CraftRanking.COOL; } else if ((newStat < ii.getTotalStat(item1)) || (newStat < ii.getTotalStat(item2))) { cr = CraftRanking.SOSO; } if (Randomizer.nextInt(100) < ((newEquip.getUpgradeSlots() > 0) || (potentialChance >= 100) ? potentialChance : potentialChance / 2)) { newEquip.resetPotential_Fuse(theLevl > 5, potentialState); } newEquip.setFlag((short) ItemFlag.CRAFTED.getValue()); newEquip.setOwner(chr.getName()); toGet = newEquip.getItemId(); expGain = (60 - (theLevl - 1) * 2) * (GameConstants.GMS ? 2 : 1); fatigue = 3; MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.EQUIP, item1.getPosition(), (short) 1, false); MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.EQUIP, item2.getPosition(), (short) 1, false); MapleInventoryManipulator.addbyItem(c, newEquip); } else { if ((ce.needOpenItem) && (chr.getSkillLevel(craftID) <= 0)) { return; } for (Map.Entry e : ce.reqItems.entrySet()) { if (!chr.haveItem(((Integer) e.getKey()).intValue(), ((Integer) e.getValue()).intValue())) { return; } } for (Triple i : ce.targetItems) { if (!MapleInventoryManipulator.checkSpace(c, ((Integer) i.left).intValue(), ((Integer) i.mid).intValue(), "")) { return; } } for (Map.Entry e : ce.reqItems.entrySet()) { MapleInventoryManipulator.removeById(c, GameConstants.getInventoryType(((Integer) e.getKey()).intValue()), ((Integer) e.getKey()).intValue(), ((Integer) e.getValue()).intValue(), false, false); } if ((Randomizer.nextInt(100) < 100 - (ce.reqSkillLevel - theLevl) * 20) || (craftID / 10000 <= 9201)) { Map sa = new HashMap(); while (true) { boolean passed = false; for (Triple i : ce.targetItems) { if (Randomizer.nextInt(100) < ((Integer) i.right).intValue()) { toGet = ((Integer) i.left).intValue(); quantity = ((Integer) i.mid).shortValue(); Item receive = null; if (GameConstants.getInventoryType(toGet) == MapleInventoryType.EQUIP) { Equip first = (Equip) ii.getEquipById(toGet); if (Randomizer.nextInt(100) < theLevl * 2) { first = ii.randomizeStats(first); cr = CraftRanking.COOL; } if (Randomizer.nextInt(100) < theLevl * (first.getUpgradeSlots() > 0 ? 2 : 1)) { first.resetPotential(); cr = CraftRanking.COOL; } receive = first; receive.setFlag((short) ItemFlag.CRAFTED.getValue()); } else { receive = new Item(toGet, (short) 0, quantity, (short) ItemFlag.CRAFTED_USE.getValue()); } if (ce.period > 0) { receive.setExpiration(System.currentTimeMillis() + ce.period * 60000); } receive.setOwner(chr.getName()); receive.setGMLog("Crafted from " + craftID + " on " + FileoutputUtil.CurrentReadable_Date()); MapleInventoryManipulator.addFromDrop(c, receive, true, false); if (ce.needOpenItem) { byte mLevel = chr.getMasterLevel(craftID); if (mLevel == 1) { sa.put(ce, new SkillEntry(0, (byte) 0, SkillFactory.getDefaultSExpiry(ce))); } else if (mLevel > 1) { sa.put(ce, new SkillEntry(2147483647, (byte) (chr.getMasterLevel(craftID) - 1), SkillFactory.getDefaultSExpiry(ce))); } } fatigue = ce.incFatigability; expGain = ce.incSkillProficiency == 0 ? (fatigue * 20 - (ce.reqSkillLevel - theLevl) * 2) * (GameConstants.GMS ? 2 : 1) : ce.incSkillProficiency; chr.getTrait(MapleTrait.MapleTraitType.craft).addExp(cr.craft, chr); passed = true; break; } } if (passed) { break; } } chr.changeSkillsLevel(sa); } else { quantity = 0; cr = CraftRanking.SOSO; } } if ((expGain > 0) && (theLevl < 10)) { expGain *= chr.getClient().getChannelServer().getTraitRate(); if (Randomizer.nextInt(100) < chr.getTrait(MapleTrait.MapleTraitType.craft).getLevel() / 5) { expGain *= 2; } String s = "Alchemy"; switch (craftID / 10000) { case 9200: s = "Herbalism"; break; case 9201: s = "Mining"; break; case 9202: s = "Smithing"; break; case 9203: s = "Accessory Crafting"; } chr.dropMessage(-5, s + "'s mastery increased. (+" + expGain + ")"); if (chr.addProfessionExp(craftID / 10000 * 10000, expGain)) { chr.dropMessage(-5, s + " has gained a level."); } } else { expGain = 0; } MapleQuest.getInstance(2550).forceStart(c.getPlayer(), 9031000, "1"); chr.setFatigue((byte) (chr.getFatigue() + fatigue)); chr.getMap().broadcastMessage(CField.craftFinished(chr.getId(), craftID, cr.i, toGet, quantity, expGain)); } public static final void UsePot(LittleEndianAccessor slea, MapleClient c) { int itemid = slea.readInt(); Item slot = c.getPlayer().getInventory(MapleInventoryType.USE).getItem(slea.readShort()); if ((slot == null) || (slot.getQuantity() <= 0) || (slot.getItemId() != itemid) || (itemid / 10000 != 244) || (MapleItemInformationProvider.getInstance().getPot(itemid) == null)) { c.getSession().write(CWvsContext.enableActions()); return; } c.getSession().write(CWvsContext.enableActions()); for (int i = 0; i < c.getPlayer().getImps().length; i++) { if (c.getPlayer().getImps()[i] == null) { c.getPlayer().getImps()[i] = new MapleImp(itemid); c.getSession().write(CWvsContext.updateImp(c.getPlayer().getImps()[i], MapleImp.ImpFlag.SUMMONED.getValue(), i, false)); MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, slot.getPosition(), (short) 1, false, false); return; } } } public static final void ClearPot(LittleEndianAccessor slea, MapleClient c) { int index = slea.readInt() - 1; if ((index < 0) || (index >= c.getPlayer().getImps().length) || (c.getPlayer().getImps()[index] == null)) { c.getSession().write(CWvsContext.enableActions()); return; } c.getSession().write(CWvsContext.updateImp(c.getPlayer().getImps()[index], MapleImp.ImpFlag.REMOVED.getValue(), index, false)); c.getPlayer().getImps()[index] = null; } public static final void FeedPot(LittleEndianAccessor slea, MapleClient c) { int itemid = slea.readInt(); Item slot = c.getPlayer().getInventory(GameConstants.getInventoryType(itemid)).getItem((short) slea.readInt()); if ((slot == null) || (slot.getQuantity() <= 0) || (slot.getItemId() != itemid)) { c.getSession().write(CWvsContext.enableActions()); return; } int level = GameConstants.getInventoryType(itemid) == MapleInventoryType.ETC ? MapleItemInformationProvider.getInstance().getItemMakeLevel(itemid) : MapleItemInformationProvider.getInstance().getReqLevel(itemid); if ((level <= 0) || (level < Math.min(120, c.getPlayer().getLevel()) - 50) || ((GameConstants.getInventoryType(itemid) != MapleInventoryType.ETC) && (GameConstants.getInventoryType(itemid) != MapleInventoryType.EQUIP))) { c.getPlayer().dropMessage(1, "The item must be within 50 levels of you."); c.getSession().write(CWvsContext.enableActions()); return; } int index = slea.readInt() - 1; if ((index < 0) || (index >= c.getPlayer().getImps().length) || (c.getPlayer().getImps()[index] == null) || (c.getPlayer().getImps()[index].getLevel() >= ((Integer) MapleItemInformationProvider.getInstance().getPot(c.getPlayer().getImps()[index].getItemId()).right).intValue() - 1) || (c.getPlayer().getImps()[index].getState() != 1)) { c.getSession().write(CWvsContext.enableActions()); return; } int mask = MapleImp.ImpFlag.FULLNESS.getValue(); mask |= MapleImp.ImpFlag.FULLNESS_2.getValue(); mask |= MapleImp.ImpFlag.UPDATE_TIME.getValue(); mask |= MapleImp.ImpFlag.AWAKE_TIME.getValue(); c.getPlayer().getImps()[index].setFullness(c.getPlayer().getImps()[index].getFullness() + 100 * (GameConstants.getInventoryType(itemid) == MapleInventoryType.EQUIP ? 2 : 1)); if (Randomizer.nextBoolean()) { mask |= MapleImp.ImpFlag.CLOSENESS.getValue(); c.getPlayer().getImps()[index].setCloseness(c.getPlayer().getImps()[index].getCloseness() + 1 + Randomizer.nextInt(5 * (GameConstants.getInventoryType(itemid) == MapleInventoryType.EQUIP ? 2 : 1))); } else if (Randomizer.nextInt(5) == 0) { c.getPlayer().getImps()[index].setState(4); mask |= MapleImp.ImpFlag.STATE.getValue(); } if (c.getPlayer().getImps()[index].getFullness() >= 1000) { c.getPlayer().getImps()[index].setState(1); c.getPlayer().getImps()[index].setFullness(0); c.getPlayer().getImps()[index].setLevel(c.getPlayer().getImps()[index].getLevel() + 1); mask |= MapleImp.ImpFlag.SUMMONED.getValue(); if (c.getPlayer().getImps()[index].getLevel() >= ((Integer) MapleItemInformationProvider.getInstance().getPot(c.getPlayer().getImps()[index].getItemId()).right).intValue() - 1) { c.getPlayer().getImps()[index].setState(5); } } MapleInventoryManipulator.removeFromSlot(c, GameConstants.getInventoryType(itemid), slot.getPosition(), (short) 1, false, false); c.getSession().write(CWvsContext.updateImp(c.getPlayer().getImps()[index], mask, index, false)); } public static final void CurePot(LittleEndianAccessor slea, MapleClient c) { int itemid = slea.readInt(); Item slot = c.getPlayer().getInventory(MapleInventoryType.ETC).getItem((short) slea.readInt()); if ((slot == null) || (slot.getQuantity() <= 0) || (slot.getItemId() != itemid) || (itemid / 10000 != 434)) { c.getSession().write(CWvsContext.enableActions()); return; } int index = slea.readInt() - 1; if ((index < 0) || (index >= c.getPlayer().getImps().length) || (c.getPlayer().getImps()[index] == null) || (c.getPlayer().getImps()[index].getState() != 4)) { c.getSession().write(CWvsContext.enableActions()); return; } c.getPlayer().getImps()[index].setState(1); c.getSession().write(CWvsContext.updateImp(c.getPlayer().getImps()[index], MapleImp.ImpFlag.STATE.getValue(), index, false)); MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.ETC, slot.getPosition(), (short) 1, false, false); } public static final void RewardPot(LittleEndianAccessor slea, MapleClient c) { int index = slea.readInt() - 1; if ((index < 0) || (index >= c.getPlayer().getImps().length) || (c.getPlayer().getImps()[index] == null) || (c.getPlayer().getImps()[index].getLevel() < ((Integer) MapleItemInformationProvider.getInstance().getPot(c.getPlayer().getImps()[index].getItemId()).right).intValue() - 1)) { c.getSession().write(CWvsContext.enableActions()); return; } int itemid = GameConstants.getRewardPot(c.getPlayer().getImps()[index].getItemId(), c.getPlayer().getImps()[index].getCloseness()); if ((itemid <= 0) || (!MapleInventoryManipulator.checkSpace(c, itemid, 1, ""))) { c.getPlayer().dropMessage(1, "Please make some space."); c.getSession().write(CWvsContext.enableActions()); return; } MapleInventoryManipulator.addById(c, itemid, (short) 1, "Item Pot from " + c.getPlayer().getImps()[index].getItemId() + " on " + FileoutputUtil.CurrentReadable_Date()); c.getSession().write(CWvsContext.updateImp(c.getPlayer().getImps()[index], MapleImp.ImpFlag.REMOVED.getValue(), index, false)); c.getPlayer().getImps()[index] = null; } static { craftingEffects.put("Effect/BasicEff.img/professions/herbalism", Integer.valueOf(92000000)); craftingEffects.put("Effect/BasicEff.img/professions/mining", Integer.valueOf(92010000)); craftingEffects.put("Effect/BasicEff.img/professions/herbalismExtract", Integer.valueOf(92000000)); craftingEffects.put("Effect/BasicEff.img/professions/miningExtract", Integer.valueOf(92010000)); craftingEffects.put("Effect/BasicEff.img/professions/equip_product", Integer.valueOf(92020000)); craftingEffects.put("Effect/BasicEff.img/professions/acc_product", Integer.valueOf(92030000)); craftingEffects.put("Effect/BasicEff.img/professions/alchemy", Integer.valueOf(92040000)); } public static enum CraftRanking { SOSO(19, 30), GOOD(20, 40), COOL(21, 50); public int i; public int craft; private CraftRanking(int i, int craft) { this.i = i; this.craft = craft; } } }