Ejemplo n.º 1
0
  /**
   * Detonate TNT for Blast Mining
   *
   * @param event The PlayerInteractEvent
   * @param player Player detonating the TNT
   * @param plugin mcMMO plugin instance
   */
  public static void detonate(PlayerInteractEvent event, Player player, mcMMO plugin) {
    PlayerProfile PP = Users.getProfile(player);

    if (PP.getSkillLevel(SkillType.MINING) < 125) return;

    Block block = event.getClickedBlock();

    if (block == null || block.getType() != Material.TNT) {
      final byte SNOW = 78;
      final byte AIR = 0;
      final int BLOCKS_AWAY = 100;

      HashSet<Byte> transparent = new HashSet<Byte>();

      transparent.add(SNOW);
      transparent.add(AIR);

      block = player.getTargetBlock(transparent, BLOCKS_AWAY);

      if (block.getType() != Material.TNT) {
        return;
      }
    } else if (block.getType() == Material.TNT) {
      event.setCancelled(
          true); // This is the only way I know to avoid the original TNT to be triggered (in case
      // the player is close to it)
    }

    if (!Misc.blockBreakSimulate(block, player, true)) {
      return;
    }

    final double MAX_DISTANCE_AWAY = 10.0;
    final int TIME_CONVERSION_FACTOR = 1000;

    AbilityType ability = AbilityType.BLAST_MINING;

    /* Check Cooldown */
    if (!Skills.cooldownOver(
        PP.getSkillDATS(ability) * TIME_CONVERSION_FACTOR, ability.getCooldown())) {
      player.sendMessage(
          LocaleLoader.getString("Skills.TooTired")
              + ChatColor.YELLOW
              + " ("
              + Skills.calculateTimeLeft(
                  PP.getSkillDATS(ability) * TIME_CONVERSION_FACTOR, ability.getCooldown())
              + "s)");

      return;
    }

    /* Send message to nearby players */
    for (Player y : player.getWorld().getPlayers()) {
      if (y != player && Misc.isNear(player.getLocation(), y.getLocation(), MAX_DISTANCE_AWAY)) {
        y.sendMessage(ability.getAbilityPlayer(player));
      }
    }

    player.sendMessage(LocaleLoader.getString("Mining.Blast.Boom"));

    /* Create the TNT entity */
    TNTPrimed tnt = player.getWorld().spawn(block.getLocation(), TNTPrimed.class);
    plugin.tntTracker.put(tnt.getEntityId(), player);
    tnt.setFuseTicks(0);

    /* Disable the original one */
    block.setType(Material.AIR);

    PP.setSkillDATS(ability, System.currentTimeMillis()); // Save DATS for Blast Mining
    PP.setAbilityInformed(ability, false);
  }