Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 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
2ce07c0
chore: remove old TranslationManager, implement base MiniMessageTrans…
iambibi Feb 24, 2026
27c8058
add: fallback language (french by default)
iambibi Feb 24, 2026
e06f8b0
add: template lang_en + fix argument
iambibi Feb 24, 2026
035f055
fix: caracter in ISO -> UTF8
iambibi Feb 24, 2026
02881e7
traduction for package commands.admin.freeze
iambibi Feb 24, 2026
21eeb24
traduction for package api.chronometer
iambibi Feb 25, 2026
a4a04d0
traduction for package api.colodown
iambibi Feb 27, 2026
cb08740
traduction for package api.input
iambibi Feb 27, 2026
f8b27fc
rework of translation loader, use a texture pack, translationKey and …
iambibi Mar 6, 2026
79fbe04
convert MessagesManager.Message.NO_PERMISSION to messages.cannot_do_this
iambibi Mar 6, 2026
a810599
s
iambibi Mar 6, 2026
86cc8b5
convert MessagesManager.Message.MISSING_ARUGMENT to messages.missing_…
iambibi Mar 6, 2026
e4ef916
convert all MessagesManager.Message
iambibi Mar 6, 2026
0b1b98b
convert messages from commands.utils
iambibi Mar 6, 2026
3b8b374
fix color
iambibi Mar 6, 2026
488926c
translate feature.adminshop (rewrite of menus, item build, ..)
iambibi Mar 7, 2026
20f3e7e
Merge branch 'v2.5' into chore/messages
iambibi Mar 7, 2026
0861a04
fix pb color, pb name back button
iambibi Mar 7, 2026
64bb3da
Merge remote-tracking branch 'origin/chore/messages' into chore/messages
iambibi Mar 7, 2026
539eeb7
fix italic
iambibi Mar 7, 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
90 changes: 40 additions & 50 deletions src/main/java/fr/openmc/api/chronometer/Chronometer.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
import fr.openmc.core.utils.messages.MessageType;
import fr.openmc.core.utils.messages.MessagesManager;
import fr.openmc.core.utils.messages.Prefix;
import fr.openmc.core.utils.messages.TranslationManager;
import lombok.Getter;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
Expand Down Expand Up @@ -64,7 +66,15 @@ public static HandlerList getHandlerList() {
* @param finishMessageType display type
* @param finishMessage message display when the chronometer ends normally
*/
public static void startChronometer(Entity entity, String group, int time, ChronometerType messageType, String message, ChronometerType finishMessageType, String finishMessage) {
public static void startChronometer(
Entity entity,
String group,
int time,
ChronometerType messageType,
Component message,
ChronometerType finishMessageType,
Component finishMessage
) {
UUID entityUUID = entity.getUniqueId();
chronometer.computeIfAbsent(entityUUID, k -> new HashMap<>()).put(group, time);

Expand All @@ -81,33 +91,26 @@ public void run() {
}

int remainingTime = chronometer.get(entityUUID).get(group);
String timerMessage = "Il reste : " + remainingTime + "s";
if (message!=null){
if (!message.contains("%null%")){
if (message.contains("%sec%")) {
timerMessage = message.replace("%sec%", String.valueOf(remainingTime));
}
if (entity instanceof Player player){
sendMessage(player, messageType, Component.text(timerMessage));
}
}
} else {
if (entity instanceof Player player){
sendMessage(player, messageType, Component.text(timerMessage));
}
}

if (message != null && entity instanceof Player player) {
Component timerMessage = message.replaceText(builder ->
builder.matchLiteral("%sec%")
.replacement(Component.text(remainingTime))
);
sendMessage(player, messageType, timerMessage);
}

if (timerEnd(entityUUID, group)) {
if (entity instanceof Player player){
sendMessage(player, finishMessageType, Component.text(finishMessage != null ? finishMessage : "Le chronomètre est terminé !"));

if (entity instanceof Player player && finishMessage != null) {
sendMessage(player, finishMessageType, finishMessage);
}

Bukkit.getPluginManager().callEvent(new ChronometerEndEvent(entity, group));

if (chronometer.containsKey(entityUUID)) {
chronometer.get(entityUUID).remove(group);
if (chronometer.get(entityUUID).isEmpty()){
if (chronometer.get(entityUUID).isEmpty()) {
chronometer.remove(entityUUID);
}
}
Expand All @@ -119,7 +122,6 @@ public void run() {
}
};
task.runTaskTimer(OMCPlugin.getInstance(), 0, 20);

activeTasks.computeIfAbsent(entityUUID, k -> new HashMap<>()).put(group, task);
}

Expand All @@ -128,26 +130,20 @@ public void run() {
* @param messageType display type
* @param message message display when the chronometer is stopped
*/
public static void stopAllChronometer(Entity entity, ChronometerType messageType, String message) {
public static void stopAllChronometer(Entity entity, ChronometerType messageType, Component message) {
UUID entityUUID = entity.getUniqueId();

if (chronometer.containsKey(entityUUID)) {
chronometer.remove(entityUUID);
if (message!=null){
if (!message.contains("%null%")){
if (entity instanceof Player player){
sendMessage(player, messageType, Component.text(message));
}
}
} else {
if (entity instanceof Player player){
sendMessage(player, messageType, Component.text("Chronomètre arrêté"));
}

if (entity instanceof Player player && message != null) {
sendMessage(player, messageType, message);
}
}

if (activeTasks.containsKey(entityUUID)) {
for (Map.Entry<String, BukkitRunnable> entry : activeTasks.get(entityUUID).entrySet()) {
entry.getValue().cancel();
for (BukkitRunnable runnable : activeTasks.get(entityUUID).values()) {
runnable.cancel();
}
activeTasks.remove(entityUUID);
}
Expand All @@ -159,7 +155,7 @@ public static void stopAllChronometer(Entity entity, ChronometerType messageType
* @param messageType display type
* @param message message display when the chronometer is stopped
*/
public static void stopChronometer(Entity entity, String group, ChronometerType messageType, String message) {
public static void stopChronometer(Entity entity, String group, ChronometerType messageType, Component message) {
UUID entityUUID = entity.getUniqueId();

if (chronometer.containsKey(entityUUID) && chronometer.get(entityUUID).containsKey(group)) {
Expand All @@ -170,24 +166,18 @@ public static void stopChronometer(Entity entity, String group, ChronometerType
activeTasks.get(entityUUID).remove(group);
}

if (message!=null){
if (!message.contains("%null%")){
if (entity instanceof Player player){
sendMessage(player, messageType, Component.text(message));
}
}
} else {
if (entity instanceof Player player){
sendMessage(player, messageType, Component.text("Chronomètre du " + group + " arrêté"));
}
if (entity instanceof Player player && message != null) {
sendMessage(player, messageType, message);
}

if (chronometer.get(entityUUID).isEmpty()) {
chronometer.remove(entityUUID);
}
} else {
if (entity instanceof Player player){
player.sendMessage("§cAucun chronomètre trouvé pour le groupe §e" + group + ".");
if (entity instanceof Player player) {
MessagesManager.sendMessage(player,
TranslationManager.translation("api.chronometer.chronometer_not_found",
Component.text(group).color(NamedTextColor.GOLD)), Prefix.OPENMC, MessageType.INFO, false);
}
}
}
Expand All @@ -196,12 +186,12 @@ public static void listChronometers(Entity entity, Player owner) {
UUID entitytUUID = entity.getUniqueId();

if (chronometer.containsKey(entitytUUID)) {
owner.sendMessage("§aChronomètres actifs :");
owner.sendMessage(TranslationManager.translation("api.chronometer.chronometer_on"));
chronometer.get(entitytUUID).forEach((group, time) ->
owner.sendMessage(" §e- " + group + ": §6" + time + "s")
);
owner.sendMessage(TranslationManager.translation("api.chronometer.chronometer_on_list",
Component.text(group), Component.text(time).color(NamedTextColor.GOLD)).color(NamedTextColor.YELLOW)));
} else {
owner.sendMessage("§cCe joueur n'a aucun chronomètre actif.");
owner.sendMessage(TranslationManager.translation("api.chronometer.none_chronometer_player"));
}
}

Expand Down
18 changes: 14 additions & 4 deletions src/main/java/fr/openmc/api/cooldown/CooldownInterceptor.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
package fr.openmc.api.cooldown;

import fr.openmc.core.utils.DateUtils;
import fr.openmc.core.utils.messages.TranslationManager;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import revxrsal.commands.bukkit.actor.BukkitCommandActor;
import revxrsal.commands.node.ExecutionContext;
import revxrsal.commands.process.CommandCondition;

public class CooldownInterceptor implements CommandCondition<BukkitCommandActor> {

@Override
public void test(@NotNull ExecutionContext<BukkitCommandActor> context) {

DynamicCooldown cooldown = context.command().annotations().get(DynamicCooldown.class);
if (cooldown == null) {
return;
Expand All @@ -18,11 +23,16 @@ public void test(@NotNull ExecutionContext<BukkitCommandActor> context) {
Player player = context.actor().requirePlayer();

if (!DynamicCooldownManager.isReady(player.getUniqueId(), cooldown.group())) {

long remaining = DynamicCooldownManager.getRemaining(player.getUniqueId(), cooldown.group());
String message = cooldown.message();
message = message.replace("%formatTime%", DateUtils.convertSecondToTime(remaining / 1000));
message = message.replace("%sec%", String.valueOf(remaining / 1000));
message = message.replace("%ms%", String.valueOf(remaining));

Component message = TranslationManager.translation(
cooldown.messageKey(),
Component.text(remaining / 1000),
Component.text(remaining),
Component.text(DateUtils.convertSecondToTime(remaining / 1000))
).color(NamedTextColor.RED);

player.sendMessage(message);
}
}
Expand Down
7 changes: 4 additions & 3 deletions src/main/java/fr/openmc/api/cooldown/DynamicCooldown.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,10 @@
*
* @return message
*/
String message() default "§cVous devez attendre %sec%s";
String messageKey() default "api.cooldown.must_wait";
/*
* %sec% | Le temps restant en secondes
* %ms% | Le temps restant en millisecondes
* <arg:0> | Le temps restant en secondes
* <arg:1> | Le temps restant en millisecondes
* <arg:2> | Le temps restant formaté (ex: 1m30s)
*/
}
8 changes: 7 additions & 1 deletion src/main/java/fr/openmc/api/input/ChatInput.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
package fr.openmc.api.input;

import fr.openmc.core.utils.messages.MessageType;
import fr.openmc.core.utils.messages.MessagesManager;
import fr.openmc.core.utils.messages.Prefix;
import fr.openmc.core.utils.messages.TranslationManager;
import io.papermc.paper.event.player.AsyncChatEvent;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
Expand Down Expand Up @@ -32,7 +37,8 @@ public void onPlayerChat(AsyncChatEvent event) {
if (event.message() instanceof TextComponent textComponent) {
String string = textComponent.content();
if (string.contains("cancel")) {
player.sendMessage("§eVous avez annulé l'action !");
MessagesManager.sendMessage(player,
TranslationManager.translation("api.chatinput.cancel"), Prefix.OPENMC, MessageType.INFO, false);
callback.accept(null);
}
callback.accept(string);
Expand Down
29 changes: 13 additions & 16 deletions src/main/java/fr/openmc/api/input/DialogInput.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package fr.openmc.api.input;

import fr.openmc.core.utils.dialog.ButtonType;
import fr.openmc.core.utils.messages.TranslationManager;
import io.papermc.paper.dialog.Dialog;
import io.papermc.paper.registry.data.dialog.ActionButton;
import io.papermc.paper.registry.data.dialog.DialogBase;
Expand All @@ -25,12 +26,12 @@ public static void send(Player player, Component lore, int maxLength, Consumer<S
body.add(DialogBody.plainMessage(lore));

Dialog inputDialog = Dialog.create(builder -> builder.empty()
.base(DialogBase.builder(Component.text("Rentrer du Texte"))
.base(DialogBase.builder(TranslationManager.translation("api.dialoginput.type_string"))
.body(body)
.inputs(List.of(
io.papermc.paper.registry.data.dialog.input.DialogInput
.text("inputtextomc",
Component.text("Rentrer du texte ici")
TranslationManager.translation("api.dialoginput.type_string.here")
)
.maxLength(maxLength)
.build()
Expand All @@ -41,14 +42,12 @@ public static void send(Player player, Component lore, int maxLength, Consumer<S
)
.type(DialogType.confirmation(
ActionButton.builder(Component.text(ButtonType.CONFIRM.getLabel()))
.action(DialogAction.customClick((response, audience) -> {
callback.accept(response.getText("inputtextomc"));
}, ClickCallback.Options.builder().build()))
.action(DialogAction.customClick((response, audience) ->
callback.accept(response.getText("inputtextomc")), ClickCallback.Options.builder().build()))
.build(),
ActionButton.builder(Component.text(ButtonType.CANCEL.getLabel()))
.action(DialogAction.customClick((response, audience) -> {
callback.accept(null);
}, ClickCallback.Options.builder().build()))
.action(DialogAction.customClick((response, audience) ->
callback.accept(null), ClickCallback.Options.builder().build()))
.build()
)
)
Expand All @@ -63,12 +62,12 @@ public static void sendFloat(Player player, Component lore, float minSize, float
body.add(DialogBody.plainMessage(lore));

Dialog inputDialog = Dialog.create(builder -> builder.empty()
.base(DialogBase.builder(Component.text("Rentrer un nombre"))
.base(DialogBase.builder(TranslationManager.translation("api.dialoginput.type_float"))
.body(body)
.inputs(List.of(
io.papermc.paper.registry.data.dialog.input.DialogInput
.numberRange("inputfloatomc",
Component.text("Rentrer un nombre ici"),
TranslationManager.translation("api.dialoginput.type_float.here"),
minSize,
maxSize
)
Expand All @@ -82,14 +81,12 @@ public static void sendFloat(Player player, Component lore, float minSize, float
)
.type(DialogType.confirmation(
ActionButton.builder(Component.text(ButtonType.CONFIRM.getLabel()))
.action(DialogAction.customClick((response, audience) -> {
callback.accept(response.getFloat("inputfloatomc"));
}, ClickCallback.Options.builder().build()))
.action(DialogAction.customClick((response, audience) ->
callback.accept(response.getFloat("inputfloatomc")), ClickCallback.Options.builder().build()))
.build(),
ActionButton.builder(Component.text(ButtonType.CANCEL.getLabel()))
.action(DialogAction.customClick((response, audience) -> {
callback.accept(null);
}, ClickCallback.Options.builder().build()))
.action(DialogAction.customClick((response, audience) ->
callback.accept(null), ClickCallback.Options.builder().build()))
.build()
)
)
Expand Down
Loading
Loading