Guide complet pour apprendre le scripting Minecraft Bedrock
Vous n'avez jamais fait de codage ? Pas de panique ! Cette section est spécialement conçue pour vous aider à comprendre les bases étape par étape.
Le codage (ou programmation) est l'art de donner des instructions à un ordinateur.
JavaScript est le langage utilisé pour Minecraft Bedrock scripting.
C'est créer des mods et fonctionnalités personnalisées dans Minecraft.
Pour commencer, vous avez besoin de :
Commençons avec quelque chose de très simple : un script qui dit bonjour aux joueurs.
// Votre tout premier script !
// Ce script va dire "Bonjour" à chaque joueur qui rejoint
world.afterEvents.playerSpawn.subscribe((eventData) => {
let player = eventData.player;
// Vérifier si c'est la première connexion du joueur
if (eventData.initialSpawn) {
player.sendMessage("§aBonjour " + player.name + " ! Bienvenue sur le serveur !");
}
});Les lignes commençant par // sont des commentaires.
world.afterEvents.playerSpawn.subscribe écoute un événement.
let player = eventData.player; crée une variable.
player.sendMessage(...) envoie un message au joueur.
Tout le monde fait des erreurs au début !
Ne essayez pas de tout apprendre d'un coup.
Les bons outils rendent le codage plus facile.
Commencez par des projets réalisables.
Le scripting Minecraft Bedrock vous permet de créer des expériences personnalisées dans Minecraft en utilisant JavaScript. Vous pouvez modifier le comportement du jeu, créer de nouveaux mécanismes et interagir avec le monde de manière programmée.
Un pack de comportement avec des scripts doit contenir :
mon_pack/ ├── manifest.json ├── scripts/ │ └── main.js └── pack_icon.png
Les imports sont essentiels dans la nouvelle API Minecraft Bedrock. Ils permettent d'accéder aux différentes fonctionnalités du jeu de manière modulaire et optimisée.
// Importer les modules essentiels
import { system, world, ItemStack, Player, Entity, Vector3 } from "@minecraft/server";
import { ActionFormData, ModalFormData, MessageFormData, uiManager } from "@minecraft/server-ui";
import { CommandPermissionLevel, CustomCommandParamType, EntityDamageCause } from "@minecraft/server";
// Importer les composantes utiles
import { EntityHealthComponent, EntityInventoryComponent } from "@minecraft/server";{
"format_version": 2,
"header": {
"name": "Mon Pack de Script",
"description": "Un pack pour apprendre le script",
"uuid": "12345678-1234-1234-1234-123456789012",
"version": [1, 0, 0],
"min_engine_version": [1, 21, 90]
},
"modules": [
{
"type": "script",
"language": "javascript",
"uuid": "87654321-4321-4321-4321-210987654321",
"version": [1, 0, 0],
"entry": "scripts/main.js"
}
],
"dependencies": [
{
"module_name": "@minecraft/server",
"version": "2.8.0-beta"
},
{
"module_name": "@minecraft/server-ui",
"version": "2.1.0-beta"
}
]
}Les variables sont des conteneurs pour stocker des données. Dans Minecraft scripting, elles sont utilisées pour suivre l'état du jeu, les informations des joueurs, et bien plus encore.
// Variables globales - accessibles partout dans le code
let playerName = "Steve"; // Nom du joueur par défaut
const MAX_HEALTH = 20; // Constante qui ne change pas
var score = 0; // Ancienne méthode (évitez si possible)
// Variables locales - dans une fonction ou un bloc
function exampleFunction() {
let localVariable = "local"; // Existe seulement ici
const PI = 3.14159; // Constante mathématique
}
// Types de données essentiels
let playerName = "Alex"; // String - chaîne de caractères
let playerAge = 25; // Number - nombres entiers ou décimaux
let isAdmin = true; // Boolean - vrai ou faux
let inventory = []; // Array - liste d'éléments
let playerData = { // Object - structure complexe
name: "Alex",
health: 20,
position: { x: 0, y: 64, z: 0 }
};
// Types spéciaux Minecraft
let position = new Vector3(10, 64, 15); // Position 3D
let itemStack = new ItemStack("minecraft:diamond", 5); // Item avec quantitéconst quand la valeur ne change paslet pour les variables qui peuvent changervar - ancienne syntaxe avec des problèmes de portéeplayerHealth au lieu de phMAX_PLAYERSChaînes de caractères pour le texte
let message = "Bienvenue dans Minecraft !";
Nombres pour les calculs
let health = 20;
let position = {x: 10, y: 64, z: 15};Vrai ou faux pour les conditions
let isFlying = false; let hasPermission = true;
// Fonction simple
function sayHello() {
world.say("Bonjour Minecraft !");
}
// Fonction avec paramètres
function teleportPlayer(player, x, y, z) {
player.teleport({x: x, y: y, z: z});
}
// Fonction fléchée
const calculateDamage = (damage, armor) => {
return Math.max(1, damage - armor);
};// Variable globale
let globalCounter = 0;
function incrementCounter() {
// Variable locale
let localCounter = 0;
globalCounter++;
localCounter++;
console.log("Global: " + globalCounter);
console.log("Local: " + localCounter);
}Les composantes (components) sont les modules qui définissent les capacités et les propriétés des entités dans Minecraft.
// Obtenir et manipuler la santé
let healthComponent = player.getComponent("minecraft:health");
if (healthComponent) {
let currentHealth = healthComponent.currentValue;
let maxHealth = healthComponent.defaultValue;
// Vérifier si le joueur est blessé
if (currentHealth < maxHealth) {
player.sendMessage("§cVous êtes blessé ! Santé: " + currentHealth + "!" + maxHealth);
}
// Soigner le joueur
healthComponent.setCurrentValue(maxHealth);
player.sendMessage("§aVous avez été soigné !");
// Appliquer des dégâts
healthComponent.setCurrentValue(currentHealth - 5);
}
// Alternative avec applyDamage
player.applyDamage(5, { cause: EntityDamageCause.fire });// Accéder à l'inventaire du joueur
let inventoryComponent = player.getComponent("minecraft:inventory");
if (inventoryComponent) {
let inventory = inventoryComponent.container;
// Obtenir un item spécifique
let item = inventory.getItem(0); // Premier slot
if (item) {
console.log("Item: " + item.typeId + " Quantité: " + item.amount);
}
// Ajouter un item
let diamond = new ItemStack("minecraft:diamond", 5);
inventory.addItem(diamond);
// Vérifier si le joueur a un certain item
let hasDiamond = false;
for (let i = 0; i < inventory.size; i++) {
let slotItem = inventory.getItem(i);
if (slotItem && slotItem.typeId === "minecraft:diamond") {
hasDiamond = true;
break;
}
}
if (hasDiamond) {
player.sendMessage("§6Vous avez des diamants dans votre inventaire !");
}
// Compter les items
let totalDiamonds = 0;
for (let i = 0; i < inventory.size; i++) {
let slotItem = inventory.getItem(i);
if (slotItem && slotItem.typeId === "minecraft:diamond") {
totalDiamonds += slotItem.amount;
}
}
player.sendMessage("§bTotal de diamants: " + totalDiamonds);
}// Accéder à l'équipement du joueur
let equipmentComponent = player.getComponent("minecraft:equippable");
if (equipmentComponent) {
let equipment = equipmentComponent.getEquipmentSlot(EquipmentSlot.Mainhand);
let heldItem = equipment.getItem();
if (heldItem) {
player.sendMessage("§fItem en main: " + heldItem.typeId);
// Vérifier si c'est une épée
if (heldItem.typeId.includes("sword")) {
player.sendMessage("§cVous tenez une épée !");
}
}
// Équiper un item
let sword = new ItemStack("minecraft:diamond_sword", 1);
equipment.setItem(sword);
// Accéder à l'armure
let helmet = equipmentComponent.getEquipmentSlot(EquipmentSlot.Head);
let chestplate = equipmentComponent.getEquipmentSlot(EquipmentSlot.Chest);
let leggings = equipmentComponent.getEquipmentSlot(EquipmentSlot.Legs);
let boots = equipmentComponent.getEquipmentSlot(EquipmentSlot.Feet);
// Vérifier si le joueur a une armure complète
let hasFullArmor = helmet.getItem() && chestplate.getItem() &&
leggings.getItem() && boots.getItem();
if (hasFullArmor) {
player.addTag("armored");
} else {
player.removeTag("armored");
}
}// Obtenir la position du joueur
let position = player.location;
player.sendMessage("§aPosition: X=" + Math.floor(position.x) +
", Y=" + Math.floor(position.y) +
", Z=" + Math.floor(position.z));
// Obtenir la dimension
let dimension = player.dimension;
player.sendMessage("§bDimension: " + dimension.id);
// Téléporter vers des coordonnées spécifiques
player.teleport({ x: 100, y: 64, z: 200 });
// Téléporter à un autre joueur
function teleportToPlayer(player, targetName) {
let players = world.getAllPlayers();
let target = players.find(p => p.name === targetName);
if (target) {
player.teleport(target.location);
player.sendMessage("§aTéléporté vers " + targetName);
} else {
player.sendMessage("§cJoueur non trouvé: " + targetName);
}
}
// Zone de protection
let protectedZone = {
min: { x: -50, y: 0, z: -50 },
max: { x: 50, y: 100, z: 50 }
};
world.beforeEvents.playerBreakBlock.subscribe((event) => {
let pos = event.block.location;
if (pos.x >= protectedZone.min.x && pos.x <= protectedZone.max.x &&
pos.y >= protectedZone.min.y && pos.y <= protectedZone.max.y &&
pos.z >= protectedZone.min.z && pos.z <= protectedZone.max.z) {
event.cancel = true;
event.player.sendMessage("§cCette zone est protégée !");
}
});// Mode de jeu
let gamemode = player.getGamemode();
player.sendMessage("§7Mode de jeu: " + gamemode);
// Changer le mode de jeu
player.setGamemode("creative"); // creative, survival, adventure, spectator
// Cloner un item
function cloneItem(item) {
if (!item) return null;
let cloned = new ItemStack(item.typeId, item.amount);
cloned.nameTag = item.nameTag;
cloned.lore = item.lore;
// Copier les enchantements si présents
if (item.getComponent("minecraft:enchantable")) {
let enchantComponent = cloned.getComponent("minecraft:enchantable");
// Logique d'enchantement ici
}
return cloned;
}
// Utilisation du clonage
world.beforeEvents.itemUse.subscribe((event) => {
let player = event.source;
let item = event.item;
if (player.hasTag("admin") && item.typeId === "minecraft:stick") {
event.cancel = true;
// Cloner l'item dans la main secondaire
let offhandSlot = player.getComponent("minecraft:equippable")
.getEquipmentSlot(EquipmentSlot.Offhand);
if (!offhandSlot.getItem()) {
let cloned = cloneItem(item);
offhandSlot.setItem(cloned);
player.sendMessage("§aItem cloné dans la main secondaire !");
}
}
});Voici 8 exercices progressifs pour vous entraîner et maîtriser le scripting Minecraft Bedrock.
Créez un système qui accueille les nouveaux joueurs et leur donne un kit de départ.
// Objectif: Détecter les nouveaux joueurs
// Compétences: playerSpawn, tags, inventaire
world.afterEvents.playerSpawn.subscribe((event) => {
// Votre code ici
});Créez un système qui compte les kills et donne des récompenses.
// Objectif: Suivre les kills des joueurs
// Compétences: entityDie, scores, messages
world.afterEvents.entityDie.subscribe((event) => {
// Votre code ici
});Implémentez une économie avec des commandes pour gagner et dépenser de l'argent.
// Objectif: Créer un système monétaire
// Compétences: chatSend, scores, commandes
world.beforeEvents.chatSend.subscribe((event) => {
// Votre code ici
});Créez des zones protégées où seul certains joueurs peuvent construire.
// Objectif: Protéger des zones spécifiques
// Compétences: blockBreak, blockPlace, positions
world.beforeEvents.playerBreakBlock.subscribe((event) => {
// Votre code ici
});Créez des items avec des pouvoirs spéciaux lorsqu'ils sont utilisés.
// Objectif: Items avec effets spéciaux
// Compétences: itemUse, effets, composantes
world.beforeEvents.itemUse.subscribe((event) => {
// Votre code ici
});Implémentez un système de quêtes avec objectifs et récompenses.
// Objectif: Gérer des quêtes // Compétences: données persistantes, conditions // Créez des quêtes et suivez leur progression
Créez un mini-jeu comme un système de capture de drapeau.
// Objectif: Implémenter un mini-jeu // Compétences: événements multiples, logique de jeu // Créez un jeu avec règles et victoires
Créez des outils d'administration avec interface graphique.
// Objectif: Outils d'administration // Compétences: UI, commandes avancées // Créez des formulaires et commandes admin
console.log() ou world.sendMessage() pour déboguerLes événements sont au cœur du scripting Minecraft. Ils vous permettent de réagir à ce qui se passe dans le jeu.
// Événement de chat (nouvelle syntaxe)
world.beforeEvents.chatSend.subscribe((eventData) => {
// Code exécuté avant chaque message de chat
console.log("Message reçu: " + eventData.message);
// Pour annuler le message
if (eventData.message.startsWith("!")) {
eventData.cancel = true;
}
});
// Événement de tick (exécuté 20 fois par seconde)
system.beforeEvents.tick.subscribe(() => {
// Code exécuté à chaque tick
// Attention: ne pas mettre de code trop lourd ici !
});
// Événement de démarrage
system.beforeEvents.startup.subscribe((init) => {
// Code exécuté au démarrage du serveur
console.log("Serveur démarré !");
});// Quand un joueur rejoint le monde
world.afterEvents.playerSpawn.subscribe((eventData) => {
let player = eventData.player;
if (eventData.initialSpawn) {
world.say("Bienvenue " + player.name + " !");
}
});
// Quand un joueur meurt
world.afterEvents.entityDie.subscribe((eventData) => {
let entity = eventData.deadEntity;
if (entity.typeId === "minecraft:player") {
world.say(entity.name + " est mort !");
}
});
// Quand un joueur interagit avec un bloc
world.beforeEvents.playerInteractWithBlock.subscribe((eventData) => {
let player = eventData.player;
let block = eventData.block;
console.log(player.name + " a cliqué sur " + block.typeId);
});// Quand un bloc est placé
world.beforeEvents.playerPlaceBlock.subscribe((eventData) => {
let block = eventData.block;
let player = eventData.player;
if (block.typeId === "minecraft:diamond_block") {
world.say(player.name + " a placé un bloc de diamant !");
}
});
// Quand un bloc est détruit
world.afterEvents.playerBreakBlock.subscribe((eventData) => {
let block = eventData.brokenBlockPermutation;
let player = eventData.player;
// Donner un bonus pour certains blocs
if (block.typeId === "minecraft:stone") {
player.runCommand("give @s minecraft:coal 2");
}
});// Système de téléportation avec commande
world.beforeEvents.chatSend.subscribe((eventData) => {
let message = eventData.message;
let player = eventData.player;
// Commande /tp
if (message.startsWith("!tp ")) {
eventData.cancel = true; // Annuler le message normal
let coords = message.substring(4).split(" ");
let x = parseFloat(coords[0]);
let y = parseFloat(coords[1]);
let z = parseFloat(coords[2]);
if (!isNaN(x) && !isNaN(y) && !isNaN(z)) {
player.teleport({x: x, y: y, z: z});
player.tell("Téléportation vers " + x + ", " + y + ", " + z);
} else {
player.tell("Usage: /tp ");
}
}
}); // Système d'argent simple
let playerMoney = {};
world.afterEvents.playerSpawn.subscribe((eventData) => {
let player = eventData.player;
let playerId = player.id;
if (eventData.initialSpawn) {
// Initialiser l'argent du joueur
if (!playerMoney[playerId]) {
playerMoney[playerId] = 100;
player.tell("💰 Vous avez 100 pièces d'or !");
}
}
});
world.beforeEvents.chatSend.subscribe((eventData) => {
let message = eventData.message;
let player = eventData.player;
let playerId = player.id;
// Commande /money
if (message === "!money") {
eventData.cancel = true;
player.tell("💰 Argent: " + playerMoney[playerId] + " pièces");
}
// Commande /pay
if (message.startsWith("!pay ")) {
eventData.cancel = true;
let parts = message.split(" ");
if (parts.length === 3) {
let targetName = parts[1];
let amount = parseInt(parts[2]);
if (!isNaN(amount) && amount > 0) {
let players = world.getAllPlayers();
let targetPlayer = null;
for (let p of players) {
if (p.name === targetName) {
targetPlayer = p;
break;
}
}
if (targetPlayer) {
if (playerMoney[playerId] >= amount) {
playerMoney[playerId] -= amount;
playerMoney[targetPlayer.id] += amount;
player.tell("✅ Vous avez envoyé " + amount + " pièces à " + targetName);
targetPlayer.tell("💰 Vous avez reçu " + amount + " pièces de " + player.name);
} else {
player.tell("❌ Vous n'avez pas assez d'argent !");
}
} else {
player.tell("❌ Joueur non trouvé: " + targetName);
}
} else {
player.tell("❌ Montant invalide !");
}
}
}
}); Envoyez votre code pour recevoir de l'aide, des conseils d'amélioration, ou demandez de l'aide si vous n'y arrivez pas. Votre demande sera envoyée directement sur Discord pour être traitée.
Envoyez votre code pour verification et suggestions d'amélioration
Envoyez votre code qui bug pour obtenir de l'aide
Envoyez votre code pour des conseils d'amélioration
Maximisez vos chances d'obtenir une réponse utile
Comment demander la verification d'un code
// Titre: Système de Téléportation
// Description: Je veux m'assurer que mon code est optimisé
world.beforeEvents.chatSend.subscribe((event) => {
if (event.message.startsWith("!tp ")) {
event.cancel = true;
let coords = event.message.substring(4).split(" ");
let x = parseFloat(coords[0]);
let y = parseFloat(coords[1]);
let z = parseFloat(coords[2]);
if (!isNaN(x) && !isNaN(y) && !isNaN(z)) {
event.sender.teleport({x, y, z});
event.sender.sendMessage("§aTéléporté!");
}
}
});
// Est-ce que ce code est bien écrit ?Comment demander de l'aide pour un code qui ne fonctionne pas
// Titre: Système d'économie qui bug
// Description: Quand je me déconnecte, je perds mon argent
let playerMoney = {};
world.beforeEvents.chatSend.subscribe((event) => {
if (event.message === "!money") {
event.cancel = true;
let money = playerMoney[event.sender.id] || 0;
event.sender.sendMessage("Argent: " + money);
}
});
// Problème: L'argent disparaît à chaque déconnexionComment demander des suggestions d'amélioration
// Titre: Système de Quêtes à Optimiser
// Description: Mon système fonctionne mais il est lent
world.beforeEvents.chatSend.subscribe((event) => {
if (event.message.startsWith("!quest")) {
let quests = getAllQuests(); // 500+ quêtes
for (let quest of quests) {
if (quest.player === event.sender.name) {
event.sender.sendMessage(quest.name);
}
}
}
});
// Comment optimiser pour éviter les lags ?Vous avez besoin d'un script spécifique ? Décrivez en détail ce que vous voulez et je le créerai pour vous si j'ai le temps disponible.
Soyez aussi précis que possible dans votre description
Listez toutes les fonctionnalités requises
Choisissez le bon niveau pour votre demande
Pour maximiser vos chances d'obtenir votre script