public void onTransferOnlyRemoveSkills(Player player, int toFinalClass, int baseKeepSkills) {
    boolean delete = false;

    if (Config.ALT_DELETE_AWAKEN_SKILL_FROM_DB) {
      delete = true;
    }

    List<Integer> allSkillsId = SkillAcquireHolder.getInstance().getAllClassSkillId();
    List<Integer> skillsToMantain =
        SkillAcquireHolder.getInstance().getMaintainSkillOnAwake(baseKeepSkills, toFinalClass);

    for (Skill skl : player.getAllSkills()) {
      if (allSkillsId.contains(skl.getId())) {
        player.removeSkill(skl, delete);
      }
    }

    for (int skillId : skillsToMantain) {
      int skillLv = SkillTable.getInstance().getBaseLevel(skillId);
      Skill newSkill = SkillTable.getInstance().getInfo(skillId, skillLv);
      player.addSkill(newSkill, true);
    }

    for (int alterSkill : ALTER_SKILLS.get(toFinalClass)) {
      int skillLv = SkillTable.getInstance().getBaseLevel(alterSkill);
      Skill newSkillAlter = SkillTable.getInstance().getInfo(alterSkill, skillLv);
      player.addSkill(newSkillAlter, true);
    }

    player.sendSkillList();
  }
  /**
   * Method restore.
   *
   * @param player Player
   */
  void restore(Player player) {
    if (player.getEffectList().getEffectsBySkillId(_skillId) != null) {
      for (Effect e : player.getEffectList().getAllEffects()) {
        if (e.getSkill().getId() == _skillId) {
          _level = e.getSkill().getLevel();
          e.exit();
        }
      }
    }

    if (!Config.ALLOW_DEATH_PENALTY_C5) {
      return;
    }

    if (getLevel(player) > 0) {
      Skill skill = SkillTable.getInstance().getInfo(_skillId, _level);

      if (skill == null) {
        return;
      }

      skill.getEffects(player, player, false, false);
      player.sendPacket(
          new SystemMessage(SystemMessage.THE_LEVEL_S1_SHILENS_BREATH_WILL_BE_ASSESSED)
              .addNumber(getLevel(player)));
    }

    player.updateStats();
  }
/**
 * @author Mobius
 * @version $Revision: 1.0 $
 */
public final class MatchBerserker extends MatchFighter {
  public static final Skill ATTACK_SKILL = SkillTable.getInstance().getInfo(4032, 6);

  /**
   * Constructor for MatchBerserker.
   *
   * @param actor NpcInstance
   */
  public MatchBerserker(NpcInstance actor) {
    super(actor);
  }

