Version 1.1.0

Ajouté:
  - Rôle Montreur d'Ours
  - Rôle Vampire
  - Rôle Chasseur de Vampire
Corrections:
  - Quelques corrections de bugs
  - Ajouts de messages afin d'éviter les erreurs dans certaines commandes
This commit is contained in:
leomelki 2020-04-07 13:57:26 +02:00
parent cc75c0746f
commit 5d41f506e5
35 changed files with 721 additions and 71 deletions

View file

@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>fr.leomelki</groupId> <groupId>fr.leomelki</groupId>
<artifactId>LoupGarou</artifactId> <artifactId>LoupGarou</artifactId>
<version>1.0.1</version> <version>1.1.0</version>
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

View file

@ -56,6 +56,7 @@ import fr.leomelki.loupgarou.roles.RAssassin;
import fr.leomelki.loupgarou.roles.RBouffon; import fr.leomelki.loupgarou.roles.RBouffon;
import fr.leomelki.loupgarou.roles.RChaperonRouge; import fr.leomelki.loupgarou.roles.RChaperonRouge;
import fr.leomelki.loupgarou.roles.RChasseur; import fr.leomelki.loupgarou.roles.RChasseur;
import fr.leomelki.loupgarou.roles.RChasseurDeVampire;
import fr.leomelki.loupgarou.roles.RChienLoup; import fr.leomelki.loupgarou.roles.RChienLoup;
import fr.leomelki.loupgarou.roles.RCorbeau; import fr.leomelki.loupgarou.roles.RCorbeau;
import fr.leomelki.loupgarou.roles.RCupidon; import fr.leomelki.loupgarou.roles.RCupidon;
@ -69,15 +70,18 @@ import fr.leomelki.loupgarou.roles.RLoupGarou;
import fr.leomelki.loupgarou.roles.RLoupGarouBlanc; import fr.leomelki.loupgarou.roles.RLoupGarouBlanc;
import fr.leomelki.loupgarou.roles.RLoupGarouNoir; import fr.leomelki.loupgarou.roles.RLoupGarouNoir;
import fr.leomelki.loupgarou.roles.RMedium; import fr.leomelki.loupgarou.roles.RMedium;
import fr.leomelki.loupgarou.roles.RMontreurDOurs;
import fr.leomelki.loupgarou.roles.RPetiteFille; import fr.leomelki.loupgarou.roles.RPetiteFille;
import fr.leomelki.loupgarou.roles.RPirate; import fr.leomelki.loupgarou.roles.RPirate;
import fr.leomelki.loupgarou.roles.RPretre; import fr.leomelki.loupgarou.roles.RPretre;
import fr.leomelki.loupgarou.roles.RPyromane; import fr.leomelki.loupgarou.roles.RPyromane;
import fr.leomelki.loupgarou.roles.RSorciere; import fr.leomelki.loupgarou.roles.RSorciere;
import fr.leomelki.loupgarou.roles.RSurvivant; import fr.leomelki.loupgarou.roles.RSurvivant;
import fr.leomelki.loupgarou.roles.RVampire;
import fr.leomelki.loupgarou.roles.RVillageois; import fr.leomelki.loupgarou.roles.RVillageois;
import fr.leomelki.loupgarou.roles.RVoyante; import fr.leomelki.loupgarou.roles.RVoyante;
import fr.leomelki.loupgarou.roles.Role; import fr.leomelki.loupgarou.roles.Role;
import fr.leomelki.loupgarou.utils.VariousUtils;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -100,7 +104,6 @@ public class MainLg extends JavaPlugin{
saveConfig(); saveConfig();
} }
loadConfig(); loadConfig();
Bukkit.getConsoleSender().sendMessage("/");
Bukkit.getPluginManager().registerEvents(new JoinListener(), this); Bukkit.getPluginManager().registerEvents(new JoinListener(), this);
Bukkit.getPluginManager().registerEvents(new CancelListener(), this); Bukkit.getPluginManager().registerEvents(new CancelListener(), this);
Bukkit.getPluginManager().registerEvents(new VoteListener(), this); Bukkit.getPluginManager().registerEvents(new VoteListener(), this);
@ -225,9 +228,23 @@ public class MainLg extends JavaPlugin{
sender.sendMessage(prefix+"§aLa position a bien été ajoutée !"); sender.sendMessage(prefix+"§aLa position a bien été ajoutée !");
return true; return true;
}else if(args[0].equalsIgnoreCase("end")) { }else if(args[0].equalsIgnoreCase("end")) {
LGPlayer.thePlayer(Bukkit.getPlayer(args[1])).getGame().cancelWait(); if(args.length != 2) {
LGPlayer.thePlayer(Bukkit.getPlayer(args[1])).getGame().endGame(LGWinType.EQUAL); sender.sendMessage("§4Utilisation : §c/lg end <pseudo>");
LGPlayer.thePlayer(Bukkit.getPlayer(args[1])).getGame().broadcastMessage("§cLa partie a été arrêtée de force !"); return true;
}
Player selected = Bukkit.getPlayer(args[1]);
if(selected == null) {
sender.sendMessage("§4Erreur : §cLe joueur §4"+args[1]+"§c n'est pas connecté.");
return true;
}
LGGame game = LGPlayer.thePlayer(selected).getGame();
if(game == null) {
sender.sendMessage("§4Erreur : §cLe joueur §4"+selected.getName()+"§c n'est pas dans une partie.");
return true;
}
game.cancelWait();
game.endGame(LGWinType.EQUAL);
game.broadcastMessage("§cLa partie a été arrêtée de force !");
return true; return true;
}else if(args[0].equalsIgnoreCase("start")) { }else if(args[0].equalsIgnoreCase("start")) {
if(args.length < 2) { if(args.length < 2) {
@ -240,6 +257,10 @@ public class MainLg extends JavaPlugin{
return true; return true;
} }
LGPlayer lgp = LGPlayer.thePlayer(player); LGPlayer lgp = LGPlayer.thePlayer(player);
if(lgp.getGame() == null) {
sender.sendMessage("§4Erreur : §cLe joueur §4"+lgp.getName()+"§c n'est pas dans une partie.");
return true;
}
if(MainLg.getInstance().getConfig().getList("spawns").size() < lgp.getGame().getMaxPlayers()) { if(MainLg.getInstance().getConfig().getList("spawns").size() < lgp.getGame().getMaxPlayers()) {
sender.sendMessage("§4Erreur : §cIl n'y a pas assez de points de spawn !"); sender.sendMessage("§4Erreur : §cIl n'y a pas assez de points de spawn !");
sender.sendMessage("§8§oPour les définir, merci de faire §7/lg addSpawn"); sender.sendMessage("§8§oPour les définir, merci de faire §7/lg addSpawn");
@ -413,6 +434,9 @@ public class MainLg extends JavaPlugin{
roles.put("Pretre", RPretre.class.getConstructor(LGGame.class)); roles.put("Pretre", RPretre.class.getConstructor(LGGame.class));
roles.put("Faucheur", RFaucheur.class.getConstructor(LGGame.class)); roles.put("Faucheur", RFaucheur.class.getConstructor(LGGame.class));
roles.put("EnfantSauvage", REnfantSauvage.class.getConstructor(LGGame.class)); roles.put("EnfantSauvage", REnfantSauvage.class.getConstructor(LGGame.class));
roles.put("MontreurDOurs", RMontreurDOurs.class.getConstructor(LGGame.class));
roles.put("Vampire", RVampire.class.getConstructor(LGGame.class));
roles.put("ChasseurDeVampire", RChasseurDeVampire.class.getConstructor(LGGame.class));
} catch (NoSuchMethodException | SecurityException e) { } catch (NoSuchMethodException | SecurityException e) {
e.printStackTrace(); e.printStackTrace();
} }

File diff suppressed because one or more lines are too long

View file

@ -30,6 +30,7 @@ import com.comphenix.protocol.wrappers.WrappedChatComponent;
import com.comphenix.protocol.wrappers.WrappedGameProfile; import com.comphenix.protocol.wrappers.WrappedGameProfile;
import fr.leomelki.com.comphenix.packetwrapper.WrapperPlayServerChat; import fr.leomelki.com.comphenix.packetwrapper.WrapperPlayServerChat;
import fr.leomelki.com.comphenix.packetwrapper.WrapperPlayServerEntityDestroy;
import fr.leomelki.com.comphenix.packetwrapper.WrapperPlayServerExperience; import fr.leomelki.com.comphenix.packetwrapper.WrapperPlayServerExperience;
import fr.leomelki.com.comphenix.packetwrapper.WrapperPlayServerPlayerInfo; import fr.leomelki.com.comphenix.packetwrapper.WrapperPlayServerPlayerInfo;
import fr.leomelki.com.comphenix.packetwrapper.WrapperPlayServerScoreboardObjective; import fr.leomelki.com.comphenix.packetwrapper.WrapperPlayServerScoreboardObjective;
@ -190,7 +191,6 @@ public class LGGame implements Listener{
deaths.put(event.getReason(), player); deaths.put(event.getReason(), player);
} }
} }
@SuppressWarnings("deprecation")
public boolean tryToJoin(LGPlayer lgp) { public boolean tryToJoin(LGPlayer lgp) {
if(ended)return false; if(ended)return false;
if(!started && inGame.size() < maxPlayers) {//Si la partie n'a pas démarrée et qu'il reste de la place if(!started && inGame.size() < maxPlayers) {//Si la partie n'a pas démarrée et qu'il reste de la place
@ -199,9 +199,32 @@ public class LGGame implements Listener{
if(lgp.isMuted()) if(lgp.isMuted())
lgp.resetMuted(); lgp.resetMuted();
lgp.getPlayer().getInventory().clear(); Player player = lgp.getPlayer();
lgp.getPlayer().updateInventory();
lgp.getPlayer().closeInventory(); // Clear votes
WrapperPlayServerEntityDestroy destroy = new WrapperPlayServerEntityDestroy();
destroy.setEntityIds(new int[] {Integer.MIN_VALUE+player.getEntityId()});
int[] ids = new int[getInGame().size()+1];
for(int i = 0;i<getInGame().size();i++) {
Player l = getInGame().get(i).getPlayer();
if(l == null)
continue;
ids[i] = Integer.MIN_VALUE+l.getEntityId();
destroy.sendPacket(l);
}
ids[ids.length-1] = -player.getEntityId();// Clear voting
destroy = new WrapperPlayServerEntityDestroy();
destroy.setEntityIds(ids);
destroy.sendPacket(player);
// End clear votes/voting
player.getInventory().clear();
player.updateInventory();
player.closeInventory();
lgp.joinChat(dayChat); lgp.joinChat(dayChat);
@ -213,22 +236,22 @@ public class LGGame implements Listener{
for(LGPlayer other : getInGame()) { for(LGPlayer other : getInGame()) {
other.updatePrefix(); other.updatePrefix();
if(lgp != other) { if(lgp != other) {
lgp.getPlayer().hidePlayer(other.getPlayer()); player.hidePlayer(other.getPlayer());
lgp.getPlayer().showPlayer(other.getPlayer()); player.showPlayer(other.getPlayer());
other.getPlayer().hidePlayer(lgp.getPlayer()); other.getPlayer().hidePlayer(player);
other.getPlayer().showPlayer(lgp.getPlayer()); other.getPlayer().showPlayer(player);
} }
} }
lgp.getPlayer().setGameMode(GameMode.ADVENTURE); player.setGameMode(GameMode.ADVENTURE);
broadcastMessage("§7Le joueur §8"+lgp.getName()+"§7 a rejoint la partie §9(§8"+inGame.size()+"§7/§8"+maxPlayers+"§9)"); broadcastMessage("§7Le joueur §8"+lgp.getName()+"§7 a rejoint la partie §9(§8"+inGame.size()+"§7/§8"+maxPlayers+"§9)");
//Reset scoreboard //Reset scoreboard
WrapperPlayServerScoreboardObjective obj = new WrapperPlayServerScoreboardObjective(); WrapperPlayServerScoreboardObjective obj = new WrapperPlayServerScoreboardObjective();
obj.setName("lg_scoreboard"); obj.setName("lg_scoreboard");
obj.setMode(1); obj.setMode(1);
obj.sendPacket(lgp.getPlayer()); obj.sendPacket(player);
Bukkit.getPluginManager().callEvent(new LGGameJoinEvent(this, lgp)); Bukkit.getPluginManager().callEvent(new LGGameJoinEvent(this, lgp));
//AutoStart //AutoStart
@ -522,7 +545,7 @@ public class LGGame implements Listener{
if(vote != null) if(vote != null)
vote.remove(killed); vote.remove(killed);
broadcastMessage(String.format(reason.getMessage(), killed.getName())+", il était "+killed.getRole().getName()+(killed.getCache().getBoolean("infected") ? " §c§l(Infecté)" : "")+"§4."); broadcastMessage(String.format(reason.getMessage(), killed.getName())+", il était "+killed.getRole().getName()+(killed.getCache().getBoolean("infected") ? " §c§l(Infecté)" : "")+(killed.getCache().getBoolean("vampire") ? " §5§l(Vampire)" : "")+"§4.");
//Lightning effect //Lightning effect
killed.getPlayer().getWorld().strikeLightningEffect(killed.getPlayer().getLocation()); killed.getPlayer().getWorld().strikeLightningEffect(killed.getPlayer().getLocation());
@ -579,6 +602,12 @@ public class LGGame implements Listener{
if(event.isCancelled()) if(event.isCancelled())
return; return;
for(LGPlayer lgp : getInGame())//Avoid bugs
if(lgp.getPlayer() != null)
lgp.getPlayer().closeInventory();
cancelWait();//Also avoid bugs
ended = true; ended = true;
//We unregister every role listener because they are unused after the game's end ! //We unregister every role listener because they are unused after the game's end !
for(Role role : getRoles()) for(Role role : getRoles())
@ -847,7 +876,7 @@ public class LGGame implements Listener{
return checkEndGame(true); return checkEndGame(true);
} }
public boolean checkEndGame(boolean doEndGame) { public boolean checkEndGame(boolean doEndGame) {
int goodGuy = 0, badGuy = 0, solo = 0; int goodGuy = 0, badGuy = 0, solo = 0, vampires = 0;
for(LGPlayer lgp : getAlive()) for(LGPlayer lgp : getAlive())
if(lgp.getRoleWinType() == RoleWinType.LOUP_GAROU) if(lgp.getRoleWinType() == RoleWinType.LOUP_GAROU)
badGuy++; badGuy++;
@ -855,14 +884,19 @@ public class LGGame implements Listener{
goodGuy++; goodGuy++;
else if(lgp.getRoleWinType() == RoleWinType.SEUL) else if(lgp.getRoleWinType() == RoleWinType.SEUL)
solo++; solo++;
else if(lgp.getRoleWinType() == RoleWinType.VAMPIRE)
vampires++;
LGEndCheckEvent event = new LGEndCheckEvent(this, goodGuy == 0 || badGuy == 0 ? (goodGuy+badGuy == 0 ? LGWinType.EQUAL : (goodGuy > 0 ? LGWinType.VILLAGEOIS : LGWinType.LOUPGAROU)) : LGWinType.NONE); LGEndCheckEvent event = new LGEndCheckEvent(this, goodGuy == 0 || badGuy == 0 ? (goodGuy+badGuy == 0 ? LGWinType.EQUAL : (goodGuy > 0 ? LGWinType.VILLAGEOIS : LGWinType.LOUPGAROU)) : LGWinType.NONE);
if((badGuy+goodGuy > 0 && solo > 0) || solo > 1) if((badGuy+goodGuy > 0 && solo > 0) || solo > 1 || (badGuy+goodGuy > 0 && vampires > 0) || (solo > 0 && vampires > 0))
event.setWinType(LGWinType.NONE); event.setWinType(LGWinType.NONE);
if(badGuy+goodGuy == 0 && solo == 1) if(badGuy+goodGuy == 0 && solo == 1 && vampires == 0)
event.setWinType(LGWinType.SOLO); event.setWinType(LGWinType.SOLO);
if(badGuy+goodGuy == 0 && solo == 0 && vampires > 0)
event.setWinType(LGWinType.VAMPIRE);
Bukkit.getPluginManager().callEvent(event); Bukkit.getPluginManager().callEvent(event);
if(doEndGame && event.getWinType() != LGWinType.NONE) if(doEndGame && event.getWinType() != LGWinType.NONE)
endGame(event.getWinType()); endGame(event.getWinType());

View file

@ -282,10 +282,14 @@ public class LGPlayer {
} }
public RoleType getRoleType() { public RoleType getRoleType() {
return this.getCache().getBoolean("infected") ? RoleType.LOUP_GAROU : getRole().getType(this); return this.getCache().getBoolean("vampire") ? RoleType.VAMPIRE : this.getCache().getBoolean("infected") ? RoleType.LOUP_GAROU : getRole().getType(this);
} }
public RoleWinType getRoleWinType() { public RoleWinType getRoleWinType() {
return this.getCache().getBoolean("infected") ? RoleWinType.LOUP_GAROU : getRole().getWinType(this); return this.getCache().getBoolean("vampire") ? RoleWinType.VAMPIRE : this.getCache().getBoolean("infected") ? RoleWinType.LOUP_GAROU : getRole().getWinType(this);
}
public boolean isRoleActive() {
return !this.getCache().getBoolean("vampire");
} }
@Getter @Getter

View file

@ -52,7 +52,7 @@ public class LGVote {
@Getter private final HashMap<LGPlayer, List<LGPlayer>> votes = new HashMap<LGPlayer, List<LGPlayer>>(); @Getter private final HashMap<LGPlayer, List<LGPlayer>> votes = new HashMap<LGPlayer, List<LGPlayer>>();
private int votesSize = 0; private int votesSize = 0;
private LGPlayer mayor; private LGPlayer mayor;
private ArrayList<LGPlayer> latestTop = new ArrayList<LGPlayer>(); private ArrayList<LGPlayer> latestTop = new ArrayList<LGPlayer>(), blacklisted = new ArrayList<LGPlayer>();
private final boolean positiveVote, randomIfEqual; private final boolean positiveVote, randomIfEqual;
@Getter private boolean mayorVote; @Getter private boolean mayorVote;
private boolean ended; private boolean ended;
@ -73,6 +73,15 @@ public class LGVote {
for(LGPlayer player : participants) for(LGPlayer player : participants)
player.choose(getChooseCallback(player)); player.choose(getChooseCallback(player));
} }
public void start(List<LGPlayer> participants, List<LGPlayer> viewers, Runnable callback, ArrayList<LGPlayer> blacklisted) {
this.callback = callback;
this.participants = participants;
this.viewers = viewers;
game.wait(timeout, this::end, generator);
for(LGPlayer player : participants)
player.choose(getChooseCallback(player));
this.blacklisted = blacklisted;
}
public void start(List<LGPlayer> participants, List<LGPlayer> viewers, Runnable callback, LGPlayer mayor) { public void start(List<LGPlayer> participants, List<LGPlayer> viewers, Runnable callback, LGPlayer mayor) {
this.callback = callback; this.callback = callback;
this.participants = participants; this.participants = participants;
@ -215,6 +224,10 @@ public class LGVote {
}; };
} }
public void vote(LGPlayer voter, LGPlayer voted) { public void vote(LGPlayer voter, LGPlayer voted) {
if(blacklisted.contains(voted)) {
voter.sendMessage("§cVous ne pouvez pas votre pour §7§l"+voted.getName()+"§c.");
return;
}
if(voted == voter.getCache().get("vote")) if(voted == voter.getCache().get("vote"))
voted = null; voted = null;
@ -223,7 +236,7 @@ public class LGVote {
if(voter.getCache().has("vote")) if(voter.getCache().has("vote"))
votesSize--; votesSize--;
if(votesSize == participants.size() && timeout > littleTimeout) { if(votesSize == participants.size() && game.getWaitTicks() > littleTimeout*20) {
votesSize = 999; votesSize = 999;
game.wait(littleTimeout, initialTimeout, this::end, generator); game.wait(littleTimeout, initialTimeout, this::end, generator);
} }

View file

@ -14,6 +14,7 @@ public enum LGWinType {
SOLO("§6§l§oUn joueur solitaire a gagné la partie!"),//bug si ça s'affiche SOLO("§6§l§oUn joueur solitaire a gagné la partie!"),//bug si ça s'affiche
ASSASSIN("§6§l§oLa partie a été gagnée par l'§1§lAssassin§6§l§o !"), ASSASSIN("§6§l§oLa partie a été gagnée par l'§1§lAssassin§6§l§o !"),
PYROMANE("§6§l§oLa partie a été gagnée par le §6§lPyromane§6§l§o !"), PYROMANE("§6§l§oLa partie a été gagnée par le §6§lPyromane§6§l§o !"),
VAMPIRE("§6§l§oLa partie a été gagnée par les §5§lVampires§6§l§o !"),
NONE("§4Erreur: §cpersonne n'a gagné la partie."); NONE("§4Erreur: §cpersonne n'a gagné la partie.");
@Getter private final String message; @Getter private final String message;

View file

@ -26,6 +26,7 @@ public class LGPlayerKilledEvent extends LGEvent implements Cancellable{
GM_LOUP_GAROU("§7§l%s§4 est mort pendant la nuit"), GM_LOUP_GAROU("§7§l%s§4 est mort pendant la nuit"),
LOUP_BLANC(LOUP_GAROU.getMessage()), LOUP_BLANC(LOUP_GAROU.getMessage()),
SORCIERE(LOUP_GAROU.getMessage()), SORCIERE(LOUP_GAROU.getMessage()),
CHASSEUR_DE_VAMPIRE("§7§l%s§4 s'est fait purifier"),
VOTE("§7§l%s§4 a été victime du vote"), VOTE("§7§l%s§4 a été victime du vote"),
CHASSEUR("§7§l%s§4 est mort sur le coup"), CHASSEUR("§7§l%s§4 est mort sur le coup"),
DICTATOR("§7§l%s§4 a été désigné"), DICTATOR("§7§l%s§4 a été désigné"),

View file

@ -0,0 +1,18 @@
package fr.leomelki.loupgarou.events;
import org.bukkit.event.Cancellable;
import fr.leomelki.loupgarou.classes.LGGame;
import fr.leomelki.loupgarou.classes.LGPlayer;
import lombok.Getter;
import lombok.Setter;
public class LGVampiredEvent extends LGEvent{
public LGVampiredEvent(LGGame game, LGPlayer player) {
super(game);
this.player = player;
}
@Getter @Setter private boolean immuned, protect;
@Getter @Setter private LGPlayer player;
}

View file

@ -47,7 +47,7 @@ public class JoinListener implements Listener{
} }
p.setFoodLevel(6); p.setFoodLevel(6);
if(e.getJoinMessage() == null || !e.getJoinMessage().equals("joinall")) if(e.getJoinMessage() == null || !e.getJoinMessage().equals("joinall"))
p.getPlayer().setResourcePack("http://leomelki.fr/mcgames/ressourcepacks/v29/loup_garou.zip"); p.getPlayer().setResourcePack("http://leomelki.fr/mcgames/ressourcepacks/v32/loup_garou.zip");
else { else {
LGPlayer lgp = LGPlayer.thePlayer(e.getPlayer()); LGPlayer lgp = LGPlayer.thePlayer(e.getPlayer());
lgp.showView(); lgp.showView();

View file

@ -62,7 +62,7 @@ public class RAnge extends Role{
night = getGame().getNight(); night = getGame().getNight();
vote = true; vote = true;
for(LGPlayer lgp : getPlayers()) for(LGPlayer lgp : getPlayers())
if(!lgp.isDead()) if(!lgp.isDead() && lgp.isRoleActive())
lgp.sendMessage("§9§oFais en sorte que les autres votent contre toi !"); lgp.sendMessage("§9§oFais en sorte que les autres votent contre toi !");
} }
} }
@ -81,7 +81,8 @@ public class RAnge extends Role{
getGame().getRoles().add(villageois = new RVillageois(getGame())); getGame().getRoles().add(villageois = new RVillageois(getGame()));
for(LGPlayer lgp : getPlayers()) { for(LGPlayer lgp : getPlayers()) {
lgp.sendMessage("§4§oTu as échoué, tu deviens §a§l§oVillageois§4§o..."); if(lgp.isRoleActive())
lgp.sendMessage("§4§oTu as échoué, tu deviens §a§l§oVillageois§4§o...");
lgp.setRole(villageois); lgp.setRole(villageois);
villageois.join(lgp); villageois.join(lgp);
} }
@ -97,7 +98,7 @@ public class RAnge extends Role{
@EventHandler @EventHandler
public void onDeath(LGPlayerGotKilledEvent e) { public void onDeath(LGPlayerGotKilledEvent e) {
if(e.getGame() == getGame()) if(e.getGame() == getGame())
if(e.getReason() == Reason.VOTE && e.getKilled().getRole() == this && getGame().getNight() == night) if(e.getReason() == Reason.VOTE && e.getKilled().getRole() == this && getGame().getNight() == night && e.getKilled().isRoleActive())
winners.add(e.getKilled()); winners.add(e.getKilled());
} }

View file

@ -11,9 +11,10 @@ import fr.leomelki.loupgarou.events.LGEndCheckEvent;
import fr.leomelki.loupgarou.events.LGGameEndEvent; import fr.leomelki.loupgarou.events.LGGameEndEvent;
import fr.leomelki.loupgarou.events.LGNightEndEvent; import fr.leomelki.loupgarou.events.LGNightEndEvent;
import fr.leomelki.loupgarou.events.LGNightPlayerPreKilledEvent; import fr.leomelki.loupgarou.events.LGNightPlayerPreKilledEvent;
import fr.leomelki.loupgarou.events.LGPyromaneGasoilEvent;
import fr.leomelki.loupgarou.events.LGPlayerKilledEvent.Reason; import fr.leomelki.loupgarou.events.LGPlayerKilledEvent.Reason;
import fr.leomelki.loupgarou.events.LGPyromaneGasoilEvent;
import fr.leomelki.loupgarou.events.LGRoleTurnEndEvent; import fr.leomelki.loupgarou.events.LGRoleTurnEndEvent;
import fr.leomelki.loupgarou.events.LGVampiredEvent;
public class RAssassin extends Role{ public class RAssassin extends Role{
public RAssassin(LGGame game) { public RAssassin(LGGame game) {
@ -77,7 +78,7 @@ public class RAssassin extends Role{
@EventHandler @EventHandler
public void onKill(LGNightPlayerPreKilledEvent e) { public void onKill(LGNightPlayerPreKilledEvent e) {
if(e.getKilled().getRole() == this && e.getReason() == Reason.LOUP_GAROU || e.getReason() == Reason.GM_LOUP_GAROU) {//Les assassins ne peuvent pas mourir la nuit ! if(e.getKilled().getRole() == this && e.getReason() == Reason.LOUP_GAROU || e.getReason() == Reason.GM_LOUP_GAROU && e.getKilled().isRoleActive()) {//Les assassins ne peuvent pas mourir la nuit !
e.setReason(Reason.DONT_DIE); e.setReason(Reason.DONT_DIE);
e.getKilled().getCache().set("assassin_protected", true); e.getKilled().getCache().set("assassin_protected", true);
} }
@ -105,9 +106,14 @@ public class RAssassin extends Role{
@EventHandler @EventHandler
public void onPyroGasoil(LGPyromaneGasoilEvent e) { public void onPyroGasoil(LGPyromaneGasoilEvent e) {
if(e.getPlayer().getRole() == this) if(e.getPlayer().getRole() == this && e.getPlayer().isRoleActive())
e.setCancelled(true); e.setCancelled(true);
} }
@EventHandler
public void onVampired(LGVampiredEvent e) {
if(e.getPlayer().getRole() == this && e.getPlayer().isRoleActive())
e.setImmuned(true);
}
@EventHandler @EventHandler
public void onDayStart(LGNightEndEvent e) { public void onDayStart(LGNightEndEvent e) {
@ -121,8 +127,13 @@ public class RAssassin extends Role{
@EventHandler @EventHandler
public void onEndgameCheck(LGEndCheckEvent e) { public void onEndgameCheck(LGEndCheckEvent e) {
if(e.getGame() == getGame() && e.getWinType() == LGWinType.SOLO) { if(e.getGame() == getGame() && e.getWinType() == LGWinType.SOLO) {
if(getPlayers().size() > 0) if(getPlayers().size() > 0) {
if(getPlayers().size() > 1)
for(LGPlayer lgp : getPlayers())
if(!lgp.isRoleActive())
return;
e.setWinType(LGWinType.ASSASSIN); e.setWinType(LGWinType.ASSASSIN);
}
} }
} }

View file

@ -71,7 +71,7 @@ public class RBouffon extends Role{
return currentPlayer == player ? "§9§lC'est à ton tour !" : "§6C'est au tour "+getFriendlyName()+" §6(§e"+secondsLeft+" s§6)"; return currentPlayer == player ? "§9§lC'est à ton tour !" : "§6C'est au tour "+getFriendlyName()+" §6(§e"+secondsLeft+" s§6)";
}); });
player.sendMessage("§6"+getTask()); player.sendMessage("§6"+getTask());
// player.sendTitle("§6C'est à vous de jouer", "§a"+getTask(), 100); // player.sendTitle("§6C'est à vous de jouer", "§a"+getTask(), 100);
onNightTurn(player, this); onNightTurn(player, this);
} }
}.run(); }.run();
@ -121,7 +121,7 @@ public class RBouffon extends Role{
@EventHandler @EventHandler
public void onPlayerKill(LGPlayerKilledEvent e) { public void onPlayerKill(LGPlayerKilledEvent e) {
if(e.getKilled().getRole() == this && e.getReason() == Reason.VOTE) { if(e.getKilled().getRole() == this && e.getReason() == Reason.VOTE && e.getKilled().isRoleActive()) {
needToPlay.add(e.getKilled()); needToPlay.add(e.getKilled());
getGame().broadcastMessage("§9§oQuelle erreur, le "+getName()+"§9§o aura droit à sa vengeance..."); getGame().broadcastMessage("§9§oQuelle erreur, le "+getName()+"§9§o aura droit à sa vengeance...");
e.getKilled().sendMessage("§6Tu as rempli ta mission, l'heure de la vengeance a sonné."); e.getKilled().sendMessage("§6Tu as rempli ta mission, l'heure de la vengeance a sonné.");

View file

@ -53,7 +53,7 @@ public class RChaperonRouge extends Role{
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
public void onKill(LGNightPlayerPreKilledEvent e) { public void onKill(LGNightPlayerPreKilledEvent e) {
if(e.getKilled().getRole() == this && e.getReason() == Reason.LOUP_GAROU || e.getReason() == Reason.GM_LOUP_GAROU) { if(e.getKilled().getRole() == this && e.getReason() == Reason.LOUP_GAROU || e.getReason() == Reason.GM_LOUP_GAROU && e.getKilled().isRoleActive()) {
for(Role role : getGame().getRoles()) for(Role role : getGame().getRoles())
if(role instanceof RChasseur) if(role instanceof RChasseur)
if(role.getPlayers().size() > 0){ if(role.getPlayers().size() > 0){
@ -68,14 +68,14 @@ public class RChaperonRouge extends Role{
if(e.getGame() == getGame()) { if(e.getGame() == getGame()) {
if(e.getPreviousRole() instanceof RLoupGarou) { if(e.getPreviousRole() instanceof RLoupGarou) {
for(LGPlayer lgp : getGame().getAlive()) for(LGPlayer lgp : getGame().getAlive())
if(lgp.getCache().getBoolean("chaperon_kill")) { if(lgp.getCache().getBoolean("chaperon_kill") && lgp.isRoleActive()) {
for(LGPlayer l : getGame().getInGame()) for(LGPlayer l : getGame().getInGame())
if(l.getRoleType() == RoleType.LOUP_GAROU) if(l.getRoleType() == RoleType.LOUP_GAROU)
l.sendMessage("§cVotre cible est immunisée."); l.sendMessage("§cVotre cible est immunisée.");
} }
}else if(e.getPreviousRole() instanceof RGrandMechantLoup) { }else if(e.getPreviousRole() instanceof RGrandMechantLoup) {
for(LGPlayer lgp : getGame().getAlive()) for(LGPlayer lgp : getGame().getAlive())
if(lgp.getCache().getBoolean("chaperon_kill")) { if(lgp.getCache().getBoolean("chaperon_kill") && lgp.isRoleActive()) {
for(LGPlayer l : e.getPreviousRole().getPlayers()) for(LGPlayer l : e.getPreviousRole().getPlayers())
l.sendMessage("§cVotre cible est immunisée."); l.sendMessage("§cVotre cible est immunisée.");
} }

View file

@ -92,7 +92,7 @@ public class RChasseur extends Role{
@EventHandler @EventHandler
public void onPlayerKill(LGPlayerKilledEvent e) { public void onPlayerKill(LGPlayerKilledEvent e) {
if(e.getKilled().getRole() == this && e.getReason() != Reason.DISCONNECTED) if(e.getKilled().getRole() == this && e.getReason() != Reason.DISCONNECTED && e.getKilled().isRoleActive())
needToPlay.add(e.getKilled()); needToPlay.add(e.getKilled());
} }
@EventHandler @EventHandler

View file

@ -0,0 +1,100 @@
package fr.leomelki.loupgarou.roles;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import fr.leomelki.loupgarou.classes.LGGame;
import fr.leomelki.loupgarou.classes.LGPlayer;
import fr.leomelki.loupgarou.classes.LGPlayer.LGChooseCallback;
import fr.leomelki.loupgarou.classes.LGWinType;
import fr.leomelki.loupgarou.events.LGEndCheckEvent;
import fr.leomelki.loupgarou.events.LGGameEndEvent;
import fr.leomelki.loupgarou.events.LGNightEndEvent;
import fr.leomelki.loupgarou.events.LGNightPlayerPreKilledEvent;
import fr.leomelki.loupgarou.events.LGPyromaneGasoilEvent;
import fr.leomelki.loupgarou.events.LGPlayerKilledEvent.Reason;
import fr.leomelki.loupgarou.events.LGRoleTurnEndEvent;
public class RChasseurDeVampire extends Role{
public RChasseurDeVampire(LGGame game) {
super(game);
}
@Override
public RoleType getType() {
return RoleType.VILLAGER;
}
@Override
public RoleWinType getWinType() {
return RoleWinType.VILLAGE;
}
@Override
public String getName() {
return "§a§lChasseur de Vampires";
}
@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. Chaque nuit, tu peux traquer un joueur pour découvrir s'il s'agit d'un Vampire. Si c'est le cas, tu le tueras dans son sommeil. Si les §5§lVampires§f te prennent pour cible, tu seras immunisé contre leur attaque, et tu tueras le plus jeune d'entre eux.";
}
@Override
public String getTask() {
return "Choisis un joueur à pister.";
}
@Override
public String getBroadcastedTask() {
return "Le "+getName()+"§9 traque ses proies...";
}
@Override
public int getTimeout() {
return 15;
}
@Override
public boolean hasPlayersLeft() {
for(LGPlayer lgp : getGame().getAlive())
if(lgp.getRoleType() == RoleType.VAMPIRE)
return super.hasPlayersLeft();
return false;
}
@Override
protected void onNightTurn(LGPlayer player, Runnable callback) {
player.showView();
player.choose(new LGChooseCallback() {
@Override
public void callback(LGPlayer choosen) {
if(choosen != null && choosen != player) {
// player.sendMessage("§6Tu as choisi de rendre visite à §7§l"+choosen.getName()+"§6.");
if(choosen.getCache().getBoolean("vampire") || choosen.getRole() instanceof RVampire) {
getGame().kill(choosen, Reason.CHASSEUR_DE_VAMPIRE);
player.sendMessage("§7§l"+choosen.getName()+"§6 est un §5§lVampire§6, à l'attaque.");
player.sendActionBarMessage("§e§l"+choosen.getName()+"§6 va mourir");
} else {
player.sendMessage("§7§l"+choosen.getName()+"§6 n'est pas un §5§lVampire§6...");
player.sendActionBarMessage("§e§l"+choosen.getName()+"§6 n'est pas un §5§lVampire");
}
player.stopChoosing();
player.hideView();
callback.run();
}
}
});
}
@Override
protected void onNightTurnTimeout(LGPlayer player) {
player.stopChoosing();
player.hideView();
//player.sendTitle("§cVous n'avez regardé aucun rôle", "§4Vous avez mis trop de temps à vous décider...", 80);
//player.sendMessage("§cVous n'avez pas utilisé votre pouvoir cette nuit.");
}
}

View file

@ -188,7 +188,7 @@ public class RDictateur extends Role{
} }
public void onTurn(Cancellable e) { public void onTurn(Cancellable e) {
for(LGPlayer lgp : getPlayers()) for(LGPlayer lgp : getPlayers())
if(lgp.getCache().getBoolean("just_coup_d_etat")) if(lgp.getCache().getBoolean("just_coup_d_etat") && lgp.isRoleActive())
e.setCancelled(true); e.setCancelled(true);
if(!e.isCancelled()) if(!e.isCancelled())

View file

@ -100,7 +100,7 @@ public class REnfantSauvage extends Role{
if(e.getGame() == getGame()) if(e.getGame() == getGame())
if(e.getKilled().getCache().has("enfant_svg_d")) { if(e.getKilled().getCache().has("enfant_svg_d")) {
LGPlayer enfant = e.getKilled().getCache().remove("enfant_svg_d"); LGPlayer enfant = e.getKilled().getCache().remove("enfant_svg_d");
if(!enfant.isDead() && enfant.getCache().remove("enfant_svg") == e.getKilled()) { if(!enfant.isDead() && enfant.getCache().remove("enfant_svg") == e.getKilled() && enfant.isRoleActive()) {
enfant.sendMessage("§7§l"+e.getKilled().getName()+"§6 est mort, tu deviens un §c§lLoup-Garou§6."); enfant.sendMessage("§7§l"+e.getKilled().getName()+"§6 est mort, tu deviens un §c§lLoup-Garou§6.");
REnfantSauvageLG lgEnfantSvg = null; REnfantSauvageLG lgEnfantSvg = null;
for(Role role : getGame().getRoles()) for(Role role : getGame().getRoles())

View file

@ -58,7 +58,7 @@ public class RFaucheur extends Role{
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
public void onKill(LGPlayerKilledEvent e) { public void onKill(LGPlayerKilledEvent e) {
if (e.getKilled().getRole() == this) { if (e.getKilled().getRole() == this && e.getKilled().isRoleActive()) {
LGPlayer killed = e.getKilled(); LGPlayer killed = e.getKilled();
if(killed.getCache().getBoolean("faucheur_did"))//A déjà fait son coup de faucheur ! if(killed.getCache().getBoolean("faucheur_did"))//A déjà fait son coup de faucheur !
return; return;

View file

@ -11,6 +11,7 @@ import fr.leomelki.loupgarou.classes.LGPlayer.LGChooseCallback;
import fr.leomelki.loupgarou.events.LGNightPlayerPreKilledEvent; import fr.leomelki.loupgarou.events.LGNightPlayerPreKilledEvent;
import fr.leomelki.loupgarou.events.LGPlayerKilledEvent.Reason; import fr.leomelki.loupgarou.events.LGPlayerKilledEvent.Reason;
import fr.leomelki.loupgarou.events.LGPreDayStartEvent; import fr.leomelki.loupgarou.events.LGPreDayStartEvent;
import fr.leomelki.loupgarou.events.LGVampiredEvent;
public class RGarde extends Role{ public class RGarde extends Role{
public RGarde(LGGame game) { public RGarde(LGGame game) {
@ -105,6 +106,11 @@ public class RGarde extends Role{
} }
} }
@EventHandler @EventHandler
public void onVampired(LGVampiredEvent e) {
if(e.getGame() == getGame() && e.getPlayer().getCache().getBoolean("garde_protected"))
e.setProtect(true);
}
@EventHandler
public void onDayStart(LGPreDayStartEvent e) { public void onDayStart(LGPreDayStartEvent e) {
if(e.getGame() == getGame()) if(e.getGame() == getGame())
for(LGPlayer lgp : getGame().getInGame()) for(LGPlayer lgp : getGame().getInGame())

View file

@ -80,7 +80,7 @@ public class RMedium extends Role{
if(e.getGame() == getGame()) if(e.getGame() == getGame())
if(e.getPreviousRole() instanceof RLoupGarou) if(e.getPreviousRole() instanceof RLoupGarou)
for(LGPlayer lgp : getPlayers()) for(LGPlayer lgp : getPlayers())
if(lgp.getChat() != getGame().getSpectatorChat()) { if(lgp.getChat() != getGame().getSpectatorChat() && lgp.isRoleActive()) {
lgp.sendMessage("§6§oTu peux de nouveau parler aux morts..."); lgp.sendMessage("§6§oTu peux de nouveau parler aux morts...");
joinChat(lgp); joinChat(lgp);
} }
@ -90,6 +90,7 @@ public class RMedium extends Role{
public void onDay(LGPreDayStartEvent e) { public void onDay(LGPreDayStartEvent e) {
if(e.getGame() == getGame()) if(e.getGame() == getGame())
for(LGPlayer lgp : getPlayers()) for(LGPlayer lgp : getPlayers())
lgp.leaveChat(); if(lgp.isRoleActive())
lgp.leaveChat();
} }
} }

View file

@ -0,0 +1,107 @@
package fr.leomelki.loupgarou.roles;
import java.util.List;
import java.util.Random;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import fr.leomelki.loupgarou.MainLg;
import fr.leomelki.loupgarou.classes.LGGame;
import fr.leomelki.loupgarou.classes.LGPlayer;
import fr.leomelki.loupgarou.events.LGDayStartEvent;
import fr.leomelki.loupgarou.events.LGPlayerKilledEvent;
import fr.leomelki.loupgarou.events.LGPlayerKilledEvent.Reason;
public class RMontreurDOurs extends Role{
public RMontreurDOurs(LGGame game) {
super(game);
}
@Override
public RoleType getType() {
return RoleType.VILLAGER;
}
@Override
public RoleWinType getWinType() {
return RoleWinType.VILLAGE;
}
@Override
public String getName() {
return "§a§lMontreur d'Ours";
}
@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. Chaque matin, ton Ours va renifler tes voisins et grognera si l'un d'eux est hostile aux Villageois.";
}
@Override
public String getTask() {
return "";
}
@Override
public String getBroadcastedTask() {
return "";
}
@Override
public int getTimeout() {
return -1;
}
private static Random random = new Random();
private int lastNight = -1;
@EventHandler(priority = EventPriority.LOWEST)
public void onDay(LGDayStartEvent e) {
if (e.getGame() == getGame() && getPlayers().size() > 0) {
if(lastNight == getGame().getNight())
return;
lastNight = getGame().getNight();
List<?> original = MainLg.getInstance().getConfig().getList("spawns");
for(LGPlayer target : getPlayers()) {
if(!target.isRoleActive())
continue;
int size = original.size();
int killedPlace = target.getPlace();
for (int i = killedPlace + 1;; i++) {
if (i == size)
i = 0;
LGPlayer lgp = getGame().getPlacements().get(i);
if (lgp != null && !lgp.isDead()) {
if(lgp.getRoleWinType() == RoleWinType.VILLAGE || lgp.getRoleWinType() == RoleWinType.NONE)
break;
else{
getGame().broadcastMessage("§6La bête du "+getName()+"§6 grogne...");
return;
}
}
if (lgp == target)// Fait un tour complet
break;
}
for (int i = killedPlace - 1;; i--) {
if (i == -1)
i = size - 1;
LGPlayer lgp = getGame().getPlacements().get(i);
if (lgp != null && !lgp.isDead()) {
if(lgp.getRoleWinType() == RoleWinType.VILLAGE || lgp.getRoleWinType() == RoleWinType.NONE)
break;
else{
getGame().broadcastMessage("§6La bête du "+getName()+"§6 grogne...");
return;
}
}
if (lgp == target)// Fait un tour complet
break;
}
}
}
}
}

View file

@ -60,7 +60,7 @@ public class RPetiteFille extends Role{
if(role instanceof RLoupGarou) { if(role instanceof RLoupGarou) {
RLoupGarou lgRole = (RLoupGarou)role; RLoupGarou lgRole = (RLoupGarou)role;
for(LGPlayer player : getPlayers()) for(LGPlayer player : getPlayers())
if(!player.getCache().getBoolean("infected")) if(!player.getCache().getBoolean("infected") && player.isRoleActive())
player.joinChat(lgRole.getChat(), (sender, message)->{ player.joinChat(lgRole.getChat(), (sender, message)->{
return "§c"+customNames.get(lgRole.getPlayers().indexOf(sender))+" §6» §f"+message; return "§c"+customNames.get(lgRole.getPlayers().indexOf(sender))+" §6» §f"+message;
}, true); }, true);
@ -68,7 +68,7 @@ public class RPetiteFille extends Role{
} }
if(e.getPreviousRole() instanceof RLoupGarou) if(e.getPreviousRole() instanceof RLoupGarou)
for(LGPlayer player : getPlayers()) for(LGPlayer player : getPlayers())
if(!player.getCache().getBoolean("infected")) if(!player.getCache().getBoolean("infected") && player.isRoleActive())
player.leaveChat(); player.leaveChat();
} }
} }

View file

@ -125,7 +125,7 @@ public class RPirate extends Role{
ItemStack item = e.getCurrentItem(); ItemStack item = e.getCurrentItem();
Player player = (Player)e.getWhoClicked(); Player player = (Player)e.getWhoClicked();
LGPlayer lgp = LGPlayer.thePlayer(player); LGPlayer lgp = LGPlayer.thePlayer(player);
if(lgp.getRole() != this || item == null || item.getItemMeta() == null)return; if(lgp.getRole() != this || item == null || item.getItemMeta() == null)return;
if(item.getItemMeta().getDisplayName().equals(items[3].getItemMeta().getDisplayName())) { if(item.getItemMeta().getDisplayName().equals(items[3].getItemMeta().getDisplayName())) {
@ -168,7 +168,7 @@ public class RPirate extends Role{
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
public void onPlayerKilled(LGPlayerKilledEvent e) { public void onPlayerKilled(LGPlayerKilledEvent e) {
if(e.getGame() == getGame() && e.getReason() == Reason.VOTE) if(e.getGame() == getGame() && e.getReason() == Reason.VOTE)
if(e.getKilled().getCache().has("pirate_otage")) { if(e.getKilled().getCache().has("pirate_otage") && e.getKilled().isRoleActive()) {
LGPlayer otage = e.getKilled().getCache().remove("pirate_otage"); LGPlayer otage = e.getKilled().getCache().remove("pirate_otage");
if(!otage.isDead() && otage.getCache().get("pirate_otage_d") == e.getKilled()) { 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."); getGame().broadcastMessage("§7§l"+e.getKilled().getName()+"§6 est "+getName()+"§6, c'est son otage qui va mourir.");

View file

@ -108,13 +108,12 @@ public class RPretre extends Role{
public void openInventory(Player player) { public void openInventory(Player player) {
inMenu = true; inMenu = true;
Inventory inventory = Bukkit.createInventory(null, 9, "§7Veux-tu réssuciter quelqu'un ?"); Inventory inventory = Bukkit.createInventory(null, 9, "§7Veux-tu réssusciter quelqu'un ?");
inventory.setContents(items.clone()); inventory.setContents(items.clone());
player.closeInventory(); player.closeInventory();
player.openInventory(inventory); player.openInventory(inventory);
} }
WrappedDataWatcherObject invisible = new WrappedDataWatcherObject(0, WrappedDataWatcher.Registry.get(Byte.class)); WrappedDataWatcherObject invisible = new WrappedDataWatcherObject(0, WrappedDataWatcher.Registry.get(Byte.class));
@SuppressWarnings("deprecation")
@Override @Override
protected void onNightTurn(LGPlayer player, Runnable callback) { protected void onNightTurn(LGPlayer player, Runnable callback) {
player.showView(); player.showView();
@ -183,7 +182,7 @@ public class RPretre extends Role{
WrapperPlayServerHeldItemSlot held = new WrapperPlayServerHeldItemSlot(); WrapperPlayServerHeldItemSlot held = new WrapperPlayServerHeldItemSlot();
held.setSlot(0); held.setSlot(0);
held.sendPacket(player); held.sendPacket(player);
lgp.sendMessage("§6Choisissez qui réssuciter."); lgp.sendMessage("§6Choisissez qui réssusciter.");
lgp.canSelectDead = true; lgp.canSelectDead = true;
lgp.choose(new LGChooseCallback() { lgp.choose(new LGChooseCallback() {
@ -202,12 +201,12 @@ public class RPretre extends Role{
lgp.stopChoosing(); lgp.stopChoosing();
lgp.canSelectDead = false; lgp.canSelectDead = false;
lgp.sendMessage("§6Tu as ramené §7§l"+choosen.getName()+"§6 à la vie."); lgp.sendMessage("§6Tu as ramené §7§l"+choosen.getName()+"§6 à la vie.");
lgp.sendActionBarMessage("§7§l"+choosen.getName()+"§6 sera réssucité"); lgp.sendActionBarMessage("§7§l"+choosen.getName()+"§6 sera réssuscité");
ressucited.add(choosen); ressucited.add(choosen);
getPlayers().remove(lgp);//Pour éviter qu'il puisse sauver plusieurs personnes. getPlayers().remove(lgp);//Pour éviter qu'il puisse sauver plusieurs personnes.
choosen.sendMessage("§6Tu vas être réssucité en tant que §a§lVillageois§6."); choosen.sendMessage("§6Tu vas être réssuscité en tant que §a§lVillageois§6.");
hidePlayers(lgp); hidePlayers(lgp);
lgp.hideView(); lgp.hideView();
callback.run(); callback.run();
@ -250,7 +249,7 @@ public class RPretre extends Role{
villagers = (RVillageois)role; villagers = (RVillageois)role;
if(villagers == null) if(villagers == null)
getGame().getRoles().add(villagers = new RVillageois(getGame())); getGame().getRoles().add(villagers = new RVillageois(getGame()));
villagers.join(lgp, false);//Le joueur réssucité rejoint les villageois. villagers.join(lgp, false);//Le joueur réssuscité rejoint les villageois.
lgp.setRole(villagers); lgp.setRole(villagers);
lgp.getPlayer().removePotionEffect(PotionEffectType.INVISIBILITY); lgp.getPlayer().removePotionEffect(PotionEffectType.INVISIBILITY);
lgp.getPlayer().getInventory().setHelmet(null); lgp.getPlayer().getInventory().setHelmet(null);

View file

@ -0,0 +1,72 @@
package fr.leomelki.loupgarou.roles;
import fr.leomelki.loupgarou.classes.LGGame;
import fr.leomelki.loupgarou.classes.LGPlayer;
import fr.leomelki.loupgarou.classes.LGPlayer.LGChooseCallback;
public class RPronostiqueur extends Role{
public RPronostiqueur(LGGame game) {
super(game);
}
@Override
public RoleType getType() {
return RoleType.VILLAGER;
}
@Override
public RoleWinType getWinType() {
return RoleWinType.VILLAGE;
}
@Override
public String getName() {
return "§a§lPronostiqueur";
}
@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. Chaque nuit, tu peux espionner un joueur et découvrir s'il est gentil ou non. Cependant, dans certaines parties, vos pronostiques ne sont pas exacts...";
}
@Override
public String getTask() {
return "Choisis un joueur sur lequel pronostiquer.";
}
@Override
public String getBroadcastedTask() {
return "Le "+getName()+"§9 s'apprête à pronostiquer...";
}
@Override
public int getTimeout() {
return 15;
}
@Override
protected void onNightTurn(LGPlayer player, Runnable callback) {
player.showView();
player.choose(new LGChooseCallback() {
@Override
public void callback(LGPlayer choosen) {
if(choosen != null && choosen != player) {
//player.sendTitle("§6Vous avez regardé un rôle", "§e§l"+choosen.getName()+"§6§l est §e§l"+choosen.getRole().getName(), 5*20);
String gentilMechant = choosen.getRoleWinType() == RoleWinType.VILLAGE || choosen.getRoleWinType() == RoleWinType.NONE ? "§a§lgentil" : "§c§lméchant";
player.sendActionBarMessage("§e§l"+choosen.getName()+"§6 est "+gentilMechant);
player.sendMessage("§6Votre instinct vous dit que §7§l"+choosen.getName()+"§6 est "+gentilMechant+"§6.");
player.stopChoosing();
player.hideView();
callback.run();
}
}
});
}
@Override
protected void onNightTurnTimeout(LGPlayer player) {
player.stopChoosing();
player.hideView();
}
}

View file

@ -22,6 +22,7 @@ import fr.leomelki.loupgarou.events.LGGameEndEvent;
import fr.leomelki.loupgarou.events.LGNightPlayerPreKilledEvent; import fr.leomelki.loupgarou.events.LGNightPlayerPreKilledEvent;
import fr.leomelki.loupgarou.events.LGPlayerKilledEvent.Reason; import fr.leomelki.loupgarou.events.LGPlayerKilledEvent.Reason;
import fr.leomelki.loupgarou.events.LGPreDayStartEvent; import fr.leomelki.loupgarou.events.LGPreDayStartEvent;
import fr.leomelki.loupgarou.events.LGVampiredEvent;
import fr.leomelki.loupgarou.utils.VariableCache; import fr.leomelki.loupgarou.utils.VariableCache;
public class RSurvivant extends Role{ public class RSurvivant extends Role{
@ -146,15 +147,21 @@ public class RSurvivant extends Role{
@EventHandler @EventHandler
public void onPlayerKill(LGNightPlayerPreKilledEvent e) { public void onPlayerKill(LGNightPlayerPreKilledEvent e) {
if(e.getGame() == getGame() && (e.getReason() == Reason.LOUP_GAROU || e.getReason() == Reason.LOUP_BLANC || e.getReason() == Reason.GM_LOUP_GAROU || e.getReason() == Reason.ASSASSIN) && e.getKilled().getCache().getBoolean("survivant_protected")) { if(e.getGame() == getGame() && (e.getReason() == Reason.LOUP_GAROU || e.getReason() == Reason.LOUP_BLANC || e.getReason() == Reason.GM_LOUP_GAROU || e.getReason() == Reason.ASSASSIN) && e.getKilled().getCache().getBoolean("survivant_protected") && e.getKilled().isRoleActive()) {
e.setReason(Reason.DONT_DIE); e.setReason(Reason.DONT_DIE);
} }
} }
@EventHandler @EventHandler
public void onVampired(LGVampiredEvent e) {
if(e.getGame() == getGame() && e.getPlayer().getCache().getBoolean("survivant_protected"))
e.setProtect(true);
}
@EventHandler
public void onDayStart(LGPreDayStartEvent e) { public void onDayStart(LGPreDayStartEvent e) {
if(e.getGame() == getGame()) if(e.getGame() == getGame())
for(LGPlayer lgp : getGame().getInGame()) for(LGPlayer lgp : getGame().getInGame())
lgp.getCache().remove("survivant_protected"); if(lgp.isRoleActive())
lgp.getCache().remove("survivant_protected");
} }
@EventHandler @EventHandler

View file

@ -0,0 +1,229 @@
package fr.leomelki.loupgarou.roles;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.inventory.ItemStack;
import fr.leomelki.com.comphenix.packetwrapper.WrapperPlayServerScoreboardTeam;
import fr.leomelki.loupgarou.classes.LGCustomItems;
import fr.leomelki.loupgarou.classes.LGCustomSkin;
import fr.leomelki.loupgarou.classes.LGGame;
import fr.leomelki.loupgarou.classes.LGPlayer;
import fr.leomelki.loupgarou.classes.LGVote;
import fr.leomelki.loupgarou.classes.LGWinType;
import fr.leomelki.loupgarou.classes.LGCustomItems.LGCustomItemsConstraints;
import fr.leomelki.loupgarou.classes.chat.LGChat;
import fr.leomelki.loupgarou.events.LGCustomItemChangeEvent;
import fr.leomelki.loupgarou.events.LGDayEndEvent;
import fr.leomelki.loupgarou.events.LGGameEndEvent;
import fr.leomelki.loupgarou.events.LGNightEndEvent;
import fr.leomelki.loupgarou.events.LGNightStart;
import fr.leomelki.loupgarou.events.LGPlayerKilledEvent.Reason;
import fr.leomelki.loupgarou.events.LGSkinLoadEvent;
import fr.leomelki.loupgarou.events.LGUpdatePrefixEvent;
import fr.leomelki.loupgarou.events.LGVampiredEvent;
import lombok.Getter;
public class RVampire extends Role{
public RVampire(LGGame game) {
super(game);
}
@Override
public String getName() {
return "§5§lVampire";
}
@Override
public String getFriendlyName() {
return "des §5§lVampires";
}
@Override
public String getShortDescription() {
return "Tu gagnes avec les §5§lVampires";
}
@Override
public String getDescription() {
return "Tu gagnes avec les §5§lVampires§f. Chaque nuit, tu te réunis avec tes compères pour décider d'une victime à transformer en §5§lVampire§f... Lorsqu'une transformation a lieu, tous les §5§lVampires§f doivent se reposer la nuit suivante. Un joueur transformé perd tous les pouvoirs liés à son ancien rôle, et gagne avec les §5§lVampires§f.";
}
@Override
public String getTask() {
return "Votez pour une cible à mordre.";
}
@Override
public String getBroadcastedTask() {
return "Les §5§lVampires§9 choisissent leur cible.";
}
@Override
public RoleType getType() {
return RoleType.VAMPIRE;
}
@Override
public RoleWinType getWinType() {
return RoleWinType.VAMPIRE;
}
@Override
public int getTimeout() {
return 30;
}
@Override
public boolean hasPlayersLeft() {
return nextCanInfect < getGame().getNight() && super.hasPlayersLeft();
}
@Getter private LGChat chat = new LGChat((sender, message) -> {
return "§5"+sender.getName()+" §6» §f"+message;
});
int nextCanInfect = 0;
LGVote vote;
@Override
public void join(LGPlayer player, boolean sendMessage) {
super.join(player, sendMessage);
for(LGPlayer p : getPlayers())
p.updatePrefix();
}
public void onNightTurn(Runnable callback) {
vote = new LGVote(getTimeout(), getTimeout()/3, getGame(), false, false, (player, secondsLeft)-> {
return !getPlayers().contains(player) ? "§6C'est au tour "+getFriendlyName()+" §6(§e"+secondsLeft+" s§6)" : player.getCache().has("vote") ? "§l§9Vous votez pour §c§l"+player.getCache().<LGPlayer>get("vote").getName() : "§6Il vous reste §e"+secondsLeft+" seconde"+(secondsLeft > 1 ? "s" : "")+"§6 pour voter";
});
for(LGPlayer lgp : getGame().getAlive())
if(lgp.getRoleType() == RoleType.VAMPIRE)
lgp.showView();
for(LGPlayer player : getPlayers()) {
player.sendMessage("§6"+getTask());
// player.sendTitle("§6C'est à vous de jouer", "§a"+getTask(), 100);
player.joinChat(chat);
}
vote.start(getPlayers(), getPlayers(), ()->{
onNightTurnEnd();
callback.run();
}, getPlayers());
}
private void onNightTurnEnd() {
for(LGPlayer lgp : getGame().getAlive())
if(lgp.getRoleType() == RoleType.VAMPIRE)
lgp.hideView();
for(LGPlayer player : getPlayers())
player.leaveChat();
LGPlayer choosen = vote.getChoosen();
if(choosen == null) {
if(vote.getVotes().size() > 0) {
int max = 0;
boolean equal = false;
for(Entry<LGPlayer, List<LGPlayer>> entry : vote.getVotes().entrySet())
if(entry.getValue().size() > max) {
equal = false;
max = entry.getValue().size();
choosen = entry.getKey();
}else if(entry.getValue().size() == max)
equal = true;
if(equal) {
choosen = null;
ArrayList<LGPlayer> choosable = new ArrayList<LGPlayer>();
for(Entry<LGPlayer, List<LGPlayer>> entry : vote.getVotes().entrySet())
if(entry.getValue().size() == max && entry.getKey().getRoleType() != RoleType.VAMPIRE)
choosable.add(entry.getKey());
if(choosable.size() > 0)
choosen = choosable.get(getGame().getRandom().nextInt(choosable.size()));
}
}
}
if(choosen != null) {
if(choosen.getRoleType() == RoleType.LOUP_GAROU || choosen.getRoleType() == RoleType.VAMPIRE) {
for(LGPlayer player : getPlayers())
player.sendMessage("§cVotre cible est immunisée.");
return;
}else if(choosen.getRole() instanceof RChasseurDeVampire) {
for(LGPlayer player : getPlayers())
player.sendMessage("§cVotre cible est immunisée.");
getGame().kill(getPlayers().get(getPlayers().size()-1), Reason.CHASSEUR_DE_VAMPIRE);
return;
}
LGVampiredEvent event = new LGVampiredEvent(getGame(), choosen);
Bukkit.getPluginManager().callEvent(event);
if(event.isImmuned()) {
for(LGPlayer player : getPlayers())
player.sendMessage("§cVotre cible est immunisée.");
return;
}else if(event.isProtect()) {
for(LGPlayer player : getPlayers())
player.sendMessage("§cVotre cible est protégée.");
return;
}
for(LGPlayer player : getPlayers())
player.sendMessage("§7§l"+choosen.getName()+" s'est transformé en §5§lVampire§6.");
choosen.sendMessage("§6Tu as été infecté par les §5§lVampires §6pendant la nuit. Tu as perdu tes pouvoirs.");
choosen.sendMessage("§6§oTu gagnes désormais avec les §5§l§oVampires§6§o.");
choosen.getCache().set("vampire", true);
choosen.getCache().set("just_vampire", true);
nextCanInfect = getGame().getNight()+1;
join(choosen, false);
LGCustomItems.updateItem(choosen);
}else
for(LGPlayer player : getPlayers())
player.sendMessage("§6Personne n'a été infecté.");
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onDayStart(LGNightEndEvent e) {
if(e.getGame() == getGame())
for(LGPlayer player : getGame().getAlive()) {
if(player.getCache().getBoolean("just_vampire")) {
player.getCache().remove("just_vampire");
for(LGPlayer lgp : getGame().getInGame()) {
if(lgp.getRoleType() == RoleType.VAMPIRE)
lgp.sendMessage("§7§l"+player.getName()+"§6 s'est transformé en §5§lVampire§6...");
else
lgp.sendMessage("§6Quelqu'un s'est transformé en §5§lVampire§6...");
}
if(getGame().checkEndGame())
e.setCancelled(true);
}
}
}
/* @EventHandler(priority = EventPriority.HIGHEST)
public void onSkinChange(LGSkinLoadEvent e) {
if(e.getGame() == getGame())
if(getPlayers().contains(e.getPlayer()) && getPlayers().contains(e.getTo()) && showSkins) {
e.getProfile().getProperties().removeAll("textures");
e.getProfile().getProperties().put("textures", LGCustomSkin.WEREWOLF.getProperty());
}
}*/
@EventHandler
public void onGameEnd(LGGameEndEvent e) {
if(e.getGame() == getGame() && e.getWinType() == LGWinType.VAMPIRE)
for(LGPlayer lgp : getGame().getInGame())
if(lgp.getRoleWinType() == RoleWinType.VAMPIRE)//Changed to wintype
e.getWinners().add(lgp);
}
@EventHandler(priority = EventPriority.LOWEST)
public void onUpdatePrefix (LGUpdatePrefixEvent e) {
if(e.getGame() == getGame())
if(getPlayers().contains(e.getTo()) && getPlayers().contains(e.getPlayer()))
e.setPrefix(e.getPrefix()+"§5");
}
@EventHandler
public void onCustomItemChange(LGCustomItemChangeEvent e) {
if(e.getGame() == getGame())
if(e.getPlayer().getCache().getBoolean("vampire"))
e.getConstraints().add(LGCustomItemsConstraints.VAMPIRE_INFECTE.getName());
}
}

View file

@ -28,6 +28,7 @@ public class RVoyante extends Role{
public String getShortDescription() { public String getShortDescription() {
return "Tu gagnes avec le §a§lVillage"; return "Tu gagnes avec le §a§lVillage";
} }
@Override @Override
public String getDescription() { public String getDescription() {
return "Tu gagnes avec le §a§lVillage§f. Chaque nuit, tu peux espionner un joueur et découvrir sa véritable identité..."; return "Tu gagnes avec le §a§lVillage§f. Chaque nuit, tu peux espionner un joueur et découvrir sa véritable identité...";

View file

@ -1,10 +1,12 @@
package fr.leomelki.loupgarou.roles; package fr.leomelki.loupgarou.roles;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.concurrent.ThreadLocalRandom;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.scheduler.BukkitRunnable;
import fr.leomelki.loupgarou.MainLg; import fr.leomelki.loupgarou.MainLg;
import fr.leomelki.loupgarou.classes.LGCustomItems; import fr.leomelki.loupgarou.classes.LGCustomItems;
@ -59,20 +61,34 @@ public abstract class Role implements Listener{
return; return;
} }
LGPlayer player = players.remove(0); LGPlayer player = players.remove(0);
getGame().wait(getTimeout(), ()->{ if(player.isRoleActive()) {
try { getGame().wait(getTimeout(), ()->{
Role.this.onNightTurnTimeout(player); try {
}catch(Exception err) { Role.this.onNightTurnTimeout(player);
System.out.println("Error when timeout role"); }catch(Exception err) {
err.printStackTrace(); System.out.println("Error when timeout role");
} err.printStackTrace();
this.run(); }
}, (currentPlayer, secondsLeft)->{ this.run();
return currentPlayer == player ? "§9§lC'est à ton tour !" : "§6C'est au tour "+getFriendlyName()+" §6(§e"+secondsLeft+" s§6)"; }, (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); player.sendMessage("§6"+getTask());
onNightTurn(player, this); // 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(); }.run();
} }

View file

@ -16,6 +16,8 @@ public enum RoleSort {
LoupGarouBlanc, LoupGarouBlanc,
Assassin, Assassin,
Pyromane, Pyromane,
ChasseurDeVampire,
Vampire,
Pirate, Pirate,
Bouffon, Bouffon,
Sorciere, Sorciere,

View file

@ -3,5 +3,6 @@ package fr.leomelki.loupgarou.roles;
public enum RoleType { public enum RoleType {
VILLAGER, VILLAGER,
LOUP_GAROU, LOUP_GAROU,
VAMPIRE,
NEUTRAL; NEUTRAL;
} }

View file

@ -4,5 +4,6 @@ public enum RoleWinType {
SEUL, SEUL,
VILLAGE, VILLAGE,
LOUP_GAROU, LOUP_GAROU,
VAMPIRE,
NONE; NONE;
} }

View file

@ -20,7 +20,7 @@ public class VariousUtils {
WorldBorder wb = p.getWorld().getWorldBorder(); WorldBorder wb = p.getWorld().getWorldBorder();
container.getWorldBorderActions().write(0, EnumWrappers.WorldBorderAction.INITIALIZE); container.getWorldBorderActions().write(0, EnumWrappers.WorldBorderAction.INITIALIZE);
container.getIntegers().write(0, 29999984); container.getIntegers().write(0, 29999984);
container.getDoubles().write(0, p.getLocation().getX()); container.getDoubles().write(0, p.getLocation().getX());

View file

@ -1,5 +1,5 @@
name: LoupGarou name: LoupGarou
version: 1.0.1 version: 1.1.0
description: Permet de jouer au jeu du loup garou description: Permet de jouer au jeu du loup garou
main: fr.leomelki.loupgarou.MainLg main: fr.leomelki.loupgarou.MainLg
depend: [ProtocolLib] depend: [ProtocolLib]