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

128 lines
4 KiB
Java

package fr.leomelki.loupgarou.roles;
import java.util.ArrayList;
import java.util.concurrent.ThreadLocalRandom;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.event.Listener;
import org.bukkit.scheduler.BukkitRunnable;
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;
public abstract class Role implements Listener{
@Getter @Setter private int waitedPlayers;
@Getter private final ArrayList<LGPlayer> players = new ArrayList<LGPlayer>();
@Getter private final LGGame game;
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)->{
return 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)->{
return 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é
}