  /**
   * Method onEvtAttacked.
   *
   * @param attacker Creature
   * @param dam int
   */
  @Override
  public void onEvtAttacked(Creature attacker, int dam) {
    super.onEvtAttacked(attacker, dam);

    if (Rnd.chance(10)) {
      addTaskCast(attacker, ATTACK_SKILL);
    }
  }
}
Exemple #4
0
 /**
  * Method doSupportMagic.
  *
  * @param npc NpcInstance
  * @param player Player
  * @param servitor boolean
  */
 public static void doSupportMagic(NpcInstance npc, Player player, boolean servitor) {
   if (player.isCursedWeaponEquipped()) {
     return;
   }
   int lvl = player.getLevel();
   if (servitor && (player.getSummonList().getFirstServitor() == null)) {
     show("default/newbie_nosupport_servitor.htm", player, npc);
     return;
   }
   if (lvl < minSupLvl) {
     show("default/newbie_nosupport_min.htm", player, npc);
     return;
   }
   if (lvl > maxSupLvl) {
     show("default/newbie_nosupport_max.htm", player, npc);
     return;
   }
   List<Creature> target = new ArrayList<>();
   if (servitor) {
     for (Summon summon : player.getSummonList()) {
       target.add(summon);
       for (int[] buff : _summonBuff) {
         if ((lvl >= buff[0]) && (lvl <= buff[1])) {
           npc.broadcastPacket(new MagicSkillUse(npc, summon, buff[2], buff[3], 0, 0));
           npc.callSkill(SkillTable.getInstance().getInfo(buff[2], buff[3]), target, true);
         }
       }
     }
   } else {
     target.add(player);
     if (!player.isMageClass() || (player.getTemplate().getRace() == Race.orc)) {
       for (int[] buff : _warrBuff) {
         if ((lvl >= buff[0]) && (lvl <= buff[1])) {
           npc.broadcastPacket(new MagicSkillUse(npc, player, buff[2], buff[3], 0, 0));
           npc.callSkill(SkillTable.getInstance().getInfo(buff[2], buff[3]), target, true);
         }
       }
     } else {
       for (int[] buff : _mageBuff) {
         if ((lvl >= buff[0]) && (lvl <= buff[1])) {
           npc.broadcastPacket(new MagicSkillUse(npc, player, buff[2], buff[3], 0, 0));
           npc.callSkill(SkillTable.getInstance().getInfo(buff[2], buff[3]), target, true);
         }
       }
     }
   }
 }
  /**
   * Method giveGiantEssences.
   *
   * @param player Player
   * @param onlyCalculateCount boolean
   * @return int
   */
  public int giveGiantEssences(Player player, boolean onlyCalculateCount) {
    List<Integer> enchantedSkills = new FastList<>();
    int count = 0;

    for (Skill skill : player.getAllSkills()) {
      if ((SkillTreeTable.isEnchantable(skill) != 0)
          && (player.getSkillDisplayLevel(skill.getId()) > 99)) {
        int skillLvl = skill.getDisplayLevel();
        int elevel = skillLvl % 100;
        EnchantSkillLearn sl = SkillTreeTable.getSkillEnchant(skill.getId(), skillLvl);

        if (sl != null) {
          if (sl.getMaxLevel() == 15) {
            elevel = Math.min(count15T.length, elevel);
            count += count15T[elevel];
          } else {
            elevel = Math.min(count30T.length, elevel);
            count += count30T[elevel];
          }
        }
      }

      enchantedSkills.add(Integer.valueOf(skill.getId()));
    }

    if (!onlyCalculateCount) {
      if (count > 0) {
        for (int i = 0; i < enchantedSkills.size(); i++) {
          player.removeSkillById(enchantedSkills.get(i));
          player.addSkill(
              SkillTable.getInstance()
                  .getInfo(
                      enchantedSkills.get(i),
                      SkillTable.getInstance().getBaseLevel(enchantedSkills.get(i))),
              true);
        }

        ItemFunctions.addItem(player, ESSENCE_OF_THE_LESSER_GIANTS, count, true);
      }
    }

    return count;
  }
  public void checkAwakenPlayerSkills(Player player) // For check on subclass change and logon
      {
    int classId = player.getActiveClassId();
    boolean delete = false;

    if (Config.ALT_DELETE_AWAKEN_SKILL_FROM_DB) {
      delete = true;
    }

    List<Integer> SkillsCheck = new ArrayList<>();
    List<Integer> SkillsToRemove = new ArrayList<>();
    List<Integer> allSkillsId = SkillAcquireHolder.getInstance().getAllClassSkillId();
    SkillsCheck.addAll(SkillAcquireHolder.getInstance().getAwakenGeneralKeepSkillList());
    SkillsCheck.addAll(SkillAcquireHolder.getInstance().getAwakenClassSkillForCheck(classId));
    SkillsCheck.addAll(SkillAcquireHolder.getInstance().getAllAwakenSkillsByClass(classId));

    if (player.getTransformation()
        == 0) // if the character log on with a transformation, do not remove any skill
    {
      for (Skill skl : player.getAllSkills()) {
        if (!SkillsCheck.contains(skl.getId()) && allSkillsId.contains(skl.getId())) {
          SkillsToRemove.add(skl.getId());
        }
      }
    } else {
      for (Skill skl : player.getAllSkills()) {
        if (!SkillsCheck.contains(skl.getId()) && SkillsCheck.contains(skl.getId())) {
          SkillsToRemove.add(skl.getId());
        }
      }
    }

    player.removeSkills(SkillsToRemove, delete);

    for (int alterSkill : ALTER_SKILLS.get(classId)) {
      int skillLv = SkillTable.getInstance().getBaseLevel(alterSkill);
      Skill newSkillAlter = SkillTable.getInstance().getInfo(alterSkill, skillLv);
      player.addSkill(newSkillAlter, true);
    }

    player.sendSkillList();
  }
Exemple #7
0
 /** Method getProtectionBlessing. */
 public void getProtectionBlessing() {
   Player player = getSelf();
   NpcInstance npc = getNpc();
   if (player.getKarma() > 0) {
     return;
   }
   if ((player.getLevel() > 39) || player.getClassId().isOfLevel(ClassLevel.Second)) {
     show("default/newbie_blessing_no.htm", player, npc);
     return;
   }
   npc.doCast(SkillTable.getInstance().getInfo(5182, 1), player, true);
 }
  /**
   * Method castEffect.
   *
   * @param player Player
   */
  void castEffect(Player player) {
    if (getLevel(player) > 0) {
      Skill skill = SkillTable.getInstance().getInfo(_skillId, getLevel(player));

      if (skill == null) {
        return;
      }

      skill.getEffects(player, player, false, false);
      player.sendPacket(
          new SystemMessage(SystemMessage.THE_LEVEL_S1_SHILENS_BREATH_WILL_BE_ASSESSED)
              .addNumber(getLevel(player)));
      player.updateStats();
    }
  }
  /** Method thinkAttack. */
  @Override
  protected void thinkAttack() {
    final NpcInstance actor = getActor();
    final NpcInstance brother = getBrother();

    if (!brother.isDead() && !actor.isInRange(brother, 300)) {
      actor.altOnMagicUseTimer(getActor(), SkillTable.getInstance().getInfo(6371, 1));
    } else {
      removeInvul(actor);
    }

    if ((_spawnTimer + 40000) < System.currentTimeMillis()) {
      _spawnTimer = System.currentTimeMillis();
      final NpcInstance mob =
          actor
              .getReflection()
              .addSpawnWithoutRespawn(
                  _minions[Rnd.get(_minions.length)], Location.findAroundPosition(actor, 300), 0);
      mob.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, actor.getAggressionTarget(), 1000);
    }

    super.thinkAttack();
  }
  /**
   * Method getRaceSkill.
   *
   * @param player Player
   * @return null
   */
  public Skill getRaceSkill(Player player) {
    int race = player.getRace().ordinal();
    Skill skill = null;

    if (player.getClassId().isOfLevel(ClassLevel.Fourth)) {
      switch (race) {
        case 0:
          skill = SkillTable.getInstance().getInfo(248, 6);
          player.addSkill(skill);
          break;

        case 1:
          skill = SkillTable.getInstance().getInfo(248, 6);
          player.addSkill(skill);
          break;

        case 2:
          skill = SkillTable.getInstance().getInfo(248, 6);
          player.addSkill(skill);
          break;

        case 3:
          skill = SkillTable.getInstance().getInfo(248, 6);
          player.addSkill(skill);
          break;

        case 4:
          skill = SkillTable.getInstance().getInfo(248, 6);
          player.addSkill(skill);
          break;

        case 5:
          skill = SkillTable.getInstance().getInfo(248, 6);
          player.addSkill(skill);
      }
    } else {
      player.sendActionFailed();
    }

    player.updateStats();
    return null;
  }
