/**
   * Method dropAttackable.
   *
   * @param attackable NpcInstance
   * @param killer Player
   */
  public void dropAttackable(NpcInstance attackable, Player killer) {
    if (killer.isInOlympiadMode()
        || killer.isCursedWeaponEquipped()
        || (_cursedWeapons.length == 0)
        || (killer.getReflection() != ReflectionManager.DEFAULT)) {
      return;
    }

    synchronized (_cursedWeapons) {
      CursedWeapon[] cursedWeapons = new CursedWeapon[0];

      for (CursedWeapon cw : _cursedWeapons) {
        if (cw.isActive()) {
          continue;
        }

        cursedWeapons = ArrayUtils.add(cursedWeapons, cw);
      }

      if (cursedWeapons.length > 0) {
        CursedWeapon cw = cursedWeapons[Rnd.get(cursedWeapons.length)];

        if (Rnd.get(100000000) <= cw.getDropRate()) {
          cw.create(attackable, killer);
        }
      }
    }
  }
  /**
   * Method saveData.
   *
   * @param cw CursedWeapon
   */
  private void saveData(CursedWeapon cw) {
    Connection con = null;
    PreparedStatement statement = null;

    try {
      con = DatabaseFactory.getInstance().getConnection();
      statement = con.prepareStatement("DELETE FROM cursed_weapons WHERE item_id = ?");
      statement.setInt(1, cw.getItemId());
      statement.executeUpdate();

      if (cw.isActive()) {
        DbUtils.close(statement);
        statement =
            con.prepareStatement(
                "REPLACE INTO cursed_weapons (item_id, player_id, player_karma, player_pkkills, nb_kills, x, y, z, end_time) VALUES (?,?,?,?,?,?,?,?,?)");
        statement.setInt(1, cw.getItemId());
        statement.setInt(2, cw.getPlayerId());
        statement.setInt(3, cw.getPlayerKarma());
        statement.setInt(4, cw.getPlayerPkKills());
        statement.setInt(5, cw.getNbKills());
        statement.setInt(6, cw.getLoc().getX());
        statement.setInt(7, cw.getLoc().getY());
        statement.setInt(8, cw.getLoc().getZ());
        statement.setLong(9, cw.getEndTime() / 1000);
        statement.executeUpdate();
      }
    } catch (SQLException e) {
      _log.error("CursedWeapon: Failed to save data: " + e);
    } finally {
      DbUtils.closeQuietly(con, statement);
    }
  }
  /**
   * Method emptyPlayerCursedWeapon.
   *
   * @param playerId int
   * @param itemId int
   * @param cw CursedWeapon
   */
  private void emptyPlayerCursedWeapon(int playerId, int itemId, CursedWeapon cw) {
    Connection con = null;
    PreparedStatement statement = null;

    try {
      con = DatabaseFactory.getInstance().getConnection();
      statement = con.prepareStatement("DELETE FROM items WHERE owner_id=? AND item_id=?");
      statement.setInt(1, playerId);
      statement.setInt(2, itemId);
      statement.executeUpdate();
      DbUtils.close(statement);
      statement = con.prepareStatement("UPDATE characters SET karma=?, pkkills=? WHERE obj_id=?");
      statement.setInt(1, cw.getPlayerKarma());
      statement.setInt(2, cw.getPlayerPkKills());
      statement.setInt(3, playerId);

      if (statement.executeUpdate() != 1) {
        _log.warn("Error while updating karma & pkkills for userId " + cw.getPlayerId());
      }

      removeFromDb(itemId);
    } catch (SQLException e) {
      _log.error("", e);
    } finally {
      DbUtils.closeQuietly(con, statement);
    }
  }
  /**
   * Method increaseKills.
   *
   * @param itemId int
   */
  public void increaseKills(int itemId) {
    CursedWeapon cw = _cursedWeaponsMap.get(itemId);

    if (cw != null) {
      cw.increaseKills();
      saveData(cw);
    }
  }
 /**
  * Method doLogout.
  *
  * @param player Player
  */
 public void doLogout(Player player) {
   for (CursedWeapon cw : _cursedWeapons) {
     if (player.getInventory().getItemByItemId(cw.getItemId()) != null) {
       cw.setPlayer(null);
       cw.setItem(null);
     }
   }
 }
 /** Method runImpl. */
 @Override
 public void runImpl() {
   for (CursedWeapon cw : _cursedWeapons) {
     if (cw.isActive() && (cw.getTimeLeft() <= 0)) {
       endOfLife(cw);
     }
   }
 }
  /**
   * Method activate.
   *
   * @param player Player
   * @param item ItemInstance
   */
  public void activate(Player player, ItemInstance item) {
    if ((player == null) || player.isInOlympiadMode()) {
      return;
    }

    CursedWeapon cw = _cursedWeaponsMap.get(item.getId());

    if (cw == null) {
      return;
    }

    if (player.isCursedWeaponEquipped()) {
      if (player.getCursedWeaponEquippedId() != item.getId()) {
        CursedWeapon cw2 = _cursedWeaponsMap.get(player.getCursedWeaponEquippedId());
        cw2.setNbKills(cw2.getStageKills() - 1);
        cw2.increaseKills();
      }

      endOfLife(cw);
      player.getInventory().destroyItem(item, 1);
    } else if (cw.getTimeLeft() > 0) {
      cw.activate(player, item);
      saveData(cw);
      announce(
          new SystemMessage(SystemMessage.THE_OWNER_OF_S2_HAS_APPEARED_IN_THE_S1_REGION)
              .addZoneName(player.getLoc())
              .addString(cw.getName()));
    } else {
      endOfLife(cw);
      player.getInventory().destroyItem(item, 1);
    }
  }
  /**
   * Method dropPlayer.
   *
   * @param player Player
   */
  public void dropPlayer(Player player) {
    CursedWeapon cw = _cursedWeaponsMap.get(player.getCursedWeaponEquippedId());

    if (cw == null) {
      return;
    }

    if (cw.dropIt(null, null, player)) {
      saveData(cw);
      announce(
          new SystemMessage(SystemMessage.S2_WAS_DROPPED_IN_THE_S1_REGION)
              .addZoneName(player.getLoc())
              .addItemName(cw.getItemId()));
    } else {
      endOfLife(cw);
    }
  }
  /**
   * Method checkPlayer.
   *
   * @param player Player
   * @param item ItemInstance
   */
  public void checkPlayer(Player player, ItemInstance item) {
    if ((player == null) || (item == null) || player.isInOlympiadMode()) {
      return;
    }

    CursedWeapon cw = _cursedWeaponsMap.get(item.getId());

    if (cw == null) {
      return;
    }

    if ((player.getObjectId() == cw.getPlayerId()) || (cw.getPlayerId() == 0) || cw.isDropped()) {
      activate(player, item);
      showUsageTime(player, cw);
    } else {
      _log.warn("CursedWeaponsManager: " + player + " tried to obtain " + item + " in wrong way");
      player.getInventory().destroyItem(item, item.getCount());
    }
  }
