Votez pour ce serveur
Tous les jours sur :

serveurs Minecraft




Cliquez pour découvrir...




... et bien d'autres

#1551 Re : Discussions publiques, suggestions » [Tuto Obsolete] Créez votre premier plugin pour bukkit » 20 May 2011 10:58

Et pourquoi avoir créé le package net.thgbm.forum.Utils ?

Vous vous souvenez, au début de ce tuto je vous avez demandé de créer un package 'net.thgbm.forum.Utils' en expliquant qu'on y rangerait certaines de nos fonctions ?

Je vous propose d'y créer une classe 'Message' qui nous permettra de définir des fonctions comme:

  • sendInfo()

  • sendError[()

  • sendSuccess()

qui seront utiles pour envoyer respectivement :

  • un message de couleur grise

  • un message de couleur rouge

  • un message de couleur verte

Vous voyez l'idée ? On va créer ces fonctions car il y a de fortes chances pour qu'on les utilisent beaucoup dans nos développements et qu'elles sont toutes les 3 de même nature.

Concrètement on cherche à faire quoi ?

Et bien concrètement on souhaite remplacer notre envoi de message de notre HelloPlayerListener:

@Override
public void onPlayerJoin(PlayerJoinEvent event) {
    // On récupère l'objet player en question    
    Player player = event.getPlayer();
    // Et on lui envoi un zoli message pour le saluer
    player.sendMessage( "Salut à toi " + player.getName() );
}

Par ceci :

@Override
public void onPlayerJoin(PlayerJoinEvent event) {
    // On récupère l'objet player en question    
    Player player = event.getPlayer();
    // Et on lui envoi un zoli message pour le saluer
    Messages.sendInfo( player, "Salut à toi " + player.getName() );
}

Et on pourra l'utiliser à chaque fois que l'on souhaite envoyer des messages à un joueur avec nos couleurs.


Mise en place

Faites un clic droit sur votre package 'net.thgbm.forum.Utils' et 'New' -> 'Class'.
Appelez là 'Messages'

Voici le code à y insérer :

package net.thgbm.forum.utils;

import org.bukkit.entity.Player;
import org.bukkit.ChatColor;


public class Messages {
    
    // Message en gris
    public static void sendInfo( Player destinataire, String message)
    {
        destinataire.sendMessage(ChatColor.DARK_GRAY + message );
    }
    
    // Message en rouge
    public static void sendError( Player destinataire, String message)
    {
        destinataire.sendMessage(ChatColor.DARK_RED + message );
    }
    
    // Message en vert
    public static void sendSuccess( Player destinataire, String message)
    {
        destinataire.sendMessage(ChatColor.DARK_GREEN + message );
    }
    
}

C'est tout ! Maintenant modifions notre HelloPlayerListener  :

  • on retire l'import de org.bukkit.ChatColor qui n'a plus lieu d'être

  • on import net.thgbm.forum.Utils.Messages

  • et on modifie le onPlayerJoin() comme souhaité

#1552 Re : Discussions publiques, suggestions » [Tuto Obsolete] Créez votre premier plugin pour bukkit » 20 May 2011 10:53

Une meilleure gestion des commandes utilisateurs

Dans notre exemple l'action faites lors de la saisie '/salut' est gérée dans notre classe principale. Il serait peut être préférable de la 'ranger' ailleurs car pour l'instant on n'a qu'une commande mais que se passera t'il quand on en ajoutera ? Si on change rien la classe principale va s'alourdir et devenir de moins en moins lisible.

A mon goût (oui vous savez "les goûts et les couleurs"..) je préfère 'ranger' mes commandes dans un package séparé et je vais vous montrer une méthode pour se faire.

Créez le package 'net.thgbm.forum.Commands'

Vous devez créer le package 'net.thgbm.forum.Commands', si vous ne vous rappelez plus comment faire remontez en haut de ce tutoriel.

Créez dans ce package une classe par commande

Nous avons pour l'instant qu'une seule commande : salut.
Créez donc une nouvelle classe en faisant un clic droit sur le package 'net.thgbm.forum.Commands' puis 'New' -> 'Class'.
Pour notre exemple appelez cette classe 'SalutCommand'.

Dans cette classe on va retrouver la méthode utilisée dans la classe principale mais sera donc exécutée dans le SalutCommand, voici le code :

package net.thgbm.forum.Commands;

import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.Command;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;

import net.thgbm.forum.Hello.Hello;


public class SalutCommand implements CommandExecutor {

    @SuppressWarnings("unused")
    private final Hello plugin;

    public SalutCommand(Hello plugin) {
        this.plugin = plugin;
    }
    
    
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

        if(label.equalsIgnoreCase("salut"))
        { 
            Player player = (Player)sender;
            player.sendMessage(ChatColor.DARK_AQUA + "Salut à toi encore une fois " + player.getName() );
            return true;
        }
        return false;
    }
    
    
}