/**
 * @author Mobius
 * @version $Revision: 1.0 $
 */
public class ResidenceFunction {
  /** Field _log. */
  private static final Logger _log = LoggerFactory.getLogger(ResidenceFunction.class);
  /** Field TELEPORT. (value is 1) */
  public static final int TELEPORT = 1;
  /** Field ITEM_CREATE. (value is 2) */
  public static final int ITEM_CREATE = 2;
  /** Field RESTORE_HP. (value is 3) */
  public static final int RESTORE_HP = 3;
  /** Field RESTORE_MP. (value is 4) */
  public static final int RESTORE_MP = 4;
  /** Field RESTORE_EXP. (value is 5) */
  public static final int RESTORE_EXP = 5;
  /** Field SUPPORT. (value is 6) */
  public static final int SUPPORT = 6;
  /** Field CURTAIN. (value is 7) */
  public static final int CURTAIN = 7;
  /** Field PLATFORM. (value is 8) */
  public static final int PLATFORM = 8;
  /** Field _id. */
  private final int _id;
  /** Field _type. */
  private final int _type;
  /** Field _level. */
  private int _level;
  /** Field _endDate. */
  private final Calendar _endDate;
  /** Field _inDebt. */
  private boolean _inDebt;
  /** Field _active. */
  private boolean _active;
  /** Field _leases. */
  private final Map<Integer, Integer> _leases = new ConcurrentSkipListMap<>();
  /** Field _teleports. */
  private final Map<Integer, TeleportLocation[]> _teleports = new ConcurrentSkipListMap<>();
  /** Field _buylists. */
  private final Map<Integer, int[]> _buylists = new ConcurrentSkipListMap<>();
  /** Field _buffs. */
  private final Map<Integer, Object[][]> _buffs = new ConcurrentSkipListMap<>();

  /**
   * Constructor for ResidenceFunction.
   *
   * @param id int
   * @param type int
   */
  public ResidenceFunction(int id, int type) {
    _id = id;
    _type = type;
    _endDate = Calendar.getInstance();
  }

  /**
   * Method getResidenceId.
   *
   * @return int
   */
  public int getResidenceId() {
    return _id;
  }

  /**
   * Method getType.
   *
   * @return int
   */
  public int getType() {
    return _type;
  }

  /**
   * Method getLevel.
   *
   * @return int
   */
  public int getLevel() {
    return _level;
  }

  /**
   * Method setLvl.
   *
   * @param lvl int
   */
  public void setLvl(int lvl) {
    _level = lvl;
  }

  /**
   * Method getEndTimeInMillis.
   *
   * @return long
   */
  public long getEndTimeInMillis() {
    return _endDate.getTimeInMillis();
  }

  /**
   * Method setEndTimeInMillis.
   *
   * @param time long
   */
  public void setEndTimeInMillis(long time) {
    _endDate.setTimeInMillis(time);
  }

  /**
   * Method setInDebt.
   *
   * @param inDebt boolean
   */
  public void setInDebt(boolean inDebt) {
    _inDebt = inDebt;
  }

  /**
   * Method isInDebt.
   *
   * @return boolean
   */
  public boolean isInDebt() {
    return _inDebt;
  }

  /**
   * Method setActive.
   *
   * @param active boolean
   */
  public void setActive(boolean active) {
    _active = active;
  }

  /**
   * Method isActive.
   *
   * @return boolean
   */
  public boolean isActive() {
    return _active;
  }

  /**
   * Method updateRentTime.
   *
   * @param inDebt boolean
   */
  public void updateRentTime(boolean inDebt) {
    setEndTimeInMillis(System.currentTimeMillis() + 86400000);
    Connection con = null;
    PreparedStatement statement = null;
    try {
      con = DatabaseFactory.getInstance().getConnection();
      statement =
          con.prepareStatement(
              "UPDATE residence_functions SET endTime=?, inDebt=? WHERE type=? AND id=?");
      statement.setInt(1, (int) (getEndTimeInMillis() / 1000));
      statement.setInt(2, inDebt ? 1 : 0);
      statement.setInt(3, getType());
      statement.setInt(4, getResidenceId());
      statement.executeUpdate();
    } catch (Exception e) {
      _log.error("", e);
    } finally {
      DbUtils.closeQuietly(con, statement);
    }
  }

  /**
   * Method getTeleports.
   *
   * @return TeleportLocation[]
   */
  public TeleportLocation[] getTeleports() {
    return getTeleports(_level);
  }

  /**
   * Method getTeleports.
   *
   * @param level int
   * @return TeleportLocation[]
   */
  public TeleportLocation[] getTeleports(int level) {
    return _teleports.get(level);
  }

