package eu.thog.uhcrun.gui;
import eu.thog.uhcrun.game.team.TeamSelector;
import mkremins.fanciful.FancyMessage;
import net.minecraft.server.v1_8_R3.EntityHuman;
import net.minecraft.server.v1_8_R3.TileEntitySign;
import eu.thog.uhcrun.UHCRun;
import eu.thog.uhcrun.game.TeamGame;
import eu.thog.uhcrun.game.team.Team;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.Sign;
import org.bukkit.craftbukkit.v1_8_R3.block.CraftSign;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.UUID;
/**
* This file is a part of the UHCRun Project CodeBase
* Created by Thog
* (C) Copyright Thomas Guillemard 2016
* All rights reserved.
*/
public class GuiSelectTeam extends Gui
{
private static TeamGame game = (TeamGame) UHCRun.getInstance().getAdaptator().getGame();
private static TeamSelector selector = TeamSelector.getInstance();
private Field signField;
private Field isEditable;
private Method openSign;
private Method setEditor;
private Method getHandle;
@Override
public void display(Player player)
{
this.inventory = Bukkit.getServer().createInventory(null, 54, "Sélection d'équipe");
try
{
this.signField = CraftSign.class.getDeclaredField("sign");
this.signField.setAccessible(true);
this.isEditable = TileEntitySign.class.getDeclaredField("isEditable");
this.isEditable.setAccessible(true);
this.getHandle = CraftPlayer.class.getDeclaredMethod("getHandle");
this.openSign = EntityHuman.class.getDeclaredMethod("openSign", TileEntitySign.class);
this.setEditor = TileEntitySign.class.getDeclaredMethod("a", EntityHuman.class);
} catch (NoSuchFieldException | SecurityException | NoSuchMethodException ex)
{
ex.printStackTrace();
}
int last = 10;
for (Team team : game.getTeams())
{
String name = team.getChatColor() + "Equipe " + team.getTeamName() + " [" + team.getPlayersUUID().size() + "/" + game.getPersonsPerTeam() + "]";
ArrayList<String> lores = new ArrayList<>();
if (team.isLocked())
{
lores.add(ChatColor.RED + "L'équipe est fermée !");
lores.add("");
}
for (UUID uuid : team.getPlayersUUID())
{
if (game.getPlugin().getServer().getPlayer(uuid) != null)
{
lores.add(team.getChatColor() + " - " + Bukkit.getPlayer(uuid).getName());
} else
{
team.remove(uuid);
}
}
setSlotData(name, team.getIcon(), last, lores.toArray(new String[lores.size()]), "team_" + team.getChatColor());
if (last == 16)
{
last = 19;
} else
{
last++;
}
}
setSlotData("Sortir de l'équipe", Material.ARROW, 31, null, "leave");
setSlotData("Ouvrir/Fermer l'équipe", Material.BARRIER, 39, null, "openclose");
setSlotData("Changer le nom de l'équipe", Material.BOOK_AND_QUILL, 40, null, "teamname");
setSlotData("Inviter un joueur", Material.FEATHER, 41, null, "invit");
player.openInventory(this.inventory);
}
@Override
public void onClick(final Player player, ItemStack stack, String action)
{
if (action.startsWith("team_"))
{
for (Team team : game.getTeams())
{
if (action.equals("team_" + team.getChatColor()))
{
if (!team.isLocked())
{
if (team.canJoin())
{
if (game.getPlayerTeam(player.getUniqueId()) != null)
{
game.getPlayerTeam(player.getUniqueId()).remove(player.getUniqueId());
}
team.join(player.getUniqueId());
player.sendMessage(game.getTag() + " " + ChatColor.YELLOW + "Vous êtes entré dans l'équipe " + team.getChatColor() + team.getTeamName() + ChatColor.YELLOW + " !");
} else
{
player.sendMessage(game.getTag() + " " + ChatColor.RED + "L'équipe choisie est pleine.");
}
} else
{
player.sendMessage(game.getTag() + " " + ChatColor.RED + "L'équipe choisie est fermée !");
}
break;
}
}
selector.openGui(player, new GuiSelectTeam());
} else if ("teamname".equals(action))
{
if (player.hasPermission("uhcrun.teamname"))
{
if (game.getPlayerTeam(player.getUniqueId()) != null)
{
final Block block = player.getWorld().getBlockAt(0, 250, 150);
block.setTypeIdAndData(Material.SIGN_POST.getId(), (byte) 2, false);
Sign sign = (Sign) block.getState();
sign.setLine(0, game.getPlayerTeam(player.getUniqueId()).getTeamName());
sign.update(true);
Bukkit.getScheduler().scheduleSyncDelayedTask(game.getPlugin(), () -> {
try
{
final Object signTile = signField.get(block.getState());
final Object entityPlayer = getHandle.invoke(player);
Bukkit.getScheduler().scheduleSyncDelayedTask(game.getPlugin(), () -> {
try
{
openSign.invoke(entityPlayer, signTile);
setEditor.invoke(signTile, entityPlayer);
isEditable.set(signTile, true);
} catch (IllegalArgumentException | InvocationTargetException | IllegalAccessException ex)
{
ex.printStackTrace();
}
}, 5L);
} catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException ex)
{
ex.printStackTrace();
}
}, 1L);
} else
{
player.sendMessage(game.getTag() + " " + ChatColor.RED + "Vous devez avoir une équipe pour pouvoir utiliser cette fonction !");
}
} else
{
player.sendMessage(game.getTag() + " " + ChatColor.RED + "Vous n'avez pas les permission d'utiliser cette fonction !");
}
} else if ("openclose".equals(action))
{
if (player.hasPermission("uhcrun.teamlock"))
{
if (game.getPlayerTeam(player.getUniqueId()) != null)
{
if (game.getPlayerTeam(player.getUniqueId()).isLocked())
{
game.getPlayerTeam(player.getUniqueId()).setLocked(false);
player.sendMessage(game.getTag() + " " + ChatColor.GREEN + "Votre équipe est maintenant ouverte !");
} else
{
game.getPlayerTeam(player.getUniqueId()).setLocked(true);
player.sendMessage(game.getTag() + " " + ChatColor.RED + "Votre équipe est maintenant fermée !");
}
} else
{
player.sendMessage(game.getTag() + " " + ChatColor.RED + "Vous devez avoir une équipe pour pouvoir utiliser cette fonction !");
}
} else
{
player.sendMessage(game.getTag() + " " + ChatColor.RED + "Vous n'avez pas les permission d'utiliser cette fonction !");
}
} else if ("invit".equals(action))
{
if (player.hasPermission("uhcrun.teaminvite"))
{
if (game.getPlayerTeam(player.getUniqueId()) != null)
{
player.sendMessage(game.getTag() + " " + ChatColor.YELLOW + "Vous pouvez inviter les joueurs suivants :");
// FIXME: ASK TO FIX NMS ON API
game.getOnlineInGamePlayers().keySet().stream().filter(aInvite -> game.getPlayerTeam(aInvite) == null).filter(aInvite -> Bukkit.getPlayer(aInvite) != null).forEach(aInvite -> new FancyMessage(" - " + Bukkit.getPlayer(aInvite).getName() + " ")
.color(ChatColor.GRAY)
.then("[Inviter]")
.color(ChatColor.GREEN)
.style(ChatColor.BOLD)
.command("/uhc invite " + Bukkit.getPlayer(aInvite).getName())
.send(player));
} else
{
player.sendMessage(game.getTag() + " " + ChatColor.RED + "Vous devez avoir une équipe pour pouvoir utiliser cette fonction !");
}
} else
{
player.sendMessage(game.getTag() + " " + ChatColor.RED + "Vous n'avez pas les permission d'utiliser cette fonction !");
}
} else if ("leave".equals(action))
{
if (game.getPlayerTeam(player.getUniqueId()) != null)
{
game.getPlayerTeam(player.getUniqueId()).remove(player.getUniqueId());
player.sendMessage(game.getTag() + " " + ChatColor.GREEN + "Vous avez quitté l'équipe !");
} else
{
player.sendMessage(game.getTag() + " " + ChatColor.RED + "Vous devez avoir une équipe pour pouvoir utiliser cette fonction !");
}
}
}
@Override
public Inventory getInventory()
{
return this.inventory;
}
}