Il faut implémenter CommandExecutor pour accéder on onCommand().
La méthode onCommand n'a pas beaucoup changée comme vous pouvez le constater sauf que je colore le texte envoyé au joueur grâce à la classe org.bukkit.ChatColor comme vous pouvez le constater dans la ligne :

player.sendMessage(ChatColor.DARK_AQUA + "Salut à toi encore une fois " + player.getName() );

Devinez quoi, ça sera écrit en bleu....

Modification sur la classe principale Hello

Il faut maintenant modifier notre classe principale pour envoyer la gestion de la commande /salut vers notre classe SalutCommand.

Commençons par ajouter nos imports :

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;

import net.thgbm.forum.Commands.*;

Ensuite on supprime notre commande onCommand() et dans le onEnable() on va rediriger la gestion de la commande /salut vers notre SalutCommand :

// La commande /salut sera executée par net.thgbm.forum.Commands.SalutCommand
getCommand("salut").setExecutor(new SalutCommand(this));

Regénez votre .jar et ça devrait fonctionner.


Conclusion

Maintenant que notre commande est 'rangée' dans son package vous vous rendez compte que la classe principale reste claire et que la gestion de la commande nécessite peu de codes au final.
En mettant en place ce système lorsque vous souhaiterez ajouter de nouvelles commandes il ne vous restera qu'à :

  • ajouter votre commande dans votre fichier plugin.yml

  • ajouter dans le onEnable() de votre classe principale :

    getCommand("<VotreCommande>").setExecutor(new <VotreCommande>Command(this));
  • créer votre classe <VotreCommande>Command dans le package Commands

  • adaptez le code de la classe SalutCommand à vos besoins pour cette nouvelle classe

#1553 Re : Discussions publiques, suggestions » [Tuto Obsolete] Créez votre premier plugin pour bukkit » 20 May 2011 10:41

Générer le .jar exploitable de votre mod

Votre mod est fait, il ne vous reste plus qu'à générer un .jar pour finalement le placer dans votre dossiers 'plugins/' se trouvant dans votre dossier du serveur Bukkit.

Pour générer votre.jar :

  • clic droit sur le dossier 'src' de votre projet Hello

  • choisissez 'Export'

  • choisissez 'Java' -> 'JAR file'
    07.png

  • vérifiez en dépliant le dossier Hello que en sélectionnant le dossier 'src' à droite vous ayez le fichier 'plugin.yml' de sélectionné lui aussi

  • choisissez la destination de votre fichier .jar et cliquez 'Finish'.

08.png
Voila votre .jar a été généré il ne vous reste plus qu'à le mettre dans votre dossier 'plugins/' de votre dossier serveur et à lancer votre serveur pour vérifier que tout va bien.

#1554 Re : Discussions publiques, suggestions » [Tuto Obsolete] Créez votre premier plugin pour bukkit » 20 May 2011 10:40

Le fichier plugin.yml indispensables références pour votre mod

Le fichier plugin.yml, comme son extension volontairement explicite l'indique, doit respecter le standard YAML.
Vous pouvez voir les références sur cette page si vous êtes curieux autrement sachez qu'il ne vous faudra pas longtemps pour vous créer le votre car le minimum d'informations requises est assez rapide à mettre en place.

