pala M-eco: /pay /baltop /balance (monnaie persistee, wiki economie)

This commit is contained in:
Anaïs Saraiva
2026-10-19 03:01:12 +02:00
parent da60aa2228
commit fdff425a48
4 changed files with 89 additions and 0 deletions
+3
View File
@@ -544,6 +544,9 @@ avant M4 (TODO:crafts-machines).
- M-infos LIVRE 2026-10-19 ~03:00 : /serv /wiki /discord /boutique /couleurs (wiki commandes,
liens en config : serverName/wikiUrl/discordUrl/shopUrl). VERIFIE : build SUCCESSFUL, boot
Done, 0 erreur, 17 cles config persistees (auto-complete +4). UNVERIFIED en jeu.
- M-eco LIVRE 2026-10-19 ~03:05 : /pay (transfert, fonds verifies) + /baltop (top 10 via
PalaStorage.topMoney) + /balance (solde). ECART : connectes uniquement (wiki suggere pseudo
offline). VERIFIE : build SUCCESSFUL, boot Done, 0 erreur. UNVERIFIED en jeu (2 joueurs).
- Client/mod : boucle visuelle OPERATIONNELLE 2026-10-19 (Xvfb :99 + runClient SDL x11 +
captures Java Robot + pilotage xdotool + vision_analyze) : menu, Select World, monde New World
(creatif, cheats), /give, pose de bloc, inventaire, F3+T. Screens : scratch vis*.png.
@@ -128,6 +128,19 @@ public final class PalaCommands {
dispatcher.register(Commands.literal("couleurs")
.executes(command -> infoText(command.getSource(),
"§6[Pala] §7Couleurs : §00 §11 §22 §33 §44 §55 §66 §77 §88 §99 §aa §bb §cc §dd §ee §ff")));
dispatcher.register(Commands.literal("pay")
.then(Commands.argument("cible", EntityArgument.player())
.then(Commands.argument("montant",
com.mojang.brigadier.arguments.DoubleArgumentType
.doubleArg(0.01))
.executes(command -> pay(command.getSource(),
EntityArgument.getPlayer(command, "cible"),
com.mojang.brigadier.arguments.DoubleArgumentType
.getDouble(command, "montant"))))));
dispatcher.register(Commands.literal("baltop")
.executes(command -> baltop(command.getSource())));
dispatcher.register(Commands.literal("balance")
.executes(command -> balance(command.getSource())));
net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents.END_SERVER_TICK
.register(PalaCommands::tickSpawnQueue);
net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents.END_SERVER_TICK
@@ -162,6 +175,68 @@ public final class PalaCommands {
return Command.SINGLE_SUCCESS;
}
// M-eco (wiki commandes/economie) : monnaie persistee (PalaStorage.money).
// /pay : transfert immediat entre connectes (ECART : wiki autorise un pseudo hors ligne ;
// ici connectes uniquement, EntityArgument). /baltop : top 10. /balance : solde.
private static int pay(CommandSourceStack source, ServerPlayer cible, double montant) {
try {
ServerPlayer player = source.getPlayerOrException();
if (player.getUUID().equals(cible.getUUID())) {
source.sendFailure(Component.literal("§cPaiement vers soi-meme impossible."));
return 0;
}
PalaStorage.PlayerData from = PalaStorage.get().data(player.getUUID());
if (from.money < montant) {
source.sendFailure(Component.literal("§cFonds insuffisants (solde : "
+ String.format("%.2f", from.money) + ")."));
return 0;
}
from.money -= montant;
PalaStorage.get().data(cible.getUUID()).money += montant;
PalaStorage.get().markDirty();
player.sendSystemMessage(Component.literal("§6[Pala] §7Vous avez envoye §e"
+ String.format("%.2f", montant) + " §7a " + cible.getScoreboardName() + "."));
cible.sendSystemMessage(Component.literal("§6[Pala] §7Vous avez recu §e"
+ String.format("%.2f", montant) + " §7de " + player.getScoreboardName() + "."));
return Command.SINGLE_SUCCESS;
} catch (com.mojang.brigadier.exceptions.CommandSyntaxException e) {
return 0;
}
}
private static int baltop(CommandSourceStack source) {
StringBuilder out = new StringBuilder("§6[Joueurs les plus riches]");
java.util.List<java.util.Map.Entry<String, Double>> top =
PalaStorage.get().topMoney(10);
if (top.isEmpty()) {
out.append("\n§7aucun joueur connu.");
}
int rank = 1;
for (java.util.Map.Entry<String, Double> entry : top) {
ServerPlayer online = source.getServer().getPlayerList()
.getPlayer(java.util.UUID.fromString(entry.getKey()));
String name = online == null
? entry.getKey().substring(0, 8) + "..." : online.getScoreboardName();
out.append("\n§e").append(rank).append(". §7").append(name).append(" : §a")
.append(String.format("%.2f", entry.getValue()));
rank++;
}
source.sendSuccess(() -> Component.literal(out.toString()), false);
return Command.SINGLE_SUCCESS;
}
private static int balance(CommandSourceStack source) {
try {
ServerPlayer player = source.getPlayerOrException();
double money = PalaStorage.get().data(player.getUUID()).money;
source.sendSuccess(() -> Component.literal(
"§6[Pala] §7Solde : §e" + String.format("%.2f", money)), false);
return Command.SINGLE_SUCCESS;
} catch (com.mojang.brigadier.exceptions.CommandSyntaxException e) {
return 0;
}
}
// M1 : prospecte les minerais pala dans un cube de rayon N autour du joueur.
// Affiche comptes par minerai + histogramme Y (8 bandes de 16) pour amethyste/titane.
// Test distribution worldgen (couches 6-10 + deep ocean). Rayon capé à 32 (65^3 lectures).
@@ -107,4 +107,15 @@ public final class PalaStorage {
public int playerCount() {
return players.size();
}
/** Top N joueurs par monnaie (M-eco, /baltop). UUID string -> money. */
public java.util.List<java.util.Map.Entry<String, Double>> topMoney(int n) {
java.util.List<java.util.Map.Entry<String, Double>> out = new java.util.ArrayList<>();
for (java.util.Map.Entry<String, PlayerData> entry : players.entrySet()) {
out.add(new java.util.AbstractMap.SimpleEntry<>(entry.getKey(),
entry.getValue().money));
}
out.sort((a, b) -> Double.compare(b.getValue(), a.getValue()));
return out.subList(0, Math.min(n, out.size()));
}
}
Binary file not shown.