LoupGarou/src/main/java/fr/leomelki/loupgarou/roles/RPirate.java
2020-09-07 23:40:57 +02:00

216 lines
7.9 KiB
Java

package fr.leomelki.loupgarou.roles;
import fr.leomelki.com.comphenix.packetwrapper.WrapperPlayServerHeldItemSlot;
import fr.leomelki.loupgarou.MainLg;
import fr.leomelki.loupgarou.classes.LGGame;
import fr.leomelki.loupgarou.classes.LGPlayer;
import fr.leomelki.loupgarou.events.LGPlayerKilledEvent;
import fr.leomelki.loupgarou.events.LGPlayerKilledEvent.Reason;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftInventoryCustom;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.Arrays;
import java.util.Collections;
public class RPirate extends Role {
static final ItemStack[] items = new ItemStack[9];
static {
items[3] = new ItemStack(Material.IRON_NUGGET);
ItemMeta meta = items[3].getItemMeta();
meta.setDisplayName("§7§lNe rien faire");
meta.setLore(Collections.singletonList("§8Passez votre tour"));
items[3].setItemMeta(meta);
items[5] = new ItemStack(Material.ROTTEN_FLESH);
meta = items[5].getItemMeta();
meta.setDisplayName("§6§lPrendre un otage");
meta.setLore(Arrays.asList(
"§8Tu peux prendre un joueur en otage",
"§8Si tu meurs du vote, il mourra à ta place."));
items[5].setItemMeta(meta);
}
Runnable callback;
boolean inMenu = false;
public RPirate(LGGame game) {
super(game);
}
@Override
public String getName() {
return "§a§lPirate";
}
@Override
public String getFriendlyName() {
return "du " + getName();
}
@Override
public String getShortDescription() {
return "Tu gagnes avec le §a§lVillage";
}
@Override
public String getDescription() {
return "Tu gagnes avec le §a§lVillage§f. Une fois dans la partie, tu peux prendre en otage un autre joueur. Si tu es désigné à l'issue du vote de jour, ton §lotage§f mourra à ta place et ton rôle sera dévoilé au reste du village";
}
@Override
public String getTask() {
return "Veux-tu prendre quelqu'un en otage ?";
}
@Override
public String getBroadcastedTask() {
return "Le " + getName() + "§9 aiguise son crochet...";
}
@Override
public RoleType getType() {
return RoleType.VILLAGER;
}
@Override
public RoleWinType getWinType() {
return RoleWinType.VILLAGE;
}
@Override
public int getTimeout() {
return 15;
}
public void openInventory(Player player) {
inMenu = true;
Inventory inventory = Bukkit.createInventory(null, 9, "§7Veux-tu prendre un otage ?");
inventory.setContents(items.clone());
player.closeInventory();
player.openInventory(inventory);
}
@Override
protected void onNightTurn(LGPlayer player, Runnable callback) {
player.showView();
this.callback = callback;
openInventory(player.getPlayer());
}
@Override
protected void onNightTurnTimeout(LGPlayer player) {
player.getPlayer().getInventory().setItem(8, null);
player.stopChoosing();
closeInventory(player.getPlayer());
player.getPlayer().updateInventory();
player.hideView();
//player.sendTitle("§cVous n'infectez personne", "§4Vous avez mis trop de temps à vous décider...", 80);
player.sendMessage("§6Tu n'as rien fait cette nuit.");
}
private void closeInventory(Player p) {
inMenu = false;
p.closeInventory();
}
@EventHandler
public void onInventoryClick(InventoryClickEvent e) {
ItemStack item = e.getCurrentItem();
Player player = (Player) e.getWhoClicked();
LGPlayer lgp = LGPlayer.thePlayer(getGame().getPlugin(), player);
if (lgp.getRole() != this || item == null || item.getItemMeta() == null) return;
if (item.getItemMeta().getDisplayName().equals(items[3].getItemMeta().getDisplayName())) {
e.setCancelled(true);
closeInventory(player);
lgp.sendMessage("§6Tu n'as rien fait cette nuit.");
lgp.hideView();
callback.run();
} else if (item.getItemMeta().getDisplayName().equals(items[5].getItemMeta().getDisplayName())) {
e.setCancelled(true);
closeInventory(player);
player.getInventory().setItem(8, items[3]);
player.updateInventory();
//Pour éviter les missclick
WrapperPlayServerHeldItemSlot held = new WrapperPlayServerHeldItemSlot();
held.setSlot(0);
held.sendPacket(player);
lgp.sendMessage("§6Choisissez votre otage.");
lgp.choose(choosen -> {
if (choosen != null) {
player.getInventory().setItem(8, null);
player.updateInventory();
lgp.stopChoosing();
lgp.sendMessage("§6Tu as pris §7§l" + choosen.getName() + "§6 en otage.");
lgp.sendActionBarMessage("§7§l" + choosen.getName() + "§6 est ton otage");
lgp.getCache().set("pirate_otage", choosen);
choosen.getCache().set("pirate_otage_d", lgp);
getPlayers().remove(lgp);//Pour éviter qu'il puisse prendre plusieurs otages
choosen.sendMessage("§7§l" + lgp.getName() + "§6 t'a pris en otage, il est " + getName() + "§6.");
lgp.hideView();
callback.run();
}
}, lgp);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerKilled(LGPlayerKilledEvent e) {
if (e.getGame() == getGame() && e.getReason() == Reason.VOTE)
if (e.getKilled().getCache().has("pirate_otage") && e.getKilled().isRoleActive()) {
LGPlayer otage = e.getKilled().getCache().remove("pirate_otage");
if (!otage.isDead() && otage.getCache().get("pirate_otage_d") == e.getKilled()) {
getGame().broadcastMessage("§7§l" + e.getKilled().getName() + "§6 est " + getName() + "§6, c'est son otage qui va mourir.");
e.setKilled(otage);
e.setReason(Reason.PIRATE);
}
}
}
@EventHandler
public void onClick(PlayerInteractEvent e) {
Player player = e.getPlayer();
LGPlayer lgp = LGPlayer.thePlayer(getGame().getPlugin(), player);
if (lgp.getRole() == this) {
if (e.getItem() != null && e.getItem().hasItemMeta() && e.getItem().getItemMeta().getDisplayName().equals(items[3].getItemMeta().getDisplayName())) {
e.setCancelled(true);
player.getInventory().setItem(8, null);
player.updateInventory();
lgp.stopChoosing();
lgp.sendMessage("§6Tu n'as rien fait cette nuit.");
lgp.hideView();
callback.run();
}
}
}
@EventHandler
public void onQuitInventory(InventoryCloseEvent e) {
if (e.getInventory() instanceof CraftInventoryCustom) {
LGPlayer player = LGPlayer.thePlayer(getGame().getPlugin(), (Player) e.getPlayer());
if (player.getRole() == this && inMenu) {
new BukkitRunnable() {
@Override
public void run() {
e.getPlayer().openInventory(e.getInventory());
}
}.runTaskLater(MainLg.getInstance(), 1);
}
}
}
}