  /**
   * Method addTeleports.
   *
   * @param level int
   * @param teleports TeleportLocation[]
   */
  public void addTeleports(int level, TeleportLocation[] teleports) {
    _teleports.put(level, teleports);
  }

  /**
   * Method getLease.
   *
   * @return int
   */
  public int getLease() {
    if (_level == 0) {
      return 0;
    }
    return getLease(_level);
  }

  /**
   * Method getLease.
   *
   * @param level int
   * @return int
   */
  public int getLease(int level) {
    return _leases.get(level);
  }

  /**
   * Method addLease.
   *
   * @param level int
   * @param lease int
   */
  public void addLease(int level, int lease) {
    _leases.put(level, lease);
  }

  /**
   * Method getBuylist.
   *
   * @return int[]
   */
  public int[] getBuylist() {
    return getBuylist(_level);
  }

  /**
   * Method getBuylist.
   *
   * @param level int
   * @return int[]
   */
  public int[] getBuylist(int level) {
    return _buylists.get(level);
  }

  /**
   * Method addBuylist.
   *
   * @param level int
   * @param buylist int[]
   */
  public void addBuylist(int level, int[] buylist) {
    _buylists.put(level, buylist);
  }

  /**
   * Method getBuffs.
   *
   * @return Object[][]
   */
  public Object[][] getBuffs() {
    return getBuffs(_level);
  }

  /**
   * Method getBuffs.
   *
   * @param level int
   * @return Object[][]
   */
  public Object[][] getBuffs(int level) {
    return _buffs.get(level);
  }

  /**
   * Method addBuffs.
   *
   * @param level int
   */
  public void addBuffs(int level) {
    _buffs.put(level, buffs_template[level]);
  }

  /**
   * Method getLevels.
   *
   * @return Set<Integer>
   */
  public Set<Integer> getLevels() {
    return _leases.keySet();
  }

