From 5d41f506e596882d602bf28d38310934a70ca53b Mon Sep 17 00:00:00 2001 From: leomelki Date: Tue, 7 Apr 2020 13:57:26 +0200 Subject: [PATCH] Version 1.1.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- pom.xml | 2 +- .../java/fr/leomelki/loupgarou/MainLg.java | 32 ++- .../loupgarou/classes/LGCustomItems.java | 3 +- .../fr/leomelki/loupgarou/classes/LGGame.java | 62 +++-- .../leomelki/loupgarou/classes/LGPlayer.java | 8 +- .../fr/leomelki/loupgarou/classes/LGVote.java | 17 +- .../leomelki/loupgarou/classes/LGWinType.java | 1 + .../loupgarou/events/LGPlayerKilledEvent.java | 1 + .../loupgarou/events/LGVampiredEvent.java | 18 ++ .../loupgarou/listeners/JoinListener.java | 2 +- .../fr/leomelki/loupgarou/roles/RAnge.java | 7 +- .../leomelki/loupgarou/roles/RAssassin.java | 19 +- .../fr/leomelki/loupgarou/roles/RBouffon.java | 4 +- .../loupgarou/roles/RChaperonRouge.java | 6 +- .../leomelki/loupgarou/roles/RChasseur.java | 2 +- .../loupgarou/roles/RChasseurDeVampire.java | 100 ++++++++ .../leomelki/loupgarou/roles/RDictateur.java | 2 +- .../loupgarou/roles/REnfantSauvage.java | 2 +- .../leomelki/loupgarou/roles/RFaucheur.java | 2 +- .../fr/leomelki/loupgarou/roles/RGarde.java | 6 + .../fr/leomelki/loupgarou/roles/RMedium.java | 5 +- .../loupgarou/roles/RMontreurDOurs.java | 107 ++++++++ .../loupgarou/roles/RPetiteFille.java | 4 +- .../fr/leomelki/loupgarou/roles/RPirate.java | 4 +- .../fr/leomelki/loupgarou/roles/RPretre.java | 11 +- .../loupgarou/roles/RPronostiqueur.java | 72 ++++++ .../leomelki/loupgarou/roles/RSurvivant.java | 11 +- .../fr/leomelki/loupgarou/roles/RVampire.java | 229 ++++++++++++++++++ .../fr/leomelki/loupgarou/roles/RVoyante.java | 1 + .../fr/leomelki/loupgarou/roles/Role.java | 44 ++-- .../fr/leomelki/loupgarou/roles/RoleSort.java | 2 + .../fr/leomelki/loupgarou/roles/RoleType.java | 1 + .../leomelki/loupgarou/roles/RoleWinType.java | 1 + .../loupgarou/utils/VariousUtils.java | 2 +- src/main/java/plugin.yml | 2 +- 35 files changed, 721 insertions(+), 71 deletions(-) create mode 100644 src/main/java/fr/leomelki/loupgarou/events/LGVampiredEvent.java create mode 100644 src/main/java/fr/leomelki/loupgarou/roles/RChasseurDeVampire.java create mode 100644 src/main/java/fr/leomelki/loupgarou/roles/RMontreurDOurs.java create mode 100644 src/main/java/fr/leomelki/loupgarou/roles/RPronostiqueur.java create mode 100644 src/main/java/fr/leomelki/loupgarou/roles/RVampire.java diff --git a/pom.xml b/pom.xml index 18ed378..5e2b762 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 fr.leomelki LoupGarou - 1.0.1 + 1.1.0 UTF-8 UTF-8 diff --git a/src/main/java/fr/leomelki/loupgarou/MainLg.java b/src/main/java/fr/leomelki/loupgarou/MainLg.java index 0e3863d..784819e 100644 --- a/src/main/java/fr/leomelki/loupgarou/MainLg.java +++ b/src/main/java/fr/leomelki/loupgarou/MainLg.java @@ -56,6 +56,7 @@ import fr.leomelki.loupgarou.roles.RAssassin; import fr.leomelki.loupgarou.roles.RBouffon; import fr.leomelki.loupgarou.roles.RChaperonRouge; import fr.leomelki.loupgarou.roles.RChasseur; +import fr.leomelki.loupgarou.roles.RChasseurDeVampire; import fr.leomelki.loupgarou.roles.RChienLoup; import fr.leomelki.loupgarou.roles.RCorbeau; 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.RLoupGarouNoir; import fr.leomelki.loupgarou.roles.RMedium; +import fr.leomelki.loupgarou.roles.RMontreurDOurs; import fr.leomelki.loupgarou.roles.RPetiteFille; import fr.leomelki.loupgarou.roles.RPirate; import fr.leomelki.loupgarou.roles.RPretre; import fr.leomelki.loupgarou.roles.RPyromane; import fr.leomelki.loupgarou.roles.RSorciere; import fr.leomelki.loupgarou.roles.RSurvivant; +import fr.leomelki.loupgarou.roles.RVampire; import fr.leomelki.loupgarou.roles.RVillageois; import fr.leomelki.loupgarou.roles.RVoyante; import fr.leomelki.loupgarou.roles.Role; +import fr.leomelki.loupgarou.utils.VariousUtils; import lombok.Getter; import lombok.Setter; @@ -100,7 +104,6 @@ public class MainLg extends JavaPlugin{ saveConfig(); } loadConfig(); - Bukkit.getConsoleSender().sendMessage("/"); Bukkit.getPluginManager().registerEvents(new JoinListener(), this); Bukkit.getPluginManager().registerEvents(new CancelListener(), 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 !"); return true; }else if(args[0].equalsIgnoreCase("end")) { - LGPlayer.thePlayer(Bukkit.getPlayer(args[1])).getGame().cancelWait(); - LGPlayer.thePlayer(Bukkit.getPlayer(args[1])).getGame().endGame(LGWinType.EQUAL); - LGPlayer.thePlayer(Bukkit.getPlayer(args[1])).getGame().broadcastMessage("§cLa partie a été arrêtée de force !"); + if(args.length != 2) { + sender.sendMessage("§4Utilisation : §c/lg end "); + 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; }else if(args[0].equalsIgnoreCase("start")) { if(args.length < 2) { @@ -240,6 +257,10 @@ public class MainLg extends JavaPlugin{ return true; } 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()) { 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"); @@ -413,6 +434,9 @@ public class MainLg extends JavaPlugin{ roles.put("Pretre", RPretre.class.getConstructor(LGGame.class)); roles.put("Faucheur", RFaucheur.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) { e.printStackTrace(); } diff --git a/src/main/java/fr/leomelki/loupgarou/classes/LGCustomItems.java b/src/main/java/fr/leomelki/loupgarou/classes/LGCustomItems.java index 72c4905..1a12a47 100644 --- a/src/main/java/fr/leomelki/loupgarou/classes/LGCustomItems.java +++ b/src/main/java/fr/leomelki/loupgarou/classes/LGCustomItems.java @@ -21,7 +21,7 @@ public class LGCustomItems { static { JSONParser parser = new JSONParser(); try { - JSONObject mappings = (JSONObject)parser.parse("{\"PetiteFille\":{\"\":\"SCUTE\",\"infecte\":\"ORANGE_CONCRETE\",\"infecte_mort\":\"WOODEN_SHOVEL\",\"infecte_maire\":\"SOUL_SAND\",\"maire\":\"EXPERIENCE_BOTTLE\",\"mort\":\"STRING\",\"maire_mort\":\"DARK_OAK_SIGN\",\"infecte_maire_mort\":\"PURPLE_SHULKER_BOX\"},\"LoupGarou\":{\"\":\"OAK_PLANKS\",\"infecte\":\"DRAGON_BREATH\",\"infecte_mort\":\"GOLDEN_PICKAXE\",\"infecte_maire\":\"WITHER_SKELETON_SKULL\",\"maire\":\"TRAPPED_CHEST\",\"maire_mort\":\"BRICK_WALL\",\"mort\":\"MELON\",\"infecte_maire_mort\":\"DARK_OAK_LEAVES\"},\"Corbeau\":{\"infecte_mort\":\"RED_TULIP\",\"infecte\":\"PURPLE_STAINED_GLASS\",\"\":\"HEAVY_WEIGHTED_PRESSURE_PLATE\",\"infecte_maire\":\"PUFFERFISH_BUCKET\",\"maire\":\"DIAMOND_CHESTPLATE\",\"maire_mort\":\"SPRUCE_PLANKS\",\"mort\":\"DARK_OAK_BOAT\",\"infecte_maire_mort\":\"WOODEN_PICKAXE\"},\"LoupGarouBlanc\":{\"infecte_mort\":\"DEAD_TUBE_CORAL_WALL_FAN\",\"infecte\":\"CORNFLOWER\",\"\":\"ANDESITE\",\"infecte_maire\":\"GRINDSTONE\",\"maire\":\"TUBE_CORAL\",\"mort\":\"STONE_PICKAXE\",\"maire_mort\":\"PURPLE_CONCRETE\",\"infecte_maire_mort\":\"CYAN_DYE\"},\"Assassin\":{\"infecte\":\"WITHER_ROSE\",\"\":\"GRAY_CONCRETE_POWDER\",\"infecte_mort\":\"ACACIA_DOOR\",\"infecte_maire\":\"ENCHANTING_TABLE\",\"maire\":\"DEAD_HORN_CORAL_FAN\",\"maire_mort\":\"WOODEN_AXE\",\"mort\":\"HOPPER\",\"infecte_maire_mort\":\"RED_STAINED_GLASS\"},\"Voyante\":{\"infecte_mort\":\"OAK_DOOR\",\"\":\"RED_CONCRETE_POWDER\",\"infecte\":\"END_STONE_BRICKS\",\"infecte_maire\":\"FARMLAND\",\"maire\":\"POPPY\",\"maire_mort\":\"PINK_CONCRETE_POWDER\",\"mort\":\"MUSHROOM_STEM\",\"infecte_maire_mort\":\"WHITE_BANNER\"},\"Dictateur\":{\"\":\"PRISMARINE_SHARD\",\"infecte_mort\":\"CYAN_TERRACOTTA\",\"infecte\":\"CYAN_GLAZED_TERRACOTTA\",\"infecte_maire\":\"REPEATER\",\"maire\":\"GREEN_BED\",\"maire_mort\":\"SPRUCE_TRAPDOOR\",\"mort\":\"DRIED_KELP_BLOCK\",\"infecte_maire_mort\":\"LIME_STAINED_GLASS_PANE\"},\"LoupGarouNoir\":{\"infecte_mort\":\"COBBLESTONE_WALL\",\"\":\"SLIME_BLOCK\",\"infecte\":\"TORCH\",\"infecte_maire\":\"CHORUS_FLOWER\",\"maire\":\"LANTERN\",\"maire_mort\":\"BRAIN_CORAL_WALL_FAN\",\"mort\":\"YELLOW_CARPET\",\"infecte_maire_mort\":\"MOJANG_BANNER_PATTERN\"},\"ChaperonRouge\":{\"\":\"GRASS\",\"infecte\":\"LIME_BANNER\",\"infecte_mort\":\"ORANGE_SHULKER_BOX\",\"infecte_maire\":\"STONE_SLAB\",\"maire\":\"BLUE_GLAZED_TERRACOTTA\",\"mort\":\"PURPLE_TERRACOTTA\",\"maire_mort\":\"YELLOW_DYE\",\"infecte_maire_mort\":\"EMERALD_ORE\"},\"EnfantSauvage\":{\"infecte\":\"GREEN_CARPET\",\"\":\"BLACK_STAINED_GLASS\",\"infecte_mort\":\"CHEST_MINECART\",\"infecte_maire\":\"MAGENTA_STAINED_GLASS\",\"maire\":\"ACACIA_SIGN\",\"mort\":\"GRAY_BANNER\",\"maire_mort\":\"POLISHED_DIORITE_SLAB\",\"infecte_maire_mort\":\"WHITE_STAINED_GLASS_PANE\"},\"Faucheur\":{\"infecte_mort\":\"RED_STAINED_GLASS_PANE\",\"infecte\":\"CYAN_WOOL\",\"\":\"MOSSY_COBBLESTONE_SLAB\",\"infecte_maire\":\"PISTON\",\"maire\":\"GOLDEN_HELMET\",\"maire_mort\":\"BIRCH_FENCE\",\"mort\":\"SKELETON_SKULL\",\"infecte_maire_mort\":\"LIGHT_BLUE_TERRACOTTA\"},\"Cupidon\":{\"\":\"CHORUS_PLANT\",\"infecte_mort\":\"SPRUCE_SIGN\",\"infecte\":\"TRIDENT\",\"infecte_maire\":\"GLOBE_BANNER_PATTERN\",\"maire\":\"YELLOW_STAINED_GLASS_PANE\",\"maire_mort\":\"BROWN_STAINED_GLASS_PANE\",\"mort\":\"GOLDEN_BOOTS\",\"infecte_maire_mort\":\"SEA_LANTERN\"},\"EnfantSauvageLG\":{\"\":\"HORN_CORAL_FAN\",\"infecte_mort\":\"JUNGLE_LOG\",\"infecte\":\"CARTOGRAPHY_TABLE\",\"infecte_maire\":\"BLACK_STAINED_GLASS_PANE\",\"maire\":\"YELLOW_GLAZED_TERRACOTTA\",\"maire_mort\":\"OXEYE_DAISY\",\"mort\":\"STICK\",\"infecte_maire_mort\":\"BROWN_MUSHROOM_BLOCK\"},\"Chasseur\":{\"infecte_mort\":\"COAL\",\"infecte\":\"PRISMARINE_SLAB\",\"\":\"DIORITE\",\"infecte_maire\":\"BLUE_CONCRETE\",\"maire\":\"DEAD_TUBE_CORAL_BLOCK\",\"maire_mort\":\"MAGENTA_TERRACOTTA\",\"mort\":\"CAKE\",\"infecte_maire_mort\":\"YELLOW_WOOL\"},\"Bouffon\":{\"infecte\":\"BIRCH_PLANKS\",\"\":\"LECTERN\",\"infecte_mort\":\"GREEN_CONCRETE_POWDER\",\"infecte_maire\":\"RABBIT_FOOT\",\"maire\":\"FIRE_CORAL_BLOCK\",\"maire_mort\":\"STRIPPED_OAK_WOOD\",\"mort\":\"DEAD_HORN_CORAL_WALL_FAN\",\"infecte_maire_mort\":\"LAPIS_BLOCK\"},\"Detective\":{\"\":\"GLASS_PANE\",\"infecte_mort\":\"RED_BED\",\"infecte\":\"MAGENTA_WOOL\",\"infecte_maire\":\"CHEST\",\"maire\":\"FEATHER\",\"mort\":\"REDSTONE_TORCH\",\"maire_mort\":\"DARK_OAK_BUTTON\",\"infecte_maire_mort\":\"GREEN_WOOL\"},\"GrandMechantLoup\":{\"infecte_mort\":\"LIGHT_BLUE_WOOL\",\"\":\"CHISELED_RED_SANDSTONE\",\"infecte\":\"LIGHT_GRAY_BED\",\"infecte_maire\":\"RABBIT_HIDE\",\"maire\":\"COCOA_BEANS\",\"maire_mort\":\"MILK_BUCKET\",\"mort\":\"PURPLE_GLAZED_TERRACOTTA\",\"infecte_maire_mort\":\"YELLOW_CONCRETE\"},\"Survivant\":{\"\":\"SLIME_BALL\",\"infecte_mort\":\"POPPED_CHORUS_FRUIT\",\"infecte\":\"INFESTED_COBBLESTONE\",\"infecte_maire\":\"GRAY_TERRACOTTA\",\"maire\":\"CHARCOAL\",\"mort\":\"PINK_STAINED_GLASS_PANE\",\"maire_mort\":\"MAGENTA_DYE\",\"infecte_maire_mort\":\"NETHER_BRICK_FENCE\"},\"ChienLoupLG\":{\"\":\"LEATHER_HORSE_ARMOR\",\"infecte\":\"BIRCH_BUTTON\",\"infecte_mort\":\"BLAST_FURNACE\",\"infecte_maire\":\"GLASS_BOTTLE\",\"maire\":\"PODZOL\",\"mort\":\"END_ROD\",\"maire_mort\":\"SPRUCE_LOG\",\"infecte_maire_mort\":\"MAGENTA_CARPET\"},\"Garde\":{\"\":\"BRICK_SLAB\",\"infecte\":\"GRAY_STAINED_GLASS\",\"infecte_mort\":\"DARK_OAK_PLANKS\",\"infecte_maire\":\"PURPUR_SLAB\",\"maire\":\"BLACK_TERRACOTTA\",\"maire_mort\":\"IRON_HELMET\",\"mort\":\"DIRT\",\"infecte_maire_mort\":\"ACACIA_WOOD\"},\"Villageois\":{\"\":\"DEAD_BUSH\",\"infecte_mort\":\"DIAMOND_AXE\",\"infecte\":\"CYAN_BED\",\"infecte_maire\":\"PINK_CONCRETE\",\"maire\":\"LEAD\",\"maire_mort\":\"LIME_CONCRETE\",\"mort\":\"DEAD_BRAIN_CORAL\",\"infecte_maire_mort\":\"SUNFLOWER\"},\"Ange\":{\"\":\"POLISHED_GRANITE_SLAB\",\"infecte\":\"BROWN_BED\",\"infecte_mort\":\"MOSSY_STONE_BRICK_WALL\",\"infecte_maire\":\"DEAD_FIRE_CORAL_WALL_FAN\",\"maire\":\"SANDSTONE\",\"maire_mort\":\"POLISHED_DIORITE\",\"mort\":\"NETHER_BRICK_SLAB\",\"infecte_maire_mort\":\"BONE_MEAL\"},\"ChienLoup\":{\"\":\"GRANITE_SLAB\",\"infecte_mort\":\"JUNGLE_PLANKS\",\"infecte\":\"PAINTING\",\"infecte_maire\":\"MOSSY_COBBLESTONE\",\"maire\":\"SUGAR_CANE\",\"mort\":\"MOSSY_STONE_BRICK_SLAB\",\"maire_mort\":\"RED_BANNER\",\"infecte_maire_mort\":\"END_CRYSTAL\"},\"Medium\":{\"infecte_mort\":\"GRAY_SHULKER_BOX\",\"infecte\":\"LIGHT_BLUE_BANNER\",\"\":\"OAK_TRAPDOOR\",\"infecte_maire\":\"LIGHT_BLUE_STAINED_GLASS_PANE\",\"maire\":\"FERN\",\"maire_mort\":\"WHITE_TERRACOTTA\",\"mort\":\"STICKY_PISTON\",\"infecte_maire_mort\":\"CYAN_SHULKER_BOX\"},\"Pyromane\":{\"\":\"BLUE_ICE\",\"infecte_mort\":\"PURPLE_WOOL\",\"infecte\":\"BEDROCK\",\"infecte_maire\":\"STONE_BRICK_WALL\",\"maire\":\"DEAD_BUBBLE_CORAL_BLOCK\",\"mort\":\"ORANGE_TULIP\",\"maire_mort\":\"PINK_STAINED_GLASS\",\"infecte_maire_mort\":\"GREEN_TERRACOTTA\"},\"Pirate\":{\"infecte\":\"BLUE_STAINED_GLASS\",\"\":\"RED_MUSHROOM_BLOCK\",\"infecte_mort\":\"SPAWNER\",\"infecte_maire\":\"STRIPPED_DARK_OAK_LOG\",\"maire\":\"DROPPER\",\"maire_mort\":\"COBBLESTONE_SLAB\",\"mort\":\"ENDER_CHEST\",\"infecte_maire_mort\":\"IRON_INGOT\"},\"Pretre\":{\"\":\"SNOWBALL\",\"infecte_mort\":\"PINK_BANNER\",\"infecte\":\"ORANGE_BED\",\"infecte_maire\":\"SPRUCE_LEAVES\",\"maire\":\"PRISMARINE_WALL\",\"maire_mort\":\"DEAD_BUBBLE_CORAL\",\"mort\":\"WHITE_SHULKER_BOX\",\"infecte_maire_mort\":\"FLINT\"},\"Sorciere\":{\"\":\"NETHERRACK\",\"infecte_mort\":\"OAK_SIGN\",\"infecte\":\"CONDUIT\",\"infecte_maire\":\"IRON_HORSE_ARMOR\",\"maire\":\"STRIPPED_OAK_LOG\",\"mort\":\"HORN_CORAL_BLOCK\",\"maire_mort\":\"COMPOSTER\",\"infecte_maire_mort\":\"BIRCH_FENCE_GATE\"}}"); + JSONObject mappings = (JSONObject)parser.parse("{\"PetiteFille\":{\"\":\"WET_SPONGE\",\"infecte\":\"ORANGE_BED\",\"infecte_mort\":\"ACACIA_WOOD\",\"infecte_maire\":\"SPRUCE_TRAPDOOR\",\"vampire-infecte\":\"BLAST_FURNACE\",\"maire\":\"POPPY\",\"mort\":\"STONE_SLAB\",\"maire_mort\":\"OAK_PLANKS\",\"mort_vampire-infecte\":\"GREEN_SHULKER_BOX\",\"maire_vampire-infecte\":\"SPRUCE_WOOD\",\"infecte_maire_mort\":\"DARK_OAK_PRESSURE_PLATE\",\"maire_mort_vampire-infecte\":\"LIGHT_BLUE_CONCRETE\"},\"LoupGarou\":{\"\":\"DARK_OAK_TRAPDOOR\",\"infecte\":\"CORNFLOWER\",\"infecte_mort\":\"GREEN_WOOL\",\"infecte_maire\":\"RED_BANNER\",\"vampire-infecte\":\"ACACIA_DOOR\",\"maire\":\"PRISMARINE_WALL\",\"maire_mort\":\"BLACK_STAINED_GLASS\",\"mort\":\"DEAD_BRAIN_CORAL\",\"mort_vampire-infecte\":\"COMPARATOR\",\"maire_vampire-infecte\":\"STONE_BRICK_SLAB\",\"infecte_maire_mort\":\"MAGMA_BLOCK\",\"maire_mort_vampire-infecte\":\"JUNGLE_TRAPDOOR\"},\"Corbeau\":{\"infecte_mort\":\"PINK_CONCRETE_POWDER\",\"infecte\":\"TRIDENT\",\"\":\"GRAY_BED\",\"infecte_maire\":\"OAK_SIGN\",\"vampire-infecte\":\"STRIPPED_DARK_OAK_LOG\",\"maire\":\"YELLOW_GLAZED_TERRACOTTA\",\"maire_mort\":\"LECTERN\",\"mort\":\"MELON\",\"mort_vampire-infecte\":\"BARREL\",\"maire_vampire-infecte\":\"LIGHT_GRAY_DYE\",\"infecte_maire_mort\":\"REDSTONE_LAMP\",\"maire_mort_vampire-infecte\":\"BELL\"},\"MontreurDOurs\":{\"infecte_mort\":\"LIGHT_BLUE_TERRACOTTA\",\"\":\"BLUE_DYE\",\"infecte\":\"BLUE_STAINED_GLASS\",\"infecte_maire\":\"DARK_OAK_BUTTON\",\"vampire-infecte\":\"JUNGLE_PLANKS\",\"maire\":\"LEAD\",\"maire_mort\":\"CHISELED_RED_SANDSTONE\",\"mort\":\"RABBIT_FOOT\",\"mort_vampire-infecte\":\"SKULL_BANNER_PATTERN\",\"maire_vampire-infecte\":\"PETRIFIED_OAK_SLAB\",\"infecte_maire_mort\":\"BRAIN_CORAL_FAN\",\"maire_mort_vampire-infecte\":\"CHISELED_SANDSTONE\"},\"LoupGarouBlanc\":{\"infecte_mort\":\"LIME_STAINED_GLASS_PANE\",\"infecte\":\"TORCH\",\"\":\"ACACIA_FENCE_GATE\",\"infecte_maire\":\"SPRUCE_LOG\",\"vampire-infecte\":\"GREEN_CONCRETE_POWDER\",\"maire\":\"DEAD_BUBBLE_CORAL_BLOCK\",\"mort\":\"MUSHROOM_STEM\",\"maire_mort\":\"HORN_CORAL_FAN\",\"mort_vampire-infecte\":\"ORANGE_CARPET\",\"maire_vampire-infecte\":\"MAGENTA_BANNER\",\"infecte_maire_mort\":\"FLOWER_BANNER_PATTERN\",\"maire_mort_vampire-infecte\":\"GRASS_PATH\"},\"Assassin\":{\"infecte\":\"WITHER_ROSE\",\"\":\"ENCHANTED_BOOK\",\"infecte_mort\":\"DARK_OAK_SIGN\",\"infecte_maire\":\"DEAD_TUBE_CORAL_WALL_FAN\",\"vampire-infecte\":\"PURPUR_SLAB\",\"maire\":\"DEAD_TUBE_CORAL_BLOCK\",\"maire_mort\":\"BIRCH_FENCE_GATE\",\"mort\":\"REDSTONE_TORCH\",\"mort_vampire-infecte\":\"ACACIA_SLAB\",\"maire_vampire-infecte\":\"DEAD_BUSH\",\"infecte_maire_mort\":\"INFESTED_MOSSY_STONE_BRICKS\",\"maire_mort_vampire-infecte\":\"BLACK_SHULKER_BOX\"},\"Voyante\":{\"infecte_mort\":\"FLINT\",\"\":\"DRAGON_HEAD\",\"infecte\":\"FIRE_CORAL_BLOCK\",\"infecte_maire\":\"BRAIN_CORAL_WALL_FAN\",\"vampire-infecte\":\"LIGHT_BLUE_WOOL\",\"maire\":\"DARK_OAK_BOAT\",\"maire_mort\":\"NETHERRACK\",\"mort\":\"BLACK_STAINED_GLASS_PANE\",\"mort_vampire-infecte\":\"WHEAT_SEEDS\",\"maire_vampire-infecte\":\"GRAY_GLAZED_TERRACOTTA\",\"infecte_maire_mort\":\"LIGHT_BLUE_SHULKER_BOX\",\"maire_mort_vampire-infecte\":\"TURTLE_HELMET\"},\"Dictateur\":{\"\":\"STRIPPED_DARK_OAK_WOOD\",\"infecte_mort\":\"LAPIS_BLOCK\",\"infecte\":\"GREEN_CARPET\",\"infecte_maire\":\"OAK_DOOR\",\"vampire-infecte\":\"STONE_BRICK_WALL\",\"maire\":\"COCOA_BEANS\",\"maire_mort\":\"GRANITE_SLAB\",\"mort\":\"STICKY_PISTON\",\"mort_vampire-infecte\":\"GRAY_CARPET\",\"maire_vampire-infecte\":\"ACACIA_BOAT\",\"infecte_maire_mort\":\"JUNGLE_LEAVES\",\"maire_mort_vampire-infecte\":\"RED_MUSHROOM\"},\"LoupGarouNoir\":{\"infecte_mort\":\"WHITE_STAINED_GLASS_PANE\",\"\":\"YELLOW_BED\",\"infecte\":\"LIGHT_BLUE_BANNER\",\"infecte_maire\":\"SPRUCE_PLANKS\",\"vampire-infecte\":\"ORANGE_SHULKER_BOX\",\"maire\":\"STRIPPED_OAK_LOG\",\"maire_mort\":\"MOSSY_COBBLESTONE_SLAB\",\"mort\":\"DEAD_FIRE_CORAL_WALL_FAN\",\"mort_vampire-infecte\":\"BIRCH_SIGN\",\"maire_vampire-infecte\":\"BEETROOT_SEEDS\",\"infecte_maire_mort\":\"BEACON\",\"maire_mort_vampire-infecte\":\"CLAY\"},\"ChaperonRouge\":{\"\":\"YELLOW_CONCRETE_POWDER\",\"infecte\":\"LIME_BANNER\",\"infecte_mort\":\"DEAD_BUBBLE_CORAL\",\"infecte_maire\":\"GRAY_SHULKER_BOX\",\"vampire-infecte\":\"WITHER_SKELETON_SKULL\",\"maire\":\"PODZOL\",\"mort\":\"GRAY_BANNER\",\"maire_mort\":\"LIGHT_BLUE_DYE\",\"mort_vampire-infecte\":\"INK_SAC\",\"maire_vampire-infecte\":\"PURPLE_CARPET\",\"infecte_maire_mort\":\"WHITE_CONCRETE_POWDER\",\"maire_mort_vampire-infecte\":\"LAPIS_LAZULI\"},\"EnfantSauvage\":{\"infecte\":\"CARTOGRAPHY_TABLE\",\"\":\"LIGHT_GRAY_STAINED_GLASS_PANE\",\"infecte_mort\":\"YELLOW_WOOL\",\"infecte_maire\":\"POLISHED_DIORITE\",\"vampire-infecte\":\"IRON_HORSE_ARMOR\",\"maire\":\"TUBE_CORAL\",\"mort\":\"STRING\",\"maire_mort\":\"LEATHER_HORSE_ARMOR\",\"mort_vampire-infecte\":\"DARK_OAK_FENCE\",\"maire_vampire-infecte\":\"SPRUCE_DOOR\",\"infecte_maire_mort\":\"YELLOW_TERRACOTTA\",\"maire_mort_vampire-infecte\":\"BAMBOO\"},\"Faucheur\":{\"infecte_mort\":\"MAGENTA_CARPET\",\"infecte\":\"GRAY_STAINED_GLASS\",\"\":\"LIME_GLAZED_TERRACOTTA\",\"infecte_maire\":\"STRIPPED_OAK_WOOD\",\"vampire-infecte\":\"PINK_CONCRETE\",\"maire\":\"FERN\",\"maire_mort\":\"CHORUS_PLANT\",\"mort\":\"ORANGE_TULIP\",\"mort_vampire-infecte\":\"MAGENTA_GLAZED_TERRACOTTA\",\"maire_vampire-infecte\":\"NETHER_BRICK_WALL\",\"infecte_maire_mort\":\"DARK_OAK_FENCE_GATE\",\"maire_mort_vampire-infecte\":\"STRIPPED_BIRCH_LOG\"},\"Cupidon\":{\"\":\"SPRUCE_SLAB\",\"infecte_mort\":\"BONE_MEAL\",\"infecte\":\"MAGENTA_WOOL\",\"infecte_maire\":\"POPPED_CHORUS_FRUIT\",\"vampire-infecte\":\"LAVA_BUCKET\",\"maire\":\"GOLDEN_HELMET\",\"maire_mort\":\"GRASS\",\"mort\":\"STONE_PICKAXE\",\"mort_vampire-infecte\":\"LIGHT_GRAY_CARPET\",\"maire_vampire-infecte\":\"DAMAGED_ANVIL\",\"infecte_maire_mort\":\"COBBLESTONE\",\"maire_mort_vampire-infecte\":\"JUNGLE_FENCE_GATE\"},\"EnfantSauvageLG\":{\"\":\"SAND\",\"infecte_mort\":\"END_CRYSTAL\",\"infecte\":\"CYAN_WOOL\",\"infecte_maire\":\"WOODEN_AXE\",\"vampire-infecte\":\"GRAY_TERRACOTTA\",\"maire\":\"LANTERN\",\"maire_mort\":\"HEAVY_WEIGHTED_PRESSURE_PLATE\",\"mort\":\"WHITE_SHULKER_BOX\",\"mort_vampire-infecte\":\"BUBBLE_CORAL_FAN\",\"maire_vampire-infecte\":\"BIRCH_PRESSURE_PLATE\",\"infecte_maire_mort\":\"PINK_CARPET\",\"maire_mort_vampire-infecte\":\"BLAZE_POWDER\"},\"Chasseur\":{\"infecte_mort\":\"PINK_STAINED_GLASS\",\"infecte\":\"PRISMARINE_SLAB\",\"\":\"SEAGRASS\",\"infecte_maire\":\"WOODEN_SHOVEL\",\"vampire-infecte\":\"GRINDSTONE\",\"maire\":\"YELLOW_STAINED_GLASS_PANE\",\"maire_mort\":\"SUNFLOWER\",\"mort\":\"STICK\",\"mort_vampire-infecte\":\"YELLOW_BANNER\",\"maire_vampire-infecte\":\"SPONGE\",\"infecte_maire_mort\":\"HOPPER_MINECART\",\"maire_mort_vampire-infecte\":\"CYAN_CONCRETE\"},\"Bouffon\":{\"infecte\":\"BIRCH_PLANKS\",\"\":\"ACACIA_SAPLING\",\"infecte_mort\":\"COBBLESTONE_SLAB\",\"infecte_maire\":\"COBBLESTONE_WALL\",\"vampire-infecte\":\"RABBIT_HIDE\",\"maire\":\"SUGAR_CANE\",\"maire_mort\":\"NETHER_BRICK_FENCE\",\"mort\":\"DRIED_KELP_BLOCK\",\"mort_vampire-infecte\":\"END_STONE_BRICK_SLAB\",\"maire_vampire-infecte\":\"RED_CONCRETE_POWDER\",\"infecte_maire_mort\":\"BUBBLE_CORAL\",\"maire_mort_vampire-infecte\":\"IRON_ORE\"},\"Detective\":{\"\":\"CROSSBOW\",\"infecte_mort\":\"RED_STAINED_GLASS\",\"infecte\":\"CYAN_GLAZED_TERRACOTTA\",\"infecte_maire\":\"DIAMOND_AXE\",\"vampire-infecte\":\"SPRUCE_LEAVES\",\"maire\":\"BLACK_TERRACOTTA\",\"mort\":\"YELLOW_CARPET\",\"maire_mort\":\"DIORITE\",\"mort_vampire-infecte\":\"ZOMBIE_HEAD\",\"maire_vampire-infecte\":\"ENDER_EYE\",\"infecte_maire_mort\":\"PINK_SHULKER_BOX\",\"maire_mort_vampire-infecte\":\"DEAD_FIRE_CORAL_BLOCK\"},\"GrandMechantLoup\":{\"infecte_mort\":\"SEA_LANTERN\",\"\":\"OBSERVER\",\"infecte\":\"DRAGON_BREATH\",\"infecte_maire\":\"MAGENTA_TERRACOTTA\",\"vampire-infecte\":\"MOSSY_STONE_BRICK_WALL\",\"maire\":\"DROPPER\",\"maire_mort\":\"PRISMARINE_SHARD\",\"mort\":\"PINK_STAINED_GLASS_PANE\",\"mort_vampire-infecte\":\"SMOKER\",\"maire_vampire-infecte\":\"COAL_ORE\",\"infecte_maire_mort\":\"ORANGE_WOOL\",\"maire_mort_vampire-infecte\":\"FIRE_CORAL_FAN\"},\"Survivant\":{\"\":\"BROWN_DYE\",\"infecte_mort\":\"CYAN_SHULKER_BOX\",\"infecte\":\"END_STONE_BRICKS\",\"infecte_maire\":\"MILK_BUCKET\",\"vampire-infecte\":\"JUNGLE_LOG\",\"maire\":\"CAKE\",\"mort\":\"GLOBE_BANNER_PATTERN\",\"maire_mort\":\"RED_MUSHROOM_BLOCK\",\"mort_vampire-infecte\":\"FIRE_CORAL_WALL_FAN\",\"maire_vampire-infecte\":\"BLACK_CONCRETE\",\"infecte_maire_mort\":\"LILY_PAD\",\"maire_mort_vampire-infecte\":\"MINECART\"},\"ChienLoupLG\":{\"\":\"RED_NETHER_BRICK_SLAB\",\"infecte\":\"PURPLE_STAINED_GLASS\",\"infecte_mort\":\"LIME_CONCRETE\",\"infecte_maire\":\"PURPLE_WOOL\",\"vampire-infecte\":\"SOUL_SAND\",\"maire\":\"ACACIA_SIGN\",\"mort\":\"PURPLE_GLAZED_TERRACOTTA\",\"maire_mort\":\"GRAY_CONCRETE_POWDER\",\"mort_vampire-infecte\":\"IRON_DOOR\",\"maire_vampire-infecte\":\"JUNGLE_DOOR\",\"infecte_maire_mort\":\"DARK_OAK_DOOR\",\"maire_mort_vampire-infecte\":\"JUNGLE_BOAT\"},\"Garde\":{\"\":\"RED_SANDSTONE\",\"infecte\":\"LIGHT_GRAY_BED\",\"infecte_mort\":\"WOODEN_PICKAXE\",\"infecte_maire\":\"YELLOW_DYE\",\"vampire-infecte\":\"FARMLAND\",\"maire\":\"EXPERIENCE_BOTTLE\",\"maire_mort\":\"GLASS_PANE\",\"mort\":\"HORN_CORAL_BLOCK\",\"mort_vampire-infecte\":\"DEAD_HORN_CORAL_BLOCK\",\"maire_vampire-infecte\":\"LIME_DYE\",\"infecte_maire_mort\":\"VINE\",\"maire_mort_vampire-infecte\":\"TNT_MINECART\"},\"Villageois\":{\"\":\"SPRUCE_FENCE\",\"infecte_mort\":\"IRON_INGOT\",\"infecte\":\"DEAD_HORN_CORAL_FAN\",\"infecte_maire\":\"PURPLE_CONCRETE\",\"vampire-infecte\":\"DARK_OAK_PLANKS\",\"maire\":\"END_ROD\",\"maire_mort\":\"BLUE_ICE\",\"mort\":\"MAGENTA_STAINED_GLASS\",\"mort_vampire-infecte\":\"ENDER_PEARL\",\"maire_vampire-infecte\":\"COMMAND_BLOCK\",\"infecte_maire_mort\":\"TERRACOTTA\",\"maire_mort_vampire-infecte\":\"ACACIA_BUTTON\"},\"Ange\":{\"\":\"CAMPFIRE\",\"infecte\":\"BROWN_BED\",\"infecte_mort\":\"WHITE_TERRACOTTA\",\"infecte_maire\":\"GOLDEN_PICKAXE\",\"vampire-infecte\":\"PISTON\",\"maire\":\"BLUE_GLAZED_TERRACOTTA\",\"maire_mort\":\"GREEN_TERRACOTTA\",\"mort\":\"GOLDEN_BOOTS\",\"mort_vampire-infecte\":\"JUNGLE_FENCE\",\"maire_vampire-infecte\":\"SLIME_BALL\",\"infecte_maire_mort\":\"DEAD_BUBBLE_CORAL_FAN\",\"maire_mort_vampire-infecte\":\"LIME_TERRACOTTA\"},\"ChienLoup\":{\"\":\"RED_SANDSTONE_SLAB\",\"infecte_mort\":\"MAGENTA_DYE\",\"infecte\":\"BIRCH_BUTTON\",\"infecte_maire\":\"PINK_BANNER\",\"vampire-infecte\":\"LIGHT_BLUE_STAINED_GLASS_PANE\",\"maire\":\"GREEN_BED\",\"mort\":\"DIRT\",\"maire_mort\":\"POLISHED_GRANITE_SLAB\",\"mort_vampire-infecte\":\"LIGHT_GRAY_STAINED_GLASS\",\"maire_vampire-infecte\":\"STRIPPED_JUNGLE_LOG\",\"infecte_maire_mort\":\"PURPLE_STAINED_GLASS_PANE\",\"maire_mort_vampire-infecte\":\"LEATHER\"},\"Medium\":{\"infecte_mort\":\"BROWN_MUSHROOM_BLOCK\",\"infecte\":\"ORANGE_CONCRETE\",\"\":\"GREEN_STAINED_GLASS\",\"infecte_maire\":\"BROWN_STAINED_GLASS_PANE\",\"vampire-infecte\":\"COAL\",\"maire\":\"CHARCOAL\",\"maire_mort\":\"BRICK_SLAB\",\"mort\":\"ENCHANTING_TABLE\",\"mort_vampire-infecte\":\"CYAN_CARPET\",\"maire_vampire-infecte\":\"DARK_OAK_SAPLING\",\"infecte_maire_mort\":\"SALMON_BUCKET\",\"maire_mort_vampire-infecte\":\"NETHER_BRICKS\"},\"Pyromane\":{\"\":\"RED_WOOL\",\"infecte_mort\":\"CYAN_DYE\",\"infecte\":\"INFESTED_COBBLESTONE\",\"infecte_maire\":\"BIRCH_FENCE\",\"vampire-infecte\":\"RED_BED\",\"maire\":\"DEAD_HORN_CORAL_WALL_FAN\",\"mort\":\"GLASS_BOTTLE\",\"maire_mort\":\"OAK_TRAPDOOR\",\"mort_vampire-infecte\":\"COBWEB\",\"maire_vampire-infecte\":\"POLISHED_GRANITE\",\"infecte_maire_mort\":\"JUNGLE_SLAB\",\"maire_mort_vampire-infecte\":\"NETHER_STAR\"},\"ChasseurDeVampire\":{\"infecte\":\"PAINTING\",\"infecte_mort\":\"COMPOSTER\",\"\":\"ANDESITE_SLAB\",\"infecte_maire\":\"SPAWNER\",\"vampire-infecte\":\"CHORUS_FLOWER\",\"maire\":\"FEATHER\",\"mort\":\"SKELETON_SKULL\",\"maire_mort\":\"WHITE_BANNER\",\"mort_vampire-infecte\":\"BOOKSHELF\",\"maire_vampire-infecte\":\"DIAMOND_SHOVEL\",\"infecte_maire_mort\":\"BIRCH_WOOD\",\"maire_mort_vampire-infecte\":\"RED_CONCRETE\"},\"Pirate\":{\"infecte\":\"BEDROCK\",\"\":\"JUNGLE_SAPLING\",\"infecte_mort\":\"YELLOW_CONCRETE\",\"infecte_maire\":\"POLISHED_DIORITE_SLAB\",\"vampire-infecte\":\"RED_TULIP\",\"maire\":\"NETHER_BRICK_SLAB\",\"maire_mort\":\"ANDESITE\",\"mort\":\"BLUE_CONCRETE\",\"mort_vampire-infecte\":\"ORANGE_TERRACOTTA\",\"maire_vampire-infecte\":\"STRIPPED_ACACIA_LOG\",\"infecte_maire_mort\":\"GLASS\",\"maire_mort_vampire-infecte\":\"LIME_BED\"},\"Vampire\":{\"infecte\":\"SANDSTONE\",\"infecte_mort\":\"PURPLE_SHULKER_BOX\",\"\":\"IRON_SHOVEL\",\"infecte_maire\":\"BRICK_WALL\",\"vampire-infecte\":\"RED_STAINED_GLASS_PANE\",\"maire\":\"MOSSY_STONE_BRICK_SLAB\",\"mort\":\"REPEATER\",\"maire_mort\":\"SNOWBALL\",\"mort_vampire-infecte\":\"BLUE_CONCRETE_POWDER\",\"maire_vampire-infecte\":\"ITEM_FRAME\",\"infecte_maire_mort\":\"DANDELION\",\"maire_mort_vampire-infecte\":\"LEATHER_BOOTS\"},\"Pretre\":{\"\":\"DARK_OAK_SLAB\",\"infecte_mort\":\"DARK_OAK_LEAVES\",\"infecte\":\"CONDUIT\",\"infecte_maire\":\"OXEYE_DAISY\",\"vampire-infecte\":\"SPRUCE_SIGN\",\"maire\":\"HOPPER\",\"maire_mort\":\"SLIME_BLOCK\",\"mort\":\"MOSSY_COBBLESTONE\",\"mort_vampire-infecte\":\"RED_GLAZED_TERRACOTTA\",\"maire_vampire-infecte\":\"SANDSTONE_SLAB\",\"infecte_maire_mort\":\"LIGHT_BLUE_CARPET\",\"maire_mort_vampire-infecte\":\"CYAN_STAINED_GLASS_PANE\"},\"Sorciere\":{\"\":\"MAP\",\"infecte_mort\":\"MOJANG_BANNER_PATTERN\",\"infecte\":\"CYAN_BED\",\"infecte_maire\":\"IRON_HELMET\",\"vampire-infecte\":\"CYAN_TERRACOTTA\",\"maire\":\"PURPLE_TERRACOTTA\",\"mort\":\"PUFFERFISH_BUCKET\",\"maire_mort\":\"SCUTE\",\"mort_vampire-infecte\":\"STRIPPED_SPRUCE_LOG\",\"maire_vampire-infecte\":\"BLACK_BED\",\"infecte_maire_mort\":\"DIAMOND_HOE\",\"maire_mort_vampire-infecte\":\"BIRCH_SLAB\"}}"); for(Object key : mappings.keySet()) { HashMap map = new HashMap(); JSONObject array = (JSONObject) mappings.get(key); @@ -71,6 +71,7 @@ public class LGCustomItems { public static enum LGCustomItemsConstraints{ INFECTED("infecte"), MAYOR("maire"), + VAMPIRE_INFECTE("vampire-infecte"), DEAD("mort"); @Getter private final String name; } diff --git a/src/main/java/fr/leomelki/loupgarou/classes/LGGame.java b/src/main/java/fr/leomelki/loupgarou/classes/LGGame.java index ec7433d..99b353c 100644 --- a/src/main/java/fr/leomelki/loupgarou/classes/LGGame.java +++ b/src/main/java/fr/leomelki/loupgarou/classes/LGGame.java @@ -30,6 +30,7 @@ import com.comphenix.protocol.wrappers.WrappedChatComponent; import com.comphenix.protocol.wrappers.WrappedGameProfile; 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.WrapperPlayServerPlayerInfo; import fr.leomelki.com.comphenix.packetwrapper.WrapperPlayServerScoreboardObjective; @@ -190,7 +191,6 @@ public class LGGame implements Listener{ deaths.put(event.getReason(), player); } } - @SuppressWarnings("deprecation") public boolean tryToJoin(LGPlayer lgp) { 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 @@ -199,9 +199,32 @@ public class LGGame implements Listener{ if(lgp.isMuted()) lgp.resetMuted(); - lgp.getPlayer().getInventory().clear(); - lgp.getPlayer().updateInventory(); - lgp.getPlayer().closeInventory(); + Player player = lgp.getPlayer(); + + // 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 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); - if(badGuy+goodGuy == 0 && solo == 1) + if(badGuy+goodGuy == 0 && solo == 1 && vampires == 0) event.setWinType(LGWinType.SOLO); + if(badGuy+goodGuy == 0 && solo == 0 && vampires > 0) + event.setWinType(LGWinType.VAMPIRE); + Bukkit.getPluginManager().callEvent(event); if(doEndGame && event.getWinType() != LGWinType.NONE) endGame(event.getWinType()); diff --git a/src/main/java/fr/leomelki/loupgarou/classes/LGPlayer.java b/src/main/java/fr/leomelki/loupgarou/classes/LGPlayer.java index 2d949b0..fc6a80f 100644 --- a/src/main/java/fr/leomelki/loupgarou/classes/LGPlayer.java +++ b/src/main/java/fr/leomelki/loupgarou/classes/LGPlayer.java @@ -282,10 +282,14 @@ public class LGPlayer { } 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() { - 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 diff --git a/src/main/java/fr/leomelki/loupgarou/classes/LGVote.java b/src/main/java/fr/leomelki/loupgarou/classes/LGVote.java index b5871db..9a3ce26 100644 --- a/src/main/java/fr/leomelki/loupgarou/classes/LGVote.java +++ b/src/main/java/fr/leomelki/loupgarou/classes/LGVote.java @@ -52,7 +52,7 @@ public class LGVote { @Getter private final HashMap> votes = new HashMap>(); private int votesSize = 0; private LGPlayer mayor; - private ArrayList latestTop = new ArrayList(); + private ArrayList latestTop = new ArrayList(), blacklisted = new ArrayList(); private final boolean positiveVote, randomIfEqual; @Getter private boolean mayorVote; private boolean ended; @@ -73,6 +73,15 @@ public class LGVote { for(LGPlayer player : participants) player.choose(getChooseCallback(player)); } + public void start(List participants, List viewers, Runnable callback, ArrayList 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 participants, List viewers, Runnable callback, LGPlayer mayor) { this.callback = callback; this.participants = participants; @@ -215,6 +224,10 @@ public class LGVote { }; } 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")) voted = null; @@ -223,7 +236,7 @@ public class LGVote { if(voter.getCache().has("vote")) votesSize--; - if(votesSize == participants.size() && timeout > littleTimeout) { + if(votesSize == participants.size() && game.getWaitTicks() > littleTimeout*20) { votesSize = 999; game.wait(littleTimeout, initialTimeout, this::end, generator); } diff --git a/src/main/java/fr/leomelki/loupgarou/classes/LGWinType.java b/src/main/java/fr/leomelki/loupgarou/classes/LGWinType.java index f5d8bc4..95b99c1 100644 --- a/src/main/java/fr/leomelki/loupgarou/classes/LGWinType.java +++ b/src/main/java/fr/leomelki/loupgarou/classes/LGWinType.java @@ -14,6 +14,7 @@ public enum LGWinType { 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 !"), 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."); @Getter private final String message; diff --git a/src/main/java/fr/leomelki/loupgarou/events/LGPlayerKilledEvent.java b/src/main/java/fr/leomelki/loupgarou/events/LGPlayerKilledEvent.java index e0784c0..419edd4 100644 --- a/src/main/java/fr/leomelki/loupgarou/events/LGPlayerKilledEvent.java +++ b/src/main/java/fr/leomelki/loupgarou/events/LGPlayerKilledEvent.java @@ -26,6 +26,7 @@ public class LGPlayerKilledEvent extends LGEvent implements Cancellable{ GM_LOUP_GAROU("§7§l%s§4 est mort pendant la nuit"), LOUP_BLANC(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"), CHASSEUR("§7§l%s§4 est mort sur le coup"), DICTATOR("§7§l%s§4 a été désigné"), diff --git a/src/main/java/fr/leomelki/loupgarou/events/LGVampiredEvent.java b/src/main/java/fr/leomelki/loupgarou/events/LGVampiredEvent.java new file mode 100644 index 0000000..682856c --- /dev/null +++ b/src/main/java/fr/leomelki/loupgarou/events/LGVampiredEvent.java @@ -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; +} \ No newline at end of file diff --git a/src/main/java/fr/leomelki/loupgarou/listeners/JoinListener.java b/src/main/java/fr/leomelki/loupgarou/listeners/JoinListener.java index 5331b26..5d5f25f 100644 --- a/src/main/java/fr/leomelki/loupgarou/listeners/JoinListener.java +++ b/src/main/java/fr/leomelki/loupgarou/listeners/JoinListener.java @@ -47,7 +47,7 @@ public class JoinListener implements Listener{ } p.setFoodLevel(6); 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 { LGPlayer lgp = LGPlayer.thePlayer(e.getPlayer()); lgp.showView(); diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RAnge.java b/src/main/java/fr/leomelki/loupgarou/roles/RAnge.java index 6617e24..988d2ca 100644 --- a/src/main/java/fr/leomelki/loupgarou/roles/RAnge.java +++ b/src/main/java/fr/leomelki/loupgarou/roles/RAnge.java @@ -62,7 +62,7 @@ public class RAnge extends Role{ night = getGame().getNight(); vote = true; for(LGPlayer lgp : getPlayers()) - if(!lgp.isDead()) + if(!lgp.isDead() && lgp.isRoleActive()) 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())); 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); villageois.join(lgp); } @@ -97,7 +98,7 @@ public class RAnge extends Role{ @EventHandler public void onDeath(LGPlayerGotKilledEvent e) { 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()); } diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RAssassin.java b/src/main/java/fr/leomelki/loupgarou/roles/RAssassin.java index 6720c13..d76cb38 100644 --- a/src/main/java/fr/leomelki/loupgarou/roles/RAssassin.java +++ b/src/main/java/fr/leomelki/loupgarou/roles/RAssassin.java @@ -11,9 +11,10 @@ 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.LGPyromaneGasoilEvent; import fr.leomelki.loupgarou.events.LGRoleTurnEndEvent; +import fr.leomelki.loupgarou.events.LGVampiredEvent; public class RAssassin extends Role{ public RAssassin(LGGame game) { @@ -77,7 +78,7 @@ public class RAssassin extends Role{ @EventHandler 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.getKilled().getCache().set("assassin_protected", true); } @@ -105,9 +106,14 @@ public class RAssassin extends Role{ @EventHandler public void onPyroGasoil(LGPyromaneGasoilEvent e) { - if(e.getPlayer().getRole() == this) + if(e.getPlayer().getRole() == this && e.getPlayer().isRoleActive()) e.setCancelled(true); } + @EventHandler + public void onVampired(LGVampiredEvent e) { + if(e.getPlayer().getRole() == this && e.getPlayer().isRoleActive()) + e.setImmuned(true); + } @EventHandler public void onDayStart(LGNightEndEvent e) { @@ -121,8 +127,13 @@ public class RAssassin extends Role{ @EventHandler public void onEndgameCheck(LGEndCheckEvent e) { 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); + } } } diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RBouffon.java b/src/main/java/fr/leomelki/loupgarou/roles/RBouffon.java index dadf590..ffea235 100644 --- a/src/main/java/fr/leomelki/loupgarou/roles/RBouffon.java +++ b/src/main/java/fr/leomelki/loupgarou/roles/RBouffon.java @@ -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)"; }); 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); } }.run(); @@ -121,7 +121,7 @@ public class RBouffon extends Role{ @EventHandler 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()); 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é."); diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RChaperonRouge.java b/src/main/java/fr/leomelki/loupgarou/roles/RChaperonRouge.java index 5b1981c..1eef01a 100644 --- a/src/main/java/fr/leomelki/loupgarou/roles/RChaperonRouge.java +++ b/src/main/java/fr/leomelki/loupgarou/roles/RChaperonRouge.java @@ -53,7 +53,7 @@ public class RChaperonRouge extends Role{ @EventHandler(priority = EventPriority.LOWEST) 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()) if(role instanceof RChasseur) if(role.getPlayers().size() > 0){ @@ -68,14 +68,14 @@ public class RChaperonRouge extends Role{ if(e.getGame() == getGame()) { if(e.getPreviousRole() instanceof RLoupGarou) { for(LGPlayer lgp : getGame().getAlive()) - if(lgp.getCache().getBoolean("chaperon_kill")) { + if(lgp.getCache().getBoolean("chaperon_kill") && lgp.isRoleActive()) { for(LGPlayer l : getGame().getInGame()) if(l.getRoleType() == RoleType.LOUP_GAROU) l.sendMessage("§cVotre cible est immunisée."); } }else if(e.getPreviousRole() instanceof RGrandMechantLoup) { 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()) l.sendMessage("§cVotre cible est immunisée."); } diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RChasseur.java b/src/main/java/fr/leomelki/loupgarou/roles/RChasseur.java index 87e029b..fbeaa82 100644 --- a/src/main/java/fr/leomelki/loupgarou/roles/RChasseur.java +++ b/src/main/java/fr/leomelki/loupgarou/roles/RChasseur.java @@ -92,7 +92,7 @@ public class RChasseur extends Role{ @EventHandler 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()); } @EventHandler diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RChasseurDeVampire.java b/src/main/java/fr/leomelki/loupgarou/roles/RChasseurDeVampire.java new file mode 100644 index 0000000..901b577 --- /dev/null +++ b/src/main/java/fr/leomelki/loupgarou/roles/RChasseurDeVampire.java @@ -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."); + } +} diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RDictateur.java b/src/main/java/fr/leomelki/loupgarou/roles/RDictateur.java index fe3b961..fa770d1 100644 --- a/src/main/java/fr/leomelki/loupgarou/roles/RDictateur.java +++ b/src/main/java/fr/leomelki/loupgarou/roles/RDictateur.java @@ -188,7 +188,7 @@ public class RDictateur extends Role{ } public void onTurn(Cancellable e) { 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); if(!e.isCancelled()) diff --git a/src/main/java/fr/leomelki/loupgarou/roles/REnfantSauvage.java b/src/main/java/fr/leomelki/loupgarou/roles/REnfantSauvage.java index a4087c6..0f4fbb9 100644 --- a/src/main/java/fr/leomelki/loupgarou/roles/REnfantSauvage.java +++ b/src/main/java/fr/leomelki/loupgarou/roles/REnfantSauvage.java @@ -100,7 +100,7 @@ public class REnfantSauvage extends Role{ if(e.getGame() == getGame()) if(e.getKilled().getCache().has("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."); REnfantSauvageLG lgEnfantSvg = null; for(Role role : getGame().getRoles()) diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RFaucheur.java b/src/main/java/fr/leomelki/loupgarou/roles/RFaucheur.java index 3356469..5af5f32 100644 --- a/src/main/java/fr/leomelki/loupgarou/roles/RFaucheur.java +++ b/src/main/java/fr/leomelki/loupgarou/roles/RFaucheur.java @@ -58,7 +58,7 @@ public class RFaucheur extends Role{ @EventHandler(priority = EventPriority.LOWEST) public void onKill(LGPlayerKilledEvent e) { - if (e.getKilled().getRole() == this) { + if (e.getKilled().getRole() == this && e.getKilled().isRoleActive()) { LGPlayer killed = e.getKilled(); if(killed.getCache().getBoolean("faucheur_did"))//A déjà fait son coup de faucheur ! return; diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RGarde.java b/src/main/java/fr/leomelki/loupgarou/roles/RGarde.java index 733fe18..67cd752 100644 --- a/src/main/java/fr/leomelki/loupgarou/roles/RGarde.java +++ b/src/main/java/fr/leomelki/loupgarou/roles/RGarde.java @@ -11,6 +11,7 @@ import fr.leomelki.loupgarou.classes.LGPlayer.LGChooseCallback; import fr.leomelki.loupgarou.events.LGNightPlayerPreKilledEvent; import fr.leomelki.loupgarou.events.LGPlayerKilledEvent.Reason; import fr.leomelki.loupgarou.events.LGPreDayStartEvent; +import fr.leomelki.loupgarou.events.LGVampiredEvent; public class RGarde extends Role{ public RGarde(LGGame game) { @@ -105,6 +106,11 @@ public class RGarde extends Role{ } } @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) { if(e.getGame() == getGame()) for(LGPlayer lgp : getGame().getInGame()) diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RMedium.java b/src/main/java/fr/leomelki/loupgarou/roles/RMedium.java index 690d719..e7f053a 100644 --- a/src/main/java/fr/leomelki/loupgarou/roles/RMedium.java +++ b/src/main/java/fr/leomelki/loupgarou/roles/RMedium.java @@ -80,7 +80,7 @@ public class RMedium extends Role{ if(e.getGame() == getGame()) if(e.getPreviousRole() instanceof RLoupGarou) 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..."); joinChat(lgp); } @@ -90,6 +90,7 @@ public class RMedium extends Role{ public void onDay(LGPreDayStartEvent e) { if(e.getGame() == getGame()) for(LGPlayer lgp : getPlayers()) - lgp.leaveChat(); + if(lgp.isRoleActive()) + lgp.leaveChat(); } } diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RMontreurDOurs.java b/src/main/java/fr/leomelki/loupgarou/roles/RMontreurDOurs.java new file mode 100644 index 0000000..e27ddb0 --- /dev/null +++ b/src/main/java/fr/leomelki/loupgarou/roles/RMontreurDOurs.java @@ -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; + } + } + } + } +} diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RPetiteFille.java b/src/main/java/fr/leomelki/loupgarou/roles/RPetiteFille.java index ca4d334..d3146ce 100644 --- a/src/main/java/fr/leomelki/loupgarou/roles/RPetiteFille.java +++ b/src/main/java/fr/leomelki/loupgarou/roles/RPetiteFille.java @@ -60,7 +60,7 @@ public class RPetiteFille extends Role{ if(role instanceof RLoupGarou) { RLoupGarou lgRole = (RLoupGarou)role; for(LGPlayer player : getPlayers()) - if(!player.getCache().getBoolean("infected")) + if(!player.getCache().getBoolean("infected") && player.isRoleActive()) player.joinChat(lgRole.getChat(), (sender, message)->{ return "§c"+customNames.get(lgRole.getPlayers().indexOf(sender))+" §6» §f"+message; }, true); @@ -68,7 +68,7 @@ public class RPetiteFille extends Role{ } if(e.getPreviousRole() instanceof RLoupGarou) for(LGPlayer player : getPlayers()) - if(!player.getCache().getBoolean("infected")) + if(!player.getCache().getBoolean("infected") && player.isRoleActive()) player.leaveChat(); } } diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RPirate.java b/src/main/java/fr/leomelki/loupgarou/roles/RPirate.java index 138c02d..3d776ad 100644 --- a/src/main/java/fr/leomelki/loupgarou/roles/RPirate.java +++ b/src/main/java/fr/leomelki/loupgarou/roles/RPirate.java @@ -125,7 +125,7 @@ public class RPirate extends Role{ ItemStack item = e.getCurrentItem(); Player player = (Player)e.getWhoClicked(); LGPlayer lgp = LGPlayer.thePlayer(player); - + if(lgp.getRole() != this || item == null || item.getItemMeta() == null)return; if(item.getItemMeta().getDisplayName().equals(items[3].getItemMeta().getDisplayName())) { @@ -168,7 +168,7 @@ public class RPirate extends Role{ @EventHandler(priority = EventPriority.LOWEST) public void onPlayerKilled(LGPlayerKilledEvent e) { 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"); 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."); diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RPretre.java b/src/main/java/fr/leomelki/loupgarou/roles/RPretre.java index 90ff82d..b84a065 100644 --- a/src/main/java/fr/leomelki/loupgarou/roles/RPretre.java +++ b/src/main/java/fr/leomelki/loupgarou/roles/RPretre.java @@ -108,13 +108,12 @@ public class RPretre extends Role{ public void openInventory(Player player) { 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()); player.closeInventory(); player.openInventory(inventory); } WrappedDataWatcherObject invisible = new WrappedDataWatcherObject(0, WrappedDataWatcher.Registry.get(Byte.class)); - @SuppressWarnings("deprecation") @Override protected void onNightTurn(LGPlayer player, Runnable callback) { player.showView(); @@ -183,7 +182,7 @@ public class RPretre extends Role{ WrapperPlayServerHeldItemSlot held = new WrapperPlayServerHeldItemSlot(); held.setSlot(0); held.sendPacket(player); - lgp.sendMessage("§6Choisissez qui réssuciter."); + lgp.sendMessage("§6Choisissez qui réssusciter."); lgp.canSelectDead = true; lgp.choose(new LGChooseCallback() { @@ -202,12 +201,12 @@ public class RPretre extends Role{ lgp.stopChoosing(); lgp.canSelectDead = false; 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); 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); lgp.hideView(); callback.run(); @@ -250,7 +249,7 @@ public class RPretre extends Role{ villagers = (RVillageois)role; if(villagers == null) 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.getPlayer().removePotionEffect(PotionEffectType.INVISIBILITY); lgp.getPlayer().getInventory().setHelmet(null); diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RPronostiqueur.java b/src/main/java/fr/leomelki/loupgarou/roles/RPronostiqueur.java new file mode 100644 index 0000000..605fbea --- /dev/null +++ b/src/main/java/fr/leomelki/loupgarou/roles/RPronostiqueur.java @@ -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(); + } +} diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RSurvivant.java b/src/main/java/fr/leomelki/loupgarou/roles/RSurvivant.java index 443bdfd..1f1309b 100644 --- a/src/main/java/fr/leomelki/loupgarou/roles/RSurvivant.java +++ b/src/main/java/fr/leomelki/loupgarou/roles/RSurvivant.java @@ -22,6 +22,7 @@ import fr.leomelki.loupgarou.events.LGGameEndEvent; import fr.leomelki.loupgarou.events.LGNightPlayerPreKilledEvent; import fr.leomelki.loupgarou.events.LGPlayerKilledEvent.Reason; import fr.leomelki.loupgarou.events.LGPreDayStartEvent; +import fr.leomelki.loupgarou.events.LGVampiredEvent; import fr.leomelki.loupgarou.utils.VariableCache; public class RSurvivant extends Role{ @@ -146,15 +147,21 @@ public class RSurvivant extends Role{ @EventHandler 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); } } @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) { if(e.getGame() == getGame()) for(LGPlayer lgp : getGame().getInGame()) - lgp.getCache().remove("survivant_protected"); + if(lgp.isRoleActive()) + lgp.getCache().remove("survivant_protected"); } @EventHandler diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RVampire.java b/src/main/java/fr/leomelki/loupgarou/roles/RVampire.java new file mode 100644 index 0000000..ef3cb2a --- /dev/null +++ b/src/main/java/fr/leomelki/loupgarou/roles/RVampire.java @@ -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().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> 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 choosable = new ArrayList(); + for(Entry> 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()); + } + +} diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RVoyante.java b/src/main/java/fr/leomelki/loupgarou/roles/RVoyante.java index 02613f7..1d2c7e3 100644 --- a/src/main/java/fr/leomelki/loupgarou/roles/RVoyante.java +++ b/src/main/java/fr/leomelki/loupgarou/roles/RVoyante.java @@ -28,6 +28,7 @@ public class RVoyante extends Role{ 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 sa véritable identité..."; diff --git a/src/main/java/fr/leomelki/loupgarou/roles/Role.java b/src/main/java/fr/leomelki/loupgarou/roles/Role.java index 36bf4e6..5bb2435 100644 --- a/src/main/java/fr/leomelki/loupgarou/roles/Role.java +++ b/src/main/java/fr/leomelki/loupgarou/roles/Role.java @@ -1,10 +1,12 @@ 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; @@ -59,20 +61,34 @@ public abstract class Role implements Listener{ return; } LGPlayer player = players.remove(0); - 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); + 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(); } diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RoleSort.java b/src/main/java/fr/leomelki/loupgarou/roles/RoleSort.java index 4b90a95..9326f96 100644 --- a/src/main/java/fr/leomelki/loupgarou/roles/RoleSort.java +++ b/src/main/java/fr/leomelki/loupgarou/roles/RoleSort.java @@ -16,6 +16,8 @@ public enum RoleSort { LoupGarouBlanc, Assassin, Pyromane, + ChasseurDeVampire, + Vampire, Pirate, Bouffon, Sorciere, diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RoleType.java b/src/main/java/fr/leomelki/loupgarou/roles/RoleType.java index cabc4d6..c5f2b11 100644 --- a/src/main/java/fr/leomelki/loupgarou/roles/RoleType.java +++ b/src/main/java/fr/leomelki/loupgarou/roles/RoleType.java @@ -3,5 +3,6 @@ package fr.leomelki.loupgarou.roles; public enum RoleType { VILLAGER, LOUP_GAROU, + VAMPIRE, NEUTRAL; } diff --git a/src/main/java/fr/leomelki/loupgarou/roles/RoleWinType.java b/src/main/java/fr/leomelki/loupgarou/roles/RoleWinType.java index d4580d3..dc63a27 100644 --- a/src/main/java/fr/leomelki/loupgarou/roles/RoleWinType.java +++ b/src/main/java/fr/leomelki/loupgarou/roles/RoleWinType.java @@ -4,5 +4,6 @@ public enum RoleWinType { SEUL, VILLAGE, LOUP_GAROU, + VAMPIRE, NONE; } diff --git a/src/main/java/fr/leomelki/loupgarou/utils/VariousUtils.java b/src/main/java/fr/leomelki/loupgarou/utils/VariousUtils.java index 5138c23..f25c4ed 100644 --- a/src/main/java/fr/leomelki/loupgarou/utils/VariousUtils.java +++ b/src/main/java/fr/leomelki/loupgarou/utils/VariousUtils.java @@ -20,7 +20,7 @@ public class VariousUtils { WorldBorder wb = p.getWorld().getWorldBorder(); container.getWorldBorderActions().write(0, EnumWrappers.WorldBorderAction.INITIALIZE); - + container.getIntegers().write(0, 29999984); container.getDoubles().write(0, p.getLocation().getX()); diff --git a/src/main/java/plugin.yml b/src/main/java/plugin.yml index f31d283..c9edd9e 100644 --- a/src/main/java/plugin.yml +++ b/src/main/java/plugin.yml @@ -1,5 +1,5 @@ name: LoupGarou -version: 1.0.1 +version: 1.1.0 description: Permet de jouer au jeu du loup garou main: fr.leomelki.loupgarou.MainLg depend: [ProtocolLib]