icon_attention.gifATTENTION
Bukkit server attend de votre part que vous lui fournissiez avec votre mod quelques informations indispensables à son goût et que le fichier porte obligatoirement ce nom sans quoi il refusera de le charger.

Dans les informations à lui fournir on retrouve :

  • le nom de votre mod

  • la classe de base

  • l'auteur

  • la version de développement de votre mod

Le YAML n'est pas balisé comme le html par exemple ou le bbcode mais est structuré d'une autre manière ou les sauts de ligne et espaces sont très importants et ont une signification précise. Ceci étant dis je précise également que selon les éditeurs de texte la tabulation ne se retranscrit pas de la même manière dans le fichier et est souvent cause de mauvaises interprétation du fichier .yml.
Donc si vous voulez vous éviter ce genre de soucis n'utilisez pas la tabulation mais faites plutôt des espaces du genre une tabulation = 2 espaces.

Si on prends notre exemple voici à quoi ressemblerait notre fichier plugin.yml avec le minimum d'informations :

name: Hello
main: net.thgbm.forum.Hello.Hello
version: 0.01
website: http://thgbm.net
authors: boozaa
description: >
    Mon premier plugin qui affiche un message quand je me connecte
    Qui me salue quand je lui demande
    Qui me dit quand je casse un block

La propriété 'name' permet de faire cohabiter aussi plusieurs commandes identiques partagées par plusieurs mods. Ceci étant tout de même à éviter mais sachez que si par exemple vous avez créé une commande '/home' et que cette commande est déja définie par un autre mod vous pouvez l'appeler en jeu par '/Hello:home' dans notre exemple <-- ceci étant à vérifier.

La propriété 'main' doit représenter le nom complet, package et nom de fichier inclut sans le '.java' ou le '.class', de la classe qui étends JavaPlugin.

La propriété 'version' est facile à comprendre, c'est donc la version de votre release.

La propriété 'website' si vous en avez un.

La propriété 'authors' là c'est de vous dont on parle tongue.

La propriété 'description', une petite description de ce que fait votre mod.


Votre plugin contient des commandes utilisateurs ?

Pour éviter que les commandes d'un mod soient écrasées par celles d'un autre et pour instaurer une certaine cohésion vous devez préciser dans votre plugin.yml les commandes utilisateurs que vous avez créés de la forme :

commands:
  salut:
    description: Une commande pour me saluer
    usage: /<command>

Ce schéma doit être respecté pour toutes vos commandes utilisateurs, le 'usage' sera le message en réponse d'une mauvaise utilisation de la commande '/salut'.


Ce qui nous donnerait donc en combinant le tout :

name: Hello
main: net.thgbm.forum.Hello.Hello
version: 0.01
website: http://thgbm.net
authors: boozaa
description: >
    Mon premier plugin qui affiche un message quand je me connecte
    Qui me salue quand je lui demande
    Qui me dit quand je casse un block
commands:
  salut:
    description: Une commande pour me saluer
    usage: /<command>

Mais pourquoi déclarer mes commandes utilisateurs ?

Sauf erreur de ma part voici le pourquoi.
Quand un joueur tapes dans le tchat une commande, par exemple '/salut', le serveur cherche cette commande parmi celles déclarées aux chargements des mods.
Si il trouve la commande il connaît le mod qui souhaite la traiter et lui renvoi l’événement.

Avant cette structure .yml le serveur devait sûrement user plus de ressources car, toujours sauf erreur de ma part, il envoyait cet événement à tous les mods un par un jusqu'à ce qu'il y en ait un qui le traite. C'était une des raisons qui me faisait dire à l'époque qu'il valait mieux créer tout ce dont on a besoin plutôt qu'entasser les mods.


Où placer ce fichier ?

Il faut que ce fichier se trouve au même niveau que votre dossier 'src'. Dans le .jar après la génération il se trouvera donc à la racine du .jar.

#1555 Re : Discussions publiques, suggestions » [Tuto Obsolete] Créez votre premier plugin pour bukkit » 20 May 2011 10:37

