Plugin Pour Mini-Jeu

Thomas_080

Bucheron
18 Mars 2019
25
0
14
28
bonsoir à tous,
j'aimerais créer un plugin Spigot sur Minecraft qui me permetterais de reproduire le Jeu "Loup-Garou"( ce jeux est un jeu qui existe en vrai et non en jeu vidéo). Pour créer ce plugin j'ai besoin d'une petite information ; j'aimerais que ce jeu se joue a 10 joueurs ; dans ce jeu chaque joueur a un rôle ; j'aimerais donner chaque rôle a chaque joueurs totalement aléatoirement et je ne sais pas faire cela. J'ai cru comprendre qu'il fallait utiliser un Player<UUID ou je sais trop quoi ; c'est pour cela que je vous demander s'il serais possible de m'expliquer comment je peut donner un rôle à chaque joueur entrant dans une partie de façon aléatoire,

Thomas,
Merci pas avance...
 
Bonsoir,

Pour les différents rôles, j'utiliserai une énumération.
Pour l'aléatoire, la classe Random.
Pour relier les joueurs à d'autres données (style leurs rôle), une Map.

Ça donnerais un truc du style :
Code:
enum Role { WEREWOLF, HUMAN }

class Foo {
[INDENT]void bar() {
[INDENT]Random r = new Random();
Role[] roles = Role.values();
Role r = roles[r.nextInt(roles.length)];[/INDENT]
}[/INDENT]
}

Cordialement,
ShE3py.
 
  • J'aime
Reactions: DiscowZombie
Bonsoir,

Pour les différents rôles, j'utiliserai une énumération.
Pour l'aléatoire, la classe Random.
Pour relier les joueurs à d'autres données (style leurs rôle), une Map.

Ça donnerais un truc du style :
Code:
enum Role { WEREWOLF, HUMAN }

class Foo {
[INDENT]void bar() {
[INDENT]Random r = new Random();
Role[] roles = Role.values();
Role r = roles[r.nextInt(roles.length)];[/INDENT]
}[/INDENT]
}

Cordialement,
ShE3py.

Tout d'abord merci de votre réponse, pour être précis je souhaite ajouter exactement 8 ou 10 classes , cela dépendera de la map; et chaque classes aura des "compétenses , par exemple certains joueurs devrons dormir la nuit sans pouvoir sortir du lit ; certains devrons se deplacer la nuit etc... je mettrais donc ces actions sous quelle forme ? Et j'ai peur de ne pas comprendre, pouvez vous ajoutez pas exemple ce que vous avez écrit mais avec des roles concrets ( exemples de roles : villageois / loup)
Thomas
Encore un grand merci de votre réponse
 
Salut,

chaque classes aura des "compétenses , par exemple certains joueurs devrons dormir la nuit sans pouvoir sortir du lit ; certains devrons se deplacer la nuit etc... je mettrais donc ces actions sous quelle forme ?
ça semble principalement être de la gestion d'événement. Une approche relativement simple est sûrement de faire une classe pour chaque rôle. Cette classe contiendrait tous les comportements du rôle en question, il ne resterait plus qu'à les appliquer après ! (NB: avec un peu d'héritage, tu pourrais arriver à un code plutôt sympathique)

Et j'ai peur de ne pas comprendre, pouvez vous ajoutez pas exemple ce que vous avez écrit mais avec des roles concrets ( exemples de roles : villageois / loup)
C'est l'énumération qui te pose problème ? Car si c'est le cas, il faut sûrement une piqûre de rappel sur les énumérations en Java. Je me suis permis d'ajouter quelques commentaires :
Code:
/*
Une énumération pour lister tous les rôles.
Dans le futur, il seront bon de la compléter avec notamment un constructeur (pour accueillir la classe modèle) et diverses méthodes.
*/
enum Role {
    WEREWOLF,  // Le rôle Loup-Garou
    HUMAN,   // Le rôle Humain
    MAGICIEN;  // Le rôle Magicien
}

// Une classe, ne fait pas attention à son nom ;)
class Foo {

    /*
    Sélection d'un rôle "aléatoire" dans tout ceux disponibles
    */
    public Role selectRandomRole() {
        Random rand = new Random(); // Création d'un objet Random, cf la doc Oracle si tu ne sais pas ce que c'est. ;)
        Role[] roles = Role.values(); // Ceci est notre tableau contenant tous les rôles disponibles dans l'énumération.
        Role selectedRole = roles[rand.nextInt(roles.length)];
        /*
        rand.nextInt(role.length) retourne un entier dans l'intervalle [|0;role.length|[
        Il suffit ensuite de récupérer le rôle à cet index pour avoir une sélection "aléatoire"
        */ 
        return selectedRole; // On retourne le rôle. ;)
    }
}


PS 1 : Dans mon message, je mets aléatoire entre guillemets car il s'agit plutôt d'un nombre pseudo-aléatoire. Je te rédige vers la documentation Oracle pour l'explication de la génération du nombre. ;)

PS 2 : Sujet déplacé dans la bonne section. ;)

