[Présentation] Mes Plugins

Bearless_

Aventurier
24 Septembre 2023
13
0
1
19
Bien le Bonjour

Je suis un petit Développeur qui débute et je viens ici vous présentez mes plugins que j'ai réalisé entièrement seuls afin d'avoir des retours et de m'améliorer.

Mon Profil SpigotMC est: https://www.spigotmc.org/resources/authors/bearless.1881313/
Mon Github est: https://github.com/BearlessDev
Mon Discord de Support est: https://discord.gg/Y2gaXtdrG9

J'ai (pour le moment) fait 2 Plugin:

  • SuperSimpleFly: Il permet comme son nom l'indique de Simplement d'implémenté le Fly dans votre Monde/Lobby et de modifier comme bon vous semble tout les Messages/Permissions.
  • LobbyManager: il permet de Désactivé/Activé des fonctionnalités afin de simplement gérer votre Lobby, vous pouvez modifier les messages et permissions, désactivé/activé le spawn d'entité, le changement de météo, d'heures etc...
Voila je voulais juste vous partagez mes travaux afin de pouvoir m'améliorez dans la création de plugin Minecraft.

Cordialement,
Bearless_
 
Dernière édition:

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 508
198
498
247
21
Mìlhüsa
Bonjour,

Je vais reprendre un peu ce qu'a dit Detobel car a priori tu n'as pas vu ;
(diff) https://github.com/BearlessDev/LobbyManager/compare/f7b9a7c7bd13bef22bed33e113a8e697dcbd9ca3...main

Java:
if(plugin.getConfig().getBoolean("server.disable_default_quit_message")){
    e.setQuitMessage(plugin.getConfig().getString("server.custom_quit_message").replace("&", "§").replaceAll("%player%", player.getName()));
}

Le code n'est pas correct ; tu vas remplacer incorrectement des textes comme
%player% a quitté le lobby d'Adam & Eve !
par
%appdata% a quitté le lobby d'Adam § Eve !
Utilise ChatColor#translateAlternateColorCodes(char, String) pour vérifier qu'il s'agisse bien d'une esperluette de couleur.

De plus, je trouve que c'est mieux cognitivement de cacher l'implémentation :
Java:
if(plugin.hasCustomQuitMessage()) {
    e.setQuitMessage(plugin.getCustomQuitMessage(player));
}
Java:
// Main extends JavaPlugin
public String getCustomQuitMessage(Player p) {
    return ChatColor.translateAlternateColorCodes('&', this.getConfig().getString("server.custom_quit_message")).replaceAll("%player%", p.getDisplayName());
}
Car ce n'est pas à l'@EventHandler de se soucier d'où est stockée la configuration.

Java:
String world = plugin.getConfig().getString("world.spawn_world_name");
Double spawnX = plugin.getConfig().getDouble("world.spawn_X");
Double spawnY = plugin.getConfig().getDouble("world.spawn_Y");
Double spawnZ = plugin.getConfig().getDouble("world.spawn_Z");
int spawnYaw = plugin.getConfig().getInt("world.spawn_Yaw");
int spawnPitch = plugin.getConfig().getInt("world.spawn_Pitch");
Location loc = new Location(Bukkit.getWorld(world), spawnX, spawnY, spawnZ, spawnYaw, spawnPitch);
Tu peux simplement faire Location spawn = plugin.getConfig().getLocation("world.spawn");.

