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

151 lines
4.9 KiB
Java

package fr.leomelki.loupgarou.roles;
import fr.leomelki.loupgarou.MainLg;
import fr.leomelki.loupgarou.classes.LGCustomItems;
import fr.leomelki.loupgarou.classes.LGGame;
import fr.leomelki.loupgarou.classes.LGPlayer;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.event.Listener;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.ArrayList;
import java.util.concurrent.ThreadLocalRandom;
public abstract class Role implements Listener {
@Getter
private final ArrayList<LGPlayer> players = new ArrayList<>();
@Getter
private final LGGame game;
@Getter
@Setter
private int waitedPlayers;
public Role(LGGame game) {
this.game = game;
Bukkit.getPluginManager().registerEvents(this, MainLg.getInstance());
FileConfiguration config = MainLg.getInstance().getConfig();
String roleConfigName = "role." + getClass().getSimpleName().substring(1);
if (config.contains(roleConfigName))
waitedPlayers = config.getInt(roleConfigName);
}
public abstract String getName();
public abstract String getFriendlyName();
public abstract String getShortDescription();
public abstract String getDescription();
public abstract String getTask();
public abstract String getBroadcastedTask();
public RoleType getType(LGPlayer lgp) {
return getType();
}
public RoleWinType getWinType(LGPlayer lgp) {
return getWinType();
}
public RoleType getType() {
return null;
}
public RoleWinType getWinType() {
return null;
}
/**
* @return Timeout in second for this role
*/
public abstract int getTimeout();
public void onNightTurn(Runnable callback) {
ArrayList<LGPlayer> players = (ArrayList<LGPlayer>) getPlayers().clone();
new Runnable() {
@Override
public void run() {
getGame().cancelWait();
if (players.size() == 0) {
onTurnFinish(callback);
return;
}
LGPlayer player = players.remove(0);
if (player.isRoleActive()) {
getGame().wait(getTimeout(), () -> {
try {
Role.this.onNightTurnTimeout(player);
} catch (Exception err) {
System.out.println("Error when timeout role");
err.printStackTrace();
}
this.run();
}, (currentPlayer, secondsLeft) -> currentPlayer == player ? "§9§lC'est à ton tour !" : "§6C'est au tour " + getFriendlyName() + " §6(§e" + secondsLeft + " s§6)");
player.sendMessage("§6" + getTask());
// player.sendTitle("§6C'est à vous de jouer", "§a"+getTask(), 100);
onNightTurn(player, this);
} else {
getGame().wait(getTimeout(), () -> {
}, (currentPlayer, secondsLeft) -> currentPlayer == player ? "§c§lTu ne peux pas jouer" : "§6C'est au tour " + getFriendlyName() + " §6(§e" + secondsLeft + " s§6)");
Runnable run = this;
new BukkitRunnable() {
@Override
public void run() {
run.run();
}
}.runTaskLater(MainLg.getInstance(), 20 * (ThreadLocalRandom.current().nextInt(getTimeout() / 3 * 2 - 4) + 4));
}
}
}.run();
}
public void join(LGPlayer player, boolean sendMessage) {
System.out.println(player.getName() + " est " + getName());
players.add(player);
if (player.getRole() == null)
player.setRole(this);
waitedPlayers--;
if (sendMessage) {
player.sendTitle("§6Tu es " + getName(), "§e" + getShortDescription(), 200);
player.sendMessage("§6Tu es " + getName() + "§6.");
player.sendMessage("§6Description : §f" + getDescription());
}
}
public void join(LGPlayer player) {
join(player, !getGame().isStarted());
LGCustomItems.updateItem(player);
}
public boolean hasPlayersLeft() {
return getPlayers().size() > 0;
}
protected void onNightTurnTimeout(LGPlayer player) {
}
protected void onNightTurn(LGPlayer player, Runnable callback) {
}
protected void onTurnFinish(Runnable callback) {
callback.run();
}
public int getTurnOrder() {
try {
RoleSort role = RoleSort.valueOf(getClass().getSimpleName().substring(1));
return role == null ? -1 : role.ordinal();
} catch (Throwable e) {
return -1;
}
}//En combientième ce rôle doit être appellé
}