PS 3 pour @ShE3py (Petite vengeance personnelle) : Ton code ne compile pas. :bave: Ta variable r est utilisé deux fois pour deux choses différences :
Code:
Random r = new Random();
Role[] roles = Role.values();
Role r = roles[r.nextInt(roles.length)];
Je ne dirais rien par rapport à cette erreur. :^)
 
  • J'aime
Reactions: ShE3py
Salut,


ça semble principalement être de la gestion d'événement. Une approche relativement simple est sûrement de faire une classe pour chaque rôle. Cette classe contiendrait tous les comportements du rôle en question, il ne resterait plus qu'à les appliquer après ! (NB: avec un peu d'héritage, tu pourrais arriver à un code plutôt sympathique)


C'est l'énumération qui te pose problème ? Car si c'est le cas, il faut sûrement une piqûre de rappel sur les énumérations en Java. Je me suis permis d'ajouter quelques commentaires :
Code:
/*
Une énumération pour lister tous les rôles.
Dans le futur, il seront bon de la compléter avec notamment un constructeur (pour accueillir la classe modèle) et diverses méthodes.
*/
enum Role {
    WEREWOLF,  // Le rôle Loup-Garou
    HUMAN,   // Le rôle Humain
    MAGICIEN;  // Le rôle Magicien
}

// Une classe, ne fait pas attention à son nom ;)
class Foo {

    /*
    Sélection d'un rôle "aléatoire" dans tout ceux disponibles
    */
    public Role selectRandomRole() {
        Random rand = new Random(); // Création d'un objet Random, cf la doc Oracle si tu ne sais pas ce que c'est. ;)
        Role[] roles = Role.values(); // Ceci est notre tableau contenant tous les rôles disponibles dans l'énumération.
        Role selectedRole = roles[rand.nextInt(roles.length)];
        /*
        rand.nextInt(role.length) retourne un entier dans l'intervalle [|0;role.length|[
        Il suffit ensuite de récupérer le rôle à cet index pour avoir une sélection "aléatoire"
        */
        return selectedRole; // On retourne le rôle. ;)
    }
}


PS 1 : Dans mon message, je mets aléatoire entre guillemets car il s'agit plutôt d'un nombre pseudo-aléatoire. Je te rédige vers la documentation Oracle pour l'explication de la génération du nombre. ;)

PS 2 : Sujet déplacé dans la bonne section. ;)

PS 3 pour @ShE3py (Petite vengeance personnelle) : Ton code ne compile pas. :bave: Ta variable r est utilisé deux fois pour deux choses différences :
Code:
Random r = new Random();
Role[] roles = Role.values();
Role r = roles[r.nextInt(roles.length)];
Je ne dirais rien par rapport à cette erreur. :^)