Les listeners, ceux qui sont à l'écoute des événements captés et agissent

Dans notre classe principale Hello nous avons précisé que nous voulons recevoir les événements PLAYER_JOIN, PLAYER_INTERACT et BLOCK_DAMAGE pour pouvoir ajouter nos modifications.

Ces événements peuvent être captés par 2 types de listener : blockListener et playerListener dont il va falloir hériter.

Notre listener qui se chargera des événements de type PLAYER a été déclaré dans Hello comme HelloPlayerListener et celui qui s'occupera de ceux de type BLOCK est déclaré comme HelloBlockListener.

HelloPlayerListener

Comme nous avons créé notre package pour les listeners au début nous allons créer notre classe en faisant un clic droit sur le package 'net.thgbm.forum.Listeners' et en choisissant 'New' -> 'Class'.
Dans la fenêtre de création de classe indiquez juste le nom de notre classe : HelloPlayerListener et validez en cliquant sur 'Finish'.
06.png

Le fichier s'ouvre avec le code auto-généré suivant :

package net.thgbm.forum.Listeners;

public class HelloPlayerListener {

}

Nous allons donc importer le nécessaire de l'API et hériter de playerListener puis attacher la classe principale pour interagir:

package net.thgbm.forum.Listeners;

import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerListener;
import org.bukkit.event.player.PlayerQuitEvent;
import net.thgbm.forum.Hello.Hello;

public class HelloPlayerListener extends PlayerListener {

        public static Hello plugin; 
    
    public HelloPlayerListener(Hello instance) { 
        plugin = instance;
     }

}

Nous saluer à la connexion

Nous devons maintenant traiter nos deux objectifs en commençant par demander au serveur de nous saluer dés qu'on se connecte, pour cela nous allons utiliser la fonction onPlayerJoin() de playerListener et voici donc le code de ce que l'on souhaite :

@Override
public void onPlayerJoin(PlayerJoinEvent event) {
    // On récupère l'objet player en question    
    Player player = event.getPlayer();
    // Et on lui envoi un zoli message pour le saluer
    player.sendMessage( "Salut à toi " + player.getName() );
}

Conclusion de notre HelloPlayerListener

Vous pouvez vous rendre compte que notre code efficace se limite à quelques lignes, le plus long étant de structurer le tout et d'importer/instancier le nécessaire.

Voici le fichier complet :

package net.thgbm.forum.Listeners;

import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerListener;
import org.bukkit.event.player.PlayerQuitEvent;
import net.thgbm.forum.Hello.Hello;

public class HelloPlayerListener extends PlayerListener {

        public static Hello plugin; 
    
    public HelloPlayerListener(Hello instance) { 
        plugin = instance;
     }

        @Override
        public void onPlayerJoin(PlayerJoinEvent event) {
            // On récupère l'objet player en question    
            Player player = event.getPlayer();
            // Et on lui envoi un zoli message pour le saluer
            player.sendMessage( "Salut à toi " + player.getName() );
        }


}

HelloBlockListener

Ça va être la même logique sauf qu'on hérite de blockListener et pas de playerListener.
On importe le nécessaire de l'API.

Voici comment être prévenu d'un block cassé.

package net.thgbm.forum.Listeners;

import org.bukkit.entity.Player;
import org.bukkit.event.block.BlockDamageEvent;
import org.bukkit.event.block.BlockListener;
import net.thgbm.forum.Hello.Hello;

public class HelloBlockListener extends BlockListener {

        public static Hello plugin; 
    
    public HelloBlockListener(Hello instance) { 
        plugin = instance;
     }

        @Override
        public void onBlockDamage(BlockDamageEvent event)
        {
                // On récupère l'objet player qui a fait cette action
                Player player = event.getPlayer(); 
                // Si il est bien un player
                if (player != null) 
                {
                        // On envoi notre message
                        player.sendMessage("Tu viens de casser un block");
                }
                
        }
}

Nous avons donc nos deux listener avec nos nouvelles actions de codé.
Ils sont bien rangés dans leur package 'net.thgbm.forum.Listeners', objectifs atteints.

