# Accueil

<h2 align="center">✨ Bienvenue sur le wiki de OpenMC !</h2>

<p align="center">Tout ce que vous devez savoir sur OpenMC, réuni à un seul endroit !</p>

<h2 align="center"><a href="https://openmc.fr/" class="button primary" data-icon="rocket-launch">Nous rejoindre !</a> <a href="https://github.com/ServerOpenMC/PluginV2" class="button secondary" data-icon="github">Voir le code source sur Github</a></h2>

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-cover data-type="image">Cover image</th><th data-hidden data-type="image">Cover image (dark)</th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><i class="fa-book-atlas">:book-atlas:</i></td><td><strong>Lire le règlement</strong></td><td>Un bon endroit à visiter au début de ton aventure</td><td><a href="/files/cMviBOOhC4DyH4Ap42Vs">/files/cMviBOOhC4DyH4Ap42Vs</a></td><td><a href="/files/cMviBOOhC4DyH4Ap42Vs">/files/cMviBOOhC4DyH4Ap42Vs</a></td><td><a href="/pages/Ij2uz5KmVy7eXY3UKx4l">/pages/Ij2uz5KmVy7eXY3UKx4l</a></td></tr><tr><td><i class="fa-school-flag">:school-flag:</i></td><td><strong>Créer sa ville</strong></td><td>Devient le plus puissant du serveur</td><td><a href="/files/GqjoOCChDZJPhco6mt8l">/files/GqjoOCChDZJPhco6mt8l</a></td><td><a href="/files/GqjoOCChDZJPhco6mt8l">/files/GqjoOCChDZJPhco6mt8l</a></td><td><a href="/pages/t8lVfKBWNPcwp1zednzf">/pages/t8lVfKBWNPcwp1zednzf</a></td></tr><tr><td><i class="fa-khanda">:khanda:</i></td><td><strong>Conquests</strong></td><td>Mini-cité où 2 camps s'affrontent !</td><td><a href="/files/CnsMNmFOUEB8c842M3ZI">/files/CnsMNmFOUEB8c842M3ZI</a></td><td><a href="/files/CnsMNmFOUEB8c842M3ZI">/files/CnsMNmFOUEB8c842M3ZI</a></td><td><a href="/pages/5tjBrZkhNNOT4LtnG2vX">/pages/5tjBrZkhNNOT4LtnG2vX</a></td></tr></tbody></table>


# Règlement

Voici quelques règles importantes à suivre pour garantir une expérience agréable à tous les joueurs.

{% hint style="info" %}
Ici le terme “comportement” désigne toute trace, action ou attitude, qu’ils soient directement dans le gameplay, dans le chat du serveur ou à l’extérieur du serveur, en relation avec ce dernier.
{% endhint %}

### Règles générales

* Le règlement du serveur discord s’applique
* Le respect est dû à tout le monde :  restez courtois et évitez les insultes. Tout comportement offensant, haineux ou discriminatoire ne sera pas toléré.
* Tout comportement NSFW sera sanctionné.
* Le serveur est en premier lieu un endroit pour s’amuser, pour cette raison les comportements politiques et religieux ainsi que les sujets sensibles sont à éviter.
* Ne partagez pas d'informations personnelles, qu'elles soient à vous ou quelqu'un d'autre. Respectez la vie privée des autres membres. Tout comportement ne respectant pas cette règle se verra très sévèrement puni.
* Tout échange monnayant un quelconque bien matériel ou service extérieur au serveur est prohibé.
* Respectez les lois en vigueur dans votre pays et en France, le bon sens est de mise.

### Gameplay

**Sont interdits :**

* L’abus d’un ou plusieurs bugs du jeu ou d’un plugin dans l’objectif de dupliquer, ou de gacher l.
* L’utilisation d’un quelconque moyen matériel ou logiciel vous procurant un avantage sur les autres joueurs
* Les logiciels ou technique passant outre l'anti afk
* Les chunks loader
* Tout comportement ou machine visant à faire lag ou à nuire au serveur,
* Le grief ou pillage d’une zone (claim ou non) hors assaut en temps de guerre,
* Le contournement de sanction à l’aide d’un double compte ou autre
* Les VPNs.
* Téléporter un joueur dans l’objectif de le tuer en moins d’une minute
* D'attendre devant une ville dans l'objectif de kill ses membres,
* De se déconnecter ou de se téléporter en combat.

**Dans les guerres de ville :**&#x20;

