Esempio n. 1
0
  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;
  }
Esempio n. 3
0
  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()));
  }
Esempio n. 4
0
  /** 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;
    }
  }