public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
   Gamer gamer = pm.getGamer(sender.getName());
   if (!gamer.isAlive()) {
     if (args.length > 0) {
       if (Bukkit.getPlayer(args[0]) != null) {
         gamer.getPlayer().eject();
         gamer
             .getPlayer()
             .teleport(sender.getServer().getPlayer(args[0]).getLocation().add(0, 0.1, 0));
         return true;
       } else if (args[0].equalsIgnoreCase(cm.getCommandGotoNameOfFeast())) {
         Location feastLoc = LibsFeastManager.getFeastManager().getFeastLocation();
         if (feastLoc.getBlockY() > 0) {
           gamer.getPlayer().eject();
           gamer
               .getPlayer()
               .teleport(
                   feastLoc
                       .getWorld()
                       .getHighestBlockAt(feastLoc)
                       .getLocation()
                       .clone()
                       .add(0.5, 1, 0.5));
         } else sender.sendMessage(cm.getCommandGotoFeastFailed());
         return true;
       } else sender.sendMessage(cm.getCommandGotoPlayerDoesntExist());
     } else sender.sendMessage(cm.getCommandGotoNotEnoughArgs());
   } else sender.sendMessage(cm.getCommandGotoNotSpectator());
   return true;
 }
 private String formatDeathMessage(String deathMessage, Player p) {
   String playerKit = cm.getKillMessageNoKit();
   if (kits.getKitByPlayer(p) != null) playerKit = kits.getKitByPlayer(p).getName();
   String killMessage = cm.getKillMessageFormatPlayerKit();
   if (killMessage.contains("%Player%") || killMessage.contains("%Kit%")) {
     playerKit = killMessage.replace("%Player%", p.getName()).replace("%Kit%", playerKit);
   } else {
     playerKit = String.format(killMessage, p.getName(), playerKit);
   }
   return deathMessage.replace(p.getName(), playerKit);
 }
 public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
   if (args.length == 0) sender.sendMessage(tm.getCommandMessageNoArgs());
   else if (args.length > 1) {
     Player player = Bukkit.getPlayer(args[0]);
     if (player == null) {
       sender.sendMessage(tm.getCommandMessageNoReceiver());
       return true;
     }
     chat.sendMessage(sender, player, StringUtils.join(args, " ").substring(args[0].length() + 1));
   } else sender.sendMessage(tm.getCommandMessagePlayerNoArgs());
   return true;
 }
 public void onDisable() {
   for (Player p : Bukkit.getOnlinePlayers()) {
     p.kickPlayer(translationsConfig.getKickGameShutdownUnexpected());
     PlayerQuitEvent event = new PlayerQuitEvent(p, "He came, he saw, he conquered");
     playerListener.onQuit(event);
   }
   HungergamesApi.getMySqlManager().getPlayerJoinThread().mySqlDisconnect();
   HungergamesApi.getMySqlManager().getPlayerJoinThread().stop();
 }
 public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
   Gamer gamer = pm.getGamer(sender.getName());
   if (!gamer.isAlive()) {
     pm.sendToSpawn(gamer);
     return true;
   } else {
     ((Player) sender).setCompassTarget(HungergamesApi.getHungergames().world.getSpawnLocation());
     gamer.getPlayer().sendMessage(cm.getCommandSpawnPointingToSpawn());
   }
   return true;
 }
 public String returnTime(Integer i) {
   i = Math.abs(i);
   int remainder = i % 3600, minutes = remainder / 60, seconds = remainder % 60;
   if (seconds == 0 && minutes == 0) return translationsConfig.getTimeFormatNoTime();
   if (minutes == 0) {
     if (seconds == 1) return String.format(translationsConfig.getTimeFormatSecond(), seconds);
     return String.format(translationsConfig.getTimeFormatSeconds(), seconds);
   }
   if (seconds == 0) {
     if (minutes == 1) return String.format(translationsConfig.getTimeFormatMinute(), minutes);
     return String.format(translationsConfig.getTimeFormatMinutes(), minutes);
   }
   if (seconds == 1) {
     if (minutes == 1)
       return String.format(translationsConfig.getTimeFormatSecondAndMinute(), minutes, seconds);
     return String.format(translationsConfig.getTimeFormatSecondAndMinutes(), minutes, seconds);
   }
   if (minutes == 1) {
     return String.format(translationsConfig.getTimeFormatSecondsAndMinute(), minutes, seconds);
   }
   return String.format(translationsConfig.getTimeFormatSecondsAndMinutes(), minutes, seconds);
 }
 public void checkWinner() {
   if (doSeconds) {
     List<Gamer> aliveGamers = pm.getAliveGamers();
     if (aliveGamers.size() == 1) {
       doSeconds = false;
       final Gamer winner = aliveGamers.get(0);
       Bukkit.getPluginManager().callEvent(new PlayerWinEvent(winner));
       int reward = getPrize(1);
       if (reward > 0) winner.addBalance(reward);
       winner.getPlayer().setAllowFlight(true);
       Bukkit.getScheduler()
           .scheduleSyncRepeatingTask(
               this,
               new Runnable() {
                 public void run() {
                   Bukkit.broadcastMessage(
                       String.format(
                           translationsConfig.getBroadcastWinnerWon(), winner.getName()));
                 }
               },
               0,
               mainConfig.getWonBroadcastsDelay() * 20);
       Bukkit.getScheduler()
           .scheduleSyncDelayedTask(
               this,
               new Runnable() {
                 public void run() {
                   String kick =
                       String.format(translationsConfig.getKickMessageWon(), winner.getName());
                   shutdown(kick);
                 }
               },
               mainConfig.getGameShutdownDelay() * 20);
     } else if (aliveGamers.size() == 0) {
       doSeconds = false;
       shutdown(translationsConfig.getKickNobodyWonMessage());
     }
   }
 }
 public void manageDeath(PlayerKilledEvent event) {
   Gamer killed = event.getKilled();
   final Player p = killed.getPlayer();
   p.setHealth(20);
   if (event.isCancelled()) return;
   for (HumanEntity human : p.getInventory().getViewers()) human.closeInventory();
   p.leaveVehicle();
   p.eject();
   p.setLevel(0);
   p.setExp(0F);
   if (event.getDeathMessage().equals(ChatColor.stripColor(event.getDeathMessage())))
     event.setDeathMessage(ChatColor.DARK_RED + event.getDeathMessage());
   event.setDeathMessage(
       this.formatDeathMessage(
           event.getDeathMessage().replace("%Remaining%", "" + (getAliveGamers().size() - 1)), p));
   if (event.getKillerPlayer() != null) {
     event.getKillerPlayer().addKill();
     event.setDeathMessage(
         this.formatDeathMessage(event.getDeathMessage(), event.getKillerPlayer().getPlayer()));
   }
   Bukkit.broadcastMessage(event.getDeathMessage());
   int reward = hg.getPrize(getAliveGamers().size());
   if (reward > 0) killed.addBalance(reward);
   hg.cannon();
   killed.clearInventory();
   World world = p.getWorld();
   for (ItemStack item : event.getDrops()) {
     if (item == null
         || item.getType() == Material.AIR
         || item.containsEnchantment(EnchantmentManager.UNLOOTABLE)) continue;
     else if (item.hasItemMeta())
       world
           .dropItemNaturally(event.getDropsLocation(), item.clone())
           .getItemStack()
           .setItemMeta(item.getItemMeta());
     else world.dropItemNaturally(event.getDropsLocation(), item);
   }
   setSpectator(killed);
   ScoreboardManager.makeScore(
       "Main", DisplaySlot.SIDEBAR, cm.getScoreboardPlayersLength(), getAliveGamers().size());
   hg.checkWinner();
   p.setVelocity(new Vector());
   for (PotionEffect effect : p.getActivePotionEffects()) p.removePotionEffect(effect.getType());
   p.teleport(p.getWorld().getHighestBlockAt(p.getLocation()).getLocation().clone().add(0, 10, 0));
   p.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 40, 9), true);
   p.sendBlockChange(p.getLocation(), Material.PORTAL.getId(), (byte) 0);
   p.sendBlockChange(p.getLocation(), Material.AIR.getId(), (byte) 0);
   for (Entity entity : p.getWorld().getEntities()) {
     if (entity instanceof Tameable
         && ((Tameable) entity).isTamed()
         && ((Tameable) entity).getOwner().getName().equals(p.getName())) {
       if (entity instanceof Wolf) ((Wolf) entity).setSitting(true);
       else if (entity instanceof Ocelot) ((Ocelot) entity).setSitting(true);
       else entity.remove();
     }
     if (entity instanceof Creature && ((Creature) entity).getTarget() == p)
       ((Creature) entity).setTarget(null);
   }
   if (HungergamesApi.getConfigManager().getMainConfig().isKickOnDeath()
       && !p.hasPermission("hungergames.spectate"))
     p.kickPlayer(String.format(cm.getKickDeathMessage(), event.getDeathMessage()));
   HungergamesApi.getAbilityManager().unregisterPlayer(p);
   HungergamesApi.getInventoryManager().updateSpectatorHeads();
 }
  public void startGame() {
    currentTime = 0;
    for (Kit kit : HungergamesApi.getKitManager().getKits()) {
      final int amount = kit.getPlayerSize();
      if (amount <= 0) continue;
      metrics
          .getKitsUsed()
          .addPlotter(
              new Metrics.Plotter(kit.getName()) {

                @Override
                public int getValue() {
                  return amount;
                }
              });
    }
    ScoreboardManager.hideScore(
        "Main", DisplaySlot.SIDEBAR, translationsConfig.getScoreBoardGameStartingIn());
    ScoreboardManager.makeScore("Main", DisplaySlot.PLAYER_LIST, "", 0);
    if (mainConfig.getTimeForInvincibility() > 0) {
      ScoreboardManager.makeScore(
          "Main",
          DisplaySlot.SIDEBAR,
          translationsConfig.getScoreboardInvincibleRemaining(),
          mainConfig.getTimeForInvincibility());
    } else {
      Bukkit.getPluginManager().callEvent(new InvincibilityWearOffEvent());
    }
    Bukkit.broadcastMessage(translationsConfig.getBroadcastGameStartedMessage());
    if (mainConfig.getTimeForInvincibility() > 0)
      Bukkit.broadcastMessage(
          String.format(
              translationsConfig.getBroadcastInvincibiltyWearsOffIn(),
              returnTime(mainConfig.getTimeForInvincibility() - currentTime)));
    for (Gamer gamer : pm.getGamers()) {
      if (mainConfig.isKitSelectorEnabled())
        gamer
            .getPlayer()
            .getInventory()
            .remove(HungergamesApi.getInventoryManager().getKitSelector());
      gamer.seeInvis(false);
      gamer.setAlive(true);
      if (mainConfig.isTeleportToSpawnLocationPregame()
          && mainConfig.isPreventMovingFromSpawnUsingPotions()) {
        gamer.getPlayer().removePotionEffect(PotionEffectType.SLOW);
        gamer.getPlayer().removePotionEffect(PotionEffectType.JUMP);
      }
      pm.sendToSpawn(gamer);
    }
    world.setGameRuleValue("doDaylightCycle", "true");
    world.setTime(mainConfig.getTimeOfDay());
    world.playSound(world.getSpawnLocation(), Sound.AMBIENCE_THUNDER, 1, 0.8F);
    Bukkit.getScheduler()
        .scheduleSyncDelayedTask(
            this,
            new Runnable() {
              public void run() {
                for (Gamer gamer : pm.getAliveGamers())
                  gamer.getPlayer().getInventory().addItem(new ItemStack(Material.COMPASS));
                for (me.libraryaddict.Hungergames.Types.Kit kit :
                    HungergamesApi.getKitManager().getKits()) kit.giveKit();
                HungergamesApi.getAbilityManager().registerAbilityListeners();
                Bukkit.getPluginManager().callEvent(new GameStartEvent());
                for (Location l : entitysToSpawn.keySet())
                  l.getWorld().spawnEntity(l, entitysToSpawn.get(l));
                entitysToSpawn.clear();
              }
            });
    checkWinner();
    HungergamesApi.getInventoryManager().updateSpectatorHeads();
    ScoreboardManager.doStage();
  }
 private void onSecond() {
   currentTime++;
   if (currentTime < 0) {
     world.setTime(0);
     ScoreboardManager.makeScore(
         "Main",
         DisplaySlot.SIDEBAR,
         translationsConfig.getScoreBoardGameStartingIn(),
         -currentTime);
     if (mainConfig.isTeleportToSpawnLocationPregame()
         && -currentTime == mainConfig.getSecondsToTeleportPlayerToSpawn()) {
       for (Gamer gamer : HungergamesApi.getPlayerManager().getGamers()) {
         HungergamesApi.getPlayerManager().sendToSpawn(gamer);
         if (mainConfig.isPreventMovingFromSpawnUsingPotions()) {
           for (Player player : Bukkit.getOnlinePlayers()) {
             player.addPotionEffect(
                 new PotionEffect(PotionEffectType.JUMP, Integer.MAX_VALUE, 200), true);
             player.addPotionEffect(
                 new PotionEffect(PotionEffectType.SLOW, Integer.MAX_VALUE, 200), true);
           }
         }
       }
     }
     if (mainConfig.isGameStarting(currentTime))
       Bukkit.broadcastMessage(
           String.format(
               translationsConfig.getBroadcastGameStartingIn(), returnTime(currentTime)));
   } else if (currentTime == 0) {
     if (pm.getGamers().size() < mainConfig.getMinPlayersForGameStart()) {
       currentTime = -90;
       ScoreboardManager.makeScore(
           "Main",
           DisplaySlot.SIDEBAR,
           translationsConfig.getScoreBoardGameStartingIn(),
           -currentTime);
       Bukkit.broadcastMessage(translationsConfig.getBroadcastNotEnoughPlayers());
     } else {
       startGame();
       return;
     }
   } else if (mainConfig.getAmountBorderClosesInPerSecond() > 0
       && currentTime > mainConfig.getBorderStartsClosingIn()) {
     double borderSize =
         mainConfig.getBorderSize() - mainConfig.getAmountBorderClosesInPerSecond();
     if (borderSize < 0) borderSize = 0;
     mainConfig.setBorderSize(borderSize);
     ScoreboardManager.makeScore(
         "Main",
         DisplaySlot.SIDEBAR,
         translationsConfig.getScoreboardBorderSize(),
         (int) mainConfig.getBorderSize());
   }
   for (Gamer gamer : pm.getGamers()) {
     this.doBorder(gamer);
   }
   if (mainConfig.getTimeForInvincibility() > 0
       && currentTime <= mainConfig.getTimeForInvincibility()
       && currentTime >= 0) {
     ScoreboardManager.makeScore(
         "Main",
         DisplaySlot.SIDEBAR,
         translationsConfig.getScoreboardInvincibleRemaining(),
         mainConfig.getTimeForInvincibility() - currentTime);
     if (currentTime == mainConfig.getTimeForInvincibility()) {
       Bukkit.broadcastMessage(translationsConfig.getBroadcastInvincibilityWornOff());
       ScoreboardManager.hideScore(
           "Main", DisplaySlot.SIDEBAR, translationsConfig.getScoreboardInvincibleRemaining());
       Bukkit.getPluginManager().callEvent(new InvincibilityWearOffEvent());
     } else if (mainConfig.advertiseInvincibility(currentTime)) {
       Bukkit.broadcastMessage(
           String.format(
               translationsConfig.getBroadcastInvincibiltyWearsOffIn(),
               returnTime(mainConfig.getTimeForInvincibility() - currentTime)));
     }
   }
   ScoreboardManager.doStage();
 }
 private void doBorder(Gamer gamer) {
   Player p = gamer.getPlayer();
   Location pLoc = p.getLocation().clone();
   Location sLoc = world.getSpawnLocation().clone();
   double border = mainConfig.getBorderSize();
   if (mainConfig.isRoundedBorder()) {
     sLoc.setY(pLoc.getY());
     double fromSpawn = pLoc.distance(sLoc);
     if (fromSpawn >= border - 20) {
       // Warn
       p.sendMessage(translationsConfig.getMessagePlayerApproachingBorder());
       if (fromSpawn >= border) {
         // Punish
         if (gamer.isAlive()) {
           // Damage and potentially kill.
           double dmg = HungergamesApi.getConfigManager().getMainConfig().getDamageBorderDeals();
           if (p.getHealth() - dmg > 0) {
             p.damage(0);
             p.setHealth(p.getHealth() - dmg);
           } else {
             pm.killPlayer(
                 gamer,
                 null,
                 pLoc,
                 gamer.getInventory(),
                 String.format(
                     translationsConfig.getKillMessageKilledByBorder(), gamer.getName()));
           }
         } else if (border > 10) {
           // Hmm. Preferably I tp them back inside.
           // May as well just tp to spawn. No harm done.
           pm.sendToSpawn(gamer);
         }
       }
     }
   } else {
     Location tpTo = pLoc.clone();
     int xDist = pLoc.getBlockX() - sLoc.getBlockX();
     if (Math.abs(xDist) > border - 20) {
       if (xDist > 0) {
         tpTo.setX(border - 2 + sLoc.getBlockX());
       } else {
         tpTo.setX(border + 2 + sLoc.getBlockX());
       }
     }
     int zDist = pLoc.getBlockZ() - sLoc.getBlockZ();
     if (Math.abs(zDist) > border - 20) {
       if (zDist > 0) {
         tpTo.setZ(border - 2 + sLoc.getBlockZ());
       } else {
         tpTo.setZ(border + 2 + sLoc.getBlockZ());
       }
     }
     if (!pLoc.equals(tpTo)) p.sendMessage(translationsConfig.getMessagePlayerApproachingBorder());
     if (tpTo.getBlockX() != pLoc.getBlockX() || tpTo.getBlockZ() != pLoc.getBlockZ()) {
       if (gamer.isAlive()) {
         // Damage and potentially kill.
         double dmg = HungergamesApi.getConfigManager().getMainConfig().getDamageBorderDeals();
         if (p.getHealth() - dmg > 0) {
           p.damage(0);
           p.setHealth(p.getHealth() - dmg);
         } else {
           pm.killPlayer(
               gamer,
               null,
               pLoc,
               gamer.getInventory(),
               String.format(translationsConfig.getKillMessageKilledByBorder(), gamer.getName()));
         }
       } else if (border > 10) {
         gamer.getPlayer().teleport(tpTo);
       }
     }
   }
 }
 private void onSecond() {
   currentTime++;
   if (currentTime < 0) {
     world.setTime(0);
     ScoreboardManager.makeScore(
         "Main",
         DisplaySlot.SIDEBAR,
         translationsConfig.getScoreBoardGameStartingIn(),
         -currentTime);
     if (mainConfig.isGameStarting(currentTime))
       Bukkit.broadcastMessage(
           String.format(
               translationsConfig.getBroadcastGameStartingIn(), returnTime(currentTime)));
   } else if (currentTime == 0) {
     if (pm.getGamers().size() < mainConfig.getMinPlayersForGameStart()) {
       currentTime = -90;
       ScoreboardManager.makeScore(
           "Main",
           DisplaySlot.SIDEBAR,
           translationsConfig.getScoreBoardGameStartingIn(),
           -currentTime);
       Bukkit.broadcastMessage(translationsConfig.getBroadcastNotEnoughPlayers());
     } else {
       startGame();
       return;
     }
   } else if (mainConfig.getAmountBorderClosesInPerSecond() > 0
       && currentTime > mainConfig.getBorderStartsClosingIn()) {
     mainConfig.setBorderSize(
         mainConfig.getBorderSize() - mainConfig.getAmountBorderClosesInPerSecond());
     ScoreboardManager.makeScore(
         "Main",
         DisplaySlot.SIDEBAR,
         translationsConfig.getScoreboardBorderSize(),
         (int) mainConfig.getBorderSize());
   }
   for (Gamer gamer : pm.getGamers()) {
     this.doBorder(gamer);
   }
   if (mainConfig.getTimeForInvincibility() > 0
       && currentTime <= mainConfig.getTimeForInvincibility()
       && currentTime >= 0) {
     ScoreboardManager.makeScore(
         "Main",
         DisplaySlot.SIDEBAR,
         translationsConfig.getScoreboardInvincibleRemaining(),
         mainConfig.getTimeForInvincibility() - currentTime);
     if (currentTime == mainConfig.getTimeForInvincibility()) {
       Bukkit.broadcastMessage(translationsConfig.getBroadcastInvincibilityWornOff());
       ScoreboardManager.hideScore(
           "Main", DisplaySlot.SIDEBAR, translationsConfig.getScoreboardInvincibleRemaining());
       Bukkit.getPluginManager().callEvent(new InvincibilityWearOffEvent());
     } else if (mainConfig.advertiseInvincibility(currentTime)) {
       Bukkit.broadcastMessage(
           String.format(
               translationsConfig.getBroadcastInvincibiltyWearsOffIn(),
               returnTime(mainConfig.getTimeForInvincibility() - currentTime)));
     }
   }
   ScoreboardManager.doStage();
 }
 private void doBorder(Gamer gamer) {
   Player p = gamer.getPlayer();
   Location loc = p.getLocation().clone();
   Location sLoc = world.getSpawnLocation().clone();
   double border = mainConfig.getBorderSize();
   if (mainConfig.isRoundedBorder()) {
     sLoc.setY(loc.getY());
     double fromBorder = loc.distance(sLoc) - border;
     if (fromBorder - 20 > 0) {
       // Warn
       p.sendMessage(translationsConfig.getMessagePlayerApproachingBorder());
       if (fromBorder > 0) {
         // Punish
         if (gamer.isAlive()) {
           // Damage and potentially kill.
           if (p.getHealth() - 2 > 0) {
             p.damage(0);
             p.setHealth(p.getHealth() - 2);
           } else {
             pm.killPlayer(
                 gamer,
                 null,
                 loc,
                 gamer.getInventory(),
                 String.format(
                     translationsConfig.getKillMessageKilledByBorder(), gamer.getName()));
           }
         } else if (border > 10) {
           // Hmm. Preferably I tp them back inside.
           // May as well just tp to spawn. No harm done.
           pm.sendToSpawn(gamer);
         }
       }
     }
   } else {
     Location tpTo = loc.clone();
     int fromSpawn = loc.getBlockX() - sLoc.getBlockX();
     if (fromSpawn > border - 20) {
       tpTo.setX(((border - 2) + sLoc.getBlockX()));
     }
     if (fromSpawn < -(border - 20)) {
       tpTo.setX((-(border - 2) + sLoc.getBlockX()));
     }
     boolean hurt = Math.abs(fromSpawn) >= border;
     fromSpawn = loc.getBlockZ() - sLoc.getBlockZ();
     if (fromSpawn > (border - 20)) {
       tpTo.setZ(((border - 2) + sLoc.getBlockZ()));
     }
     if (fromSpawn < -(border - 20)) {
       tpTo.setZ((-(border - 2) + sLoc.getBlockZ()));
     }
     if (!hurt) hurt = Math.abs(fromSpawn) >= border;
     if (!loc.equals(tpTo)) p.sendMessage(translationsConfig.getMessagePlayerApproachingBorder());
     if (hurt) {
       if (gamer.isAlive()) {
         // Damage and potentially kill.
         if (p.getHealth() - 2 > 0) {
           p.damage(0);
           p.setHealth(p.getHealth() - 2);
         } else {
           pm.killPlayer(
               gamer,
               null,
               loc,
               gamer.getInventory(),
               String.format(translationsConfig.getKillMessageKilledByBorder(), gamer.getName()));
         }
       } else if (border > 10) {
         gamer.getPlayer().teleport(tpTo);
       }
     }
   }
 }