pala M-eco: /pay /baltop /balance (monnaie persistee, wiki economie)
This commit is contained in:
@@ -544,6 +544,9 @@ avant M4 (TODO:crafts-machines).
|
|||||||
- M-infos LIVRE 2026-10-19 ~03:00 : /serv /wiki /discord /boutique /couleurs (wiki commandes,
|
- 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
|
liens en config : serverName/wikiUrl/discordUrl/shopUrl). VERIFIE : build SUCCESSFUL, boot
|
||||||
Done, 0 erreur, 17 cles config persistees (auto-complete +4). UNVERIFIED en jeu.
|
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 +
|
- 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
|
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.
|
(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")
|
dispatcher.register(Commands.literal("couleurs")
|
||||||
.executes(command -> infoText(command.getSource(),
|
.executes(command -> infoText(command.getSource(),
|
||||||
"§6[Pala] §7Couleurs : §00 §11 §22 §33 §44 §55 §66 §77 §88 §99 §aa §bb §cc §dd §ee §ff")));
|
"§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
|
net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents.END_SERVER_TICK
|
||||||
.register(PalaCommands::tickSpawnQueue);
|
.register(PalaCommands::tickSpawnQueue);
|
||||||
net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents.END_SERVER_TICK
|
net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents.END_SERVER_TICK
|
||||||
@@ -162,6 +175,68 @@ public final class PalaCommands {
|
|||||||
return Command.SINGLE_SUCCESS;
|
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.
|
// 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.
|
// 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).
|
// 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() {
|
public int playerCount() {
|
||||||
return players.size();
|
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.
Reference in New Issue
Block a user