  /** Field A. (value is """") */
  public static final String A = "";
  /** Field W. (value is ""W"") */
  public static final String W = "W";
  /** Field M. (value is ""M"") */
  public static final String M = "M";
  /** Field buffs_template. */
  /*
  15374	1	Clan Hall - Horn Melody	For 30 min., P. Atk. + 17%, P. Def. + 15%, M. Atk. + 79%, and M. Def. + 30%.	none	none\0
  15375	1	Clan Hall - Drum Melody	For 30 min., Max MP + 20%, HP Recovery Bonus + 20%, M. Critical Rate + 20, Critical Damage during a standard attack + 20%, P. Atk. + 10%, P. Def. + 20%, Atk. Spd. + 20%, M. Atk. + 20%, M. Def. + 20%, Casting Spd. + 20%, Debuff Resistance + 10%, and P. Def. when receiving a critical attack. Also, Spd. - 15%, and Critical Damage during a standard attack is increased after receiving a certain amount of damage.	none	none\0
  15376	1	Clan Hall - Pipe Organ Melody	For 30 min., Max HP/ MP/ CP + 37%, and HP Recovery Bonus + 20%.	none	none\0
  15377	1	Clan Hall - Guitar Melody	For 30 min., P. Critical Rate + 32%, P. Critical Damage + 35%, and M. Critical Rate + 20. Also, P. Skill MP Consumption - 20%, M. Skill MP Consumption -10%, and the Iss Enchanter's Enchant Skill MP Consumption - 20%.	none	none\0
  15378	1	Clan Hall - Harp Melody	For 30 min., P. Accuracy + 5, P. Evasion/ M. Evasion + 5, and Spd. + 34. Also, Received Critical Damage - 30%.	none	none\0
  15379	1	Clan Hall - Lute Melody	For 30 min., Atk. Spd. + 34%, Casting Spd. + 31%, and has a chance of applying 9% Vampiric Rage effect.	none	none\0

  15374	2	Clan Hall - Horn Melody	For 30 min., P. Atk. + 19%, P. Def. + 15%, M. Atk. + 83%, and M. Def. + 30%.	none	none\0
  15375	2	Clan Hall - Drum Melody	For 30 min., Max MP + 20%, HP Recovery Bonus + 20%, M. Critical Rate + 20, Critical Damage during a standard attack + 20%, P. Atk. + 10%, P. Def. + 20%, Atk. Spd. + 20%, M. Atk. + 20%, M. Def. + 20%, Casting Spd. + 20%, Debuff Resistance + 10%, and P. Def. when receiving a critical attack. Also, Spd. - 10%, and Critical Damage during a standard attack is increased after receiving a certain amount of damage.	none	none\0
  15376	2	Clan Hall - Pipe Organ Melody	For 30 min., Max HP/ MP/ CP + 39%, and HP Recovery Bonus + 20%.	none	none\0
  15377	2	Clan Hall - Guitar Melody	For 30 min., P. Critical Rate + 34%, P. Critical Damage + 35%, and M. Critical Rate + 20. Also, P. Skill MP Consumption - 20%, M. Skill MP Consumption - 10%, and the Iss Enchanter's Enchant Skill MP Consumption - 20%.	none	none\0
  15378	2	Clan Hall - Harp Melody	For 30 min., P. Accuracy + 6, P. Evasion/ M. Evasion + 6, and Spd. + 35. Also, Received Critical Damage - 30%.	none	none\0
  15379	2	Clan Hall - Lute Melody	For 30 min., Atk. Spd. + 35%, Casting Spd. + 32%, and has a chance of applying 9% Vampiric Rage effect.	none	none\0
  15380	1	Clan Hall - Knight's Harmony	For 30 min., P. Atk. + 12%, P. Critical Damage + 35%, P. Critical Rate + 100%, P. Def. + 45%, Shield Defense Rate + 30%, and Shield Defense + 50%.	none	none\0
  15381	1	Clan Hall - Warrior's Harmony	For 30 min., P. Atk. + 35%, P. Critical Damage + 35%, P. Critical Rate + 100%, Atk. Spd. + 8%, M. Atk. + 16%, Casting Spd. + 8%, and Spd. + 8.	none	none\0
  15382	1	Clan Hall - Wizard's Harmony	For 30 min., M. Atk. + 40%, M. Critical Rate + 100%, Casting Spd. + 8%, P. Atk. + 8%, Atk. Spd. + 8%, Spd. + 8, M. Def. + 14%, and MP Recovery Bonus + 20%. Also, M. Skill MP Consumption - 15%, P. Skill MP Consumption - 5%, Skill Cooldown - 20%.	none	none\0
  */
  private static final Object[][][] buffs_template = {
    {
      // level 0 - no buff
    },
    {
      // level 1
      {SkillTable.getInstance().getInfo(4342, 1), A},
      {SkillTable.getInstance().getInfo(4343, 1), A},
      {SkillTable.getInstance().getInfo(4344, 1), A},
      {SkillTable.getInstance().getInfo(4346, 1), A},
      {SkillTable.getInstance().getInfo(4345, 1), W},
    },
    {
      // level 2
      {SkillTable.getInstance().getInfo(4342, 2), A},
      {SkillTable.getInstance().getInfo(4343, 3), A},
      {SkillTable.getInstance().getInfo(4344, 3), A},
      {SkillTable.getInstance().getInfo(4346, 4), A},
      {SkillTable.getInstance().getInfo(4345, 3), W},
    },
    {
      // level 3
      {SkillTable.getInstance().getInfo(4342, 2), A},
      {SkillTable.getInstance().getInfo(4343, 3), A},
      {SkillTable.getInstance().getInfo(4344, 3), A},
      {SkillTable.getInstance().getInfo(4346, 4), A},
      {SkillTable.getInstance().getInfo(4345, 3), W},
    },
    {
      // level 4
      {SkillTable.getInstance().getInfo(4342, 2), A},
      {SkillTable.getInstance().getInfo(4343, 3), A},
      {SkillTable.getInstance().getInfo(4344, 3), A},
      {SkillTable.getInstance().getInfo(4346, 4), A},
      {SkillTable.getInstance().getInfo(4345, 3), W},
      {SkillTable.getInstance().getInfo(4347, 2), A},
      {SkillTable.getInstance().getInfo(4349, 1), A},
      {SkillTable.getInstance().getInfo(4350, 1), W},
      {SkillTable.getInstance().getInfo(4348, 2), A},
    },
    {
      // level 5
      {SkillTable.getInstance().getInfo(4342, 2), A},
      {SkillTable.getInstance().getInfo(4343, 3), A},
      {SkillTable.getInstance().getInfo(4344, 3), A},
      {SkillTable.getInstance().getInfo(4346, 4), A},
      {SkillTable.getInstance().getInfo(4345, 3), W},
      {SkillTable.getInstance().getInfo(4347, 2), A},
      {SkillTable.getInstance().getInfo(4349, 1), A},
      {SkillTable.getInstance().getInfo(4350, 1), W},
      {SkillTable.getInstance().getInfo(4348, 2), A},
      {SkillTable.getInstance().getInfo(4351, 2), M},
      {SkillTable.getInstance().getInfo(4352, 1), A},
      {SkillTable.getInstance().getInfo(4353, 2), W},
      {SkillTable.getInstance().getInfo(4358, 1), W},
      {SkillTable.getInstance().getInfo(4354, 1), W},
    },
    {
      // level 6 - unused
    },
    {
      // level 7
      {SkillTable.getInstance().getInfo(4342, 2), A},
      {SkillTable.getInstance().getInfo(4343, 3), A},
      {SkillTable.getInstance().getInfo(4344, 3), A},
      {SkillTable.getInstance().getInfo(4346, 4), A},
      {SkillTable.getInstance().getInfo(4345, 3), W},
      {SkillTable.getInstance().getInfo(4347, 6), A},
      {SkillTable.getInstance().getInfo(4349, 2), A},
      {SkillTable.getInstance().getInfo(4350, 4), W},
      {SkillTable.getInstance().getInfo(4348, 6), A},
      {SkillTable.getInstance().getInfo(4351, 6), M},
      {SkillTable.getInstance().getInfo(4352, 2), A},
      {SkillTable.getInstance().getInfo(4353, 6), W},
      {SkillTable.getInstance().getInfo(4358, 3), W},
      {SkillTable.getInstance().getInfo(4354, 4), W},
      // GOD
      {SkillTable.getInstance().getInfo(15374, 1), M},
      {SkillTable.getInstance().getInfo(15375, 1), M},
      {SkillTable.getInstance().getInfo(15376, 1), M},
      {SkillTable.getInstance().getInfo(15377, 1), M},
      {SkillTable.getInstance().getInfo(15378, 1), M},
      {SkillTable.getInstance().getInfo(15379, 1), M},
      {SkillTable.getInstance().getInfo(15380, 1), M},
      {SkillTable.getInstance().getInfo(15381, 1), M},
      {SkillTable.getInstance().getInfo(15382, 1), M}
    },
    {
      // level 8
      {SkillTable.getInstance().getInfo(4342, 2), A},
      {SkillTable.getInstance().getInfo(4343, 3), A},
      {SkillTable.getInstance().getInfo(4344, 3), A},
      {SkillTable.getInstance().getInfo(4346, 4), A},
      {SkillTable.getInstance().getInfo(4345, 3), W},
      {SkillTable.getInstance().getInfo(4347, 6), A},
      {SkillTable.getInstance().getInfo(4349, 2), A},
      {SkillTable.getInstance().getInfo(4350, 4), W},
      {SkillTable.getInstance().getInfo(4348, 6), A},
      {SkillTable.getInstance().getInfo(4351, 6), M},
      {SkillTable.getInstance().getInfo(4352, 2), A},
      {SkillTable.getInstance().getInfo(4353, 6), W},
      {SkillTable.getInstance().getInfo(4358, 3), W},
      {SkillTable.getInstance().getInfo(4354, 4), W},
      {SkillTable.getInstance().getInfo(4355, 1), M},
      {SkillTable.getInstance().getInfo(4356, 1), M},
      {SkillTable.getInstance().getInfo(4357, 1), W},
      {SkillTable.getInstance().getInfo(4359, 1), W},
      {SkillTable.getInstance().getInfo(4360, 1), W},
      // GOD
      {SkillTable.getInstance().getInfo(15374, 2), M},
      {SkillTable.getInstance().getInfo(15375, 2), M},
      {SkillTable.getInstance().getInfo(15376, 2), M},
      {SkillTable.getInstance().getInfo(15377, 2), M},
      {SkillTable.getInstance().getInfo(15378, 2), M},
      {SkillTable.getInstance().getInfo(15379, 2), M},
      {SkillTable.getInstance().getInfo(15380, 1), M},
      {SkillTable.getInstance().getInfo(15381, 1), M},
      {SkillTable.getInstance().getInfo(15382, 1), M}
    },
    {
      // Level 9 - unused
    },
    {
      // level 10 - unused
    },
    {
      // level 11
      {SkillTable.getInstance().getInfo(4342, 3), A},
      {SkillTable.getInstance().getInfo(4343, 4), A},
      {SkillTable.getInstance().getInfo(4344, 4), A},
      {SkillTable.getInstance().getInfo(4346, 5), A},
      {SkillTable.getInstance().getInfo(4345, 4), W},
    },
    {
      // level 12
      {SkillTable.getInstance().getInfo(4342, 4), A},
      {SkillTable.getInstance().getInfo(4343, 6), A},
      {SkillTable.getInstance().getInfo(4344, 6), A},
      {SkillTable.getInstance().getInfo(4346, 8), A},
      {SkillTable.getInstance().getInfo(4345, 6), W},
    },
    {
      // level 13
      {SkillTable.getInstance().getInfo(4342, 4), A},
      {SkillTable.getInstance().getInfo(4343, 6), A},
      {SkillTable.getInstance().getInfo(4344, 6), A},
      {SkillTable.getInstance().getInfo(4346, 8), A},
      {SkillTable.getInstance().getInfo(4345, 6), W},
    },
    {
      // level 14
      {SkillTable.getInstance().getInfo(4342, 4), A},
      {SkillTable.getInstance().getInfo(4343, 6), A},
      {SkillTable.getInstance().getInfo(4344, 6), A},
      {SkillTable.getInstance().getInfo(4346, 8), A},
      {SkillTable.getInstance().getInfo(4345, 6), W},
      {SkillTable.getInstance().getInfo(4347, 8), A},
      {SkillTable.getInstance().getInfo(4349, 3), A},
      {SkillTable.getInstance().getInfo(4350, 5), W},
      {SkillTable.getInstance().getInfo(4348, 8), A},
    },
    {
      // level 15
      {SkillTable.getInstance().getInfo(4342, 4), A},
      {SkillTable.getInstance().getInfo(4343, 6), A},
      {SkillTable.getInstance().getInfo(4344, 6), A},
      {SkillTable.getInstance().getInfo(4346, 8), A},
      {SkillTable.getInstance().getInfo(4345, 6), W},
      {SkillTable.getInstance().getInfo(4347, 8), A},
      {SkillTable.getInstance().getInfo(4349, 3), A},
      {SkillTable.getInstance().getInfo(4350, 5), W},
      {SkillTable.getInstance().getInfo(4348, 8), A},
      {SkillTable.getInstance().getInfo(4351, 8), M},
      {SkillTable.getInstance().getInfo(4352, 3), A},
      {SkillTable.getInstance().getInfo(4353, 8), W},
      {SkillTable.getInstance().getInfo(4358, 4), W},
      {SkillTable.getInstance().getInfo(4354, 5), W},
    },
    {
      // level 16 - unused
    },
    {
      // level 17
      {SkillTable.getInstance().getInfo(4342, 4), A},
      {SkillTable.getInstance().getInfo(4343, 6), A},
      {SkillTable.getInstance().getInfo(4344, 6), A},
      {SkillTable.getInstance().getInfo(4346, 8), A},
      {SkillTable.getInstance().getInfo(4345, 6), W},
      {SkillTable.getInstance().getInfo(4347, 12), A},
      {SkillTable.getInstance().getInfo(4349, 4), A},
      {SkillTable.getInstance().getInfo(4350, 8), W},
      {SkillTable.getInstance().getInfo(4348, 12), A},
      {SkillTable.getInstance().getInfo(4351, 12), M},
      {SkillTable.getInstance().getInfo(4352, 4), A},
      {SkillTable.getInstance().getInfo(4353, 12), W},
      {SkillTable.getInstance().getInfo(4358, 6), W},
      {SkillTable.getInstance().getInfo(4354, 8), W},
    },
    {
      // level 18
      {SkillTable.getInstance().getInfo(4342, 4), A},
      {SkillTable.getInstance().getInfo(4343, 6), A},
      {SkillTable.getInstance().getInfo(4344, 6), A},
      {SkillTable.getInstance().getInfo(4346, 8), A},
      {SkillTable.getInstance().getInfo(4345, 6), W},
      {SkillTable.getInstance().getInfo(4347, 12), A},
      {SkillTable.getInstance().getInfo(4349, 4), A},
      {SkillTable.getInstance().getInfo(4350, 8), W},
      {SkillTable.getInstance().getInfo(4348, 12), A},
      {SkillTable.getInstance().getInfo(4351, 12), M},
      {SkillTable.getInstance().getInfo(4352, 4), A},
      {SkillTable.getInstance().getInfo(4353, 12), W},
      {SkillTable.getInstance().getInfo(4358, 6), W},
      {SkillTable.getInstance().getInfo(4354, 8), W},
      {SkillTable.getInstance().getInfo(4355, 4), M},
      {SkillTable.getInstance().getInfo(4356, 4), M},
      {SkillTable.getInstance().getInfo(4357, 3), W},
      {SkillTable.getInstance().getInfo(4359, 4), W},
      {SkillTable.getInstance().getInfo(4360, 4), W},
    },
  };
}
 /** Constructor for StartEvent. */
 public StartEvent() {
   _freeze = SkillTable.getInstance().getInfo(6034, 1);
   _transformationRed = SkillTable.getInstance().getInfo(6035, 1);
   _transformationBlue = SkillTable.getInstance().getInfo(6036, 1);
 }
 /** Method runImpl. */
 @Override
 public void runImpl() {
   Skill fp = SkillTable.getInstance().getInfo(4616, 1);
   fp.getEffects(activeChar, activeChar, false, false);
 }
