Un jour Rigodron est venu me voir en me demandant si je voulais bien faire du développement de plugins Minecraft avec lui via le projet NeverEnoughTrees, un projet extrêmement ambitieux de création de terrain personnalisé, qu’il menait avec d’autres développeurs talentueux. Je faisais du Java depuis des années et je jouais à Minecraft depuis des années alors j’ai dis : meh, pourquoi pas ¯\(°_o)/¯ Après tout, Minecraft ne souffre d’aucun bug débilitant 😏

Après m’avoir expliqué la différence entre un plugin (exécuté par le serveur du jeu) et un mod (exécuté par un client du jeu), et m’avoir armé avec la documentation de Spigot, Rigodron m’a challengé pour créer un premier plugin, histoire de prendre en main le processus.

J’ai voulu commencé par quelque chose de simple et qui me manquait dans nos parties avec mon fils mais atteignable avec les possibilités de neverEnoughTrees : la possibilité d’écrire un message secret et de le délivrer à quelqu’un sans qu’il connaisse son contenu dans l’immédiat mais doive d’abord ouvrir la lettre ^^ Comme une carte de vœux dans la vraie vie ❤️ ✉️

Le message est écrit sur une map, en lieu et place de la vue topdown capturée habituellement, ce qui permet de conserver le secret jusqu’au moment propice, en gardant la carte pliée. On peut la mettre dans son inventaire sans la lire.

Le message est écrit sur la carte à l’aide du MapRenderer développé par Rigodron pour le projet NeverEnoughTrees.

package fr.neverenough.giftcard;

import java.util.Objects;

import fr.neverenough.giftcard.map.MapRender;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.MapMeta;
import org.bukkit.map.MapView;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin {
	public static MapRender myMapRender;

	@Override
	public void onEnable() {
		myMapRender = new MapRender("");

		Objects.requireNonNull(getCommand("giftcard")).setExecutor((commandSender, command, label, args) -> {
			StringBuilder message = new StringBuilder();

			if (commandSender instanceof Player player) {
				for (String arg : args) {
					message.append(arg);
					message.append(" ");
				}

				int charactersByLine = 24;

				int messageLinesQuantity = (int) Math.ceil(((double) message.length())/charactersByLine);
				String multilineMessage = "";

				// filling the last line with spaces for simplicity of coding �\(�_o)/�
				int fillingSpacesQuantity = (messageLinesQuantity*charactersByLine) - message.length();
				message.append(" ".repeat(Math.max(0, fillingSpacesQuantity)));

				for (int i = 0; i < messageLinesQuantity; i++) {
					multilineMessage = multilineMessage + message.substring(i*charactersByLine, (i*charactersByLine)+charactersByLine) + "\n";
				}

				ItemStack giftcardsStack = new ItemStack( Material.FILLED_MAP, 1);
				myMapRender = new MapRender(multilineMessage);

				MapMeta meta = (MapMeta) giftcardsStack.getItemMeta();

				MapView mapView = Bukkit.getServer().createMap(Bukkit.getWorld("world"));
				mapView.getRenderers().clear();
				mapView.addRenderer(myMapRender);
				meta.setMapView(mapView);

				giftcardsStack.setItemMeta(meta);

				player.getInventory().addItem(giftcardsStack);
			}
			return false;
		});
		System.out.println("giftcard enabled");
	}
}

La limitation étant que comme une sur vraie carte (au sens propre) de vœux, la place est limitée et on ne peut pas effacer. Il faut donc choisir ses mots avec soin ^^

Le code est disponible sur Github si vous voulez laisser des mots doux sur vos serveurs ^^

Leave a Reply