#1556 Re : Discussions publiques, suggestions » [Tuto Obsolete] Créez votre premier plugin pour bukkit » 20 May 2011 10:36

La classe principale, celle qui hérite de JavaPlugin de bukkit

Maintenant que nos packages principaux sont faits on va s'attaquer à notre première classe.
Cette classe va hériter de JavaPlugin de bukkit pour pouvoir accéder à tout ce dont on a besoin dans notre mod.

Création de notre classe Hello

Faites un clic droit sur le package 'net.thgbm.forum.Hello' et choisissez 'New' -> 'Class'.
05.png

Dans la fenêtre de création assisté de Classe vous avez juste à préciser le nom de la classe à créer : Hello et valider en cliquant sur 'Finish'.

Notre fichier Hello

Notre fichier s'ouvre donc et vous voyez le code minimal généré par Eclipse

package net.thgbm.forum.Hello;

public class Hello {

}

Dans ce code nous allons commencer par importer le nécessaire pour notre classe et hériter de JavaPlugin en modifiant le fichier comme suit :

package net.thgbm.forum.Hello;

//Import du nécessaire de l'API
import org.bukkit.event.Event;
import org.bukkit.event.Event.Priority;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
// Import de nos listeners
import net.thgbm.forum.Listeners.*;

public class Hello extends JavaPlugin {

}

Vous avez du remarquer que votre Eclipse vous signale des erreurs ou des avertissements. Comme vous venez d'hériter de JavaPlugin il vous faut obligatoirement définir 2 fonctions qui sont :
onEnable() et onDisable()

Ces deux fonctions sont les 'accroches' au serveur.
onEnable() là bukkit server démarre votre mod, c'est ici que vous allez démarrer votre application et également informer dans la console que votre mod a bien démarré.

onDisable() ici ce sera tout le ménage à faire lorsque votre mod s'arrète.

Ceci étant dit modifiez votre fichier en y ajoutant ces 2 fonctions :

package net.thgbm.forum.Hello;

//Import du nécessaire de l'API
import org.bukkit.event.Event;
import org.bukkit.event.Event.Priority;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
// Import de nos listeners
import net.thgbm.forum.Listeners.*;

public class Hello extends JavaPlugin {

    @Override
    public void onEnable() 
    { 
        registerEvents();
        System.out.println(this.getDescription().getFullName() + " by " + this.getDescription().getAuthors().toString() + " started" );
    }

    @Override
    public void onDisable()
    {
        System.out.println(this.getDescription().getFullName() + " by " + this.getDescription().getAuthors().toString() + " stopped" );
    }

}

Dans le onEnable() vous avez certainement remarqué que j'appele une autre fonction qui est registerEvents(). Cette fonction va attacher les évenements serveur souhaités pour pouvoir les récupérer quand activés et ajouter nos modifications.

Notre registerEvents()

Voila la partie qui nécessite le plus de connaître les finalités de notre mod.
Pour rappel, je crée ce mod pour :
- me saluer quand je me connecte
- à nouveau me saluer lorsque je lance la commande '/salut'
- et me dire lorsque je casse un bloc

Les événements à capter pour cela sont donc respectivement :
- Event.Type.PLAYER_JOIN
- Event.Type.PLAYER_INTERACT
- Event.Type.BLOCK_DAMAGE

Vous remarquerez donc que 2 de ces 3 types d’événements sont PLAYER et un BLOCK. On revient à ce que je vous disais au début de ce tuto et on voit là nos 2 familles d’événements principaux le blockListener et le playerListener.

Nous allons donc ajouter à notre code le nécessaire pour capter ces 3 types d’événements.


Nous saluer lorsqu'on tape /salut

Voici maintenant le code pour que le serveur nous salut sur demande:

public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){    
    // On recupere le joueur qui a lancé la commande
    Player player = (Player) sender;
    // Si cette commande est '/salut'
    if(commandLabel.equalsIgnoreCase("salut")){ 
        player.sendMessage(    player.getName() + ", salut à toi encore une fois." );
        return true;
    }else{
        return false;
    }
}

