package me.maker56.survivalgames.user;
import java.util.Iterator;
import me.maker56.survivalgames.SurvivalGames;
import me.maker56.survivalgames.commands.messages.MessageHandler;
import me.maker56.survivalgames.commands.permission.Permission;
import me.maker56.survivalgames.commands.permission.PermissionHandler;
import me.maker56.survivalgames.game.Game;
import me.maker56.survivalgames.game.GameManager;
import me.maker56.survivalgames.game.GameState;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.IllegalPluginAccessException;
import org.bukkit.potion.PotionEffect;
public class UserManager {
private GameManager gm = SurvivalGames.gameManager;
// START SPECTATOR
public void leaveGame(SpectatorUser su) {
Game g = su.getGame();
for(User u : g.getUsers()) {
u.getPlayer().showPlayer(su.getPlayer());
}
g.leaveSpectator(su);
if(g.getScoreboardPhase() != null) {
su.getPlayer().setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
}
setState(su.getPlayer(), su);
}
public void joinGameAsSpectator(Player p, String gamename) {
if(!SurvivalGames.instance.getConfig().getBoolean("Spectating.Enabled")) {
p.sendMessage(MessageHandler.getMessage("spectator-disabled"));
return;
}
if(!PermissionHandler.hasPermission(p, Permission.SPECTATE)) {
p.sendMessage(MessageHandler.getMessage("no-permission"));
return;
}
if(isSpectator(p.getName()) || isPlaying(p.getName())) {
p.sendMessage(MessageHandler.getMessage("join-already-playing"));
return;
}
if(p.getVehicle() != null) {
p.sendMessage(MessageHandler.getMessage("join-vehicle"));
return;
}
Game g = gm.getGame(gamename);
if(g == null) {
p.sendMessage(MessageHandler.getMessage("join-unknown-game").replace("%0%", gamename));
return;
}
int max = SurvivalGames.instance.getConfig().getInt("Spectating.Max-Spectators-Per-Arena", 8);
if(g.getSpecators().size() >= max) {
p.sendMessage(MessageHandler.getMessage("spectator-full").replace("%0%", Integer.valueOf(max).toString()));
return;
}
GameState state = g.getState();
if(state == GameState.VOTING || state == GameState.WAITING || state == GameState.COOLDOWN || state == GameState.RESET) {
p.sendMessage(MessageHandler.getMessage("spectator-game-running"));
return;
}
g.joinSpectator(new SpectatorUser(p, g));
return;
}
// END SPECTATOR
public void joinGame(Player p, String gamename) {
if(!PermissionHandler.hasPermission(p, Permission.JOIN)) {
p.sendMessage(MessageHandler.getMessage("no-permission"));
return;
}
if(isPlaying(p.getName())) {
p.sendMessage(MessageHandler.getMessage("join-already-playing"));
return;
}
if(p.getVehicle() != null) {
p.sendMessage(MessageHandler.getMessage("join-vehicle"));
return;
}
Game g = gm.getGame(gamename);
if(g == null) {
p.sendMessage(MessageHandler.getMessage("join-unknown-game").replace("%0%", gamename));
return;
}
GameState state = g.getState();
if(state != GameState.VOTING && state != GameState.WAITING && state != GameState.COOLDOWN) {
if(SurvivalGames.instance.getConfig().getBoolean("Spectating.Enabled")) {
joinGameAsSpectator(p, gamename);
} else {
p.sendMessage(MessageHandler.getMessage("join-game-running"));
}
return;
}
if(g.getUsers().size() >= g.getMaximumPlayers()) {
User kick = PermissionHandler.canJoin(p, g);
if(kick != null) {
kick.sendMessage(MessageHandler.getMessage("fulljoin-kick"));
leaveGame(kick.getPlayer());
} else {
p.sendMessage(MessageHandler.getMessage("join-game-full"));
return;
}
}
User user = new User(p, g);
g.join(user);
return;
}
public void leaveGame(final Player p) {
if(!isPlaying(p.getName())) {
SpectatorUser su = getSpectator(p.getName());
if(su != null) {
leaveGame(su);
return;
}
p.sendMessage(MessageHandler.getMessage("leave-not-playing"));
return;
}
if(p.getVehicle() != null)
p.getVehicle().setPassenger(null);
if(p.getPassenger() != null) {
p.setPassenger(null);
}
final User user = getUser(p.getName());
user.getStatistics().updateStatistics();
user.clear();
Game game = user.getGame();
for(SpectatorUser su : game.getSpecators()) {
p.showPlayer(su.getPlayer());
}
if(game.getState() == GameState.WAITING || game.getState() == GameState.VOTING || game.getState() == GameState.COOLDOWN)
game.sendMessage(MessageHandler.getMessage("game-leave").replace("%0%", p.getName()).replace("%1%", Integer.valueOf(game.getPlayingUsers() - 1).toString()).replace("%2%", Integer.valueOf(game.getMaximumPlayers()).toString()));
game.leave(user);
if(game.getScoreboardPhase() != null) {
p.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
}
if(p.isDead()) {
Bukkit.getScheduler().scheduleSyncDelayedTask(SurvivalGames.instance, new Runnable() {
public void run() {
setState(p, user);
}
}, 1);
} else {
setState(p, user);
}
}
public void setState(Player p, UserState state) {
p.teleport(state.getLocation());
p.setFallDistance(state.getFallDistance());
p.setGameMode(state.getGameMode());
p.setAllowFlight(state.getAllowFlight());
p.setFlying(state.isFlying());
p.setLevel(state.getLevel());
p.setExp(state.getExp());
p.setFireTicks(state.getFireTicks());
p.setMaxHealth(state.getMaxHealth());
p.setHealth(state.getHealth());
p.setFoodLevel(state.getFoodLevel());
p.setWalkSpeed(state.getWalkSpeed());
p.setFlySpeed(state.getFlySpeed());
for (Iterator<PotionEffect> i = p.getActivePotionEffects().iterator(); i.hasNext();) {
p.removePotionEffect(i.next().getType());
}
p.addPotionEffects(state.getActivePotionEffects());
p.getInventory().setHeldItemSlot(state.getHeldItemSlot());
final String name = p.getName();
final ItemStack[] contents = state.getContents();
final ItemStack[] armorcontents = state.getArmorContents();
try {
Bukkit.getScheduler().scheduleSyncDelayedTask(SurvivalGames.instance, new Runnable() {
public void run() {
Player fp = Bukkit.getPlayer(name);
if(fp != null) {
fp.getInventory().setContents(contents);
fp.getInventory().setArmorContents(armorcontents);
fp.updateInventory();
}
}
}, 2L);
} catch(IllegalPluginAccessException e) {
p.getInventory().setContents(contents);
p.getInventory().setArmorContents(armorcontents);
p.updateInventory();
}
}
public boolean isSpectator(String name) {
return getSpectator(name) != null;
}
public SpectatorUser getSpectator(Player p) {
return getSpectator(p.getName());
}
public SpectatorUser getSpectator(String name) {
for(Game game : gm.getGames()) {
for(SpectatorUser su : game.getSpecators()) {
if(su.getName().equals(name))
return su;
}
}
return null;
}
public boolean isPlaying(String name) {
return getUser(name) != null;
}
public User getUser(Player player) {
return getUser(player.getName());
}
public User getUser(String name) {
for(Game game : gm.getGames()) {
User u = game.getUser(name);
if(u != null)
return u;
}
return null;
}
}