/**
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package tntrun.arena.handlers;
import java.io.IOException;
import java.util.HashSet;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.Sound;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import tntrun.TNTRun;
import tntrun.arena.Arena;
import tntrun.arena.structure.StructureManager.TeleportDestination;
import tntrun.utils.Bars;
import tntrun.utils.Stats;
import tntrun.utils.TitleMsg;
import tntrun.messages.Messages;
public class PlayerHandler {
private TNTRun plugin;
private Arena arena;
public PlayerHandler(TNTRun plugin, Arena arena) {
this.plugin = plugin;
this.arena = arena;
}
// check if player can join the arena
public boolean checkJoin(Player player) {
if (arena.getStructureManager().getWorld() == null) {
Messages.sendMessage(player, Messages.arenawolrdna);
return false;
}
if (!arena.getStatusManager().isArenaEnabled()) {
Messages.sendMessage(player, Messages.arenadisabled);
return false;
}
if (arena.getStatusManager().isArenaRunning()) {
Messages.sendMessage(player, Messages.arenarunning);
return false;
}
if (arena.getStatusManager().isArenaRegenerating()) {
Messages.sendMessage(player, Messages.arenaregenerating);
return false;
}
if (player.isInsideVehicle()) {
Messages.sendMessage(player, Messages.arenavehicle);
return false;
}
if (arena.getPlayersManager().getPlayersCount() == arena.getStructureManager().getMaxPlayers()) {
Messages.sendMessage(player, Messages.limitreached);
return false;
}
return true;
}
// spawn player on arena
@SuppressWarnings("deprecation")
public void spawnPlayer(final Player player, String msgtoplayer, String msgtoarenaplayers) {
// teleport player to arena
plugin.pdata.storePlayerLocation(player);
player.teleport(arena.getStructureManager().getSpawnPoint());
// set player visible to everyone
for (Player aplayer : Bukkit.getOnlinePlayers()) {
aplayer.showPlayer(player);
}
// change player status
plugin.pdata.storePlayerGameMode(player);
plugin.pdata.storePlayerFlight(player);
player.setFlying(false);
player.setAllowFlight(false);
plugin.pdata.storePlayerLevel(player);
plugin.pdata.storePlayerInventory(player);
plugin.pdata.storePlayerArmor(player);
plugin.pdata.storePlayerPotionEffects(player);
plugin.pdata.storePlayerHunger(player);
// update inventory
player.updateInventory();
//set full countdown
if(!arena.getStatusManager().isArenaStarting()){
arena.getGameHandler().count = arena.getStructureManager().getCountdown();
}
// send message to player
Messages.sendMessage(player, msgtoplayer);
// set player on arena data
arena.getPlayersManager().add(player);
// send message to other players
for (Player oplayer : arena.getPlayersManager().getPlayers()) {
msgtoarenaplayers = msgtoarenaplayers.replace("{PLAYER}", player.getName());
Messages.sendMessage(oplayer, msgtoarenaplayers);
// send title for players
TitleMsg.sendFullTitle(oplayer, TitleMsg.join.replace("{PLAYER}", player.getName()), TitleMsg.subjoin.replace("{PLAYER}", player.getName()), 10, 20, 20, plugin);
}
// start cooldown and add leave item
Bukkit.getScheduler().runTaskLater(plugin, new Runnable(){
public void run(){
String[] ids = plugin.getConfig().getString("items.leave.ID").split(":");
ItemStack item = new ItemStack(Material.getMaterial(Integer.parseInt(ids[0])), 1, (byte) Byte.parseByte(ids[1]));
ItemMeta im = item.getItemMeta();
im.setDisplayName(plugin.getConfig().getString("items.leave.name").replace("&", "§"));
item.setItemMeta(im);
player.getInventory().setItem(8, item);
if(plugin.getConfig().getBoolean("items.vote.use")){
addVoteDiamond(player);
}
if(plugin.getConfig().getBoolean("items.shop.use")){
addShop(player);
}
if(plugin.getConfig().getBoolean("items.info.use")){
addInfo(player);
}
if(plugin.getConfig().getBoolean("items.stats.use")){
addStats(player);
}
if(plugin.getConfig().getBoolean("items.effects.use")){
if(Bukkit.getPluginManager().getPlugin("TNTRun-Effects") != null){
addEffects(player);
}
}
}
}, 5L);
// send message about arena player count
String message = Messages.playerscountinarena;
message = message.replace("{COUNT}", String.valueOf(arena.getPlayersManager().getPlayersCount()));
Messages.sendMessage(player, message);
// modify signs
plugin.signEditor.modifySigns(arena.getArenaName());
// create scoreboard
arena.getGameHandler().createWaitingScoreBoard();
// modify bars
if (!arena.getStatusManager().isArenaStarting()) {
for (Player oplayer : arena.getPlayersManager().getPlayers()) {
Bars.setBar(oplayer, Bars.waiting, arena.getPlayersManager().getPlayersCount(), 0, arena.getPlayersManager().getPlayersCount() * 100 / arena.getStructureManager().getMinPlayers(), plugin);
// play sound
TNTRun.getInstance().sound.NOTE_PLING(oplayer, 5, 999);
}
}
// check for game start
if (!arena.getStatusManager().isArenaStarting() && arena.getPlayersManager().getPlayersCount() == arena.getStructureManager().getMinPlayers()) {
arena.getGameHandler().runArenaCountdown();
}
}
// move to spectators
public void spectatePlayer(final Player player, String msgtoplayer, String msgtoarenaplayers) {
// remove form players
arena.getPlayersManager().remove(player);
// add to lostPlayers
arena.getGameHandler().lostPlayers++;
// remove scoreboard
player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
// teleport to spectators spawn
player.teleport(arena.getStructureManager().getSpectatorSpawn());
// clear inventory
player.getInventory().clear();
player.getInventory().setArmorContents(new ItemStack[4]);
// allow flight
player.setAllowFlight(true);
player.setFlying(true);
// hide from others
for (Player oplayer : Bukkit.getOnlinePlayers()) {
oplayer.hidePlayer(player);
}
// send message to player
Messages.sendMessage(player, msgtoplayer);
// modify signs
plugin.signEditor.modifySigns(arena.getArenaName());
// send message to other players and update bars
for (Player oplayer : arena.getPlayersManager().getAllParticipantsCopy()) {
msgtoarenaplayers = msgtoarenaplayers.replace("{PLAYER}", player.getName());
Messages.sendMessage(oplayer, msgtoarenaplayers);
}
// add to spectators
arena.getPlayersManager().addSpectator(player);
// start cooldown and add leave item
Bukkit.getScheduler().runTaskLater(plugin, new Runnable(){
public void run(){
String[] ids = plugin.getConfig().getString("items.leave.ID").split(":");
@SuppressWarnings("deprecation")
ItemStack item = new ItemStack(Material.getMaterial(Integer.parseInt(ids[0])), 1, (byte) Byte.parseByte(ids[1]));
ItemMeta im = item.getItemMeta();
im.setDisplayName(plugin.getConfig().getString("items.leave.name").replace("&", "§"));
item.setItemMeta(im);
player.getInventory().setItem(8, item);
if(plugin.getConfig().getBoolean("items.info.use")){
addInfo(player);
}
if(plugin.getConfig().getBoolean("items.stats.use")){
addStats(player);
}
}
}, 5L);
}
// remove player from arena
public void leavePlayer(Player player, String msgtoplayer, String msgtoarenaplayers) {
// reset spectators
boolean spectator = arena.getPlayersManager().isSpectator(player.getName());
if (spectator) {
arena.getPlayersManager().removeSpecator(player.getName());
for (Player oplayer : Bukkit.getOnlinePlayers()) {
oplayer.showPlayer(player);
}
player.setAllowFlight(false);
player.setFlying(false);
}
// check if arena is running
if(arena.getStatusManager().isArenaRunning()){
// add to lostPlayers
arena.getGameHandler().lostPlayers++;
Stats.addLoses(player, 1);
}
// remove scoreboard
player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
// remove player from arena and restore his state
removePlayerFromArenaAndRestoreState(player, false);
// should not send messages and other things when player is a spectator
if (spectator) {
return;
}
// send message to player
Messages.sendMessage(player, msgtoplayer);
// modify signs
plugin.signEditor.modifySigns(arena.getArenaName());
// create scoreboard
if(!arena.getStatusManager().isArenaRunning()){
arena.getGameHandler().createWaitingScoreBoard();
}
// send message to other players and update bars
for (Player oplayer : arena.getPlayersManager().getAllParticipantsCopy()) {
msgtoarenaplayers = msgtoarenaplayers.replace("{PLAYER}", player.getName());
Messages.sendMessage(oplayer, msgtoarenaplayers);
if (!arena.getStatusManager().isArenaStarting() && !arena.getStatusManager().isArenaRunning()) {
Bars.setBar(oplayer, Bars.waiting, arena.getPlayersManager().getPlayersCount(), 0, arena.getPlayersManager().getPlayersCount() * 100 / arena.getStructureManager().getMinPlayers(), plugin);
}
}
}
protected void leaveWinner(Player player, String msgtoplayer) {
// remove player from arena and restore his state
removePlayerFromArenaAndRestoreState(player, true);
// remove scoreboard
player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
// send message to player
Messages.sendMessage(player, msgtoplayer);
// modify signs
plugin.signEditor.modifySigns(arena.getArenaName());
}
private void removePlayerFromArenaAndRestoreState(Player player, boolean winner) {
// remove vote
votes.remove(player.getName());
// remove bar
Bars.removeBar(player);
// remove player on arena data
arena.getPlayersManager().remove(player);
// remove all potion effects
for (PotionEffect effect : player.getActivePotionEffects()) {
player.removePotionEffect(effect.getType());
}
// restore player status
plugin.pdata.restorePlayerHunger(player);
plugin.pdata.restorePlayerPotionEffects(player);
plugin.pdata.restorePlayerArmor(player);
plugin.pdata.restorePlayerInventory(player);
plugin.pdata.restorePlayerLevel(player);
// add player damage resistance
player.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 80, 80, true), true);
// restore location ot teleport to lobby
if (arena.getStructureManager().getTeleportDestination() == TeleportDestination.LOBBY && plugin.globallobby.isLobbyLocationWorldAvailable()) {
player.teleport(plugin.globallobby.getLobbyLocation());
plugin.pdata.clearPlayerLocation(player);
} else {
plugin.pdata.restorePlayerLocation(player);
}
// reward player before restoring gamemode if player is winner
if (winner) {
arena.getStructureManager().getRewards().rewardPlayer(player);
// spawn firework
Firework f = player.getWorld().spawn(player.getLocation(), Firework.class);
FireworkMeta fm = f.getFireworkMeta();
fm.addEffect(FireworkEffect.builder()
.withColor(Color.GREEN).withColor(Color.RED)
.withColor(Color.PURPLE)
.with(Type.BALL_LARGE)
.withFlicker()
.build());
fm.setPower(1);
f.setFireworkMeta(fm);
}
plugin.pdata.restorePlayerGameMode(player);
// update inventory
player.updateInventory();
// remove fly
if(player.hasPermission("tntrun.fly.everywhere")){
player.setAllowFlight(true);
player.setFlying(true);
}else{
player.setAllowFlight(false);
player.setFlying(false);
}
plugin.pdata.restorePlayerFlight(player);
if(player.getGameMode() == GameMode.CREATIVE){
player.setAllowFlight(true);
}
// check is in arena 0 players
if (arena.getStatusManager().isArenaRunning() && arena.getPlayersManager().getPlayersCount() == 0) {
arena.getGameHandler().stopArena();
}
}
// vote for game start
private HashSet<String> votes = new HashSet<String>();
public boolean vote(Player player) {
if (!votes.contains(player.getName())) {
votes.add(player.getName());
if (!arena.getStatusManager().isArenaStarting() && arena.getPlayersManager().getPlayersCount() > 1 && votes.size() >= arena.getPlayersManager().getPlayersCount() * arena.getStructureManager().getVotePercent()) {
arena.getGameHandler().runArenaCountdown();
}
return true;
}
return false;
}
public void addInfo(Player p){
String[] ids = plugin.getConfig().getString("items.info.ID").split(":");
@SuppressWarnings("deprecation")
ItemStack item = new ItemStack(Material.getMaterial(Integer.parseInt(ids[0])), 1, (byte) Byte.parseByte(ids[1]));
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(plugin.getConfig().getString("items.info.name").replace("&", "§"));
item.setItemMeta(meta);
p.getInventory().addItem(item);
}
public void addVoteDiamond(Player p){
String[] ids = plugin.getConfig().getString("items.vote.ID").split(":");
@SuppressWarnings("deprecation")
ItemStack item = new ItemStack(Material.getMaterial(Integer.parseInt(ids[0])), 1, (byte) Byte.parseByte(ids[1]));
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(plugin.getConfig().getString("items.vote.name").replace("&", "§"));
item.setItemMeta(meta);
p.getInventory().addItem(item);
}
public void addShop(Player p){
String[] ids = plugin.getConfig().getString("items.shop.ID").split(":");
@SuppressWarnings("deprecation")
ItemStack item = new ItemStack(Material.getMaterial(Integer.parseInt(ids[0])), 1, (byte) Byte.parseByte(ids[1]));
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(plugin.getConfig().getString("items.shop.name").replace("&", "§"));
item.setItemMeta(meta);
p.getInventory().addItem(item);
}
public void addStats(Player p){
String[] ids = plugin.getConfig().getString("items.stats.ID").split(":");
@SuppressWarnings("deprecation")
ItemStack item = new ItemStack(Material.getMaterial(Integer.parseInt(ids[0])), 1, (byte) Byte.parseByte(ids[1]));
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(plugin.getConfig().getString("items.stats.name").replace("&", "§"));
item.setItemMeta(meta);
p.getInventory().addItem(item);
}
public void addEffects(Player p){
String[] ids = plugin.getConfig().getString("items.effects.ID").split(":");
@SuppressWarnings("deprecation")
ItemStack item = new ItemStack(Material.getMaterial(Integer.parseInt(ids[0])), 1, (byte) Byte.parseByte(ids[1]));
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(plugin.getConfig().getString("items.effects.name").replace("&", "§"));
item.setItemMeta(meta);
p.getInventory().addItem(item);
}
}