Le code ressemblera à cela :

package net.thgbm.forum.Hello;

//Import du nécessaire de l'API
import org.bukkit.event.Event;
import org.bukkit.event.Event.Priority;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
// Import de nos listeners
import net.thgbm.forum.Listeners.*;

public class Hello extends JavaPlugin {


    // BlockListener
    private final HelloBlockListener blockListener = new HelloBlockListener(this);
    // PlayerListener
    private final HelloPlayerListener playerListener = new HelloPlayerListener(this);
    
    /**
     * Capture des events nécessaires
     */
    private void registerEvents() {
        PluginManager pm = getServer().getPluginManager();
        /* Block events */
        pm.registerEvent(Event.Type.BLOCK_DAMAGE, blockListener, Priority.Normal, this);
        /* Player events */
        pm.registerEvent(Event.Type.PLAYER_JOIN, playerListener, Priority.Normal, this);
        pm.registerEvent(Event.Type.PLAYER_INTERACT, playerListener, Priority.Normal, this);
    }

    @Override
    public void onEnable() 
    { 
        registerEvents();
        System.out.println(this.getDescription().getFullName() + " by " + this.getDescription().getAuthors().toString() + " started" );
    }

    @Override
    public void onDisable()
    {
        System.out.println(this.getDescription().getFullName() + " by " + this.getDescription().getAuthors().toString() + " stopped" );
    }

    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){    
        // On recupere le joueur qui a lancé la commande
        Player player = (Player) sender;
        // Si cette commande est '/salut'
        if(commandLabel.equalsIgnoreCase("salut")){ 
            player.sendMessage(    player.getName() + ", salut à toi encore une fois." );
            return true;
        }
        return false;
    }


}

Cette méthode onCommand() permet de lancer des actions donc sur des commandes lancées dans le tchat.

Pour notre projet cela est suffisant. Dans le code vous voyez que je déclare 2 Listeners : HelloBlockListener et HelloPlayerListener : ce sont nos Listeners qui va falloir créer et qui feront le boulot qu'il reste.

#1557 Re : Discussions publiques, suggestions » [Tuto Obsolete] Créez votre premier plugin pour bukkit » 20 May 2011 10:35

Création d'un nouveau projet dans Eclipse

Vous avez les pré-requis alors on peut se lancer.

Aprés avoir démarré votre Eclipse allez dans le menu 'File' -> 'New' -> 'Java Project'.

Vous devez arriver à une fenêtre comme celle ci :
01.png

Dans 'Project name' vous indiquez le nom de votre projet. Pour notre exemple il va donc s'appeler 'Hello'. On va se contenter de cela, cliquez donc sur 'Finish'.


Ajoutez la référence de l'API bukkit

Votre projet étant créé vous le voyez apparaître dans l'onglet 'Package explorer' de Eclipse
02.png

Vous vous rappelez que vous avez téléchargé le .jar de l'API de bukkit. Maintenant il vous faut la référencer dans votre projet.
Pour cela faites un clic droit sur le nom du projet 'Hello'.
Choisissez 'Properties'.
Allez dans menu 'Java build path'.
Dans l'onglet 'Libraries' vous verrez les librairies référencées pour ce projet. C'est ici que vous allez ajouter l'API en cliquant sur le bouton 'Add external JAR' et en allant chercher le fichier .jar que vous avez téléchargé tout à l'heure.

03.png

Création de notre premier package

Notre package sera pour l'exemple : 'net.thgbm.forum.Hello', alors cliquez droit sur le projet 'Hello' et choissisez 'New' -> 'Package'.
04.png

Refaites la même manip pour vous familiariser au 'rangement' pour le package 'net.thgbm.forum.Listeners'.

Allez pour vous entraîner refaites la encore une fois pour le package 'net.thgbm.forum.Utils' dans lequel on y rangera nos fonctions.

#1558 Re : Discussions publiques, suggestions » [Tuto Obsolete] Créez votre premier plugin pour bukkit » 20 May 2011 10:33

Concepts essentiels

Petit rappel sur les packages java