/**
 * @author Mobius
 * @version $Revision: 1.0 $
 */
public final class AlfredVonHellmann extends SiegeGuardFighter {
  public static final Skill DAMAGE_SKILL = SkillTable.getInstance().getInfo(5000, 1);
  public static final Skill DRAIN_SKILL = SkillTable.getInstance().getInfo(5001, 1);
  private static final Zone ZONE_3 = ReflectionUtils.getZone("lidia_zone3");

  /**
   * Constructor for AlfredVonHellmann.
   *
   * @param actor NpcInstance
   */
  public AlfredVonHellmann(NpcInstance actor) {
    super(actor);
  }

  /** Method onEvtSpawn. */
  @Override
  public void onEvtSpawn() {
    super.onEvtSpawn();
    ZONE_3.setActive(true);
    Functions.npcShout(
        getActor(),
        NpcString
            .HEH_HEH_I_SEE_THAT_THE_FEAST_HAS_BEGAN_BE_WARY_THE_CURSE_OF_THE_HELLMANN_FAMILY_HAS_POISONED_THIS_LAND);
  }

  /**
   * Method onEvtDead.
   *
   * @param killer Creature
   */
  @Override
  public void onEvtDead(Creature killer) {
    final NpcInstance actor = getActor();
    super.onEvtDead(killer);
    ZONE_3.setActive(false);
    Functions.npcShout(actor, NpcString.AARGH_IF_I_DIE_THEN_THE_MAGIC_FORCE_FIELD_OF_BLOOD_WILL);
    final ClanHallSiegeEvent siegeEvent = actor.getEvent(ClanHallSiegeEvent.class);

    if (siegeEvent == null) {
      return;
    }

    final SpawnExObject spawnExObject = siegeEvent.getFirstObject(ClanHallSiegeEvent.BOSS);
    final NpcInstance lidiaNpc = spawnExObject.getFirstSpawned();

    if (lidiaNpc.getCurrentHpRatio() == 1.) {
      lidiaNpc.setCurrentHp(lidiaNpc.getMaxHp() >> 1, true);
    }
  }