Пример #10
0
  /** Method checkConditions. */
  private void checkConditions() {
    Connection con = null;
    PreparedStatement statement1 = null, statement2 = null;
    ResultSet rset = null;

    try {
      con = DatabaseFactory.getInstance().getConnection();
      statement1 = con.prepareStatement("DELETE FROM character_skills WHERE skill_id=?");
      statement2 = con.prepareStatement("SELECT owner_id FROM items WHERE item_id=?");

      for (CursedWeapon cw : _cursedWeapons) {
        int itemId = cw.getItemId();
        int skillId = cw.getSkillId();
        boolean foundedInItems = false;
        statement1.setInt(1, skillId);
        statement1.executeUpdate();
        statement2.setInt(1, itemId);
        rset = statement2.executeQuery();

        while (rset.next()) {
          int playerId = rset.getInt("owner_id");

          if (!foundedInItems) {
            if ((playerId != cw.getPlayerId()) || (cw.getPlayerId() == 0)) {
              emptyPlayerCursedWeapon(playerId, itemId, cw);
              _log.info(
                  "CursedWeaponsManager[254]: Player "
                      + playerId
                      + " owns the cursed weapon "
                      + itemId
                      + " but he shouldn't.");
            } else {
              foundedInItems = true;
            }
          } else {
            emptyPlayerCursedWeapon(playerId, itemId, cw);
            _log.info(
                "CursedWeaponsManager[262]: Player "
                    + playerId
                    + " owns the cursed weapon "
                    + itemId
                    + " but he shouldn't.");
          }
        }

        if (!foundedInItems && (cw.getPlayerId() != 0)) {
          removeFromDb(cw.getItemId());
          _log.info("CursedWeaponsManager: Unownered weapon, removing from table...");
        }
      }
    } catch (Exception e) {
      _log.warn("CursedWeaponsManager: Could not check cursed_weapons data: " + e);
    } finally {
      DbUtils.closeQuietly(statement1);
      DbUtils.closeQuietly(con, statement2, rset);
    }
  }