* Le boost des prérequis pour le milestone des villes concerant la guerre sont interdit, (c'est a dire, un membre quitte pour faire un ville jusqu'au niveau ou les guerres se débloquent et qu'il lance une guerre contre sa ville, pour passer les prérequis).
* La mascotte doit être dans une zone accesible de l'exterieur pour les attaquants, sans passage en redstone
* Un passage de 2x1 blocs doit etre fait, au minimum pour acceder a la mascote.
* Aucun piège ou autre doit être fait afin de bloquer la progression de l'adversaire et l'accès ne doit pas se faire sous forme de labyrinthe
* Le record des combats sont recommandés dans les 2 camps, au cas ou qu'un enemie enfraint les règles. A moins que un membre du staff a vu la situation.

{% hint style="warning" %}
Une infraction des règles entrainera des peines pour votre ville, pour la première fois :&#x20;

* 2 levels de ville en moins
* 10k enlevé à la ville (ou au propriétaire de la ville si banque vide)
* Les récompenses du gagnant seront enlevé

Pour les occurences de ces infractions, le staff pourra décider des conséquences pour la ville (suppression, reduction de la banque de la ville, et autres...) et pour les joueurs participants (ban et autres...)&#x20;
{% endhint %}

### Chat

* Pas de spam, de flood, de messages répétitifs ou de full maj.
* Pas de publicité non autorisée par les admins. Cela inclut les publicités pour votre ville ou votre shop.

### Hors du serveur

* La création de serveurs discord ou toute autre communauté internet en lien avec le serveur minecraft entraînera un bannissement définitif en jeu. Sont exemptés de cette règle les serveurs discord des villes qui devront cependant rester privés entre les membres et seront sous la modération du chef de ville.
* Merci de respecter ces règles dans les discussions concernant OpenMC hors du serveur en lui-même.

### Autres

* Suivez les instructions des modérateurs.
* Respectez leur décision.
* Le staff se réserve le droit de vous sanctionner pour tout contenu considéré comme inapproprié.

Bon jeu !


# Contribuer au wiki

1. Rendez vous sur le [repo Github du wiki](https://github.com/ServerOpenMC/Wiki).
2. Créez un nouveau fork puis ajoutez votre contenu en respectant le [schèma Gitbook](https://docs.gitbook.com/creating-content)
3. Créez une nouvelle pull request afin qu'un modérateur puisse vérifier et intégrer votre contenu !


# Contribuer au plugin

## Créer un fork du [repo du plugin **OpenMC**](https://github.com/ServerOpenMC/PluginV2)

Le repo créé sur votre compte vous permettras de faire tout vos changements au code de plugin.

## Faire des changements

Lorsque vous avez le repo sur votre machine, vous pouvez faire vos changements: régler des bugs, ajouter des fonctionnalités, etc...\
Lorsque vous faites vos changements, vérifiés qu'il sont bien conforme au[code de conduite](https://github.com/ServerOpenMC/PluginV2/blob/master/CODE_OF_CONDUCT.md)\
et aux [règles de contribution](https://github.com/ServerOpenMC/PluginV2/blob/master/CONTRIBUTING.md).

## Tester vos changements

Afin de tester vos changements, vous devrez [compiler le plugin](/zunhuycbzyencd/contribute/build). Il vous faudra aussi un [serveur Minecraft](/zunhuycbzyencd/install).\
Lorsque vous aurez le plugin compiler, glissez le dans le dossier `plugins` de votre serveur et redémarez-le.\
En vous connectant, vous pourrez tester toute les modifications que vous avez faites au plugin.

## Synchroniser vos changements avec le repo principal du plugin

Lorsque tout vos changements sont fait, verifiez que votre code est conforme aux [imperatifs](/zunhuycbzyencd/contribute/imperatifs).\
Si tout les conditions sont vérifiés, vous pouvez soumettre votre pull request à l'examen des modérateurs du serveur.\
Suivez votre PR jusqu'à ce qu'elle soit acceptée ou rejettée afin d'éviter d'avoir des PR ouvertes sans progression.


# Build le plugin

## Dans **IntelliJ**

* A droite, dans **Gradle** (l'éléphant) :
  * Ouvrez `Tasks`, puis le sous-dossier `shadow`
  * Double-cliquez sur `shadowJar`
* La console s'ouvrira en bas, si il y a une erreur, elle sera affiché ici, voici à quoi ressemble un build réussi
* Une fois build sans erreur, le plugin sera dans `builds` **avec un S**

## En ligne de commande

* Sur **Windows**
  * `.\gradlew.bat shadowJar`
* Sur **Unix-like** (Linux/MacOS/...)
  * `./gradlew shadowJar`
* Une fois build sans erreur, le plugin sera dans `builds` **avec un S**


# Impératifs

## Vérifier que vos changements son conforme aux règles du repo

Ces deux documents contiennent les règles de contribution à **OpenMC**:

{% embed url="<https://github.com/ServerOpenMC/PluginV2/blob/master/CONTRIBUTING.md>" fullWidth="false" %}

{% embed url="<https://github.com/ServerOpenMC/PluginV2/blob/master/CODE_OF_CONDUCT.md>" %}

**Si vous ne suivez pas ces règles, votre pull request seras refusée !**

## Vérifier que le plugin se compile sans erreur sur votre machine

## Vérifier que vos ajouts fonctionnent (fonctionnalité sans bug/bug reglé sans en avoir créé d'autre)

## Vérifier qu'il n'y ai aucun conflit avec la branche `master` du repo

## Vérifier que la description de votre pull request est conforme avec la template du repo

{% embed url="<https://github.com/ServerOpenMC/PluginV2/blob/master/.github/pull_request_template.md>" %}


# Utiliser le plugin

{% hint style="warning" %}
En lisant ce guide, nous présupposons que vous savez créé un serveur Minecraft avec des plugins.
{% endhint %}

## Etape 1 : Récupérer un `.jar` du plugin

Nous n'avons pour l'instant pas de distribution de fichiers du plugin. Il vous faudra donc [compiler vous-même le plugin](/zunhuycbzyencd/contribute/build).

## Etape 2 : Le serveur **Minecraft**

OpenMC est un plugin [**Paper**](https://papermc.io/downloads/paper) mais vous pouvez aussi utiliser [**Purpur**](https://purpurmc.org/download/purpur) et d'autres forks.\
Veuillez vous munir de la version la plus récente.

## Etape 3 : Les dépendances de **OpenMC**

Le plugin **OpenMC** n'a pas de dépendances "durs". Autrement dit, vous pouvez l'utiliser tout seul sans autre plugin.\
Cependant, beaucoup de fonctionnalités nécessitent d'autre plugins pour fonctionner. Ainsi, pour avoir toute les fonctionnalités\
du plugin sur votre serveur il vous faudra quatre plugins supplémentaires (à la version la plus récente si possible):

* **LuckPerms** pour les grades et permissions
* **ItemsAdder** pour les items, blocks et menus custom (n'oubliez pas d'utiliser la [configuration ItemsAdder de **OpenMC**](https://github.com/ServerOpenMC/ItemsAdder) pour que tout fonctionne)
* **PlaceholderAPI** et **ProtocolLib** pour certaines utilités
* **WorldEdit** et **WorldGuard** pour protéger le monde du grief

## Etape 4 : La base de données

Afin de stocker ses données, le plugin **OpenMC** nécessite une base de donnée compatible **MySQL**.\
Il faudra vous munir des identifiants et de l'addresse de la base de données et les rensigner dans `plugins/OpenMC/config.yml`.

## Etape 5 : Tester vos features & trouver un max de bugs !

Vous avez maintenant un serveur avec le plugin **OpenMC**.


# Les systèmes

Les systèmes et les APIs du plugin, commment les modifier et les utiliser

## [Utiliser la base de données](https://github.com/ServerOpenMC/Wiki/blob/main/developers/systems/database.md)

## [Le système de quêtes](/zunhuycbzyencd/systems/quests)

## [Le système d'intérèt](/zunhuycbzyencd/systems/interests)

## [Le système de reformes](https://github.com/ServerOpenMC/Wiki/blob/main/developers/systems/perks.md)


# La base de données

Comment bien utiliser ORMLite pour communiquer avec la base de données ?

## Table des matières

1. [#lorm](#lorm "mention")
2. [#integrer-un-manager-avec-ormlite](#integrer-un-manager-avec-ormlite "mention")
   1. [#creer-un-objet-a-stocker](#creer-un-objet-a-stocker "mention")
   2. [#initialiser-la-table-et-le-dao](#initialiser-la-table-et-le-dao "mention")
   3. [#utiliser-le-dao](#utiliser-le-dao "mention")
3. [#bonnes-pratiques](#bonnes-pratiques "mention")

## L'ORM

Le plugin **OpenMC** utilise l'ORM [**ORMLite**](https://ormlite.com/) pour communiquer plus facilement avec la base de donnés (dans notre cas **MySQL**). Un ORM c'est un **Object Relational Mapping**, soit un système qui permet de relier les tables et colonnes d'un schéma de DB traditionnel avec des objets **Java**. Ce guide vous expliquera les bases d'**ORMLite** et son intégration dans le plugin. Si vous voulez plus d'informations ou juste des docs plus détaillées du système, rendez-vous sur l'excellente [documentation officielle d'ORMLite](https://ormlite.com/javadoc/ormlite-core/doc-files/ormlite.html).

## Intégrer un manager avec **ORMLite**

Nous prendrons l'exemple des maires pour ce guide (soit les classes `Mayor` et `MayorManager`).

### Créer un objet à stocker

Avec **ORMLite** chaque table de la base de donnés est représentée par un objet **Java**.

Dans un premier temps, pour qu'un objet puisse être utilisé par **ORMLite** il lui faut un constructeur sans arguments avec une visibilité au niveau du package.

```java
class Mayor {
    Mayor() {
        // required for ORMLite
    }
}
```

Ensuite, il faut que la classe et ses membres soient annotés par les interfaces `@DatabaseTable` et `@DatabaseField`.

L'interface `@DatabaseTable` permet de configurer l'aspect général de la table. Il doit être placé sur la déclaration de la classe. Vous pouvez utiliser le paramètre `tableName` pour changer le nom de la table. Par défaut c'est le nom de la classe.

```java
@DatabaseTable(tableName = "mayors")
class Mayor {
    Mayor() {
        // required for ORMLite
    }
}
```

L'interface `@DatabaseField` permet de configurer les colonnes de la table. Pour qu'ils soient détectés, les membres doivent être annotés par cette interface. Si un membre n'est pas annoté, il ne sera pas sauvegardé dans la DB. Quelques paramètres utiles :

* `columnName` : Le nom de la colonne. Le nom du membre par défaut.
* `id` : Si ce membre est l'ID de la table. Peut être utilisé qu'une seule fois par table.
* `generatedId` : Si l'ID doit être généré automatiquement.
* `unique` : Si ce membre doit être unique.
* `canBeNull` : Si ce membre peut être nul. Utile pour le stockage d'`UUID`.
* `defaultValue` : La valeur par défaut de la colonne. Doit être un `String` même si la variable a un type différent (ex. `defaultValue = "0"`)

```java
@DatabaseTable(tableName = "mayors")
public class Mayor {
    @DatabaseField(id = true)
    private String city;
    @DatabaseField
    private UUID uuid;
    @DatabaseField(canBeNull = false)
    private String name;
    @DatabaseField
    private String mayorColor;
    @DatabaseField(canBeNull = false)
    private int idPerk1;
    @DatabaseField(canBeNull = false)
    private int idPerk2;
    @DatabaseField(canBeNull = false)
    private int idPerk3;
    @DatabaseField(canBeNull = false, columnName = "election_type")
    private String electionType;

    Mayor() {
        // required for ORMLite
    }
}
```

### Initialiser la table et le `DAO`

Par convention dans la codebase **OpenMC**, le base de donnés est initialisée par le `DatabaseManager` a travers une fonction `init_db`. Cette fonction doit créer la/les table(s) si elle(s) n'existe(nt) pas et initialiser le `DAO`. Le `Data Access Object` est l'objet qui permet d'interagir avec la table associée de la DB.

Le `Dao` doit être initialisé avec le type à stocker dans la DB et le type du membre annoté avec `id = true`. Si le type n'a pas d'ID, un type quelconque peut être utilisé.

{% hint style="warning" %}
Attention, si vous utilisés le `Dao` dans la fonction `init_db` cela risque de bloquer les unit tests (je pense que c'est un problème avec les driver `h2` mais je ne suis pas sûre).
{% endhint %}

```java
private static Dao<Mayor, String> mayorsDao;

public static void init_db(ConnectionSource connectionSource) throws SQLException {
    TableUtils.createTableIfNotExists(connectionSource, Mayor.class);
    mayorsDao = DaoManager.createDao(connectionSource, Mayor.class);
}
```

### Utiliser le `DAO`

Maintenant que vous avez votre table et votre `DAO`, vous pouvez commencer à manipuler la base de donnés. Voici quelque fonctions utiles :

* `queryForAll` : Retourne une liste du type stocké. Ex. `List<Mayor>`
* `queryForId` : Retourne l'élément avec l'ID donné.
* `create` : Sauvegarde l'objet ou la liste d'objets donné(e).
* `update` : Met à jour l'objet donné (fonctionne uniquement si le type a un `id = true`).
* `createOrUpdate` : Créé l'objet si il n'existe pas et le met à jour s'il existe (fonctionne uniquement si le type a un `id = true`).
* `delete` : Supprime l'objet donné.

Vous pouvez aussi créer des requêtes plus complexes à l'aide du `QueryBuilder` et du `DeleteBuilder`.

```java
DeleteBuilder<Mayor, String> mayorsDelete = mayorsDao.deleteBuilder();
mayorsDelete.where().eq("city", city.getUUID());
mayorsDao.delete(mayorsDelete.prepare());
```

Pour plus d'informations rendez-vous sur la [documentation officielle](https://ormlite.com/javadoc/ormlite-core/doc-files/ormlite.html#Statement-Builder).

## Bonnes pratiques

1. Garder le `Dao` en `private` sans `@Getter` afin de garder localiser les interactions avec la DB.
2. Mettre les operations de sauvegarde dans des fonction asynchrones pour de meilleurs performances.

Rédigé par [PiquelChips](https://github.com/PiquelChips)


# Les quêtes

## Table des matières

* [Vue d'ensemble](#vue-densemble)
* [Architecture du système](#architecture-du-système)
* [Guide d'implémentation](#guide-dimplémentation)
  * [Créer une nouvelle quête](#créer-une-nouvelle-quête)
  * [Enregistrer une quête](#enregistrer-une-quête)
  * [Gérer des événements spécifiques](#gérer-des-événements-spécifiques)
* [Composants du système](#composants-du-système)
  * [Récompenses](#récompenses)
  * [Progression](#progression)
* [Utilisation avancée](#utilisation-avancée)
  * [QuestBuilder](#questbuilder)
* [Bonnes pratiques](#bonnes-pratiques)

## Vue d'ensemble

Le système de quêtes permet d'implémenter des objectifs pour les joueurs dans le jeu. Il est conçu pour être flexible, permettant de créer diverses quêtes avec différents niveaux de complexité et de récompenses.

## Architecture du système

Le système est composé des éléments suivants :

| Composant           | Description                                                                             |
| ------------------- | --------------------------------------------------------------------------------------- |
| **Quête**           | Objet principal qui contient un nom, une description, une icône et une liste de paliers |
| **Palier de Quête** | Niveau de progression avec un objectif et des récompenses                               |
| **Étape de Quête**  | Sous-objectifs optionnels au sein d'un palier                                           |
| **Récompenses**     | Objets ou argent attribués lorsqu'un palier est complété                                |
| **Progression**     | Système de suivi et sauvegarde de l'avancement des joueurs                              |

## Guide d'implémentation

### Créer une nouvelle quête

1. Créez une classe qui étend `Quest` :

```java
package fr.openmc.core.features.quests.quests;

import fr.openmc.core.features.quests.objects.Quest;
import fr.openmc.core.features.quests.objects.QuestTier;
import fr.openmc.core.features.quests.rewards.QuestMoneyReward;
import org.bukkit.Material;

public class MinerQuest extends Quest {

    public MinerQuest() {
        // Nom de la quête: String, description: String, icône: ItemStack ou Material, Action bar: boolean *facultatif*
        super("Mineur professionnel", "Miner {target} blocs", Material.DIAMOND_PICKAXE, false);

        this.addTiers(
            new QuestTier(10, new QuestMoneyReward(100)),
            new QuestTier(50, new QuestMoneyReward(500)),
            new QuestTier(100, new QuestMoneyReward(1000))
        );
    }
}
```

pour `l'action bar`, le boolean est facultatif, par défaut il est à `false`.\
Il permet d'afficher la progression de la quête dans la barre d'action du joueur, elle s'afficheras a chaque palier (50), pour éviter de spammer le joueur.

### Enregistrer une quête

Ajoutez votre quête au gestionnaire dans la méthode `loadDefaultQuests` :

```java
public void loadDefaultQuests() {
    this.registerQuests(
        new MinerQuest(),
        new FishingQuest(),
        // Autres quêtes...
    );
}
```

### Implementer une progression

1. Une progression unique (*1*):

```java
    @EventHandler
    public void onPlayerBreakBlock(BlockBreakEvent event) {
        if (event.getBlock().getType() == Material.DIAMOND_ORE) {
            // incrementer la progression de la quête de 1
            this.incrementProgress(event.getPlayer().getUniqueId());
        }
    }
```

2. Une progression multiple (*n*):

```java
    @EventHandler
    public void onPlayerBreakBlock(FurnaceExtractEvent event) {
        if (event.getBlock().getType() == Material.DIAMOND_ORE) {
            if (event.getItemType().equals(Material.IRON_INGOT)) {
                int amount = event.getItemAmount(); // Récupérer le nombre d'items extraits
                // incrementer la progression de la quête de amount (n)
                this.incrementProgress(event.getPlayer().getUniqueId(), amount);
            }
        }
    }
```

3. Progression avec les étapes:

```java
        this.incrementStepProgress(playerUUID, 0); // Incrémente la progression de l'étape 0 (= index)
        this.incrementProgress(playerUUID); // Incrémente la progression de la quête
```

## Composants du système

### Récompenses

Deux types de récompenses sont disponibles :

1. **Récompenses en objets** (`QuestItemReward`) :

   ```java
   // Donne 5 diamants
   new QuestItemReward(Material.DIAMOND, 5);

   // Ou avec un ItemStack personnalisé
   ItemStack customItem = new ItemStack(Material.DIAMOND_SWORD);
   // Personnalisation de l'objet...
   new QuestItemReward(customItem);
   ```
2. **Récompenses en argent** (`QuestMoneyReward`) :

   ```java
   // Donne 500 unités de monnaie
   new QuestMoneyReward(500);
   ```

### Progression

La progression des joueurs est automatiquement gérée par le `QuestProgressSaveManager` :

* Les données sont stockées dans des fichiers YAML
* Emplacement : dossier `quests` du répertoire de données du plugin
* Chargement et sauvegarde automatiques

## Utilisation avancée

### QuestBuilder

Le `QuestBuilder` permet de créer des quêtes avec des étapes.

```java
Quest armorQuest = new QuestBuilder("Armure précieuse", "Fabriquer une armure complète en diamant", new ItemStack(Material.DIAMOND_CHESTPLATE))
        .tier(4, "Fabriquer une armure complète en diamant", new QuestItemReward(Material.DIAMOND, 10))
        .step("Casque en diamant", 1)
        .step("Plastron en diamant", 1)
        .step("Pantalon en diamant", 1)
        .step("Bottes en diamant", 1)
        .requireAllSteps(true)
        .build();

// Enregistrer la quête
for (int i = 0; i < armorQuest.getTiers().size(); i++) {
    this.addTier(armorQuest.getTiers().get(i)); // Ajoute chaque palier à la quête 
}  
```

## Bonnes pratiques

1. **Nommage clair** : Utilisez des noms et descriptions explicites pour les quêtes
2. **Équilibre des récompenses** : Assurez-vous que les récompenses sont proportionnelles à la difficulté
3. **Tests rigoureux** : Vérifiez que les déclencheurs d'événements fonctionnent correctement
4. **Progression intuitive** : Concevez des paliers avec une difficulté progressive
5. **Documentation** : Commentez votre code pour faciliter la maintenance

***

Développé par [Axeno](https://github.com/AxenoDev)


# Les intérêts

Dans le plugin **OpenMC** il y a un système de banques. Il y a des banques personnels (pour chaque joueur) et des banques de ville (pour chaque ville).\
Les deux sortes de banques peuvent percevoir des intérèts deux fois par semaine. Le Lundi et le Jeudi à 2h du matin (heure Française).

Si une feature que vous développez à besoin de modifier le taux d'intérêt des joueurs et/ou des villes il suffit de modifier les fonctions suivants:

* Pour les joueurs, la fonction `calculatePlayerInterest` dans la classe `BankManager`
* Pour les villes, la fonction `calculateCityInterest` dans la classe `City`\
  La valeur retournée est le taux d'intérêt en proportion et non en pourcentage.


# Les réformes

## Table des matières

* [Vue d'ensemble](#vue-densemble)
* [Guide d'implémentation](#guide-dimplémentation)
  * [Créer une nouvelle Réforme](#créer-une-nouvelle-réforme)
  * Gérer les comportements d'une Réforme :
    * [Réforme Basique](#réforme-basique)
    * [Réforme Evenementiel](#réforme-événementielle)

## Vue d'ensemble

Le Système de Réformes permet d'implémenter de nouvelles façons de jouer et d'établir ses stratégies dans le jeu.

## Guide d'implémentation

### Créer une nouvelle Réforme

1. Aller dans l'enum `Perks` : Il vous suffit d'ajouter une nouvelle Réforme. **L'ID de la Réforme doit être unique à chaque Réforme !**

```java
NOM(
    id,
    nom,
    description,
    itemstack
    type de perk
    cooldown si PerksType.EVENT
)
```

id devra etre un int nom, un string description, une liste de components itemstack, un itemstack :

* ItemStack.of(Material)
* CustomItemRegistry.getByName("omc\_items:aywenite").getBest(), un CustomItem d'ItemAdder type de perk, PerkEvent donc soit un BASIC et EVENT

Exemple d'une Réforme basique :

```java
TNT_RAIN(
    16,
    "§e§lPluie de TNT",
    List.of(
        Component.text("§7Lorsque vous §3tapez un joueur§7, une tnt"),
        Component.

text("§7apparaitra au dessus de lui et §3explosera §7!"),
    ),
    ItemStack.of(Material.TNT),
    PerkType.BASIC,
    0
)
```

Exemple d'une Réforme événementielle :

```java
IDYLLIC_RAIN(
    14,
    "§e§lPluie idyllique",
    List.of(
        Component.text("§7Fait apparaître de l'§3Aywenite §7dans votre ville pendant§3 1 §7min. §8(Cooldown : 1j)")
    ),
    ItemStack.of(Material.GHAST_TEAR),
    PerkType.EVENT,
    24 * 60 * 60 * 1000L // 1 jour
),
```

### Gérer les comportements d'une Réforme :

#### Réforme Basique

1. Faites une classe dans `mayor.perks.basic`, vous pourrez implementer Listener si votre Réforme peut être activée lorsqu'une telle chose se passe
2. Utilisez `PerkManager.hasPerk(<City>.getMayor(), id)` afin de regarder si le Maire a choisit ce Perk et assurez vous que le Maire est dans sa phase d'application `MayorManager.getInstance().phaseMayor==2`

Exemple avec un Listener:

```java
public class AyweniterPerk implements Listener {

    private static final double DROP_CHANCE = 0.01; //1%
    private final Random random = new Random();

    @EventHandler
    public void onBlockBreak(BlockBreakEvent event) {
        Block block = event.getBlock();
        Player player = event.getPlayer();
        City playerCity = CityManager.getPlayerCity(player.getUniqueId());
        if (MayorManager.getInstance().phaseMayor==2) {
            if (!PerkManager.hasPerk(playerCity.getMayor(), Perks.AYWENITER.getId())) return;

            if (block.getType() == Material.STONE) {

                if (random.nextDouble() < DROP_CHANCE) {
                    ItemStack ayweniteItem = CustomItemRegistry.getByName("omc_items:aywenite").getBest();
                    ayweniteItem.setAmount(2);
                    player.getInventory().addItem(ayweniteItem);
                    player.playSound(player.getEyeLocation(), Sound.BLOCK_AMETHYST_BLOCK_RESONATE, 10.0F, 0.6F);
                    MessagesManager.sendMessage(player, Component.text("§8§o*la bénédiction!*"), Prefix.MAYOR, MessageType.INFO, false);
                }
            }
        }
    }
}
```

Il est aussi autorisé d'implementer un comportement différent dans le code du plugin

Exemple de la modfication des Intérêts :

```java
    import fr.openmc.core.features.city.mayor.perks.Perks;// Interests calculated as proportion not percentage (eg: 0.01 = 1%)

public double calculateCityInterest() {
    double interest = .01; // base interest is 1%

    if (MayorManager.getInstance().phaseMayor == 2) {
        if (PerkManager.hasPerk(getMayor(), Perks.BUISNESS_MAN.getId())) {
            interest = .03; // interest is 3% when perk Buisness Man actived
        }
    }

    return interest;
}
```

#### Réforme Événementielle

1. Faites une classe dans `mayor.perks.event`, vous pourrez mettre les méthodes qui sont concernées par votre Réforme Evenementielle.
2. Allez dans `city.menu.mayor.MayorLawMenu`, vous devrez ajouter la détection lorsque votre Réforme est activée par le Maire.

Exemple :

```java
else if(PerkManager.hasPerk(city.getMayor(),Perks.MILITARY_DISSUASION.

getId())){
    // Dissuasion Militaire (id : 13) - Perk Event
    for (UUID uuid : city.getMembers()) {
        Player member = Bukkit.getPlayer(uuid);

        if (member == null || !member.isOnline()) continue;

        MessagesManager.sendMessage(member, Component.text("Le §6Maire §fa déclenché la §eDissuasion Militaire §f!"), Prefix.MAYOR, MessageType.INFO, false);
    }

    MilitaryDissuasion.spawnIronMan(city, 10);
    DynamicCooldownManager.use(city.getUUID(), "city:military_dissuasion", 10 * 60 * 1000L); // 10 minutes
    
    DynamicCooldownManager.use(mayor.getUUID().toString(), "mayor:law-perk-event", PerkManager.getPerkEvent(mayor).getCooldown());

    new BukkitRunnable() {
        @Override
        public void run() {
            if (DynamicCooldownManager.isReady(city.getUUID(), "city:military_dissuasion")) {
                MilitaryDissuasion.clearCityGolems(city);
                this.cancel();
            }
        }
    }.runTaskTimer(OMCPlugin.getInstance(), 20L, 100L);
}
```

`DynamicCooldownManager.use(mayor.getUUID().toString(), "mayor:law-perk-event", PerkManager.getPerkEvent(mayor).getCooldown());` va donc appliquer le cooldown associé a la Réforme d'Event.

`MilitaryDissuasion.spawnIronMan(city, 10);` `DynamicCooldownManager.use(city.getUUID(), "city:military_dissuasion", 10 * 60 * 1000L); // 10 minutes` Les lignes ci dessus sont le corps de votre Réforme, ici on spawn 10 IronMan dans la ville. Et apres 10 minutes on les clear.

## Bonnes pratiques

1. **Nommage clair** : Utilisez des noms et descriptions explicites pour les Réformes
2. **Équilibrage de la Réforme** : Assurez-vous que la Réforme n'est pas trop puissante, ou trop forte comparé à une autre
3. **Documentation** : Commentez votre code pour faciliter la maintenance
4. **Style** : Essayez au maximum de vous brancher sur les mêmes couleurs utilisées

***

Développé par [iambibi\_](https://github.com/iambibi)


# Mail

| Commande      | Description                  |
| ------------- | ---------------------------- |
| /mail         | Affiche tout vos mails       |
| /mail home    | Ouvre le menu des mails      |
| /mail send    | Permet d'envoyer un mail     |
| /mail pending | Affiche les mails en attente |


# Fun

| Commande  | Description                    |
| --------- | ------------------------------ |
| /diceroll | Fait un lancé de dé a 10 faces |
| /playtime | Donne votre temps de jeu       |


# Utilitaire

{% hint style="info" %}
Si l'argument est encadré avec "\[]" il est facultatif. Avec "<>" il est obligatoire.
{% endhint %}

| Commande | Description                                                                                                          |
| -------- | -------------------------------------------------------------------------------------------------------------------- |
| /spawn   | Téléportation au spawn du serveur                                                                                    |
| /money   | Gérez votre argent (voir [économie](https://github.com/ServerOpenMC/Wiki/blob/main/commandes/commandes/economie.md)) |
| /sb      | Désactive le scoreboard                                                                                              |
| /link    | Permet de lier son compte Discord au serveur *(à venir)*                                                             |
| /rules   | Affiche les règles du serveur *(à venir)*                                                                            |
| /privacy | Permet de bloquer un joueur de vos messages privés *(à venir)*                                                       |


# Économie

{% hint style="info" %}
Si l'argument est encadré avec "\[]" il est facultatif. Avec "<>" il est obligatoire.
{% endhint %}

| Commande                  | Description                                            |
| ------------------------- | ------------------------------------------------------ |
| /money                    | Affiche le montant que vous possédez                   |
| /money history            | Affiche votre historique de transaction                |
| /pay \<joueur> \<montant> | Permet de transférer votre argent à un autre joueur    |
| /adminshop                | Ouvre l'adminshop                                      |
| /baltop                   | Affiche la liste des 10 premiers joueurs du classement |
| /bank                     | Ouvre le menu de votre banque personnelle              |


# Téléportation

{% hint style="info" %}
Si l'argument est encadré avec "\[]" il est facultatif. Avec "<>" il est obligatoire.
{% endhint %}

## TPA

| Commande                 | Description                                                                     |
| ------------------------ | ------------------------------------------------------------------------------- |
| /tpa ou /tpask \<joueur> | Envoie une demande de téléportation au joueur indiqué                           |
| /tpaccept \[joueur]      | Accept la demande de téléportation (d'un certain joueur si précisé)             |
| /tpadeny \[joueur]       | Rejette une demande de téléportation (d'un certain joueur si précisé)           |
| /tpacancel \[joueur]     | Annule une demande de téléportaion en cours (vers un certain joueur si précisé) |


# Amis

| Commande                 | Description                               |
| ------------------------ | ----------------------------------------- |
| /friend list             | Affiche la liste de vos amis.             |
| /friend add \<joueur>    | Demande un joueur en amis.                |
| /friend remove \<joueur> | Retire un joueur de la liste de vos amis. |
| /friend accept \<joueur> | Accepte la demande d'amis d'un joueur.    |
| /friend deny \<joueur>   | Refuse la demande d'amis d'un joueur.     |


# Les Villes

Le meilleur moyen de s'organiser entre joueurs

{% hint style="warning" %}
Cette page du wiki n'est pas a jour ou pas terminée. Si vous voulez la completée vous-même, voir [comment contribuer au wiki](https://github.com/ServerOpenMC/Wiki/blob/main/.gitbook/includes/developers/wiki.md).
{% endhint %}

{% hint style="info" %}
Si l'argument est encadré avec "\[]" il est facultatif. Avec "<>" il est obligatoire.
{% endhint %}

<details>

<summary>Sommaire</summary>

1. [#la-commande-city](#la-commande-city "mention")
2. [#creer-une-ville](#creer-une-ville "mention")
3. [#rejoindre-une-ville](#rejoindre-une-ville "mention")
4. [#quitter-une-ville](#quitter-une-ville "mention")
5. [#gerer-les-membres](#gerer-les-membres "mention")
   1. [#permissions-disponibles](#permissions-disponibles "mention")
6. [#expulser-un-joueur](#expulser-un-joueur "mention")
7. [#claim-et-unclaim](#claim-et-unclaim "mention")
   1. [#par-les-commandes](#par-les-commandes "mention")
   2. [#par-le-menu](#par-le-menu "mention")
8. [#stockage-de-la-ville](#stockage-de-la-ville "mention")
9. [#types-de-villes](#types-de-villes "mention")
10. [#mascotte-de-la-ville](#mascotte-de-la-ville "mention")
11. [#banque-de-la-ville](#banque-de-la-ville "mention")
12. [#warp-de-la-ville](#warp-de-la-ville "mention")
13. [#liste-des-villes](#liste-des-villes "mention")
14. [#les-grades-de-ville](#les-grades-de-ville "mention")
    1. [#par-les-commandes-1](#par-les-commandes-1 "mention")
    2. [#par-les-menus](#par-les-menus "mention")

</details>

## La commande /city

Cette commande est la principale commande utilisée pour les villes. Elle permet de rejoindre, quitter, gérer les membres et la mascotte,...\
Bref, tout ce qu'il y a en lien avec les villes. Vous pouvez utiliser soit le menu (`/city`) soit les commandes (`/city [sous-commande]`).

<table><thead><tr><th width="190">Commande</th><th>Description</th></tr></thead><tbody><tr><td>/city</td><td>Ouvre le menu des villes.</td></tr><tr><td>/city create</td><td>Crée une ville avec le nom spécifié.</td></tr><tr><td>/city invite &#x3C;joueur></td><td>Invite un joueur à rejoindre votre ville.</td></tr><tr><td>/city accept &#x3C;nom></td><td>Rejoint la ville qui vous a invité.</td></tr><tr><td>/city deny &#x3C;nom></td><td>Refuse l'invitation à rejoindre une ville.</td></tr><tr><td>/city leave</td><td>Quitte la ville dans laquelle vous êtes.</td></tr><tr><td>/city kick &#x3C;joueur></td><td>Exclut un joueur de la ville.</td></tr><tr><td>/city map</td><td>Ouvre le menu carte.</td></tr><tr><td>/city mayor</td><td>Ouvre le menu du maire.</td></tr><tr><td>/city rename</td><td>Renomme la ville.</td></tr><tr><td>/city ranks</td><td>Ouvre le menu des grades.</td></tr><tr><td>/city info</td><td>Affiche les informations de la ville.</td></tr><tr><td>/city bank</td><td>Ouvre la banque de la ville.</td></tr><tr><td>/city chest</td><td>Ouvre le coffre de la ville.</td></tr><tr><td>city upgradechest</td><td>Améliore le coffre de la ville.</td></tr><tr><td>/city claim</td><td>Claim le chunk ou vous vous trouvez pour la ville, s'il n'est pas déjà claim.</td></tr><tr><td>/city unclaim</td><td>Unclaim le chunk ou vous vous trouvez pour la ville, s'il est déjà claim.</td></tr><tr><td>/city list</td><td>Affiche la liste des villes existantes.</td></tr><tr><td>/city setwarp</td><td>Définit le warp de la ville à votre position actuelle.</td></tr><tr><td>/city warp</td><td>Vous téléporte au warp de la ville, s'il a été défini.</td></tr><tr><td>/city type</td><td>Ouvre le menu de type de ville.</td></tr><tr><td>/city transfer &#x3C;joueur></td><td>Transfère la propriété de la ville à un autre joueur.</td></tr><tr><td>/city chat</td><td>Active ou désactive le chat de la ville.</td></tr><tr><td>/city perms</td><td>Ouvre le menu des permissions de la ville.</td></tr></tbody></table>

## Créer une ville

Pour créer une ville, utilisez la commande `/city create`. Lorsque vous créez une ville, celle-ci sera automatiquement en type PAIX, ce qui signifie qu'elle ne peut pas être attaquée et ne peut pas attaquer d'autres villes. Vous disposerez de 300 secondes pour poser la mascotte à l'aide du bâton de mascotte, sinon la ville sera supprimée.

Vous pouvez ensuite inviter d'autres joueurs à rejoindre votre ville en utilisant la commande `/city invite <joueur>`.

{% hint style="info" %}
Lorsque la ville est créée, vous serez en automatiquement défini propriétaire. Pour transférer la propriété de la ville à un autre joueur, utilisez la commande `/city transfer <joueur>`. Le joueur doit être membre de la ville pour pouvoir recevoir la propriété.

Une fois que vous avez transféré la propriété, vous ne pourrez plus gérer la ville à moins d'être réinvité par le nouveau propriétaire.
{% endhint %}

***

## Rejoindre une ville <a href="#rejoindre-une-ville" id="rejoindre-une-ville"></a>

Pour rejoindre une ville, vous devez d'abord être invité par un joueur qui en est le maire ou un membre. Une fois que vous avez reçu l'invitation, vous pouvez accepter en utilisant la commande `/city accept <nom>` ou en cliquant sur l'invitation dans le chat.

***

## Quitter une ville <a href="#quitter-une-ville" id="quitter-une-ville"></a>

Pour quitter une ville, utilisez la commande `/city leave`. Vous serez alors retiré de la ville et ne pourrez plus interagir avec ses fonctionnalités.

{% hint style="warning" %}
&#x20;Si vous êtes le propriétaire, vous devrez transférer la propriété de la ville à un autre joueur avant de pouvoir quitter.
{% endhint %}

***

## Gérer les membres <a href="#gerer-les-membres" id="gerer-les-membres"></a>

Pour gérer les membres de votre ville, vous pouvez utiliser la commande `/city ranks` ou `/city perms` pour définir des rôles et des permissions.

### Permissions disponibles <a href="#permissions-disponibles" id="permissions-disponibles"></a>

<table><thead><tr><th width="233.99993896484375">Permission</th><th>Description</th></tr></thead><tbody><tr><td>Inviter</td><td>Permet d'inviter des joueurs à rejoindre la ville.</td></tr><tr><td>Expulser</td><td>Permet d'exclure des joueurs de la ville.</td></tr><tr><td>Placer des blocks</td><td>Permet de placer des blocs dans la ville.</td></tr><tr><td>Casser des blocks</td><td>Permet de casser des blocs dans la ville.</td></tr><tr><td>Ouvrir les coffres</td><td>Permet d'ouvrir les coffres dans la ville (Shulkers Boxes et EC non compris).</td></tr><tr><td>Interagir</td><td>Permet d'interagir avec les blocs dans la ville (hors coffres et tonneaux).</td></tr><tr><td>Claim</td><td>Permet de claim/unclaim des chunks pour la ville.</td></tr><tr><td>Voir les claims</td><td>Permet de voir les chunks claims par la ville.</td></tr><tr><td>Renommer</td><td>Permet de renommer la ville.</td></tr><tr><td>Déposer de l'argent</td><td>Permet de déposer de l'argent dans la banque de la ville.</td></tr><tr><td>Voir l'argent</td><td>Permet de voir le montant d'argent dans la banque de la ville.</td></tr><tr><td>Retirer de l'argent</td><td>Permet de retirer de l'argent de la banque de la ville.</td></tr><tr><td>Permissions</td><td>Permet de gérer les permissions des membres de la ville.</td></tr><tr><td>Coffre de ville</td><td>Permet d'ouvrir le coffre de la ville.</td></tr><tr><td>Améliorer le coffre</td><td>Permet d'améliorer le coffre de la ville.</td></tr><tr><td>Changer le type de ville</td><td>Permet de changer le type de la ville.</td></tr><tr><td>Déplacer la mascotte</td><td>Permet de déplacer la mascotte de la ville.</td></tr><tr><td>Changer le skin de la mascotte</td><td>Permet de changer le skin de la mascotte.</td></tr><tr><td>Améliorer la mascotte</td><td>Permet d'améliorer la mascotte de la ville.</td></tr><tr><td>Soigner la mascotte</td><td>Permet de soigner la mascotte de la ville.</td></tr><tr><td>Lancer des guerres</td><td>Permet de lancer des guerres contre d'autres villes.</td></tr><tr><td>Gérer les grades</td><td>Permet de créer/modifier/supprimer des grades de la ville.</td></tr><tr><td>Assigner des grades</td><td>Permet d'assigner/désassigner des grades aux membres de la ville.</td></tr></tbody></table>

***

## Les grades de ville

Les grades sont des ensembles de permissions qui peutvent être prédéfinis et que peuvent être appliqués sur un joueur afin de lui donner certaines permissions simplement et rapidement.

Pour gérer les grades, vous pouvez passer par les commandes ou les menus.

### Par les commandes

* Créez un grade avec la commande `/city ranks add` , cela vous ouvrira le menu de création de grade.
* Pour modifier un grade, tapez `/city ranks edit <grade>` et le menu d'édition s'ouvrira.
* Pour assigner une grade, la commande `/city ranks assign <grade> <joueur>`  est prévue pour cela. Il en est de même pour désassigner un grade.
* Pour renommer un grade, exécutez `/city ranks rename <grade>` , et cela vous ouvrira le menu d'édition du nom du grade.
* Enfin, pour supprimer un grade, tapez `/city ranks delete <grade>` , vous devrez confirmer la suppression du grade.

### Par les menus

Effectuez la commande `/city ranks`  pour ouvrir le menu des grades.

<div data-full-width="false"><figure><img src="/files/G6pz64OTyJlucJNw5rNK" alt=""><figcaption></figcaption></figure></div>

<details>

<summary>Créer un grade</summary>

Pour ajouter un grade, cliquez sur le bouton **+** en bas à droite. Cela vous demandera de donner un nom au grade, puis vous ouvrira ce menu :

<figure><img src="/files/TsuXVtXIQ9j3AX8c2ArM" alt=""><figcaption></figcaption></figure>

* Le papier représente la priorité. Variant de 0 à 17, la priorité détermine l'ordre des grades, les uns par rapport aux autres. Un grade avec une plus petite priorité sera un grade plus élevé.
* Le panneau repésente le nom du grade, modifiable plus tard.
* Le GOLD BLOCK représente l'icône du grade. Cliquez dessus pour la modifier.
* Le livre représente l'ensemble de permissions que contiendra le grade, cliquez dessus pour les modifier.
* Enfin, si vous voulez annuler la création du grade, cliquer sur la croix, et pour confirmer sa création, cliquez sur la coche.

</details>

<details>

<summary>Modifier un grade</summary>

Pour modifier un grade, cliquez sur ce grade. Un menu de ce type s'ouvrira :

<figure><img src="/files/jhsN2ix4GNaaaqtRkXM6" alt=""><figcaption></figcaption></figure>

Les icônes sont les mêmes que pour la création. Cependant vous pouvez :

* Modifier le nom du grade en cliquant sur le panneau
* Annuler les modifications en cliquant sur la croix
* Supprimer le grade en cliquant sur le **-**

</details>

<details>

<summary>Assigner un grade</summary>

Pour assigner un grade, cliquez sur la plume.

* Vous devrez choisir le membre auquel vous voulez assigner une grade.
* Puis, vous devrez choisir le grade Que vous voulez assigner (ou désassigner) au membre.

</details>

***

## Expulser un joueur

Pour expulser quelqu'un de la ville, utilisez la commande `/city kick <Joueur>` en ayant la permission de le faire, ou en étant propriétaire de la ville.

***

## Claim et Unclaim <a href="#claim-et-unclaim" id="claim-et-unclaim"></a>

### Par les commandes

Pour claim un chunk pour votre ville, vous devez vous trouver dans le chunk que vous souhaitez claim — pourvu qu'il ne soit pas déjà claim et qu'il soit adjacent à un autre de vos claims — et utiliser la commande `/city claim`. Cela protégera le chunk contre les autres joueurs et permettra à votre ville d'y construire en toute sécurité.

Pour unclaim un chunk, vous devez vous trouver dans le chunk que vous souhaitez unclaim et utiliser la commande `/city unclaim`. Cela retirera la protection du chunk et permettra à d'autres joueurs de l'utiliser.

### Par le menu

Vous pouvez aussi passer par le menu map (`/city map`) pour claim ou unclaim des chunks :

<figure><img src="/files/f55mCfPWotRpcJIJ2peS" alt=""><figcaption></figcaption></figure>

* Les <mark style="color:red;">vitres rouges</mark> représentent les chunks claims par une autre ville.
* Les <mark style="color:blue;">vitres bleues</mark> représentent les claims de votre ville.&#x20;
* La <mark style="color:green;">vitre verte</mark> représente le chunk où vous vous trouvez actuellement.
* Les <mark style="color:orange;">vitres oranges</mark> représentent une zone protégée qui ne peut pas être claim (ex. le spawn).
* Les <mark style="color:$info;">vitres grises</mark> représentent les chunks libres que vous pouvez claim.

Pour claim depuis ce menu il vous suffit de cliquer sur la vitre du chunk à (un)claim.

***

## Stockage de la ville

Pour accéder au stockage de la ville , utiliser la commande `/city chest`.

Vous aurez une interface comme celle-ci où vous pourrez prendre et déposer des items comme dans un coffre :

<figure><img src="/files/CMmlBRGeYeYBpNfM7U5G" alt=""><figcaption></figcaption></figure>

Dans cet espace, vous pouvez déposer des items qui seront conservés en sécurité, mais accessibles par tous les membres de la ville ayant la permission d'y accéder. **Plusieurs membres ne peuvent pas accéder au coffre en même temps**.

L'espace de stockage de la ville est améliorable depuis le menu en cliquant sur l'ender chest, ou la commande `/city upgradecoffre`. Une amélioration du coffre coûte en argent et en Aywenithes.

***

## Types de villes <a href="#types-de-villes" id="types-de-villes"></a>

Il existe plusieurs types de villes, PAIX et GUERRE. Une ville de type PAIX ne peut pas être attaquée et ne peut pas attaquer d'autres villes, tandis qu'une ville de type GUERRE peut être attaquée et attaquer d'autres villes. Vous pouvez changer le type de votre ville en utilisant la commande `/city type`.

***

## Mascotte de la ville <a href="#mascotte-de-la-ville" id="mascotte-de-la-ville"></a>

La mascotte est posée lors de la création de la ville et en est le cœur. Elle peut être déplacée et améliorée afin d'avoir plus de PV. Si vous êtes en type GUERRE, la mascotte peut être attaquée et détruite par les autres villes lors des assauts. Nous vous conseillons de bien la protéger et de la soigner si sa vie n'est pas au maximum.

***

## Banque de la ville <a href="#banque-de-la-ville" id="banque-de-la-ville"></a>

La banque de la ville est un coffre qui permet de stocker de l'argent pour la ville. Vous pouvez y déposer de l'argent pour éviter de le perdre en cas de mort. Vous pouvez y accéder en utilisant la commande `/city bank`.

***

## Warp de la ville <a href="#warp-de-la-ville" id="warp-de-la-ville"></a>

Pour définir un warp pour votre ville, vous devez être le propriétaire de la ville et vous trouver à l'endroit où vous souhaitez que le warp soit défini. Utilisez la commande `/city setwarp` pour définir le warp. Les joueurs de la ville pourront ensuite se téléporter au warp de la ville avec la commande `/city warp`.

***

## Informations sur les villes <a href="#liste-des-villes" id="liste-des-villes"></a>

Pour afficher la liste des villes existantes, utilisez la commande `/city list`. Cela vous montrera les villes disponibles et vous permettra de voir dans quelle ville se trouvent vos amis. Vous pouvez cliquer sur la ville pour en savoir plus.

Si vous préférez le chat, vous pouvez voir les informations de chaque ville en utilisant la commande `/city info <nom>`.

***


# Les Contest

**Toutes les fonctionnalités lié au Contest sont disponible via le `/contest` ou la Borne de Contest qu'il y a au spawn**

<figure><img src="/files/5Zd35dm4pxBWhMCshuQW" alt=""><figcaption></figcaption></figure>

## Qu'est ce que c'est ?

Les Contest ont pour but d’affronter 2 camps (exemple: Mayonaise VS Ketchup, et pleins d'autres...).

## Phase 1 : Les Votes !

Les votes commenceront toujours le vendredi à 0h de chaque semaine. Vous aurez 2 choix d'équipe, par exemple Ordre VS Chaos.

<figure><img src="/files/i7mLqREKXYJMxfqutj1G" alt=""><figcaption></figcaption></figure>

Le soleil commence à tomber sur le Spawn...

## Phase 2 : L’Affrontement !

Un jour après que les votes soient terminés, donc le samedi à 0h. Le Contest démare sur une durée de 2 jours.

### 1- Comment avoir des Coquillages de Contest?

Pour donner des points à votre équipe vous devez faire des trades contre des Coquillages de Contest.

<figure><img src="/files/tYzbPsTeUGvVAqXg1uKc" alt=""><figcaption></figcaption></figure>

\*\*Ou bien gagner une animation dans le chat\*\*. *(lorsque les animations seront implémentés)*

### 2- La Contribution

Il vous faut déposer les Coquillages de Contest pour ajouter des points dans votre Team !

<figure><img src="/files/FzCERrvNda3h2uH43UAV" alt=""><figcaption></figcaption></figure>

## Phase 3 : Les Résultats !

Les résultats tombent, ils sont basés sur le taux de Coquillages de Contest déposé. Vous recevrez dans votre boite mail, le Lundi à 0h, un livre et des récompenses en lien avec le Contest. Dans ce livre vous pourez regarder les statistiques générales à propos du Contest, vos statistiques personnelles, et le classement !

<div><figure><img src="/files/QR79bCSQU273OPrEWMb1" alt=""><figcaption></figcaption></figure> <figure><img src="/files/rUPZOpd0FHCmech5Hek0" alt=""><figcaption></figcaption></figure> <figure><img src="/files/BE6Fa5IkFM9MBKcv7kQf" alt=""><figcaption></figcaption></figure> <figure><img src="/files/btqLiT2WtZf8JrsiUzfo" alt=""><figcaption></figcaption></figure></div>

Si vous avez un bug en rapport les Contest, contactez iambibi\_


# Nourriture custom

## Kebab

{% tabs %}
{% tab title="Craft" %}

<figure><img src="/files/Qo6tUKrihDhu0PVx82W6" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Matériaux nécessaires" %}

* pain
* tomate
* salade
* oignon
  {% endtab %}

{% tab title="Info" %}
Le **kebab** est un aliment custom qui vous nourrit comme n'importe quel autre aliment, même s'il y a une infime chance de choper la chiasse.
{% endtab %}
{% endtabs %}

## Salade, tomate, oignon

{% tabs %}
{% tab title="Craft" %}

<figure><img src="/files/pM0jJmq4IBpZm3t7fEza" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Matériaux nécessaires" %}

* 1 tomate, salade ou oignon
  {% endtab %}

{% tab title="Info" %}
Pour obtenir la **salade**, la **tomate** et l'**oignon**, vous devrez tuer des villageois fermiers.\
Il faudra vous armer de patience puisque la chance d'obtenir l'un des trois légumes est infime.
{% endtab %}
{% endtabs %}

## *The Mixture*

{% tabs %}
{% tab title="Craft" %}

<figure><img src="/files/5Ow5WQVJFz5c90ZEkcvt" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Matériaux nécessaires" %}

* 4 glass
* 4 iron ingot
* 1 aywenite
  {% endtab %}

{% tab title="Info" %}
Aucun Effet Secondaire !
{% endtab %}
{% endtabs %}

## Frites

{% tabs %}
{% tab title="Craft" %}

<figure><img src="/files/ldUdDXPH7cythIYVZAzi" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Matériaux nécessaires" %}

* 3 baked potato
  {% endtab %}

{% tab title="Info" %}

<figure><img src="/files/0aZsE94UsJrsDMoL00dr" alt=""><figcaption></figcaption></figure>

Les frites n'ont pas d'effet particulier.
{% endtab %}
{% endtabs %}


# Trade (à venir)

Pratique pour le troc

{% hint style="warning" %}
Cette fonctionalité n'existe pas sur le serveur. Elle est en cours de dévelopment ou planifiée pour une prochaine mise à jour. Cette page n'est donc pas à jour. Si vous souhaiter implémenter vous-même cette fonctionalité, voir [comment contribuer](https://github.com/ServerOpenMC/Wiki/blob/main/.gitbook/includes/developers/contribute/contribute.md).
{% endhint %}

{% hint style="info" %}
Si l'argument est encadré avec "\[]" il est facultatif. Avec "<>" il est obligatoire.
{% endhint %}

## La commande /trade

Cette commande permet à deux joueurs de s'échanger des **items** et de l'**argent** plus facilement.

Pour réaliser un échange avec quelqu'un, il vous faut exécuter `/trade <joueur>`.

Si cette personne **clique sur le message**, le trade est accepté et un **menu** va ensuite s'ouvrir

**Cliquez** sur les parties du message pour effectuer des actions :

* **Modifier les items** : Montre les items que l'on souhaite envoyer.
* **Vérifier les items** : Montre les items et l'argent que l'autre joueur va envoyer.
* **Modifier l'argent à envoyer** : Permet de modifier l'argent à envoyer à l'autre joueur `/trade money <valeur>`
* **Conclure le trade** : Bloque le trade, et réalise l'échange si les deux joueurs ont cliqué.
* **Annuler la demande de trade** : Annule le trade et rembourse les deux joueurs.


# Les jeux et évents aléatoires (à venir)

Ce sont des événements qui se déclenchent de temps en temps pour pimenter l'expérience de jeu !

{% hint style="warning" %}
Cette fonctionalité n'existe pas sur le serveur. Elle est en cours de dévelopment ou planifiée pour une prochaine mise à jour. Cette page n'est donc pas à jour. Si vous souhaiter implémenter vous-même cette fonctionalité, voir [comment contribuer](https://github.com/ServerOpenMC/Wiki/blob/main/.gitbook/includes/developers/contribute/contribute.md).
{% endhint %}

## La nuit terrifiante (Bloodmoon)

### Apparition et durée

Cet événement a un chance sur quatre de se produire chaque nuit, à **minuit**. Celui-ci dure **3 minutes** et ne peut se produire deux nuits d'affilée.

### Effets

Durant la nuit terrifiante, les **monstres** deviennent **plus forts**, mais leurs **loots** en sont d'autant plus **intéressants.**

* Les monstres reçoivent les effets **speed 2** et **résistance 2**, reçoivent une petite **armure** ainsi que des **armes améliorées**. Les creepers ont une explosion plus grande et puissante.
* À l'inverse les joueurs reçoivent ainsi un effet de **weakness** et perdent **20% de leur vie maximale**.

Néanmoins, les monstres boostés droppent des **loots supplémentaires** (en probabilité) :

* **Zombies**: 30% lingots fer (1-3), 20% lingots or (1-3), 20% xp (+10-+30), 10% diamant, 10% émeraudes (2-5), 10% œuf de zombie
* **Squelettes** 30% lingots fer (1-3), 20% os (5-10), 20% xp (10-30), 10% flèches (10-15), 10% émeraudes (2-5), 10% œuf de squelette
* **Creepers**: 30% poudres à canon (5-10), 30% fireworks (5-10), 20% tnt (3-5), 10% fire charge (3-8), 10% œuf de creeper

## Events à venir?

*Peut être dans le futur... 👀*


# Les LootBox

Les lootboxes sont le seul moyen d'obtenir des meubles.

{% hint style="warning" %}
Cette fonctionalité n'existe pas sur le serveur. Elle est en cours de dévelopment ou planifiée pour une prochaine mise à jour. Cette page n'est donc pas à jour. Si vous souhaiter implémenter vous-même cette fonctionalité, voir [comment contribuer](https://github.com/ServerOpenMC/Wiki/blob/main/.gitbook/includes/developers/contribute/contribute.md).
{% endhint %}

Les **Lootboxes** sont présente sous forme de boite de différents style au spawn; des Lootbox spéciales son placé au spawn pour certain événement **Halloween** et **Noël**

<div><figure><img src="/files/wyQ4P1pa9rmUO150k12n" alt=""><figcaption></figcaption></figure> <figure><img src="/files/3dk7Pw9k8bdDQ4kKY5FO" alt=""><figcaption></figcaption></figure> <figure><img src="/files/rDrrnOCVBjUhTmzukIob" alt=""><figcaption></figcaption></figure></div>

<figure><img src="/files/jlIsG6YsXDBAZXsW4FGK" alt="" width="375"><figcaption></figcaption></figure>

<figure><img src="/files/UaOF60HXTmfwmV7ot2ML" alt="" width="375"><figcaption></figcaption></figure>

### Clé Lootbox

{% tabs %}
{% tab title="Craft" %}

<figure><img src="/files/IU8aAbkQoDjDMydM8y3X" alt=""><figcaption></figcaption></figure>

Pour l'utiliser prenez la dans la main et faite Clic droit sur la Lootbox Meuble que vous voulez ouvrir

Il existe différentes clés de lootbox de différents matériaux et de différentes raretés :

* Common
* Rare
* Epic
  {% endtab %}

{% tab title="Matériaux nécessaires" %}

* 5 block de bois
* 2 block de laine
* 1 Bâton en bois

Les différent matériaux utilisable pour les clé :

* Lingot d'or
* Améthiste
* Diamant
* Emeraude
* lingot de fer
  {% endtab %}
  {% endtabs %}


# Les dimensions

{% hint style="warning" %}
Cette fonctionalité n'existe pas sur le serveur. Elle est en cours de dévelopment ou planifiée pour une prochaine mise à jour. Cette page n'est donc pas à jour. Si vous souhaiter implémenter vous-même cette fonctionalité, voir [comment contribuer](https://github.com/ServerOpenMC/Wiki/blob/main/.gitbook/includes/developers/contribute/contribute.md).
{% endhint %}

L'End est ouvert.


# Marteaux

L'arme mythique du dieu de la foudre.

{% hint style="warning" %}
Cette fonctionalité n'existe pas sur le serveur. Elle est en cours de dévelopment ou planifiée pour une prochaine mise à jour. Cette page n'est donc pas à jour. Si vous souhaiter implémenter vous-même cette fonctionalité, voir [comment contribuer](https://github.com/ServerOpenMC/Wiki/blob/main/.gitbook/includes/developers/contribute/contribute.md).
{% endhint %}

## Marteau de guerre

{% hint style="info" %}
Cette arme fait 10 points de dégâts et génère une explosion et un éclair lorsqu'elle est utilisée pour attaquer\
ou lorsque on fait un shift + clique droit sur un bloc. (Non, on ne peut pas la lancer.)
{% endhint %}

*Cooldown de 60 secondes.50 points de durabilité.*

{% tabs %}
{% tab title="Craft" %}

<figure><img src="/files/p6Jsw59dFXCfSDpjPPf4" alt="" width="270"><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Matériaux nécessaires" %}

* 5 blocs de cobblestone
* 1 bloc d'or
* 1 bâton
  {% endtab %}
  {% endtabs %}

***

## Marteau en Netherite

{% hint style="info" %}
Le Marteau en Netherite permet de creuser un cube de 3\*3\*3 blocks
{% endhint %}

*4096 points de durabilité.*

{% tabs %}
{% tab title="Craft" %}

<figure><img src="/files/YdoYwKSX6JZHEWwiEQFt" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Matériaux nécessaires" %}

* 5 lingot de Netherite
* 2 Bâtons en bois
  {% endtab %}

{% tab title="Enchantements" %}

* Fortune
* Silk touch
  {% endtab %}
  {% endtabs %}

***

## Marteau en Diamant

{% hint style="info" %}
Le Marteau en Diamant permet de creuser un cube de 3\*3\*3 blocks
{% endhint %}

*2048 points de durabilité.*

{% tabs %}
{% tab title="Craft" %}

<figure><img src="/files/r0Zkd6rO9nCMltUECb9e" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Matériaux nécessaires" %}

* 5 block de diamants
* 2 Bâtons en bois
  {% endtab %}

{% tab title="Enchantements" %}

* Fortune
* Silk touch
  {% endtab %}
  {% endtabs %}

***

## Marteaux en Fer

{% hint style="info" %}
Le Marteau en Fer permet de creuser un cube de 3\*3\*3 blocks
{% endhint %}

*512 points de durabilité.*

{% tabs %}
{% tab title="Craft" %}

<figure><img src="/files/9r0zWRacVMnoKTx9erxq" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Matériaux nécessaires" %}

* 5 block de fer
* 2 Bâtons en bois
  {% endtab %}

{% tab title="Enchantements" %}

* Fortune
* Silk touch
  {% endtab %}
  {% endtabs %}


# Wands

{% hint style="warning" %}
Cette fonctionalité n'existe pas sur le serveur. Elle est en cours de dévelopment ou planifiée pour une prochaine mise à jour. Cette page n'est donc pas à jour. Si vous souhaiter implémenter vous-même cette fonctionalité, voir [comment contribuer](https://github.com/ServerOpenMC/Wiki/blob/main/.gitbook/includes/developers/contribute/contribute.md).
{% endhint %}

## RTP Wand

{% hint style="info" %}
Cet item vous permet de vous téléporter à un endroit aléatoire sur la map.
{% endhint %}

*Cooldown de 30 secondes.*

{% tabs %}
{% tab title="Craft" %}

<figure><img src="/files/G6cZdouzOXSG1OLINHVy" alt="" width="270"><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Matériaux nécessaires" %}

* 2 bâtons
* 1 enderpearl
  {% endtab %}
  {% endtabs %}

***

## Builder Wand

{% hint style="info" %}
Cet item vous permet de construire très rapidement.
{% endhint %}

*Cooldown de 30 secondes.*

{% tabs %}
{% tab title="Craft" %}

<figure><img src="/files/8RrskFE0wtpiFagUsphi" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Matériaux nécessaires" %}

* 2 block d'émeraude
* 1 block de diamant
* 2 bâtons de blaze
  {% endtab %}
  {% endtabs %}

***

### Claim Wand

{% hint style="info" %}
Cette item vous indiquera la délimitation du chunk claim avec des particules ainsi que sont propriétaire et quelque information relative aux coordonnées.
{% endhint %}

*Cooldown de 30 secondes.*

{% tabs %}
{% tab title="Craft" %}

<figure><img src="/files/dz3aIyC3pfk9GEPEs0as" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Matériaux nécessaires" %}

* 1 gold ingot
* 2 Oak stick
  {% endtab %}
  {% endtabs %}


