287 lines
11 KiB
Java
287 lines
11 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.LGDayEndEvent;
|
|
import fr.leomelki.loupgarou.events.LGMayorVoteEvent;
|
|
import fr.leomelki.loupgarou.events.LGPlayerKilledEvent;
|
|
import fr.leomelki.loupgarou.events.LGPlayerKilledEvent.Reason;
|
|
import fr.leomelki.loupgarou.events.LGVoteEvent;
|
|
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.Cancellable;
|
|
import org.bukkit.event.EventHandler;
|
|
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.ArrayList;
|
|
import java.util.Arrays;
|
|
import java.util.Collections;
|
|
import java.util.Iterator;
|
|
|
|
public class RDictateur extends Role {
|
|
static private final ItemStack[] items = new ItemStack[9];
|
|
static private final Inventory inventory;
|
|
|
|
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./*DIAMOND_SWORD*/GUNPOWDER);
|
|
meta = items[5].getItemMeta();
|
|
meta.setDisplayName("§e§lCoup d'État");
|
|
meta.setLore(Arrays.asList(
|
|
"§8Prends le contrôle du village",
|
|
"§8et choisis seul qui mourra demain.",
|
|
"",
|
|
"§8Si tu tues un §a§lVillageois§8, tu",
|
|
"§8l'auras sur la conscience."));
|
|
items[5].setItemMeta(meta);
|
|
inventory = Bukkit.createInventory(null, 9, "§7Veux-tu faire un coup d'état ?");
|
|
inventory.setContents(items.clone());
|
|
}
|
|
|
|
Runnable callback, run;
|
|
boolean inMenu = false;
|
|
|
|
public RDictateur(LGGame game) {
|
|
super(game);
|
|
}
|
|
|
|
@Override
|
|
public RoleType getType() {
|
|
return RoleType.VILLAGER;
|
|
}
|
|
|
|
@Override
|
|
public RoleWinType getWinType() {
|
|
return RoleWinType.VILLAGE;
|
|
}
|
|
|
|
@Override
|
|
public String getName() {
|
|
return "§a§lDictateur";
|
|
}
|
|
|
|
@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 choisir d'effectuer un §e§o§lcoup d'état§f, tu choisiras alors seul qui mourra au jour suivant. Si tu fais le bon choix, tu deviendras §5§lCapitaine§f mais si tu tues un §a§lVillageois§f, tu te suicideras la nuit qui suit.";
|
|
}
|
|
|
|
@Override
|
|
public String getTask() {
|
|
return "Veux-tu réaliser un coup d'état ?";
|
|
}
|
|
|
|
@Override
|
|
public String getBroadcastedTask() {
|
|
return "Le " + getName() + "§9 décide s'il veut se dévoiler.";
|
|
}
|
|
|
|
@Override
|
|
public int getTimeout() {
|
|
return 15;
|
|
}
|
|
|
|
public void openInventory(Player player) {
|
|
inMenu = true;
|
|
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.hideView();
|
|
closeInventory(player.getPlayer());
|
|
/*player.sendTitle("§cVous ne faites pas votre coup d'état.", "§4Vous avez mis trop de temps à vous décider...", 80);
|
|
player.sendMessage("§cVous ne faites pas votre coup d'état.");
|
|
player.sendMessage("§7§oVous aurez de nouveau le choix lors de la prochaine 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("§cVous ne faites pas votre coup d'état.");
|
|
lgp.sendMessage("§7§oVous aurez de nouveau le choix lors de la prochaine nuit.");*/
|
|
lgp.hideView();
|
|
callback.run();
|
|
} else if (item.getItemMeta().getDisplayName().equals(items[5].getItemMeta().getDisplayName())) {
|
|
e.setCancelled(true);
|
|
closeInventory(player);
|
|
lgp.sendActionBarMessage("§9§lTu effectueras un coup d'état");
|
|
lgp.sendMessage("§6Tu as décidé de faire un coup d'état.");
|
|
lgp.getCache().set("coup_d_etat", true);
|
|
lgp.getCache().set("just_coup_d_etat", true);
|
|
lgp.hideView();
|
|
callback.run();
|
|
}
|
|
}
|
|
|
|
@EventHandler
|
|
public void onClick(PlayerInteractEvent e) {
|
|
Player p = e.getPlayer();
|
|
LGPlayer player = LGPlayer.thePlayer(getGame().getPlugin(), p);
|
|
if (e.getItem() != null && e.getItem().getType() == Material.IRON_NUGGET && player.getRole() == this) {
|
|
getGame().cancelWait();
|
|
player.stopChoosing();
|
|
p.getInventory().setItem(8, null);
|
|
p.updateInventory();
|
|
getGame().broadcastMessage("§7§l" + player.getName() + "§9 n'a tué personne.");
|
|
run.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);
|
|
}
|
|
}
|
|
}
|
|
|
|
@EventHandler
|
|
public void onMayorVote(LGMayorVoteEvent e) {
|
|
if (e.getGame() == getGame())
|
|
onTurn(e);
|
|
}
|
|
|
|
@EventHandler
|
|
public void onVote(LGVoteEvent e) {
|
|
if (e.getGame() == getGame())
|
|
onTurn(e);
|
|
}
|
|
|
|
public void onTurn(Cancellable e) {
|
|
for (LGPlayer lgp : getPlayers())
|
|
if (lgp.getCache().getBoolean("just_coup_d_etat") && lgp.isRoleActive())
|
|
e.setCancelled(true);
|
|
|
|
if (!e.isCancelled())
|
|
return;
|
|
|
|
Iterator<LGPlayer> ite = ((ArrayList<LGPlayer>) getPlayers().clone()).iterator();
|
|
new Runnable() {
|
|
public void run() {
|
|
run = this;
|
|
if (ite.hasNext()) {
|
|
LGPlayer lgp = ite.next();
|
|
if (lgp.getCache().getBoolean("just_coup_d_etat")) {
|
|
getPlayers().remove(lgp);
|
|
lgp.getCache().remove("just_coup_d_etat");
|
|
getGame().broadcastMessage("§7§l" + lgp.getName() + " §9réalise un coup d'état.");
|
|
//lgp.sendTitle("§6Vous faites votre coup d'état", "§aChoisissez qui tuer", 60);
|
|
|
|
//On le met sur le slot 0 pour éviter un missclick sur la croix
|
|
WrapperPlayServerHeldItemSlot hold = new WrapperPlayServerHeldItemSlot();
|
|
hold.setSlot(0);
|
|
hold.sendPacket(lgp.getPlayer());
|
|
|
|
lgp.sendMessage("§6Choisis un joueur à exécuter.");
|
|
getGame().wait(60, () -> {
|
|
lgp.stopChoosing();
|
|
getGame().broadcastMessage("§7§l" + lgp.getName() + "§9 n'a tué personne.");
|
|
lgp.getPlayer().getInventory().setItem(8, null);
|
|
lgp.getPlayer().updateInventory();
|
|
this.run();
|
|
}, (player, secondsLeft) -> lgp == player ? "§9§lC'est à ton tour !" : "§6Le Dictateur choisit sa victime (§e" + secondsLeft + " s§6)");
|
|
lgp.choose((choosen) -> {
|
|
if (choosen != null) {
|
|
getGame().cancelWait();
|
|
lgp.stopChoosing();
|
|
lgp.getPlayer().getInventory().setItem(8, null);
|
|
lgp.getPlayer().updateInventory();
|
|
kill(choosen, lgp, this);
|
|
}
|
|
});
|
|
lgp.getPlayer().getInventory().setItem(8, items[3]);
|
|
lgp.getPlayer().updateInventory();
|
|
}
|
|
} else
|
|
getGame().nextNight();
|
|
}
|
|
}.run();
|
|
}
|
|
|
|
protected void kill(LGPlayer choosen, LGPlayer dicta, Runnable callback) {
|
|
RoleType roleType = choosen.getRoleType();
|
|
|
|
LGPlayerKilledEvent killEvent = new LGPlayerKilledEvent(getGame(), choosen, Reason.DICTATOR);
|
|
Bukkit.getPluginManager().callEvent(killEvent);
|
|
if (killEvent.isCancelled()) return;
|
|
if (getGame().kill(killEvent.getKilled(), killEvent.getReason(), true))
|
|
return;
|
|
|
|
if (roleType != RoleType.VILLAGER) {
|
|
getGame().broadcastMessage("§7§l" + dicta.getName() + " §9devient le §5§lCapitaine§9 du village.");
|
|
getGame().setMayor(dicta);
|
|
} else {
|
|
getGame().kill(dicta, Reason.DICTATOR_SUICIDE);
|
|
for (LGPlayer lgp : getGame().getInGame()) {
|
|
if (lgp == dicta)
|
|
lgp.sendMessage("§9§oÇa ne s'est pas passé comme prévu...");
|
|
else
|
|
lgp.sendMessage("§9Le " + getName() + "§9 s'est trompé, il mourra la nuit suivante.");
|
|
}
|
|
}
|
|
callback.run();
|
|
}
|
|
|
|
@EventHandler
|
|
public void onNight(LGDayEndEvent e) {
|
|
if (e.getGame() == getGame()) {
|
|
LGPlayer lgp = getGame().getDeaths().get(Reason.DICTATOR_SUICIDE);
|
|
if (lgp != null)
|
|
lgp.sendMessage("§8§oDes pensées sombres hantent ton esprit...");
|
|
}
|
|
}
|
|
}
|