Пример #11
0
  /** Method restore. */
  private void restore() {
    Connection con = null;
    PreparedStatement statement = null;
    ResultSet rset = null;

    try {
      con = DatabaseFactory.getInstance().getConnection();
      statement = con.prepareStatement("SELECT * FROM cursed_weapons");
      rset = statement.executeQuery();

      while (rset.next()) {
        int itemId = rset.getInt("item_id");
        CursedWeapon cw = _cursedWeaponsMap.get(itemId);

        if (cw != null) {
          cw.setPlayerId(rset.getInt("player_id"));
          cw.setPlayerKarma(rset.getInt("player_karma"));
          cw.setPlayerPkKills(rset.getInt("player_pkkills"));
          cw.setNbKills(rset.getInt("nb_kills"));
          cw.setLoc(new Location(rset.getInt("x"), rset.getInt("y"), rset.getInt("z")));
          cw.setEndTime(rset.getLong("end_time") * 1000L);

          if (!cw.reActivate()) {
            endOfLife(cw);
          }
        } else {
          removeFromDb(itemId);
          _log.warn("CursedWeaponsManager: Unknown cursed weapon " + itemId + ", deleted");
        }
      }
    } catch (Exception e) {
      _log.warn("CursedWeaponsManager: Could not restore cursed_weapons data: " + e);
      _log.error("", e);
    } finally {
      DbUtils.closeQuietly(con, statement, rset);
    }
  }
Пример #12
0
  /** Method load. */
  private void load() {
    try {
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      factory.setValidating(false);
      factory.setIgnoringComments(true);
      File file = new File(Config.DATAPACK_ROOT, "data/xml/other/cursed_weapons.xml");

      if (!file.exists()) {
        return;
      }

      Document doc = factory.newDocumentBuilder().parse(file);

      for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling()) {
        if ("list".equals(n.getNodeName())) {
          for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling()) {
            if ("item".equals(d.getNodeName())) {
              NamedNodeMap attrs = d.getAttributes();
              int id = Integer.parseInt(attrs.getNamedItem("id").getNodeValue());
              int skillId = Integer.parseInt(attrs.getNamedItem("skillId").getNodeValue());
              String name = "Unknown cursed weapon";

              if (attrs.getNamedItem("name") != null) {
                name = attrs.getNamedItem("name").getNodeValue();
              } else if (ItemHolder.getInstance().getTemplate(id) != null) {
                name = ItemHolder.getInstance().getTemplate(id).getName();
              }

              if (id == 0) {
                continue;
              }

              CursedWeapon cw = new CursedWeapon(id, skillId, name);

              for (Node cd = d.getFirstChild(); cd != null; cd = cd.getNextSibling()) {
                if ("dropRate".equals(cd.getNodeName())) {
                  cw.setDropRate(
                      Integer.parseInt(cd.getAttributes().getNamedItem("val").getNodeValue()));
                } else if ("duration".equals(cd.getNodeName())) {
                  attrs = cd.getAttributes();
                  cw.setDurationMin(Integer.parseInt(attrs.getNamedItem("min").getNodeValue()));
                  cw.setDurationMax(Integer.parseInt(attrs.getNamedItem("max").getNodeValue()));
                } else if ("durationLost".equals(cd.getNodeName())) {
                  cw.setDurationLost(
                      Integer.parseInt(cd.getAttributes().getNamedItem("val").getNodeValue()));
                } else if ("disapearChance".equals(cd.getNodeName())) {
                  cw.setDisapearChance(
                      Integer.parseInt(cd.getAttributes().getNamedItem("val").getNodeValue()));
                } else if ("stageKills".equals(cd.getNodeName())) {
                  cw.setStageKills(
                      Integer.parseInt(cd.getAttributes().getNamedItem("val").getNodeValue()));
                } else if ("transformationId".equals(cd.getNodeName())) {
                  cw.setTransformationId(
                      Integer.parseInt(cd.getAttributes().getNamedItem("val").getNodeValue()));
                } else if ("transformationTemplateId".equals(cd.getNodeName())) {
                  cw.setTransformationTemplateId(
                      Integer.parseInt(cd.getAttributes().getNamedItem("val").getNodeValue()));
                } else if ("transformationName".equals(cd.getNodeName())) {
                  cw.setTransformationName(cd.getAttributes().getNamedItem("val").getNodeValue());
                }
              }

              _cursedWeaponsMap.put(id, cw);
            }
          }
        }
      }

      _cursedWeapons = _cursedWeaponsMap.values(new CursedWeapon[_cursedWeaponsMap.size()]);
    } catch (Exception e) {
      _log.error("CursedWeaponsManager: Error parsing cursed_weapons file. " + e);
    }
  }