Un package Java, par exemple net.thgbm.forum se retranscrits dans l'archive .jar comme une arborescence de dossier, ce qui nous donne pour cet exemple la structure de dossier suivante :

- net
    - thgbm
        - forum

Gardez bien cela en mémoire pour vous permettre de bien 'ranger' vos futures classes, interface & co.
Je vous donne un exemple concret : dans ce package j'ai plusieurs fonctions qui envoi des messages customisés, un message en rouge pour un joueur précis, un message pour tout le monde etc..
Pour bien les ranger vous pouvez les mettre dans le package, par exemple, net.thgbm.forum.utils.message à coté des fonctions qui travaillent sur les strings par exemple net.thgbm.forum.utils.string, cela vous donnera une arborescence de ce genre :

- net
    - thgbm
        - forum
            - utils
                - message
                - string

Pensez donc à bien structurer votre code pour bien 'ranger'.

Les événements

On peut interagir grâce aux mods sur différents aspects du serveur.
On peut créer une action lors d'un clic sur un block, lors de la destruction d'un block, lors de l’arrivée sur le serveur d'un joueur ... et j'en passe ..

Ces actions sur lesquelles on peut agir sont en fait des événements. Pour pouvoir les modifier ou ajouter de nouvelles fonctions dés qu'un de ces événements intervient il vous faut les 'capter'.
Vous verrez que l'un des intérêts de travailler avec une IDE c'est qu'elle vous listera pour cet exemple tous les événements disponibles dans l'API.

#1559 Re : Discussions publiques, suggestions » [Tuto Obsolete] Créez votre premier plugin pour bukkit » 20 May 2011 10:32

Les pré-requis


emblem-important.pngIMPORTANT
Java ne s'invente pas alors si vous n'avez pas déjà programmé sous ce langage ou un langage orienté objet je vous invite avant tout à vous former

  • pour votre confort choisissez une IDE, pour ma part j'utilise Eclipse

  • sauvegardez l'API de bukkit dans un endroit sûr.
    Vous devrez y faire référence dans tous vos projets de mods, cette API vous permettra d’accéder et d'agir sur les événements du serveur bukkit.


icon_attention.gifPremiers avertissements

  • Le .jar de l'API ne doit pas être confondu avec le .jar de bukkit !

  • Une mise à jour de minecraft nécessite la mise à jour de bukkit server qui peut entraîner la mise à jour de l'API, veillez à toujours utiliser la dernière version de l'API donc !

#1560 Discussions publiques, suggestions » [Tuto Obsolete] Créez votre premier plugin pour bukkit » 20 May 2011 10:31

boozaa
Réponses : 14

Si vous souhaitez diffuser ce tutoriel je vous demande juste la gentillesse de me citer.

TUTO OBSOLETE


Créez votre premier plugin

Pour ceux parmi vous ayant des connaissances en Java ou langage orienté objet et avec l'envie de créer votre propre mod je vous propose un tutoriel imagé pour vous aider à démarrer.

Sommaire

  1. Les pré-requis

  2. Concepts essentiels

  3. Création d'un nouveau projet dans Eclipse

  4. La classe principale, celle qui hérite de JavaPlugin de bukkit

  5. Les listeners, ceux qui sont à l'écoute des événements captés et agissent

  6. Le fichier plugin.yml indispensables références pour votre mod

  7. Générer le .jar exploitable de votre mod

  8. Une meilleure gestion des commandes utilisateurs

  9. Et pourquoi avoir créé le package net.thgbm.forum.Utils ?

  10. à venir

  11. à venir

Bien démarrer

Avant de démarrer il faut savoir où l'on va.
Vous devez avoir déjà une idée précise de ce que va faire votre mod, pas forcément comment il va le faire mais au moins connaître ses objectifs.

Notre projet Hello

Je vous propose un projet basique pour tenter de voir ensemble comment démarrer un mod.
Ce que mon mod doit faire :

  • le serveur doit me saluer lorsque je me connecte

  • quand je tape la commande '/salut' je veux que le serveur me salut de nouveau

  • lorsque que je casse un block je veux que le serveur m'en informe

