Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
6fcfdb3
Fix soul chestplate altar crafting
iambibi Feb 17, 2026
d89c65f
Change SoulAxe rarity from COMMON to RARE
iambibi Feb 18, 2026
728e677
Correctif de la possibilité de se faire de l'argent a l'infini (#1158)
iambibi Feb 24, 2026
d139ae9
fix: incorrect singularity transfer (#1157)
iambibi Feb 24, 2026
e6b919e
Refonte du principe pour aller dans la dimension des rêves (#1156)
iambibi Feb 27, 2026
7d3a0d5
Merge branch 'v2.5' into master
iambibi Feb 27, 2026
d23de02
fix: metal detector chest spawning only in +x +z direction (#1169)
gtolontop Mar 11, 2026
ba318cd
Add tests methods in contributing.md
iambibi Mar 13, 2026
356a7c6
Update CONTRIBUTING.md
iambibi Mar 13, 2026
716d7fd
Update CONTRIBUTING.md
iambibi Mar 13, 2026
505a0a4
fix Double is null (#1192)
iambibi Mar 14, 2026
295a8b5
fix if milestone was finished (#1193)
iambibi Mar 14, 2026
96be457
Update target path for OpenMC.jar in workflow
iambibi Mar 17, 2026
07e2e5e
Update pterodactyl-upload-action to version 2.5
iambibi Mar 17, 2026
eca0239
Add command to restart OpenMC after deployment
iambibi Mar 17, 2026
54ce73e
Update source path for OpenMC.jar in workflow
iambibi Mar 17, 2026
bb7c816
Ajout d'une commande /debug animation resetHead (#1199)
iambibi Mar 18, 2026
ab98803
Update action-gh-release to version 2.6.1
iambibi Mar 18, 2026
d8f2db2
Update GitHub Release action version
iambibi Mar 18, 2026
29a6a7c
Add permissions for milestone close workflow
iambibi Mar 18, 2026
56cd148
Update action-gh-release to softprops version
iambibi Mar 18, 2026
c7801f7
Fix release to discord
iambibi Mar 18, 2026
bd7f51c
Fix command formatting in milestone-close.yml
iambibi Mar 18, 2026
828809b
Update GitHub Releases to Discord action version
iambibi Mar 18, 2026
7a420b7
Revert fix release to discord
iambibi Mar 18, 2026
acf6c29
Revert write permissions for contents in workflow
iambibi Mar 18, 2026
6e5dfef
Update action-gh-release to version 2
iambibi Mar 18, 2026
6f25ebf
test if attribute need more perm
iambibi Mar 18, 2026
ab31490
Enable release notes generation for milestones
iambibi Mar 18, 2026
e82767d
final fix?
iambibi Mar 18, 2026
b0fe724
Downgrade github-releases-to-discord version
iambibi Mar 18, 2026
f680644
Update release types format in workflow file
iambibi Mar 18, 2026
db62cb2
Fix YAML syntax for release types in workflow
iambibi Mar 18, 2026
059017c
Remove command from milestone-close workflow
iambibi Mar 18, 2026
09d4552
Rewrite de la base des boss bars + implémentation boss bar dans miles…
iambibi Mar 18, 2026
ceffac3
Revert "Rewrite de la base des boss bars + implémentation boss bar da…
AxenoDev Mar 18, 2026
8f883c4
final fix?
iambibi Mar 18, 2026
b9d946e
try to readd command on release?
iambibi Mar 18, 2026
8aa0787
fix: correction des tests unitaires et ajout de nouveau test (#1170)
gtolontop Mar 20, 2026
6ecb3ba
Ajout des dégats de chute dans la dimension (1 bloc tombé = -1.5 s) (…
iambibi Mar 20, 2026
53688e6
fix: null check sur getPlayerCity() dans calculatePlayerInterest() (#…
gtolontop Mar 22, 2026
e7de576
fix: corriger la profondeur du Hammer (3x3x3 → 3x3x2) (#1217)
gtolontop Mar 26, 2026
77ebb67
Changement sur le Cube (stop command, une bulle = un cube) (#1227)
iambibi Mar 26, 2026
976a493
Correction sur le bouton de retour (#1228)
iambibi Mar 26, 2026
33cf86f
try fix: corruption
iambibi Mar 27, 2026
4ab4d45
fix CLEAR TABLE WHEN SERVER CRASH... (#1239)
iambibi Mar 29, 2026
495bc48
Correctif des creepers qui explosait les entités murales (item frame,…
iambibi Apr 5, 2026
46489fc
Ajout d'info supplémentaire pour la quête de Casser des Buches (#1236)
iambibi Apr 5, 2026
dad5caf
Simplifier la création de messages pour le chat en async (#1235)
iambibi Apr 5, 2026
a339ec1
Correction des effets qui n'était pas correctement enlever avec les a…
iambibi Apr 5, 2026
4f41c7b
Correction de la camera bugée du a l'emote de join + Setting + Invinc…
iambibi Apr 5, 2026
703ca3e
Ajout d'une base pour les évenements de week end (rotation entre les …
iambibi Apr 5, 2026
4e549da
Correction du fait de pouvoir intéragir avec la statue de cuivre d'un…
iambibi Apr 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/workflows/milestone-close.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ jobs:
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
token: ${{ secrets.RELEASE_TOKEN }}
tag_name: ${{ github.event.milestone.title }}
name: Release milestone ${{ github.event.milestone.title }}
generate_release_notes: true
Expand All @@ -54,14 +55,13 @@ jobs:

${{ github.event.milestone.description }}
files: builds/**
env:
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}

- name: Deploy to server
uses: rexlmanu/pterodactyl-upload-action@v2.4
uses: blobles-dev/pterodactyl-upload-action@pterodactyl-file-upload-modification-allow-http-200-fileupload
with:
panel-host: ${{ secrets.PANEL_HOST }}
api-key: ${{ secrets.API_KEY }}
server-id: ${{ secrets.SERVER_ID }}
source: builds/OpenMC.jar
target: "./plugins/OpenMC.jar"
target: "./plugins/update/"
command: omcrestart
1 change: 1 addition & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,5 +68,6 @@ Les noms doivent être en anglais, peu importe la chose nommée.
| Package | Toujours en miniscules et tous les mots sont collés sans caractère entre (pas d'`_`). Le nom doit être simple et sans caractères spéciaux (uniquement les caractères ASCII, donc pas d'accents). Le nom du package doit au possible rester un seul mot. | `fr.communaywen.commands` |
| Classes, Interfaces, Enums, Records, Annotations | Toujours en PascalCase. Utilisez seulement des noms. Évitez les acronymes ou abréviations. | `class SpawnManager;` |
| Methodes | Son nom commence par un verbe. En `camelCase` | `getInstance()` `clone()` |
| Methodes de Tests | Son nom commence par test + une méthode testée. | `testFormat_avoid0()` `testGetNamedTextColor_success()`|
| Variables | Toujours en `camelCase`, évitez les abréviations et les noms raccourcis comme `nbr`. Pas d'`_` ou de `$` au début. L'utilité de la variable devrait être compréhensible en regardant le nom. | `int numberOfPlayers` `String playerName` |
| Constantes et membres d'enums | Les constantes dont la déclaration commence par `static final` sont nommées en UPPER_SNAKE_CASE, avec comme pour les variables, un nom qui décrit clairement leur utilité. | `static final int MIN_WIDTH = 4;` |
5 changes: 5 additions & 0 deletions src/main/java/fr/openmc/api/menulib/MenuLib.java
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,11 @@ public void onClose(InventoryCloseEvent e) {
if (!(e.getPlayer() instanceof Player player)) return;
if (e.getInventory().getHolder(false) instanceof PaginatedMenu paginatedMenu) {
paginatedMenu.onClose(e);
Bukkit.getScheduler().runTaskLater(OMCPlugin.getInstance(), () -> {
if (!(e.getPlayer().getOpenInventory().getTopInventory().getHolder() instanceof PaginatedMenu)) {
MenuLib.clearHistory(player);
}
}, 1L);
return;
}

Expand Down
8 changes: 6 additions & 2 deletions src/main/java/fr/openmc/core/CommandsManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@
import fr.openmc.core.commands.fun.Playtime;
import fr.openmc.core.commands.utils.*;
import fr.openmc.core.features.adminshop.AdminShopCommand;
import fr.openmc.core.features.animations.DebugAnimationCommand;
import fr.openmc.core.features.credits.CreditsCommand;
import fr.openmc.core.features.cube.CubeCommands;
import fr.openmc.core.features.events.halloween.commands.HalloweenCommands;
import fr.openmc.core.features.events.commands.EventCommand;
import fr.openmc.core.features.events.contents.halloween.commands.HalloweenCommands;
import fr.openmc.core.features.friend.FriendCommand;
import fr.openmc.core.features.mailboxes.MailboxCommand;
import fr.openmc.core.features.mainmenu.commands.MainMenuCommand;
Expand Down Expand Up @@ -59,7 +61,9 @@ private static void registerCommands() {
new Cooldowns(),
new CreditsCommand(),
new CubeCommands(),
new HalloweenCommands()
new HalloweenCommands(),
new DebugAnimationCommand(),
new EventCommand()
);
}
}
2 changes: 1 addition & 1 deletion src/main/java/fr/openmc/core/ListenersManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,12 @@ public static void init() {
new EquipableItemListener(),
new NoMoreRabbit(),
new ArmorListener(),
new SpawnerExtractorListener(),
new BlockBreakListener()
);

if (!OMCPlugin.isUnitTestVersion()) {
registerEvents(
new SpawnerExtractorListener(),
new ItemsAddersListener(),
new TicketListener()
);
Expand Down
9 changes: 6 additions & 3 deletions src/main/java/fr/openmc/core/OMCPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
import fr.openmc.core.features.city.sub.notation.NotationManager;
import fr.openmc.core.features.city.sub.statistics.CityStatisticsManager;
import fr.openmc.core.features.city.sub.war.WarManager;
import fr.openmc.core.features.contest.managers.ContestManager;
import fr.openmc.core.features.cube.multiblocks.MultiBlockManager;
import fr.openmc.core.features.displays.TabList;
import fr.openmc.core.features.displays.bossbar.BossbarManager;
Expand All @@ -25,7 +24,9 @@
import fr.openmc.core.features.dream.generation.DreamDimensionManager;
import fr.openmc.core.features.economy.BankManager;
import fr.openmc.core.features.economy.EconomyManager;
import fr.openmc.core.features.events.halloween.managers.HalloweenManager;
import fr.openmc.core.features.events.contents.halloween.managers.HalloweenManager;
import fr.openmc.core.features.events.contents.weeklyevents.WeeklyEventsManager;
import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers.ContestManager;
import fr.openmc.core.features.homes.HomesManager;
import fr.openmc.core.features.homes.icons.HomeIconCacheManager;
import fr.openmc.core.features.leaderboards.LeaderboardManager;
Expand Down Expand Up @@ -132,7 +133,8 @@ public void onEnable() {
TPAQueue.initCommand();
FreezeManager.init();
QuestProgressSaveManager.init();
TabList.init();
if (!isUnitTestVersion())
TabList.init();
AdminShopManager.init();
BossbarManager.init();
AnimationsManager.init();
Expand Down Expand Up @@ -160,6 +162,7 @@ public void loadWithItemsAdder() {
QuestsManager.init();
CityManager.init();
ContestManager.init();
WeeklyEventsManager.init();
DreamManager.init();
MultiBlockManager.init();
if (WorldGuardHook.isHasWorldGuard()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package fr.openmc.core.features.animations;

import fr.openmc.core.features.adminshop.AdminShopManager;
import fr.openmc.core.features.animations.listeners.EmoteListener;
import org.bukkit.entity.Player;
import revxrsal.commands.annotation.Command;
import revxrsal.commands.annotation.Description;
import revxrsal.commands.bukkit.annotation.CommandPermission;


public class DebugAnimationCommand {
@Command("debug animation resetHead")
@CommandPermission("omc.debug.animation.resetHead")
public void resetHead(Player player) {
EmoteListener.sendCamera(player, player);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,8 @@ private void animationEnd(Player player) {
PlayerAnimationInfo info = playingAnimations.remove(player);
if (info == null) return;

player.setInvulnerable(false);

sendCamera(player, player);
if (info.getArmorStand() != null)
info.getArmorStand().remove();
Expand All @@ -112,7 +114,7 @@ private void animationEnd(Player player) {
* @param player The player to send the packet to.
* @param entity The entity to set the camera to.
*/
private void sendCamera(Player player, Entity entity) {
public static void sendCamera(Player player, Entity entity) {
PacketContainer packet = new PacketContainer(PacketType.Play.Server.CAMERA);
packet.getIntegers().write(0, entity.getEntityId());
ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import fr.openmc.core.OMCPlugin;
import fr.openmc.core.features.animations.Animation;
import fr.openmc.core.features.animations.PlayerAnimationInfo;
import fr.openmc.core.features.settings.PlayerSettingsManager;
import fr.openmc.core.features.settings.SettingType;
import org.bukkit.GameMode;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
Expand All @@ -19,16 +21,26 @@ public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();

boolean onGround = player.getLocation().subtract(0, 1, 0).getBlock().getType().isSolid();
if (!(boolean) PlayerSettingsManager.getPlayerSettings(player.getUniqueId()).getSetting(SettingType.JOIN_ANIMATION)) return;
if (player.isFlying() || !onGround || player.getGameMode().equals(GameMode.SPECTATOR)) return;

playingAnimations.put(player, new PlayerAnimationInfo());
EmoteListener.setupHead(player);
player.setInvulnerable(true);

new BukkitRunnable() {
@Override
public void run() {
player.playSound(player, "omc_sounds:ambient.join_rift", 1.0f, 1.0f);
CustomPlayer.playEmote(player, Animation.JOIN_RIFT.getNameAnimation());
if (!player.isOnline()) return;

player.getWorld().playSound(player.getLocation(), "omc_sounds:ambient.join_rift", 1.0f, 1.0f);
try {
CustomPlayer.playEmote(player, Animation.JOIN_RIFT.getNameAnimation());
} catch (Exception e) {
playingAnimations.remove(player);
EmoteListener.sendCamera(player, player);
player.setInvulnerable(false);
}
}
}.runTaskLater(OMCPlugin.getInstance(), 11L);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import fr.openmc.core.utils.messages.MessagesManager;
import fr.openmc.core.utils.messages.Prefix;
import net.kyori.adventure.text.Component;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;

Expand All @@ -26,7 +27,7 @@ public static int calculateAywenite(int chunkCount) {

public static void startUnclaim(Player sender, int chunkX, int chunkZ) {
City city = CityManager.getPlayerCity(sender.getUniqueId());
org.bukkit.World bWorld = sender.getWorld();
World bWorld = sender.getWorld();
if (!bWorld.getName().equals("world")) {
MessagesManager.sendMessage(sender, Component.text("Tu ne peux pas étendre ta ville ici"), Prefix.CITY, MessageType.ERROR, false);
return;
Expand All @@ -42,14 +43,17 @@ public static void startUnclaim(Player sender, int chunkX, int chunkZ) {
return;
}

int price = calculatePrice(city.getChunks().size());
int ayweniteNb = calculateAywenite(city.getChunks().size());

EconomyManager.addBalance(sender.getUniqueId(), price, "Unclaim de chunk de ville");
ItemStack aywenite = ayweniteItemStack.clone();
aywenite.setAmount(ayweniteNb);
for (ItemStack item : ItemUtils.splitAmountIntoStack(aywenite)) {
sender.dropItem(item);
// si on unclaim des claims gratuits on ne rend rien, sinon on rend une partie de l'argent et d'aywenite
if (city.getChunks().size() > CityCreateAction.FREE_CLAIMS+1) {
int price = calculatePrice(city.getChunks().size());
int ayweniteNb = calculateAywenite(city.getChunks().size());

EconomyManager.addBalance(sender.getUniqueId(), price, "Unclaim de chunk de ville");
ItemStack aywenite = ayweniteItemStack.clone();
aywenite.setAmount(ayweniteNb);
for (ItemStack item : ItemUtils.splitAmountIntoStack(aywenite)) {
sender.dropItem(item);
}
}

city.removeChunk(chunkX, chunkZ);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
import org.bukkit.event.hanging.HangingBreakEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;

public class HangingProtection implements Listener {
Expand All @@ -22,8 +23,18 @@ public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {

@EventHandler(ignoreCancelled = true)
public void onHangingBreakByEntity(HangingBreakByEntityEvent event) {
if (event.getRemover() instanceof Player player) {
ProtectionsManager.verify(player, event, event.getEntity().getLocation());
Entity remover = event.getRemover();
if (remover != null) {
ProtectionsManager.verify(remover, event, event.getEntity().getLocation());
}
}

@EventHandler(ignoreCancelled = true)
public void onHangingBreak(HangingBreakEvent event) {
if (event.getCause() == HangingBreakEvent.RemoveCause.EXPLOSION) {
if (!ProtectionsManager.canExplodeNaturally(event.getEntity().getLocation())) {
event.setCancelled(true);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ public void onInteract(PlayerInteractEvent event) {
Player player = event.getPlayer();

if (event.getAction() == Action.PHYSICAL) return;
if (event.getHand() != EquipmentSlot.HAND) return;
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return;

Block clickedBlock = event.getClickedBlock();
Expand Down
21 changes: 17 additions & 4 deletions src/main/java/fr/openmc/core/features/city/menu/CityChunkMenu.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import fr.openmc.core.features.city.CityManager;
import fr.openmc.core.features.city.CityPermission;
import fr.openmc.core.features.city.actions.CityClaimAction;
import fr.openmc.core.features.city.actions.CityCreateAction;
import fr.openmc.core.features.city.actions.CityUnclaimAction;
import fr.openmc.core.features.economy.EconomyManager;
import fr.openmc.core.utils.ChunkInfo;
Expand Down Expand Up @@ -264,9 +265,9 @@ private ItemBuilder createProtectedChunkItem(Material material, int chunkX, int
}

private ItemBuilder createPlayerCityChunkItem(Material material, City city, int chunkX, int chunkZ) {
return new ItemBuilder(this, material, itemMeta -> {
itemMeta.displayName(Component.text("§9Claim de votre ville"));
itemMeta.lore(List.of(
List<Component> lore;
if (city.getChunks().size() > CityCreateAction.FREE_CLAIMS+1) {
lore = List.of(
Component.text("§7Ville : §d" + city.getName()),
Component.text("§7Position : §f" + chunkX + ", " + chunkZ),
Component.empty(),
Expand All @@ -275,7 +276,19 @@ private ItemBuilder createPlayerCityChunkItem(Material material, City city, int
Component.text("§8- §d" + CityUnclaimAction.calculateAywenite(playerCity.getChunks().size()) + " d'Aywenite"),
Component.empty(),
Component.text("§e§lCLIQUEZ POUR UNCLAIM")
));
);
} else {
lore = List.of(
Component.text("§7Ville : §d" + city.getName()),
Component.text("§7Position : §f" + chunkX + ", " + chunkZ),
Component.empty(),
Component.text("§e§lCLIQUEZ POUR UNCLAIM")
);
}

return new ItemBuilder(this, material, itemMeta -> {
itemMeta.displayName(Component.text("§9Claim de votre ville"));
itemMeta.lore(lore);
}).setOnClick(event -> handleChunkUnclaimClick(player, chunkX, chunkZ, hasPermissionClaim));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@ public static void giveReward(String weekStr) {
* Planifie l'exécution de la tâche de minuit qui calcule les scores et attribue les récompenses.
*/
private static void scheduleMidnightTask() {
long delayInTicks = DateUtils.getSecondsUntilDayOfWeekMidnight(APPLY_NOTATION_DAY) * 20;
long delayInTicks = DateUtils.getSecondsUntilDayOfWeekTime(APPLY_NOTATION_DAY, 0, 0, 0) * 20;
Bukkit.getScheduler().runTaskLater(OMCPlugin.getInstance(), () -> {
if (!isApplied) {
String weekStr = DateUtils.getWeekFormat();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,13 @@ public static DialogBody lineCityNotation(City city, String weekStr) {
Component base = Component.empty();

if (notation != null) {
String activity = String.format("%.2f/" + NotationNote.NOTE_ACTIVITY.getMaxNote(), Math.round(notation.getNoteActivity() * 100.0) / 100.0);
String eco = String.format("%.2f/" + NotationNote.NOTE_PIB.getMaxNote(), Math.round(notation.getNoteEconomy() * 100.0) / 100.0);
String military = String.format("%.2f/" + NotationNote.NOTE_MILITARY.getMaxNote(), Math.round(notation.getNoteMilitary() * 100.0) / 100.0);
double noteActivity = notation.getNoteActivity() != null ? notation.getNoteActivity() : 0;
double noteEconomy = notation.getNoteEconomy() != null ? notation.getNoteEconomy() : 0;
double noteMilitary = notation.getNoteMilitary() != null ? notation.getNoteMilitary() : 0;

String activity = String.format("%.2f/" + NotationNote.NOTE_ACTIVITY.getMaxNote(), Math.round(noteActivity * 100.0) / 100.0);
String eco = String.format("%.2f/" + NotationNote.NOTE_PIB.getMaxNote(), Math.round(noteEconomy * 100.0) / 100.0);
String military = String.format("%.2f/" + NotationNote.NOTE_MILITARY.getMaxNote(), Math.round(noteMilitary * 100.0) / 100.0);
String arch = String.format("%.2f/" + NotationNote.NOTE_ARCHITECTURAL.getMaxNote(), Math.round(notation.getNoteArchitectural() * 100.0) / 100.0);
String coh = String.format("%.2f/" + NotationNote.NOTE_COHERENCE.getMaxNote(), Math.round(notation.getNoteCoherence() * 100.0) / 100.0);
String total = String.format("%.2f/%.0f", Math.round(notation.getTotalNote() * 100.0) / 100.0, NotationNote.getMaxTotalNote());
Expand Down Expand Up @@ -150,13 +154,18 @@ public static Component getHoverTotal(CityNotation notation) {
return Component.text("Aucun total pour vous");
}


double noteActivity = notation.getNoteActivity() != null ? notation.getNoteActivity() : 0;
double noteEconomy = notation.getNoteEconomy() != null ? notation.getNoteEconomy() : 0;
double noteMilitary = notation.getNoteMilitary() != null ? notation.getNoteMilitary() : 0;

return Component.text("§6§lDétails")
.appendNewline()
.append(Component.text("§8Activité " + notation.getNoteActivity()))
.append(Component.text("§8Activité " + noteActivity))
.appendNewline()
.append(Component.text("§8Économie " + notation.getNoteEconomy()))
.append(Component.text("§8Économie " + noteEconomy))
.appendNewline()
.append(Component.text("§8Militaire " + notation.getNoteMilitary()))
.append(Component.text("§8Militaire " + noteMilitary))
.appendNewline()
.append(Component.text("§8Architecture " + notation.getNoteArchitectural()))
.appendNewline()
Expand Down
Loading
Loading