⛏️ Minecraft Bedrock Scripting ⛏️

Guide complet pour apprendre le scripting Minecraft Bedrock

🌟 Pour les Débutants Complets

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 n'est pas magique : C'est simplement donner des instructions précises à l'ordinateur. Pensez-y comme si vous expliquiez à quelqu'un comment faire quelque chose, mais en étant extrêmement précis !

🎯 Avant de Commencer

🧠 Qu'est-ce que le Codage ?

Le codage (ou programmation) est l'art de donner des instructions à un ordinateur.

  • Comme une recette de cuisine : suivez les étapes dans l'ordre
  • Chaque instruction doit être précise et claire
  • Une petite erreur peut tout changer

📝 Pourquoi JavaScript ?

JavaScript est le langage utilisé pour Minecraft Bedrock scripting.

  • Relativement facile à apprendre
  • Très populaire sur internet
  • Documentation abondante
  • Parfait pour débuter

🎮 Minecraft Bedrock Scripting

C'est créer des mods et fonctionnalités personnalisées dans Minecraft.

  • Modifier le comportement du jeu
  • Ajouter de nouvelles commandes
  • Créer des systèmes personnalisés
  • Faire des expériences uniques

🛠️ Matériel Requis

Pour commencer, vous avez besoin de :

  • Minecraft Bedrock Edition
  • Un éditeur de texte (VS Code recommandé)
  • Un ordinateur fonctionnel
  • De la patience et de la curiosité

📚 Votre Premier Script

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 !");
    }
});

🔍 Explication du Code

📝 Les Commentaires

Les lignes commençant par // sont des commentaires.

  • Ils ne sont pas exécutés par le jeu
  • Ils expliquent ce que fait le code
  • Très utiles pour s'y retrouver

🎯 Les Événements

world.afterEvents.playerSpawn.subscribe écoute un événement.

  • world: Le monde de Minecraft
  • afterEvents: Les événements après qu'ils se produisent
  • playerSpawn: Quand un joueur apparaît
  • subscribe: S'abonner à cet événement

👤 Les Variables

let player = eventData.player; crée une variable.

  • let: Déclare une nouvelle variable
  • player: Nom de notre variable
  • = Assigne une valeur à la variable
  • eventData.player: Le joueur qui a déclenché l'événement

💬 Les Messages

player.sendMessage(...) envoie un message au joueur.

  • §a: Code couleur (vert)
  • player.name: Le nom du joueur
  • Les + combinent du texte
  • Le texte entre guillemets est une chaîne de caractères

🎓 Conseils pour Débutants

🐛 Gérer les Erreurs

Tout le monde fait des erreurs au début !

  • Lisez attentivement les messages d'erreur
  • Vérifiez les fautes de frappe
  • Assurez-vous que les parenthèses sont fermées
  • Utilisez un bon éditeur de code

📖 Apprendre Progressivement

Ne essayez pas de tout apprendre d'un coup.

  • Commencez par des scripts simples
  • Modifiez des scripts existants
  • Chaque jour, apprenez quelque chose de nouveau
  • Pratiquez régulièrement

🔨 Utiliser les Outils

Les bons outils rendent le codage plus facile.

  • VS Code: Éditeur gratuit avec coloration syntaxique
  • Documentation: Gardez la documentation à portée
  • Console: Utilisez console.log() pour déboguer
  • Test: Testez souvent votre code

🎯 Petits Projets

Commencez par des projets réalisables.

  • Une commande simple de bonjour
  • Un système de téléportation simple
  • Un compteur de joueurs en ligne
  • Un message de bienvenue personnalisé
⚠️ Important pour les Débutants :
  • Personne n'est né en sachant coder
  • Chaque expert a été débutant un jour
  • La pratique rend parfait
  • N'hésitez pas à demander de l'aide
  • Soyez patient avec vous-même

🎮 Introduction au Scripting Minecraft Bedrock

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.

💡 Astuce : Le scripting Minecraft Bedrock utilise l'API Minecraft Scripting qui est basée sur JavaScript. Si vous connaissez déjà JavaScript, vous avez une belle avance !

📋 Prérequis

📚 Les Notions de Base

🏗️ Structure d'un Pack de Comportement