Пример #13
0
 /**
  * Method showUsageTime.
  *
  * @param player Player
  * @param cw CursedWeapon
  */
 public void showUsageTime(Player player, CursedWeapon cw) {
   SystemMessage sm = new SystemMessage(SystemMessage.S2_MINUTE_OF_USAGE_TIME_ARE_LEFT_FOR_S1);
   sm.addString(cw.getName());
   sm.addNumber(new Long(cw.getTimeLeft() / 60000).intValue());
   player.sendPacket(sm);
 }
Пример #14
0
 /**
  * Method getLevel.
  *
  * @param itemId int
  * @return int
  */
 public int getLevel(int itemId) {
   CursedWeapon cw = _cursedWeaponsMap.get(itemId);
   return cw != null ? cw.getLevel() : 0;
 }
Пример #15
0
  /**
   * Method endOfLife.
   *
   * @param cw CursedWeapon
   */
  public void endOfLife(CursedWeapon cw) {
    if (cw.isActivated()) {
      Player player = cw.getOnlineOwner();

      if (player != null) {
        _log.info(
            "CursedWeaponsManager: " + cw.getName() + " being removed online from " + player + ".");
        player.abortAttack(true, true);
        player.setKarma(cw.getPlayerKarma());
        player.setPkKills(cw.getPlayerPkKills());
        player.setCursedWeaponEquippedId(0);
        player.setTransformation(0);
        player.setTransformationName(null);
        player.removeSkill(
            SkillTable.getInstance()
                .getInfo(cw.getSkillId(), player.getSkillLevel(cw.getSkillId())),
            false);
        player.getInventory().destroyItemByItemId(cw.getItemId(), 1L);
        player.broadcastCharInfo();
      } else {
        _log.info("CursedWeaponsManager: " + cw.getName() + " being removed offline.");
        Connection con = null;
        PreparedStatement statement = null;

        try {
          con = DatabaseFactory.getInstance().getConnection();
          statement = con.prepareStatement("DELETE FROM items WHERE owner_id=? AND item_id=?");
          statement.setInt(1, cw.getPlayerId());
          statement.setInt(2, cw.getItemId());
          statement.executeUpdate();
          DbUtils.close(statement);
          statement =
              con.prepareStatement(
                  "DELETE FROM character_skills WHERE char_obj_id=? AND skill_id=?");
          statement.setInt(1, cw.getPlayerId());
          statement.setInt(2, cw.getSkillId());
          statement.executeUpdate();
          DbUtils.close(statement);
          statement =
              con.prepareStatement("UPDATE characters SET karma=?, pkkills=? WHERE obj_Id=?");
          statement.setInt(1, cw.getPlayerKarma());
          statement.setInt(2, cw.getPlayerPkKills());
          statement.setInt(3, cw.getPlayerId());
          statement.executeUpdate();
        } catch (SQLException e) {
          _log.warn("CursedWeaponsManager: Could not delete : " + e);
        } finally {
          DbUtils.closeQuietly(con, statement);
        }
      }
    } else if ((cw.getPlayer() != null)
        && (cw.getPlayer().getInventory().getItemByItemId(cw.getItemId()) != null)) {
      Player player = cw.getPlayer();

      if (!cw.getPlayer().getInventory().destroyItemByItemId(cw.getItemId(), 1)) {
        _log.info("CursedWeaponsManager[453]: Error! Cursed weapon not found!!!");
      }

      player.sendChanges();
      player.broadcastUserInfo();
    } else if (cw.getItem() != null) {
      cw.getItem().deleteMe();
      cw.getItem().delete();
      _log.info("CursedWeaponsManager: " + cw.getName() + " item has been removed from World.");
    }

    cw.initWeapon();
    removeFromDb(cw.getItemId());
    announce(new SystemMessage(SystemMessage.S1_HAS_DISAPPEARED_CW).addString(cw.getName()));
  }