Java:
public class spawnCmd implements CommandExecutor {
    private Main plugin;
Par convention les classes s'écrivent en CamelCase (SpawnCmd), et comme tu as a priori l'autocomplétion pas besoin de compresser les noms (SpawnCommand) vu que dans tous les cas tu auras juste à écrire les premières lettres, ça sera plus lisible.

Et je sais que dans énormément de ressources en ligne ils appellent la classe principale du plugin Main, mais ça ne veut rien dire ; préfère mettre le nom du plugin (LobbyManager).


Tu as fait ton plugin avec IntelliJ, cela force les gens à utiliser IntelliJ pour modifier ton plugin. L'on .gitignore généralement les dossiers de l'IDE (*.iml, idea/) et l'on gère les dépendances et la création du .jar avec Maven.

Cordialement,
ShE3py
 

Bearless_

Aventurier
24 Septembre 2023
13
0
1
19
Bonjour,

Je vais reprendre un peu ce qu'a dit Detobel car a priori tu n'as pas vu ;
(diff) https://github.com/BearlessDev/LobbyManager/compare/f7b9a7c7bd13bef22bed33e113a8e697dcbd9ca3...main

Java:
if(plugin.getConfig().getBoolean("server.disable_default_quit_message")){
    e.setQuitMessage(plugin.getConfig().getString("server.custom_quit_message").replace("&", "§").replaceAll("%player%", player.getName()));
}

Le code n'est pas correct ; tu vas remplacer incorrectement des textes comme

par

Utilise ChatColor#translateAlternateColorCodes(char, String) pour vérifier qu'il s'agisse bien d'une esperluette de couleur.

De plus, je trouve que c'est mieux cognitivement de cacher l'implémentation :
Java:
if(plugin.hasCustomQuitMessage()) {
    e.setQuitMessage(plugin.getCustomQuitMessage(player));
}
Java:
// Main extends JavaPlugin
public String getCustomQuitMessage(Player p) {
    return ChatColor.translateAlternateColorCodes('&', this.getConfig().getString("server.custom_quit_message")).replaceAll("%player%", p.getDisplayName());
}
Car ce n'est pas à l'@EventHandler de se soucier d'où est stockée la configuration.

Java:
String world = plugin.getConfig().getString("world.spawn_world_name");
Double spawnX = plugin.getConfig().getDouble("world.spawn_X");
Double spawnY = plugin.getConfig().getDouble("world.spawn_Y");
Double spawnZ = plugin.getConfig().getDouble("world.spawn_Z");
int spawnYaw = plugin.getConfig().getInt("world.spawn_Yaw");
int spawnPitch = plugin.getConfig().getInt("world.spawn_Pitch");
Location loc = new Location(Bukkit.getWorld(world), spawnX, spawnY, spawnZ, spawnYaw, spawnPitch);
Tu peux simplement faire Location spawn = plugin.getConfig().getLocation("world.spawn");.

Java:
public class spawnCmd implements CommandExecutor {
    private Main plugin;
Par convention les classes s'écrivent en CamelCase (SpawnCmd), et comme tu as a priori l'autocomplétion pas besoin de compresser les noms (SpawnCommand) vu que dans tous les cas tu auras juste à écrire les premières lettres, ça sera plus lisible.

Et je sais que dans énormément de ressources en ligne ils appellent la classe principale du plugin Main, mais ça ne veut rien dire ; préfère mettre le nom du plugin (LobbyManager).


Tu as fait ton plugin avec IntelliJ, cela force les gens à utiliser IntelliJ pour modifier ton plugin. L'on .gitignore généralement les dossiers de l'IDE (*.iml, idea/) et l'on gère les dépendances et la création du .jar avec Maven.

Cordialement,
ShE3py
Merci pour t'es réponses, en faite je ne suis pas un expert en Java je fait sa par plaisir et comme passe temps, mais je reste bien évidement sérieux dans ce que je fait.

Ensuite ici:
Java:
if(plugin.hasCustomQuitMessage()) {
    e.setQuitMessage(plugin.getCustomQuitMessage(player));
}
Java:
// Main extends JavaPlugin
public String getCustomQuitMessage(Player p) {
    return ChatColor.translateAlternateColorCodes('&', this.getConfig().getString("server.custom_quit_message")).replaceAll("%player%", p.getDisplayName());
}
Si je fait sa je dois le faire pour tout les message, permission, boolean ?

Ensuite pour là:
Location spawn = plugin.getConfig().getLocation("world.spawn");
Je n'arrive pas à comprendre comment je le place dans la config, en faite comment juste avec sa il va trouver le x, y, z etc... comment je le set dans le config.yml ?

Ensuite pour le nom des class mes Events sont comme sa mais pas mes commandes jsp pas pourquoi j'avais jamais remarquer mais merci :).

Pour le nom de la class Principale je l'ai toujours appelé comme sa, j'y suis habitué c'est comme sa que je la retrouve facilement, donc je continuerais de l'appelé comme sa, par pure habitude et pour évité de me perdre.

Et enfin pour le compiler vu que je ne sais pas comment fonctionne maven (J'ai déjà essayé mais en vain), je préfère faire avec celui de base de Intelijj, et puis dans mes plugins je ne fait pas d'api spécifique donc je vois pas pourquoi des gens aurait besoin de modifier eux même mon plugin, je changerais peut être pour Maven quand je m'y connaitrais plus en Dev de plugin et que sa me seras plus utile.

En tout cas merci de ta réponse, je vais essayé d'appliquer certaine de tes correction.

Cordialement,
Bearless_
 

EdgarPi

Correcteur
Staff
Correcteur
9 Février 2014
183
13
26
135
Salut à toi,
Si je fait sa je dois le faire pour tout les message, permission, boolean ?
Tu ne dois rien faire, c'est juste plus simple et il y a moins de risques de faire des erreurs. En programmation, il faut être fainéant et écrire la même chose le moins possible, surtout quand il s'agit de String ou autres valeurs arbitraires écrites telles qu'elles. Je vois que tu l'as appliqué dans ton dernier commit (du moins en partie), ce qui est une bonne chose.
Ensuite pour là:
Location spawn = plugin.getConfig().getLocation("world.spawn");
Je n'arrive pas à comprendre comment je le place dans la config, en faite comment juste avec sa il va trouver le x, y, z etc... comment je le set dans le config.yml ?
Spigot est très ouvert : non seulement il y a de la documentation, mais le code est opensource. Si on combine les deux, on arrive à la class org.bukkit.Location qui contient cette méthode :
Java:
@Override
@Utility
@NotNull
public Map<String, Object> serialize() {
    Map<String, Object> data = new HashMap<String, Object>();

    if (this.world != null) {
        data.put("world", getWorld().getName());
    }

    data.put("x", this.x);
    data.put("y", this.y);
    data.put("z", this.z);

    data.put("yaw", this.yaw);
    data.put("pitch", this.pitch);

    return data;
}

Elle renvoie une liste de combinaisons de String et de Object (voir la doc Java sur les Map pour plus de précision), les String étant le chemin pour accéder à la valeur Object dans le fichier. Je te conseille de te renseigner un peu sur la structure d'un fichier YAML, très intuitive une fois qu'on comprend son fonctionnement. Dans ton cas, la structure serait :
YAML:
world:
  spawn:
    x: ...
    y: ...
    z: ...
    world: ...
Tel que montré dans la méthode plus haut, le monde peut-être null (c'est à dire sans valeur) si Location.world == null.

Enfin, Maven commence à perdre en popularité au profit de Gradle. Cependant, tant que tu ne comptes pas participer à la création de plugins collaboratifs, utiliser le compilateur intégré à Intellij est une bonne idée bien que @ShE3py en ait donné les limites.

Je conclurai en te félicitant de t'être lancé dans cette aventure, grâce à laquelle j'ai moi-même découvert, comme une majorité de devs ici, les joies de la programmation.

En espérant avoir pu t'aider,
EdgarPi
 
  • J'aime
Reactions: Detobel36