Un pack de comportement avec des scripts doit contenir :

mon_pack/
├── manifest.json
├── scripts/
│   └── main.js
└── pack_icon.png

📦 Imports Modernes

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";
💡 Conseil : Importez uniquement ce dont vous avez besoin. Les imports inutiles peuvent alourdir votre code et affecter les performances.

📄 Le Fichier manifest.json

{
  "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"
    }
  ]
}

🔢 Variables et Types de Données

Déclaration de Variables

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é

🎯 Bonnes pratiques avec les variables

Types de Données Courants

📝 String

Chaînes de caractères pour le texte

let message = "Bienvenue dans Minecraft !";

🔢 Number

Nombres pour les calculs

let health = 20;
let position = {x: 10, y: 64, z: 15};

✅ Boolean

Vrai ou faux pour les conditions

let isFlying = false;
let hasPermission = true;

⚙️ Fonctions

Déclaration de Fonctions

// 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);
};

Portée des Variables

// Variable globale
let globalCounter = 0;

function incrementCounter() {
    // Variable locale
    let localCounter = 0;
    globalCounter++;
    localCounter++;
    
    console.log("Global: " + globalCounter);
    console.log("Local: " + localCounter);
}

🏷️ Tags et Scores

Les tags et les scores sont fondamentaux pour suivre l'état des joueurs et créer des systèmes complexes dans Minecraft.

🏷️ Tags

Les tags sont des étiquettes que vous pouvez attacher aux joueurs pour les identifier ou suivre leur état.

// Gestion des tags
player.addTag("vip");                    // Ajouter un tag VIP
player.addTag("admin");                  // Ajouter un tag admin
player.addTag("new_player");             // Marquer comme nouveau joueur

player.removeTag("new_player");           // Retirer le tag quand le joueur n'est plus nouveau

// Vérification des tags
if (player.hasTag("vip")) {
    player.sendMessage("§6Bienvenue VIP !");
    // Donner des avantages VIP
}

if (player.hasTag("admin")) {
    // Permettre aux admins d'utiliser des commandes spéciales
}

// Obtenir tous les tags d'un joueur
let tags = player.getTags();
console.log("Tags du joueur: " + tags.join(", "));

// Applications pratiques des tags
world.afterEvents.entityHitEntity.subscribe((event) => {
    let damager = event.damagingEntity;
    let victim = event.hitEntity;
    
    if (damager.hasTag("pvp_enabled") && victim.typeId === "minecraft:player") {
        // Autoriser le PvP
    } else if (victim.typeId === "minecraft:player") {
        // Bloquer le PvP
        event.cancel = true;
        damager.sendMessage("§cLe PvP est désactivé !");
    }
});

📊 Scores et Tableaux de Score

Les scores permettent de stocker des valeurs numériques associées aux joueurs ou au serveur.

// Création et gestion des objectifs de score
world.scoreboard.addObjective("kills", "Nombre de tués");
world.scoreboard.addObjective("deaths", "Nombre de morts");
world.scoreboard.addObjective("level", "Niveau du joueur");
world.scoreboard.addObjective("money", "Argent du joueur");

// Définir des scores
player.scoreboard.setScore("kills", 0);
player.scoreboard.setScore("level", 1);
player.scoreboard.setScore("money", 100);

// Obtenir et modifier des scores
let currentKills = player.scoreboard.getScore("kills") || 0;
let currentMoney = player.scoreboard.getScore("money") || 0;

// Augmenter un score
player.scoreboard.setScore("kills", currentKills + 1);
player.scoreboard.setScore("money", currentMoney + 50);

// Système de niveau basé sur les kills
world.afterEvents.entityDie.subscribe((event) => {
    let killer = event.damageSource.damagingEntity;
    let victim = event.deadEntity;
    
    if (killer && killer.typeId === "minecraft:player" && victim.typeId !== "minecraft:player") {
        let kills = killer.scoreboard.getScore("kills") || 0;
        killer.scoreboard.setScore("kills", kills + 1);
        
        // Système de progression
        let level = killer.scoreboard.getScore("level") || 1;
        if (kills > 0 && kills % 10 === 0) {
            killer.scoreboard.setScore("level", level + 1);
            killer.sendMessage("§aFélicitations ! Vous êtes niveau " + (level + 1));
        }
    }
});