Cet exemple plutôt basique et sans grand intérêt dans le jeu va nous permettre de voir les 2 grandes familles d’événements:
le blockListener et le playerListener

Ce ne sont pas les seules mais les principales donc, après tout dépend de ce que doit faire votre mod.

#1563 Re : Réclamations, éventuelles Demandes de Ban » Cratere au mcdonald » 18 May 2011 09:07

A propos de TNT, dans les mods installés il y en a pas un qui logs tous les usages de cet item ?

#1564 Re : Détente, flood:p » Terraria - Achat groupé » 17 May 2011 18:23

Alors pour l'instant sauf erreur de ma part on est 3 :
- boozaa
- bar_na_bet
- benofdark

Il nous manquerait un 4°.

#1565 Re : Détente, flood:p » Terraria - Achat groupé » 17 May 2011 16:51

Ben un parmis nous fournis son paypal et achetes le pack.
Le mieux serait que ce soit un membre du staff autrement je peux m'en occuper.

#1566 Re : Réclamations, éventuelles Demandes de Ban » incinerateur public » 17 May 2011 15:35

J'espere que le comité n'est pas contre le fait de réparer ce que l'on voit de déteriorer dans ce genre d'exemple en se promenant, un bloc ou deux, une dalle...?
Dans ces exemples y a pas mort d'homme on va dire que c'est de la maintenance ordinaire ou vous préferez la delation pour ajouter ce genre de petits délits à la charge du coupable ?

#1567 Détente, flood:p » Terraria - Achat groupé » 17 May 2011 13:18

boozaa
Réponses : 16

Plop,

vous avez peut être entendu parler de Terraria le clone 2D de Minecraft disponible sous Steam.
En ce moment Steam propose le jeu à 9.99€ mais propose aussi un pack de 4 pour 29.99€.

Alors je me demandais si quelqu'un d'autre que moi serait intéressé par ce jeu et voir si un achat groupé ne serait pas possible.

Voilou, dites moi...

Lien vers l'offre

#1568 Re : Réclamations, éventuelles Demandes de Ban » ban de blackior ? » 16 May 2011 19:18

Genuflexion devant chaque habitant ?

Mouarfhihi ca devient la gestapo le Gros Oeil.

#1569 Re : PLUGINS Ajoutés, Améliorations du jeu » Propositions de nouvelles règles / plugins » 16 May 2011 17:03

Ben là avoir 2 versions de minecraft sur son poste vaut le coup parce que je te dis pas à chaque mis à jour la panique si en plus du coté serveur faut s'occuper du coté client.

Pour ma part je serais pour tester si c'est 'optionnel'.

#1572 Re : INSCRIPTION DES NOUVEAUX JOUEURS » [ACCEPTE] presentation Larousse » 15 May 2011 20:09

larousse a écrit :

Bonjour je m'appelle Larousse et je voudrais venir sur votre serveur.
je fais quelques constructions en solo mais seul c'est un peu lourd a la longue j'aime bien les constructions de grandes tailles si c'est pour faire une maison de 10 sur 5  je reste en solo .
Je me connecte souvent (je ne pourrai pas dire d'heures précises =/) mais entre 3 et 10h de jeu par semaine... meme si ce moment je vais avoir quelques examens je serai un peu moins présent.

voilas merci de m'avoir lus

Larousse


Je sais c'était pas drôle..

#1573 Re : Réclamations, éventuelles Demandes de Ban » La pelle et la pioche brulés - demande de ban benjamindeph » 15 May 2011 20:06

Moi je propose d'utiliser son mail pour l'inscrire dans tous les sites de prOn... tongue

#1574 Re : INSCRIPTION DES NOUVEAUX JOUEURS » [ACCEPTE] presentation Larousse » 15 May 2011 18:03

Salut à toi et j'espere pour toi que tu seras accepté.
C'est rigolo de voir un message sans ' '' '', je savais pas qu'il était retiré du dico ...Larousse ... ok je sais c'est nul je sors.

Pied de page des forums

Propulsé par FluxBB