  /**
   * Method onEvtAttacked.
   *
   * @param attacker Creature
   * @param damage int
   */
  @Override
  public void onEvtAttacked(Creature attacker, int damage) {
    final NpcInstance actor = getActor();
    super.onEvtAttacked(attacker, damage);

    if ((PositionUtils.calculateDistance(attacker, actor, false) > 300.) && Rnd.chance(0.13)) {
      addTaskCast(attacker, DRAIN_SKILL);
    }

    final Creature target = actor.getAggroList().getMostHated();

    if ((target.equals(attacker)) && Rnd.chance(0.3)) {
      addTaskCast(attacker, DAMAGE_SKILL);
    }
  }
}
  /**
   * 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()));
  }
 /**
  * Method readData.
  *
  * @param rootElement org.dom4j.Element
  * @throws Exception
  */
 @Override
 protected void readData(org.dom4j.Element rootElement) throws Exception {
   for (Iterator<org.dom4j.Element> itemIterator = rootElement.elementIterator();
       itemIterator.hasNext(); ) {
     org.dom4j.Element itemElement = itemIterator.next();
     StatsSet set = new StatsSet();
     set.set("item_id", itemElement.attributeValue("id"));
     set.set("name", itemElement.attributeValue("name"));
     set.set("add_name", itemElement.attributeValue("add_name", StringUtils.EMPTY));
     int slot = 0;
     for (Iterator<org.dom4j.Element> subIterator = itemElement.elementIterator();
         subIterator.hasNext(); ) {
       org.dom4j.Element subElement = subIterator.next();
       String subName = subElement.getName();
       if (subName.equalsIgnoreCase("set")) {
         set.set(subElement.attributeValue("name"), subElement.attributeValue("value"));
       } else if (subName.equalsIgnoreCase("equip")) {
         for (Iterator<org.dom4j.Element> slotIterator = subElement.elementIterator();
             slotIterator.hasNext(); ) {
           org.dom4j.Element slotElement = slotIterator.next();
           Bodypart bodypart = Bodypart.valueOf(slotElement.attributeValue("id"));
           if (bodypart.getReal() != null) {
             slot = bodypart.mask();
           } else {
             slot |= bodypart.mask();
           }
         }
       }
     }
     set.set("bodypart", slot);
     ItemTemplate template = null;
     try {
       if (itemElement.getName().equalsIgnoreCase("weapon")) {
         if (!set.containsKey("class")) {
           if ((slot & ItemTemplate.SLOT_L_HAND) > 0) {
             set.set("class", ItemTemplate.ItemClass.ARMOR);
           } else {
             set.set("class", ItemTemplate.ItemClass.WEAPON);
           }
         }
         template = new WeaponTemplate(set);
       }
     } catch (Exception e) {
       warn("Fail create item: " + set.get("item_id"), e);
       continue;
     }
     for (Iterator<org.dom4j.Element> subIterator = itemElement.elementIterator();
         subIterator.hasNext(); ) {
       org.dom4j.Element subElement = subIterator.next();
       String subName = subElement.getName();
       if (subName.equalsIgnoreCase("for")) {
         parseFor(subElement, template);
       } else if (subName.equalsIgnoreCase("triggers")) {
         parseTriggers(subElement, template);
       } else if (subName.equalsIgnoreCase("skills")) {
         for (Iterator<org.dom4j.Element> nextIterator = subElement.elementIterator();
             nextIterator.hasNext(); ) {
           org.dom4j.Element nextElement = nextIterator.next();
           int id = Integer.parseInt(nextElement.attributeValue("id"));
           int level = Integer.parseInt(nextElement.attributeValue("level"));
           Skill skill = SkillTable.getInstance().getInfo(id, level);
           if (skill != null) {
             template.attachSkill(skill);
           } else {
             info(
                 "Skill not found("
                     + id
                     + ","
                     + level
                     + ") for item:"
                     + set.getObject("item_id")
                     + "; file:"
                     + getCurrentFileName());
           }
         }
       } else if (subName.equalsIgnoreCase("enchant4_skill")) {
         int id = Integer.parseInt(subElement.attributeValue("id"));
         int level = Integer.parseInt(subElement.attributeValue("level"));
         Skill skill = SkillTable.getInstance().getInfo(id, level);
         if (skill != null) {
           template.setEnchant4Skill(skill);
         }
       } else if (subName.equalsIgnoreCase("unequip_skill")) {
         int id = Integer.parseInt(subElement.attributeValue("id"));
         int level = Integer.parseInt(subElement.attributeValue("level"));
         Skill skill = SkillTable.getInstance().getInfo(id, level);
         if (skill != null) {
           template.setUnequipeSkill(skill);
         }
       } else if (subName.equalsIgnoreCase("cond")) {
         Condition condition = parseFirstCond(subElement);
         if (condition != null) {
           int msgId = parseNumber(subElement.attributeValue("msgId")).intValue();
           condition.setSystemMsg(msgId);
           template.setCondition(condition);
         }
       } else if (subName.equalsIgnoreCase("attributes")) {
         int[] attributes = new int[6];
         for (Iterator<org.dom4j.Element> nextIterator = subElement.elementIterator();
             nextIterator.hasNext(); ) {
           org.dom4j.Element nextElement = nextIterator.next();
           Element element;
           if (nextElement.getName().equalsIgnoreCase("attribute")) {
             element = Element.getElementByName(nextElement.attributeValue("element"));
             attributes[element.getId()] = Integer.parseInt(nextElement.attributeValue("value"));
           }
         }
         template.setBaseAtributeElements(attributes);
       } else if (subName.equalsIgnoreCase("enchant_options")) {
         for (Iterator<org.dom4j.Element> nextIterator = subElement.elementIterator();
             nextIterator.hasNext(); ) {
           org.dom4j.Element nextElement = nextIterator.next();
           if (nextElement.getName().equalsIgnoreCase("level")) {
             int val = Integer.parseInt(nextElement.attributeValue("val"));
             int i = 0;
             int[] options = new int[3];
             for (org.dom4j.Element optionElement : nextElement.elements()) {
               OptionDataTemplate optionData =
                   OptionDataHolder.getInstance()
                       .getTemplate(Integer.parseInt(optionElement.attributeValue("id")));
               if (optionData == null) {
                 error(
                     "Not found option_data for id: "
                         + optionElement.attributeValue("id")
                         + "; item_id: "
                         + set.get("item_id"));
                 continue;
               }
               options[i++] = optionData.getId();
             }
             template.addEnchantOptions(val, options);
           }
         }
       }
     }
     getHolder().addItem(template);
   }
 }