// Supprimer un objectif (attention: cela supprime toutes les données)
// world.scoreboard.removeObjective("old_objective");

💾 Données Personnalisées

Les propriétés dynamiques permettent de stocker des données persistantes qui survivent aux redémarrages du serveur.

// Données persistantes pour les joueurs
player.setDynamicProperty("first_join", Date.now());
player.setDynamicProperty("total_playtime", 0);
player.setDynamicProperty("last_login", Date.now());
player.setDynamicProperty("player_rank", "member");

// Données complexes (objets)
let playerStats = {
    blocks_placed: 0,
    blocks_broken: 0,
    mobs_killed: 0,
    deaths: 0,
    achievements: []
};
player.setDynamicProperty("stats", JSON.stringify(playerStats));

// Récupérer les données
let firstJoin = player.getDynamicProperty("first_join");
let playerRank = player.getDynamicProperty("player_rank");
let stats = JSON.parse(player.getDynamicProperty("stats") || "{}");

// Mettre à jour les statistiques
stats.blocks_broken++;
player.setDynamicProperty("stats", JSON.stringify(stats));

// Système de connexion
world.afterEvents.playerSpawn.subscribe((event) => {
    let player = event.player;
    
    if (event.initialSpawn) {
        let firstJoin = player.getDynamicProperty("first_join");
        
        if (!firstJoin) {
            // Premier joueur
            player.setDynamicProperty("first_join", Date.now());
            player.sendMessage("§aBienvenue sur le serveur ! C'est votre première connexion !");
            player.addTag("new_player");
        } else {
            let lastLogin = player.getDynamicProperty("last_login");
            let daysSinceLastLogin = Math.floor((Date.now() - lastLogin) / (1000 * 60 * 60 * 24));
            
            if (daysSinceLastLogin > 7) {
                player.sendMessage("§eBonjour ! Ça fait longtemps qu'on ne vous a pas vu !");
            } else {
                player.sendMessage("§aBon retour parmi nous !");
            }
        }
        
        player.setDynamicProperty("last_login", Date.now());
    }
});

// Supprimer une donnée
player.removeDynamicProperty("old_data");

🧩 Composantes d'Entité

Les composantes (components) sont les modules qui définissent les capacités et les propriétés des entités dans Minecraft.

🏥 Composante Santé

// 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 });

🎒 Composante Inventaire

// 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);
}

👕 Composante Équipement

// 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");
    }
}

📍 Composante Position

// 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 !");
    }
});

🎮 Composantes Utiles

// 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 !");
        }
    }
});

🎯 Exercices Pratiques

Voici 8 exercices progressifs pour vous entraîner et maîtriser le scripting Minecraft Bedrock.

📝 Exercice 1: Système de Bienvenue

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
});

⚔️ Exercice 2: Système de Combat

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
});

💰 Exercice 3: Économie Simple

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
});

🏠 Exercice 4: Protection de Zone

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
});

🎒 Exercice 5: Système d'Items Spéciaux

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
});

🏆 Exercice 6: Système de Quêtes

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

🎮 Exercice 7: Mini-jeu Simple

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

🔧 Exercice 8: Système d'Admin

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
💡 Conseils pour les exercices :
  • Commencez par l'exercice 1 et progressez dans l'ordre
  • Testez chaque fonctionnalité séparément
  • Utilisez console.log() ou world.sendMessage() pour déboguer
  • Sauvegardez votre monde avant les tests
  • Consultez la documentation officielle si besoin

🎯 Événements (Events)

Les événements sont au cœur du scripting Minecraft. Ils vous permettent de réagir à ce qui se passe dans le jeu.

Événements Système

// É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é !");
});

Événements Joueur

// 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);
});

Événements Block

// 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");
    }
});

🛠️ Exemples Pratiques

Exemple 1: Système de Téléportation

// 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   ");
        }
    }
});

Exemple 2: Système d'Économie Simple

// 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 !");
            }
        }
    }
});

🎓 Conseils et Bonnes Pratiques

💡 Performance

  • Évitez le code lourd dans les événements tick
  • Utilisez des variables pour stocker les valeurs réutilisées
  • Limitez les boucles infinies