Un grand merci ,
Je ne vois pas exactement ou rentrer ce code, dans une classe a part avec un bukkitrunnable / onEnable. J'aimerais que quand un joueur clique sur un item il soit tp( cela et plutot simple ^^) mais que lorsqu'il clique il se donne un role donc je me demande si je ferais pas :
Public void onInteract(PInteractEvent e){
Player p = e.getplayer();
Action a = e.getAction();
ItemStack it = e.getItem();

If(item == null)return;
If(!item.hasItemMeta())return;
If(a != Action.right_click_block)return;
If(item.getType() == Material.feather{
Et la j'execute un bukkit runnable avec le le give des roles?

Pour l'instant ce que j'ai fais dans mon prrogramme c'est quand un joueur clique sur un item dans son inventaire, ça lui ouvre un inventaire avec differents mini jeux, quand un joueur clique sur un item(celui pour le loup/garou) il est teleporter au lobby loup garou, son inv est clear et il reçoit 2 items un (une barrier) et auand il clique dessus il est tp au spawn principal puis il reçoit ce qui permet de choisir le minijeu; le 2eme item est la plume où quand je joueur clique sur la plume il doit passer a un role random... il me manque la plume a faire .... et il faudrais mettre tout les joueurs cliquant sur le jeu loup-garou dans un Role du style "joueurLoupGarou" pour donner les roles du loup garou a seulement les joueurs qui ont clique sur le jeu et non tout les joueurs...
Je ne sais pas si c'est vraiment clair,
Et désoler pour les fautes
Thomas
Merci
 
Dernière édition par un modérateur:
Salut,

tu me sembles un peu perdu. Plusieurs choses :
- Une classe qui implémente BukkitRunnable est généralement un Timer, vu qu'elle doit implementer la méthode run().
- La classe principale (celle qui redéfinit JavaPlugin et donc notamment le onEnable()) est unique, c'est celle qui est chargée en première pour ton plugin. Il faut donc essayer de la garder clean au maximum.
En outre, chaque classe que ce soit une classe "normale", une énumération ou quoi ce soit d'autre doit être déclarée dans son propre fichier (si on oublie le cas des classes existantes dans une autre).

Une structure relativement simple pour ton plugin est donc celle là :
Main.java -> Classe principale
Role.java -> Les rôles et notre méthode pour en choisir un
RoleInventory.java -> Gestion de ton event

Tu trouveras ci-dessous des snipets de code pour te mettre sur la piste.
Désolé par avance pour les erreurs d'innatention (pas d'IDE). Je ne t'invite pas à Ctrl C/V mais bien à comprendre.

Code:
public final class Main extends JavaPlugin {

  public static HashMap<UUID, Role> playerRole = new HashMap<>();

  @Override
  public void onEnable() {
    // ...
  }

}
Code:
/*
Une énumération pour lister tous les rôles.
Dans le futur, il seront bon de la compléter avec notamment un constructeur (pour accueillir la classe modèle) et diverses méthodes.
*/
public enum Role {
    WEREWOLF,  // Le rôle Loup-Garou
    HUMAN,   // Le rôle Humain
    MAGICIEN;  // Le rôle Magicien

    public static Role selectRandomRole() {
      Random rand = new Random(); // Création d'un objet Random, cf la doc Oracle si tu ne sais pas ce que c'est. ;)
      Role[] roles = Role.values(); // Ceci est notre tableau contenant tous les rôles disponibles dans l'énumération.
      Role selectedRole = roles[rand.nextInt(roles.length)];
      /*
      rand.nextInt(role.length) retourne un entier dans l'intervalle [|0;role.length|[
      Il suffit ensuite de récupérer le rôle à cet index pour avoir une sélection "aléatoire"
      */
      return selectedRole; // On retourne le rôle. ;)
    }
}
Code:
public final class RoleInventory implements Listener {

  // Ton event de choix d'un rôle...

}

et il faudrais mettre tout les joueurs cliquant sur le jeu loup-garou dans un Role du style "joueurLoupGarou" pour donner les roles du loup garou a seulement les joueurs qui ont clique sur le jeu et non tout les joueurs...
Dans le code exemple, tu vois que j'ai une HashMap dans la classe principale. Cela semble être une plûtot bonne solution pour sauvegarder les joueurs. ;)
 
Euh...
Merci le HashMap correspond a quoi exactement
homas
s

Code:
package fr.Zombie.Main;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;
import fr.Zombie.Main.Commands.CommandLobZombie;
import fr.Zombie.Main.Commands.CommandPlayer;
import fr.Zombie.Main.Commands.GameCancel;
import fr.Zombie.Main.Commands.GameStart;
public class GMain extends JavaPlugin implements Listener{
 
 public ArrayList<UUID> Zombie = new ArrayList<>();    //creation rôles
 public ArrayList<UUID> JeanPierre = new ArrayList<>();
 public ArrayList<UUID> Traitre = new ArrayList<>();        //je peut donc supprimer toute ces
 public ArrayList<UUID> Citoyen = new ArrayList<>();      //arrayslist si je passe par une enum
 public ArrayList<UUID> Electeur = new ArrayList<>();
 public ArrayList<UUID> Somnambule = new ArrayList<>();
 public ArrayList<UUID> Devin = new ArrayList<>();
 public ArrayList<UUID> Robin = new ArrayList<>();
 private LinkedList<Player> players = new LinkedList<Player>();
 private GState state;
 
 public static GMain instance;
 public static GMain getInstance() {
  return instance;}
 
 @EventHandler
 public void onJoin(PlayerJoinEvent e) {
  Player player = e.getPlayer();
  player.getInventory().clear();
     MenuMJ(player);}
 
 @EventHandler
 public void MenuMJ(Player player) {
  ItemStack item = new ItemStack(Material.STICK, 1);
  ItemMeta ITem = item.getItemMeta();
  ITem.setDisplayName("§4▶ §6Choix du Mini-Jeu §4◀");
  ITem.setLore(Arrays.asList("§7Joue a un Mini-Jeu!"));
  item.setItemMeta(ITem);
  player.getInventory().setItem(0, item);}
 
 @EventHandler
 public void onInteract(PlayerInteractEvent e) {
  Player player = e.getPlayer();
  Action action = e.getAction();  
  ItemStack it = e.getItem();
 
  if(it == null)e.setCancelled(true); {
  if(action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK);{
  if(it.getItemMeta().getDisplayName().equalsIgnoreCase("§4▶ §6Choix du Mini-Jeu §4◀") && it.getType() == Material.STICK) {
   player.openInventory(MenuMiniJ());}}}
 }
 @EventHandler
 public void onInteract1(PlayerInteractEvent e) {
  Player player = e.getPlayer();
  Action action = e.getAction();  
  ItemStack it = e.getItem();
 
  if(it == null)e.setCancelled(true); {
  if(action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK);{
  if(it.getItemMeta().getDisplayName().equalsIgnoreCase("§4▶ §6Lance la partie§4 ◀") && it.getType() == Material.FEATHER) {
   player.performCommand("GameStart");
 
   isState(GState.LANCEMENT);}}}
 }
 @EventHandler
 public void onInteract2(PlayerInteractEvent e) {
  Player player = e.getPlayer();
  Action action = e.getAction();  
  ItemStack it = e.getItem();
 
  if(it == null)e.setCancelled(true); {
  if(action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK);{
  if(it.getItemMeta().getDisplayName().equalsIgnoreCase("§4▶ §6Revenir au Spawn§4 ◀") && it.getType() == Material.BARRIER) {
   player.performCommand("GameCancel");}}}
 }
 @EventHandler
 public void onClick(InventoryClickEvent e) {
 
  Inventory inv = e.getInventory();
  Player p = (Player) e.getWhoClicked();
  ItemStack it = e.getCurrentItem();
 
  if(it == null || !it.hasItemMeta())return;
 
  if(inv.getName().equalsIgnoreCase("§4▶ §6Lobby Zombie §4◀"));
   if(it.getType() == Material.ZOMBIE_HEAD) {
    p.performCommand("lobbyzombie");
    p.performCommand("GameZombie");
    isState(GState.ATTENTE);}
  }
  private Inventory MenuMiniJ() {
 
   Inventory inv  = Bukkit.createInventory(null, 9, "§4▶ §6Choix du Mini-Jeu §4◀");
 
   ItemStack it = new ItemStack(Material.ZOMBIE_HEAD);
   ItemMeta IT = it.getItemMeta();
   IT.setDisplayName("§4▶ §6Lobby Zombie §4◀");
   IT.setLore(Arrays.asList("§7Téléporte toi au Lobby Zombie"));
   it.setItemMeta(IT);
   inv.setItem(0, it);
   return inv;}
 
 @EventHandler
 public void onRespawnEvent(PlayerRespawnEvent event) {
  Player player = event.getPlayer();
        MenuMJ(player);}
 
 @Override
 public void onEnable(){
  System.out.println("Plugin Zombie demarrer!");
  getCommand("lobbyzombie").setExecutor(new CommandLobZombie());
  getCommand("GameZombie").setExecutor(new CommandPlayer());
  getCommand("GameStart").setExecutor(new GameStart());
  getCommand("GameCancel").setExecutor(new GameCancel());
  getServer().getPluginManager().registerEvents(this, this);}
 @Override
 public void onDisable() {
  System.out.println("Plugin Zombie arreter!");}
 
 public void setState(GState state){
  this.state = state;}
 public boolean isState(GState state) {
  return this.state == state;}
 public void gameAnnounce(String message) {
  if(message == null)return;
  this.getPlayers().forEach(inGamePlayers -> inGamePlayers.sendMessage(message));}
 public LinkedList<Player> getPlayers(){
  return players;}
}




//dans man classe principale il y a ça





//ensuite j'ai fait çela

Code:
package fr.Zombie.Main.joueursrole;
import java.util.Random;

public enum Role {
    ZOMBIE,
    CITOYEN,
    TRAITRE,
 JEANPIERRE,
 SOMNAMBULE,
 ROBIN,
 DEVIN,
 ELECTEUR;
    public static Role selectRandomRole(){
      Random rand = new Random();
      Role[] roles = Role.values();
      Role selectedRole = roles[rand.nextInt(roles.length)];   
      return selectedRole;}
 }


et je ne voit pas comment executer cette classe de séléction de role


Merci
Thomas
 
Dernière édition par un modérateur:
Salut,

ton code était illisible, je me suis permis d'éditer ton message pour mettre en forme. (utilise les balises CODE la prochaine fois).
Mis à part ça, tu as tout mis dans ta classe principale elle est donc illisible ! Sépare tes événements dans plusieurs classes différentes (au moins une classe pour le Join/Leave et une pour le clique dans le menu à mon avis).

public ArrayList<UUID> Zombie = new ArrayList<>(); //creation rôles
public ArrayList<UUID> JeanPierre = new ArrayList<>();
public ArrayList<UUID> Traitre = new ArrayList<>(); //je peut donc supprimer toute ces
public ArrayList<UUID> Citoyen = new ArrayList<>(); //arrayslist si je passe par une enum
public ArrayList<UUID> Electeur = new ArrayList<>();
public ArrayList<UUID> Somnambule = new ArrayList<>();
public ArrayList<UUID> Devin = new ArrayList<>();
public ArrayList<UUID> Robin = new ArrayList<>();
Effectivement tu peux tout retiré, comme ta LinkedList qui sert à je ne sais pas quoi ?

et je ne voit pas comment executer cette classe de séléction de role
Exécuter une classe ça ne veut rien dire... Pour faire une nouvelle instance d'une classe, la syntaxe est suivante : new Nom(). Si ta classe contient des membres statiques (ici la fonction #selectRandomRole), tu peux directement l'appelé par NomClasse.membre.
 
Je parle d'ici comme je met l'event du choix d'un role
Ça dépend comment tu veux que ton jeu démarre, afin d'assigner chaque joueur à un rôle. Cf le wiki.

Sinon, pour répondre à ta question lointaine, un tableau associatif (map en anglais) est un conteneur qui associe à chaque clef une valeur. En d'autres termes, c'est une liste, mais où lieu d'accéder à un élément via un indice, tu le récupères via un objet. Cela permet dans ton cas d'associer chaque joueur à un rôle

(maintenant que je peux enfin caser un message)
PS 3 pour @ShE3py (Petite vengeance personnelle) : Ton code ne compile pas. :bave: Ta variable r est utilisé deux fois pour deux choses différences :
Code:
Random r = new Random();
Role[] roles = Role.values();
Role r = roles[r.nextInt(roles.length)];
Je ne dirais rien par rapport à cette erreur. :^)
:mais:
C'était pour voir si vous suiviez :c
En vrai j'avais d'abord mit le random dans l'opérateur d'indice, mais j'ai voulu simplifier et je l'ai promu en variable.
 
  • J'aime
Reactions: DiscowZombie