public static void getQuestDrop(Set<DropItem> dropItems, Npc npc, Player player) { List<QuestDrop> drops = QuestEngine.getInstance().getQuestDrop(npc.getNpcId()); if (drops.isEmpty() || player.isInAlliance()) return; List<Player> players = new ArrayList<Player>(); if (player.isInGroup()) { players.add(player); // add the first for (Player member : player.getPlayerGroup().getMembers()) { if (player.equals(member)) continue; if (MathUtil.isInRange(member, npc, GroupConfig.GROUP_MAX_DISTANCE)) { players.add(member); } } } else { players.add(player); } for (QuestDrop drop : drops) { boolean droppedOnce = false; boolean isItemDropped = false; DropItem droppedOnceItem = null; // create new DropItem with player not set, so we could compare hashes DropItem item = new DropItem(new DropTemplate(drop.getNpcId(), drop.getItemId(), 1, 1, drop.getChance())); // protection against overriding chances from DB if (dropItems.contains(item)) // for this player from DB data dropItems.remove(item); // removes DB drop for (Player member : players) { if (!hasQuestForDrop(member, drop)) continue; if (!drop.isDropEachMember()) { if (!droppedOnce) { isItemDropped = isDrop(member, drop); droppedOnce = true; } else { if (isItemDropped) droppedOnceItem.addQuestPlayerObjId(member.getObjectId()); continue; } } else { isItemDropped = isDrop(player, drop); } // create a new DropItem if its null if (item == null) item = new DropItem( new DropTemplate(drop.getNpcId(), drop.getItemId(), 1, 1, drop.getChance())); if (drop.isDropEachMember()) item.setQuestDropForEachMemeber(); if (droppedOnce && isItemDropped) droppedOnceItem = item; item.addQuestPlayerObjId(member.getObjectId()); item.setCount(1); if (isItemDropped && !droppedOnce) dropItems.add(item); item = null; } if (droppedOnce && isItemDropped) dropItems.add(droppedOnceItem); } }
@Override public HandlerResult onItemUseEvent(final QuestCookie env, Item item) { final Player player = env.getPlayer(); final QuestState qs = player.getQuestStateList().getQuestState(questId); final int id = item.getItemTemplate().getTemplateId(); final int itemObjId = item.getObjectId(); if (id != 182201783 || qs == null) return HandlerResult.UNKNOWN; int var = qs.getQuestVars().getQuestVars(); if (var != 0 || qs.getStatus() != QuestStatus.START) return HandlerResult.FAILED; if (MathUtil.getDistance( 1677, 2520, 100, player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ()) > 5) return HandlerResult.FAILED; int itemId1 = 110100150; int itemId2 = 113100144; boolean CheckitemId1 = false; boolean CheckitemId2 = false; List<Item> items1 = player.getEquipment().getEquippedItemsByItemId(itemId1); for (@SuppressWarnings("unused") Item ListeCheckitemId1 : items1) { CheckitemId1 = true; } List<Item> items2 = player.getEquipment().getEquippedItemsByItemId(itemId2); for (@SuppressWarnings("unused") Item ListeCheckitemId2 : items2) { CheckitemId2 = true; } if (!CheckitemId1 && CheckitemId2 || CheckitemId1 && !CheckitemId2 || !CheckitemId1 && !CheckitemId2) return HandlerResult.FAILED; PacketSendUtility.broadcastPacket( player, new SM_ITEM_USAGE_ANIMATION(player.getObjectId(), itemObjId, id, 3000, 0, 0), true); ThreadPoolManager.getInstance() .schedule( new Runnable() { @Override public void run() { PacketSendUtility.broadcastPacket( player, new SM_ITEM_USAGE_ANIMATION(player.getObjectId(), itemObjId, id, 0, 1, 0), true); player.getInventory().removeFromBagByObjectId(itemObjId, 1); qs.setStatus(QuestStatus.REWARD); updateQuestStatus(env); } }, 3000); return HandlerResult.SUCCESS; }
public static void fusionWeapons(Player player, int firstItemUniqueId, int secondItemUniqueId) { Item firstItem = player.getInventory().getItemByObjId(firstItemUniqueId); if (firstItem == null) firstItem = player.getEquipment().getEquippedItemByObjId(firstItemUniqueId); Item secondItem = player.getInventory().getItemByObjId(secondItemUniqueId); if (secondItem == null) secondItem = player.getEquipment().getEquippedItemByObjId(secondItemUniqueId); /* * Need to have items in bag, and target the fusion NPC */ if (firstItem == null || secondItem == null || !(player.getTarget() instanceof Npc)) return; if (!MathUtil.isIn3dRange(player.getTarget(), player, 10)) return; /* * Both have to be 2h weapons */ if (!firstItem.getItemTemplate().isWeapon() || !secondItem.getItemTemplate().isWeapon()) { Logger.getLogger(ArmsfusionService.class) .info("[AUDIT]Player: " + player.getName() + " trying to fusion non-weapon. Hacking!"); return; } if (firstItem.getItemTemplate().getWeaponType() == null || secondItem.getItemTemplate().getWeaponType() == null) return; else { switch (firstItem.getItemTemplate().getWeaponType()) { case DAGGER_1H: case MACE_1H: case SWORD_1H: case TOOLHOE_1H: Logger.getLogger(ArmsfusionService.class) .info("[AUDIT]Player: " + player.getName() + " trying to fusion 1h weapon. Hacking!"); return; } switch (secondItem.getItemTemplate().getWeaponType()) { case DAGGER_1H: case MACE_1H: case SWORD_1H: case TOOLHOE_1H: Logger.getLogger(ArmsfusionService.class) .info("[AUDIT]Player: " + player.getName() + " trying to fusion 1h weapon. Hacking!"); return; } } // check if both items are fusionable if (!firstItem.getItemTemplate().isCanFuse() || !secondItem.getItemTemplate().isCanFuse()) return; double rarity = rarityRate(firstItem.getItemTemplate().getItemQuality()); double priceRate = player.getPrices().getGlobalPrices(player.getCommonData().getRace()) * .01; double taxRate = player.getPrices().getTaxes(player.getCommonData().getRace()) * .01; int priceMod = player.getPrices().getGlobalPricesModifier() * 2; int level = firstItem.getItemTemplate().getLevel(); int price = (int) (priceMod * priceRate * taxRate * rarity * level * level); log.debug( "Rarity: " + rarity + " Price Rate: " + priceRate + " Tax Rate: " + taxRate + " Price Mod: " + priceMod + " Weapon Level: " + level); log.debug("Price: " + price); if (player.getInventory().getKinahItem().getItemCount() < price) { PacketSendUtility.sendPacket( player, SM_SYSTEM_MESSAGE.STR_COMPOUND_ERROR_NOT_ENOUGH_MONEY( firstItem.getNameID(), secondItem.getNameID())); return; } /* * Fusioned weapons must have same type */ if (firstItem.getItemTemplate().getWeaponType() != secondItem.getItemTemplate().getWeaponType()) { PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_COMPOUND_ERROR_DIFFERENT_TYPE); return; } /* * Second weapon must have inferior or equal lvl. in relation to first weapon */ if (secondItem.getItemTemplate().getLevel() > firstItem.getItemTemplate().getLevel()) { PacketSendUtility.sendPacket( player, SM_SYSTEM_MESSAGE.STR_COMPOUND_ERROR_MAIN_REQUIRE_HIGHER_LEVEL); return; } boolean decreaseResult = player.getInventory().decreaseKinah(price); if (!decreaseResult) return; boolean removeResult = player.getInventory().removeFromBagByObjectId(secondItemUniqueId, 1); if (!removeResult) return; firstItem.setFusionedItem(secondItem.getItemTemplate().getTemplateId()); ItemService.removeAllFusionStone(player, firstItem); if (secondItem.hasOptionalSocket()) { firstItem.setOptionalFusionSocket(secondItem.getOptionalSocket()); } else { firstItem.setOptionalFusionSocket(0); } Set<ManaStone> manastones = secondItem.getItemStones(); for (ManaStone stone : manastones) ItemService.addFusionStone(firstItem, stone.getItemId()); if (firstItem.getPersistentState() != PersistentState.NEW && firstItem.getPersistentState() != PersistentState.UPDATE_REQUIRED) firstItem.setPersistentState(PersistentState.UPDATE_REQUIRED); DAOManager.getDAO(InventoryDAO.class).store(firstItem, player.getObjectId()); PacketSendUtility.sendPacket(player, new SM_DELETE_ITEM(secondItemUniqueId)); PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(firstItem)); PacketSendUtility.sendPacket( player, SM_SYSTEM_MESSAGE.STR_COMPOUND_SUCCESS(firstItem.getNameID(), secondItem.getNameID())); }
/** Handle dialog */ @Override public void onDialogSelect(int dialogId, final Player player, int questId) { Npc npc = getOwner(); int targetObjectId = npc.getObjectId(); if (QuestEngine.getInstance().onDialog(new QuestCookie(npc, player, questId, dialogId))) return; switch (dialogId) { case 2: PacketSendUtility.sendPacket( player, new SM_TRADELIST( npc, TradeService.getTradeListData().getTradeListTemplate(npc.getNpcId()), player.getPrices().getVendorBuyModifier(), player)); break; case 3: PacketSendUtility.sendPacket( player, new SM_SELL_ITEM( targetObjectId, player.getPrices().getVendorSellModifier(player.getCommonData().getRace()))); break; case 4: // stigma PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(targetObjectId, 1)); break; case 5: // create legion if (MathUtil.isInRange( npc, player, 10)) // avoiding exploit with sending fake dialog_select packet { PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(targetObjectId, 2)); } else { PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.LEGION_CREATE_TOO_FAR_FROM_NPC()); } break; case 6: // disband legion if (MathUtil.isInRange( npc, player, 10)) // avoiding exploit with sending fake dialog_select packet { LegionService.getInstance().requestDisbandLegion(npc, player); } else { PacketSendUtility.sendPacket( player, SM_SYSTEM_MESSAGE.LEGION_DISPERSE_TOO_FAR_FROM_NPC()); } break; case 7: // recreate legion if (MathUtil.isInRange( npc, player, 10)) // voiding exploit with sending fake client dialog_select // packet { LegionService.getInstance().recreateLegion(npc, player); } else { PacketSendUtility.sendPacket( player, SM_SYSTEM_MESSAGE.LEGION_DISPERSE_TOO_FAR_FROM_NPC()); } break; case 20: // warehouse if (MathUtil.isInRange( npc, player, 10)) // voiding exploit with sending fake client dialog_select // packet { if (!RestrictionsManager.canUseWarehouse(player)) return; PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(targetObjectId, 26)); WarehouseService.sendWarehouseInfo(player, true); } break; case 25: // TODO hotfix to prevent opening the legion wh when a quest returns false. break; case 27: // Consign trade?? npc karinerk, koorunerk PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(targetObjectId, 13)); break; case 29: // soul healing final long expLost = player.getCommonData().getExpRecoverable(); if (expLost == 0) player.getEffectController().removeEffect(8291); final double factor = (expLost < 1000000 ? 0.25 - (0.00000015 * expLost) : 0.1); final int price = (int) (expLost * factor * CustomConfig.SOULHEALING_PRICE_MULTIPLIER); RequestResponseHandler responseHandler = new RequestResponseHandler(npc) { @Override public void acceptRequest(Creature requester, Player responder) { if (player.getInventory().getKinahItem().getItemCount() >= price) { PacketSendUtility.sendPacket( player, SM_SYSTEM_MESSAGE.EXP(String.valueOf(expLost))); PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.SOUL_HEALED()); player.getCommonData().resetRecoverableExp(); player.getInventory().decreaseKinah(price); player.getEffectController().removeEffect(8291); } else { PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.NOT_ENOUGH_KINAH(price)); } } @Override public void denyRequest(Creature requester, Player responder) { // no message } }; if (player.getCommonData().getExpRecoverable() > 0) { boolean result = player .getResponseRequester() .putRequest(SM_QUESTION_WINDOW.STR_SOUL_HEALING, responseHandler); if (result) { PacketSendUtility.sendPacket( player, new SM_QUESTION_WINDOW( SM_QUESTION_WINDOW.STR_SOUL_HEALING, 0, String.valueOf(price))); } } else { PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.DONT_HAVE_RECOVERED_EXP()); } break; case 30: switch (npc.getNpcId()) { // Triniel Arena (Enter) case 204089: TeleportService.teleportTo(player, 120010000, 1, 984f, 1543f, 222.1f, 0); ArenaService.getInstance().registerPlayerForTriniel(player); break; // Coliseum (Enter) case 203764: TeleportService.teleportTo(player, 110010000, 1, 1462.5f, 1326.1f, 564.1f, 0); ArenaService.getInstance().registerPlayerForColiseum(player); break; // Eracus Temple (Enter) case 203981: TeleportService.teleportTo(player, 210020000, 1, 439.3f, 422.2f, 274.3f, 0); break; } break; case 31: switch (npc.getNpcId()) { // Triniel Arena (Leave) case 204087: TeleportService.teleportTo(player, 120010000, 1, 1005.1f, 1528.9f, 222.1f, 0); ArenaService.getInstance().unregister(player); break; // Coliseum (Leave) case 203875: TeleportService.teleportTo(player, 110010000, 1, 1470.3f, 1343.5f, 563.7f, 21); ArenaService.getInstance().unregister(player); break; // Eracus Temple (Leave) case 203982: TeleportService.teleportTo(player, 210020000, 1, 446.2f, 431.1f, 274.5f, 0); break; } break; case 35: // Godstone socketing PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(targetObjectId, 21)); break; case 36: // remove mana stone PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(targetObjectId, 20)); break; case 37: // modify appearance PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(targetObjectId, 19)); break; case 38: // flight and teleport TeleportService.showMap(player, targetObjectId, npc.getNpcId()); break; case 39: // improve extraction case 40: // learn tailoring armor smithing etc... CraftSkillUpdateService.getInstance().learnSkill(player, npc); break; case 41: // expand cube CubeExpandService.expandCube(player, npc); break; case 42: WarehouseService.expandWarehouse(player, npc); break; case 47: // legion warehouse if (LegionConfig.LEGION_WAREHOUSE) if (MathUtil.isInRange(npc, player, 10)) LegionService.getInstance().openLegionWarehouse(player); break; case 50: // WTF??? Quest dialog packet break; case 52: if (MathUtil.isInRange( npc, player, 10)) // avoiding exploit with sending fake dialog_select packet { PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(targetObjectId, 28)); } break; case 53: // coin reward PacketSendUtility.sendPacket( player, new SM_MESSAGE(0, null, "This feature is not available yet", ChatType.ANNOUNCEMENTS)); break; case 55: case 56: byte changesex = 0; // 0 plastic surgery, 1 gender switch byte check_ticket = 2; // 2 no ticket, 1 have ticket if (dialogId == 56) { // Gender Switch changesex = 1; if (player.getInventory().getItemCountByItemId(169660000) > 0 || player.getInventory().getItemCountByItemId(169660001) > 0) check_ticket = 1; } else { // Plastic Surgery if (player.getInventory().getItemCountByItemId(169650000) > 0 || player.getInventory().getItemCountByItemId(169650001) > 0) check_ticket = 1; } PacketSendUtility.sendPacket( player, new SM_PLASTIC_SURGERY(player, check_ticket, changesex)); player.setEditMode(true); break; case 60: // armsfusion PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(targetObjectId, 29)); break; case 61: // armsbreaking PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(targetObjectId, 30)); break; case 64: // repurchase PacketSendUtility.sendPacket(player, new SM_REPURCHASE(npc, player)); break; case 65: // adopt pet PacketSendUtility.sendPacket(player, new SM_PET(6)); break; case 66: // surrender pet PacketSendUtility.sendPacket(player, new SM_PET(7)); break; case 10000: // generic npc reply (most are teleporters) TeleporterTemplate template = DataManager.TELEPORTER_DATA.getTeleporterTemplate(npc.getNpcId()); if (template != null) { TeleportLocation loc = template.getTeleLocIdData().getTelelocations().get(0); if (loc != null) { player.getInventory().decreaseKinah(loc.getPrice()); TelelocationTemplate tlt = DataManager.TELELOCATION_DATA.getTelelocationTemplate(loc.getLocId()); TeleportService.teleportTo( player, tlt.getMapId(), tlt.getX(), tlt.getY(), tlt.getZ(), 1000); } } break; default: if (questId > 0) PacketSendUtility.sendPacket( player, new SM_DIALOG_WINDOW(targetObjectId, dialogId, questId)); else PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(targetObjectId, dialogId)); break; } }