🐛 Débogage

  • Utilisez console.log() pour vérifier les valeurs
  • Testez vos scripts avec un seul joueur d'abord
  • Sauvegardez votre monde avant les tests

📚 Apprentissage

  • Commencez par des scripts simples
  • Lisez la documentation officielle
  • Étudiez les exemples existants
⚠️ Attention : Les scripts Minecraft Bedrock ont des limitations. Certaines fonctionnalités ne sont pas accessibles via l'API de scripting.

📡 Aide & Support

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.

� Formulaire de Demande d'Aide

📋 Comment Utiliser le Formulaire

✅ Code qui fonctionne

Envoyez votre code pour verification et suggestions d'amélioration

  • Pour faire vérifier votre code
  • Obtenir des suggestions d'optimisation
  • Conseils de bonnes pratiques

❌ Code qui ne fonctionne pas

Envoyez votre code qui bug pour obtenir de l'aide

  • Décrivez le problème rencontré
  • Mentionnez les messages d'erreur
  • Expliquez ce que vous essayez de faire

🤔 Besoin d'améliorations

Envoyez votre code pour des conseils d'amélioration

  • Optimisation de performance
  • Ajout de nouvelles fonctionnalités
  • Refactoring du code

💡 Conseils pour une Bonne Demande

Maximisez vos chances d'obtenir une réponse utile

  • Soyez précis dans votre description
  • Expliquez ce que vous essayez de faire
  • Mentionnez les erreurs rencontrées
  • Ajoutez votre pseudo Discord
  • Soyez patient pour les réponses

🧪 Exemples de Demandes

✅ Exemple de Verification

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 ?

❌ Exemple de Code qui Bug

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éconnexion

🤔 Exemple d'Amélioration

Comment 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 ?
💡 Informations importantes :
  • Les code envoyés par le formulaire sont directement a Youri / EnoxElite16
  • Les pseudos Discord donnent la priorité aux réponses
  • Soyez aussi précis que possible dans vos descriptions
  • Les délais de réponse varient selon la complexité et le temps que Youri / EnoxElite16 a pour répondre
⚠️ Bonnes Pratiques :
  • Testez votre code avant de demander de l'aide
  • Fournissez le code complet
  • Expliquez clairement ce que vous voulez faire
  • Soyez patient pour les réponses
  • Respectez les délais de traitement

🎮 Demande de Script Personnalisé

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.

📝 Formulaire de Demande de Script

📋 Comment Utiliser le Formulaire

📝 Description Détaillée

Soyez aussi précis que possible dans votre description

  • Expliquez le contexte du script
  • Décrivez ce que chaque fonction doit faire
  • Mentionnez les interactions avec les joueurs
  • Précisez les données à sauvegarder

⚙️ Fonctionnalités Spécifiques

Listez toutes les fonctionnalités requises

  • Interface graphique (ActionFormData, ModalFormData)
  • Sauvegarde de données (DynamicProperty)
  • Permissions et rôles
  • Intégration avec d'autres systèmes

🎯 Niveau de Complexité

Choisissez le bon niveau pour votre demande

  • 🟢 Simple: Commandes basiques, petites fonctionnalités
  • 🟡 Moyen: Plusieurs systèmes, interface simple
  • 🔴 Complexe: Système complet, interface avancée

💡 Conseils Importants

Pour maximiser vos chances d'obtenir votre script

  • Soyez réaliste dans vos demandes
  • Le pseudo Discord est obligatoire
  • Les scripts sont créés selon disponibilité
  • Les délais varient selon la complexité
💡 Informations importantes :
  • Les demandes de scripts sont envoyées directement à Youri / EnoxElite16
  • Le pseudo Discord est obligatoire pour recevoir une réponse
  • Les scripts sont créés selon le temps disponible
  • Les délais varient selon la complexité et la disponibilité de youri / EnoxElite16
  • Soyez patient pour les réponses
⚠️ Bonnes Pratiques :
  • Ne demandez pas de scripts impossibles avec l'API Minecraft si vous ne savez pas si sais possible faite la demande
  • Soyez précis dans vos descriptions
  • Respectez les délais de traitement
  • Max 3 demandes par personne à la fois
  • Soyez poli dans vos demandes