---
title: Créer un Plugin
type: docs
weight: 3
---

Ce guide vous accompagne dans la création de votre premier plugin Hytale.

## Structure du Projet

Un projet de plugin Hytale typique a cette structure :

```
my-plugin/
├── app/
│   ├── build.gradle.kts
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/example/myplugin/
│       │   │       └── MyPlugin.java
│       │   └── resources/
│       │       └── manifest.json
│       └── test/
│           └── java/
├── gradle/
│   ├── libs.versions.toml
│   └── wrapper/
├── build.gradle.kts
├── settings.gradle.kts
└── gradlew
```

## Le manifest.json

Chaque plugin nécessite un fichier `manifest.json` dans `src/main/resources/` :

```json
{
  "Group": "com.example",
  "Name": "MyPlugin",
  "Version": "1.0.0",
  "Description": "Mon premier plugin Hytale",
  "Authors": [
    {
      "Name": "Votre Nom"
    }
  ],
  "Main": "com.example.myplugin.MyPlugin",
  "ServerVersion": "*",
  "Dependencies": {},
  "OptionalDependencies": {},
  "DisabledByDefault": false,
  "IncludesAssetPack": false,
  "SubPlugins": []
}
```

### Champs du Manifest

| Champ | Requis | Description |
|-------|--------|-------------|
| `Group` | Oui | Groupe de package (ex: "com.example") |
| `Name` | Oui | Nom du plugin (utilisé pour l'identification) |
| `Version` | Oui | Version sémantique (ex: "1.0.0") |
| `Description` | Non | Brève description du plugin |
| `Authors` | Non | Liste des auteurs avec champ `Name` |
| `Main` | Oui | Nom complet de la classe principale |
| `ServerVersion` | Oui | Compatibilité version serveur ("*" pour toutes) |
| `Dependencies` | Non | Dépendances de plugins requises |
| `OptionalDependencies` | Non | Dépendances de plugins optionnelles |
| `DisabledByDefault` | Non | Si le plugin est désactivé par défaut |
| `IncludesAssetPack` | Non | Si le plugin inclut des assets |
| `SubPlugins` | Non | Liste des sous-plugins |

{{< callout type="warning" >}}
Tous les noms de champs du manifest utilisent le **PascalCase** (ex: `ServerVersion`, pas `serverVersion`).
{{< /callout >}}

## Classe Principale du Plugin

Créez votre classe principale en étendant `JavaPlugin` :

```java
package com.example.myplugin;

import com.hypixel.hytale.server.core.plugin.JavaPlugin;
import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
import java.util.logging.Level;

public class MyPlugin extends JavaPlugin {

    public MyPlugin(JavaPluginInit init) {
        super(init);
    }

    @Override
    public void setup() {
        // Appelé pendant l'initialisation du plugin
        // Enregistrer les configs, préparer les ressources
        getLogger().at(Level.INFO).log("MyPlugin s'initialise !");
    }

    @Override
    public void start() {
        // Appelé quand le plugin démarre
        // Enregistrer les commandes, événements, entités
        getLogger().at(Level.INFO).log("MyPlugin a démarré !");
    }

    @Override
    public void shutdown() {
        // Appelé quand le plugin s'arrête
        // Nettoyer les ressources
        getLogger().at(Level.INFO).log("MyPlugin s'arrête !");
    }
}
```

{{< callout type="info" >}}
Le constructeur avec le paramètre `JavaPluginInit` est obligatoire. Appelez toujours `super(init)`.
{{< /callout >}}

## API de Logging

Hytale utilise une API de logging basée sur Flogger :

```java
import java.util.logging.Level;

// Logging basique
getLogger().at(Level.INFO).log("Message d'information");
getLogger().at(Level.WARNING).log("Message d'avertissement");
getLogger().at(Level.SEVERE).log("Message d'erreur");

// Avec formatage
getLogger().at(Level.INFO).log("Le joueur %s a rejoint la partie", playerName);
```

## build.gradle.kts

Configurez votre fichier de build Gradle (DSL Kotlin) :

```kotlin
plugins {
    java
}

group = "com.example"
version = "1.0.0"

repositories {
    mavenCentral()
}

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(25)
    }
}

dependencies {
    // API Serveur Hytale - compile only car fournie à l'exécution
    compileOnly(files("../../../HytaleServer.jar"))

    // Tests
    testImplementation(libs.junit)
}

tasks.jar {
    archiveBaseName.set("MyPlugin")
}
```

{{< callout type="info" >}}
Le chemin vers `HytaleServer.jar` dépend de l'emplacement de votre source de plugin par rapport au répertoire du jeu.
{{< /callout >}}

## Registres Disponibles

Votre plugin a accès à plusieurs registres via la classe de base :

| Méthode | Type de Registre | Utilité |
|---------|-----------------|---------|
| `getEventRegistry()` | EventRegistry | Enregistrer des écouteurs d'événements |
| `getCommandRegistry()` | CommandRegistry | Enregistrer des commandes |
| `getEntityRegistry()` | EntityRegistry | Enregistrer des entités personnalisées |
| `getBlockStateRegistry()` | BlockStateRegistry | Enregistrer des états de blocs |
| `getTaskRegistry()` | TaskRegistry | Planifier des tâches |
| `getAssetRegistry()` | AssetRegistry | Enregistrer des assets |
| `getEntityStoreRegistry()` | EntityStoreRegistry | Enregistrer des composants d'entité |
| `getChunkStoreRegistry()` | ChunkStoreRegistry | Enregistrer des composants de chunk |

## Étapes Suivantes

Découvrez le [Cycle de Vie du Plugin](../plugin-lifecycle) pour comprendre quand chaque méthode est appelée.
