From 86cc852c8165a1058228541f4bb72722865fa5b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=C3=AFs=20Saraiva?= <53227802+Kisakay@users.noreply.github.com> Date: Sun, 18 Oct 2026 23:38:52 +0200 Subject: [PATCH] pala M0: socle core (config/permissions/storage/jobs) + /pala /jobs + gate /nether, jar serveur redeploye --- PALAMOD_CDC.md | 11 ++ .../main/java/fr/surviepote/pala/Pala.java | 1 + .../java/fr/surviepote/pala/PalaCommands.java | 97 +++++++++++++- .../fr/surviepote/pala/core/PalaConfig.java | 124 ++++++++++++++++++ .../fr/surviepote/pala/core/PalaCore.java | 37 ++++++ .../fr/surviepote/pala/core/PalaJobs.java | 64 +++++++++ .../surviepote/pala/core/PalaPermissions.java | 47 +++++++ .../fr/surviepote/pala/core/PalaStorage.java | 110 ++++++++++++++++ .../pala/events/PalaToolEvents.java | 4 + server/mods/pala-0.2.1.jar | Bin 308198 -> 323094 bytes 10 files changed, 492 insertions(+), 3 deletions(-) create mode 100644 mods/pala/src/main/java/fr/surviepote/pala/core/PalaConfig.java create mode 100644 mods/pala/src/main/java/fr/surviepote/pala/core/PalaCore.java create mode 100644 mods/pala/src/main/java/fr/surviepote/pala/core/PalaJobs.java create mode 100644 mods/pala/src/main/java/fr/surviepote/pala/core/PalaPermissions.java create mode 100644 mods/pala/src/main/java/fr/surviepote/pala/core/PalaStorage.java diff --git a/PALAMOD_CDC.md b/PALAMOD_CDC.md index 1fb2df2..6476711 100644 --- a/PALAMOD_CDC.md +++ b/PALAMOD_CDC.md @@ -474,6 +474,17 @@ avant M4 (TODO:crafts-machines). (biomesoplenty/clumps/glitchcore/patpat, message standard "ignorer hors dev"). Serveur arrete apres test (port 25565 libere), eula.txt restaure a false, server.properties/packetfixer.properties restaures (le boot ne change que leurs timestamps). +- M0 LIVRE 2026-10-18 23:35 (commit a suivre) : package core (PalaConfig JSON rechargeable + 22 entrees minerXp wiki, PalaStorage joueurs JSON + flush 5 s, PalaPermissions rangs+noeuds, + PalaJobs moteur XP/niveaux, PalaCore lifecycle), /pala reload|info|rank, /jobs, + /nether gate mineur niv.3, hook XP dans PalaToolEvents. VERIFIE : ./gradlew compileJava+build + SUCCESSFUL, boot serveur Done (0.355s), "Pala core charge (config creee par defaut)", + config/pala.json generee (6 cles), 0 ERROR/Exception au log. Deploys : server/mods/pala-0.2.1.jar. +- Build mod : TOUJOURS via shell racine avec JAVA_HOME redirige (le shell.nix positionne + JAVA_HOME sur un JDK 8, Gradle 9 exige 17+). Commande VERIFIE : + cd mods/pala && nix-shell /shell.nix --run "export JAVA_HOME=$(dirname $(dirname + $(readlink -f $(which java)))); ./gradlew build". TODO:java-home : fixer shell.nix racine + (export JAVA_HOME jdk25) pour ne plus bricoler. Raison : decouvert en testant (3 essais). - Client/mod : ./gradlew runClient dans mods/pala/ : NON LANCE (session : pas d'affichage ; screenshots ocular impossibles ici). TODO:runclient : 1 screenshot/feature dans mods/pala/docs/screens/ avant M10. Raison : environnement headless, a faire sur poste avec X. diff --git a/mods/pala/src/main/java/fr/surviepote/pala/Pala.java b/mods/pala/src/main/java/fr/surviepote/pala/Pala.java index 6c9f556..0facfbe 100644 --- a/mods/pala/src/main/java/fr/surviepote/pala/Pala.java +++ b/mods/pala/src/main/java/fr/surviepote/pala/Pala.java @@ -11,6 +11,7 @@ public class Pala implements ModInitializer { @Override public void onInitialize() { + fr.surviepote.pala.core.PalaCore.register(); PalaRegistries.registerAll(); fr.surviepote.pala.events.PalaEvents.registerAll(); LOGGER.info("[SurviePote] Pala initialisé."); diff --git a/mods/pala/src/main/java/fr/surviepote/pala/PalaCommands.java b/mods/pala/src/main/java/fr/surviepote/pala/PalaCommands.java index e2785aa..b407f58 100644 --- a/mods/pala/src/main/java/fr/surviepote/pala/PalaCommands.java +++ b/mods/pala/src/main/java/fr/surviepote/pala/PalaCommands.java @@ -1,10 +1,13 @@ package fr.surviepote.pala; import com.mojang.brigadier.Command; +import com.mojang.brigadier.arguments.StringArgumentType; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; +import net.minecraft.commands.arguments.EntityArgument; import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; @@ -15,7 +18,13 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.portal.TeleportTransition; import net.minecraft.world.phys.Vec3; -// Commandes Pala : /end /nether /overworld (permission niveau 4, legacy). +import fr.surviepote.pala.core.PalaConfig; +import fr.surviepote.pala.core.PalaJobs; +import fr.surviepote.pala.core.PalaPermissions; +import fr.surviepote.pala.core.PalaStorage; + +// Commandes Pala : /end /overworld (permission niveau 4, legacy), /nether (gate metier +// mineur niv.3, M0), /pala reload|info|rank (admin), /jobs (metiers). Voir CDC §3.8. // Origine : CommandEnd/Nether/Overworld + procedures *CommandExecuted qui // teleportaient le joueur au spawn de la dimension visee. Ici via // TeleportTransition (API 26.x), sans le Teleporter custom du legacy. @@ -30,14 +39,96 @@ public final class PalaCommands { .requires(source -> Commands.LEVEL_OWNERS.check(source.permissions())) .executes(command -> teleport(command.getSource(), Level.END))); dispatcher.register(Commands.literal("nether") - .requires(source -> Commands.LEVEL_OWNERS.check(source.permissions())) - .executes(command -> teleport(command.getSource(), Level.NETHER))); + .executes(command -> nether(command.getSource()))); dispatcher.register(Commands.literal("overworld") .requires(source -> Commands.LEVEL_OWNERS.check(source.permissions())) .executes(command -> teleport(command.getSource(), Level.OVERWORLD))); + com.mojang.brigadier.builder.ArgumentBuilder rankArg = + Commands.argument("rang", StringArgumentType.word()) + .executes(command -> rank(command.getSource(), + EntityArgument.getPlayer(command, "joueur"), + StringArgumentType.getString(command, "rang"))); + com.mojang.brigadier.builder.ArgumentBuilder joueurArg = + Commands.argument("joueur", EntityArgument.player()).then(rankArg); + dispatcher.register(Commands.literal("pala") + .then(Commands.literal("reload") + .requires(source -> isAdmin(source)) + .executes(command -> reload(command.getSource()))) + .then(Commands.literal("info") + .requires(source -> isAdmin(source)) + .executes(command -> info(command.getSource()))) + .then(Commands.literal("rank") + .requires(source -> isAdmin(source)) + .then(joueurArg))); + dispatcher.register(Commands.literal("jobs") + .executes(command -> jobs(command.getSource()))); }); } + private static boolean isAdmin(CommandSourceStack source) { + ServerPlayer player = source.getPlayer(); + if (player == null) { + return true; + } + return PalaPermissions.has(source, player, "pala.admin"); + } + + private static int reload(CommandSourceStack source) { + PalaConfig.load(); + source.sendSuccess(() -> Component.literal( + "§6[Pala] §7Config rechargee (" + PalaStorage.get().playerCount() + " joueurs connus)."), + false); + return Command.SINGLE_SUCCESS; + } + + private static int info(CommandSourceStack source) { + source.sendSuccess(() -> Component.literal("§6[Pala] §7Joueurs connus : " + + PalaStorage.get().playerCount()), false); + return Command.SINGLE_SUCCESS; + } + + private static int rank(CommandSourceStack source, ServerPlayer target, String rank) { + if (!PalaConfig.get().rankNodes.containsKey(rank)) { + source.sendFailure(Component.literal("§cRang inconnu : " + rank)); + return 0; + } + PalaPermissions.setRank(target, rank); + source.sendSuccess(() -> Component.literal("§6[Pala] §7" + target.getScoreboardName() + + " -> rang " + rank + "."), false); + return Command.SINGLE_SUCCESS; + } + + private static int jobs(CommandSourceStack source) { + try { + ServerPlayer player = source.getPlayerOrException(); + StringBuilder lines = new StringBuilder("§6[Metiers]"); + for (String job : PalaJobs.JOBS) { + lines.append("\n§e").append(job).append(" §7niv. §a") + .append(PalaJobs.levelOf(player, job)).append(" §8(") + .append((long) PalaJobs.xpOf(player, job)).append(" xp)"); + } + source.sendSuccess(() -> Component.literal(lines.toString()), false); + return Command.SINGLE_SUCCESS; + } catch (com.mojang.brigadier.exceptions.CommandSyntaxException e) { + return 0; + } + } + + // /nether : deblocage metier mineur niv.3 (wiki recompenses mineur, VERIFIE), OP bypass. + private static int nether(CommandSourceStack source) { + ServerPlayer player = source.getPlayer(); + if (player != null) { + int required = PalaConfig.get().netherMinerLevel; + if (!Commands.LEVEL_ADMINS.check(source.permissions()) + && PalaJobs.levelOf(player, "mineur") < required) { + player.sendSystemMessage(Component.literal("§cNether verrouille : mineur niveau " + + required + " requis (actuel : " + PalaJobs.levelOf(player, "mineur") + ").")); + return 0; + } + } + return teleport(source, Level.NETHER); + } + private static int teleport(CommandSourceStack source, ResourceKey dimension) { try { ServerPlayer player = source.getPlayerOrException(); diff --git a/mods/pala/src/main/java/fr/surviepote/pala/core/PalaConfig.java b/mods/pala/src/main/java/fr/surviepote/pala/core/PalaConfig.java new file mode 100644 index 0000000..8e1fa19 --- /dev/null +++ b/mods/pala/src/main/java/fr/surviepote/pala/core/PalaConfig.java @@ -0,0 +1,124 @@ +package fr.surviepote.pala.core; + +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import net.fabricmc.loader.api.FabricLoader; + +import fr.surviepote.pala.Pala; + +// Config rechargeable du mod (M0). JSON via Gson (fourni par Mojang au runtime). +// +// Choix JSON plutot que YAML en 3 lignes : +// 1. Zero dependance (pas de snakeyaml a embarquer/patcher au build) ; +// 2. Gson est deja au classpath compile (gson-2.14.0.jar) et au runtime Mojang ; +// 3. /pala reload re-parse le fichier sans restart, valeurs par defaut si cles absentes. +// Les valeurs wiki VERIFIEES sont en Maka ; le reste est UNVERIFIED (balance staff, M5). +public final class PalaConfig { + + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + + // XP metier mineur par bloc casse (wiki "Evolution du metier Mineur", VERIFIE). + // Cles = ids de registres (vanilla ou pala:). Map.ofEntries : Map.of limite a 10 paires. + public Map minerXp = new HashMap<>(Map.ofEntries( + Map.entry("minecraft:stone", 0.5), + Map.entry("minecraft:diorite", 3.0), Map.entry("minecraft:andesite", 3.0), + Map.entry("minecraft:coal_ore", 4.0), Map.entry("minecraft:deepslate_coal_ore", 4.0), + Map.entry("minecraft:quartz_ore", 6.0), Map.entry("minecraft:obsidian", 6.0), + Map.entry("minecraft:lapis_ore", 15.0), Map.entry("minecraft:redstone_ore", 15.0), + Map.entry("minecraft:emerald_ore", 50.0), + Map.entry("minecraft:iron_ore", 2.0), Map.entry("minecraft:deepslate_iron_ore", 2.0), + Map.entry("minecraft:gold_ore", 4.0), Map.entry("minecraft:deepslate_gold_ore", 4.0), + Map.entry("minecraft:diamond_ore", 8.0), Map.entry("minecraft:deepslate_diamond_ore", 8.0), + Map.entry("pala:amethyst_ore", 12.0), Map.entry("pala:titane_ore", 16.0), + Map.entry("pala:paladium_ore", 20.0), + Map.entry("pala:paladium_green_ore", 20.0), Map.entry("pala:trixium_ore", 10.0), + Map.entry("pala:findium_ore", 10.0))); + + // Courbe XP : cout du niveau n. UNVERIFIED (formule placeholder, a caler M5). + public double xpBase = 100.0; + public double xpExponent = 1.5; + + // Niveau mineur requis pour /nether (wiki recompenses mineur niv.3, VERIFIE). + public int netherMinerLevel = 3; + + // Cooldowns sticks PvP en secondes. UNVERIFIED (durees balance staff, M5). + public Map stickCooldowns = new HashMap<>(Map.of( + "heal_stick", 60, "speed_stick", 30, "hyper_jump_stick", 30, + "strenght_stick", 120, "stick_of_god", 600)); + + // Rangs -> noeuds de permission (extrait page "par grade", partiel UNVERIFIED). + public Map> rankNodes = new HashMap<>(Map.of( + "default", java.util.List.of("pala.job", "pala.trade", "pala.market"), + "heros", java.util.List.of("pala.*"))); + + private static PalaConfig instance = new PalaConfig(); + + private PalaConfig() { + } + + public static PalaConfig get() { + return instance; + } + + public static Path file() { + return FabricLoader.getInstance().getConfigDir().resolve("pala.json"); + } + + /** Charge (ou cree avec defauts). Retourne true si un fichier existant a ete lu. */ + public static boolean load() { + Path path = file(); + if (!Files.exists(path)) { + save(); + return false; + } + try (Reader reader = Files.newBufferedReader(path)) { + PalaConfig loaded = GSON.fromJson(reader, PalaConfig.class); + if (loaded != null) { + if (loaded.minerXp != null && !loaded.minerXp.isEmpty()) { + instance.minerXp = loaded.minerXp; + } + if (loaded.xpBase > 0) { + instance.xpBase = loaded.xpBase; + } + if (loaded.xpExponent > 0) { + instance.xpExponent = loaded.xpExponent; + } + if (loaded.netherMinerLevel >= 0) { + instance.netherMinerLevel = loaded.netherMinerLevel; + } + if (loaded.stickCooldowns != null && !loaded.stickCooldowns.isEmpty()) { + instance.stickCooldowns = loaded.stickCooldowns; + } + if (loaded.rankNodes != null && !loaded.rankNodes.isEmpty()) { + instance.rankNodes = loaded.rankNodes; + } + } + return true; + } catch (IOException | com.google.gson.JsonParseException e) { + Pala.LOGGER.warn("[SurviePote] Config pala.json illisible, defauts gardes : {}", e.toString()); + return false; + } + } + + public static void save() { + try (Writer writer = Files.newBufferedWriter(file())) { + GSON.toJson(instance, writer); + } catch (IOException e) { + Pala.LOGGER.warn("[SurviePote] Ecriture pala.json impossible : {}", e.toString()); + } + } + + /** Cout XP total pour atteindre le niveau n (n >= 1). */ + public long xpForLevel(int level) { + return (long) (xpBase * Math.pow(level, xpExponent)); + } +} diff --git a/mods/pala/src/main/java/fr/surviepote/pala/core/PalaCore.java b/mods/pala/src/main/java/fr/surviepote/pala/core/PalaCore.java new file mode 100644 index 0000000..115ea09 --- /dev/null +++ b/mods/pala/src/main/java/fr/surviepote/pala/core/PalaCore.java @@ -0,0 +1,37 @@ +package fr.surviepote.pala.core; + +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; + +import fr.surviepote.pala.Pala; + +// Cycle de vie du socle M0 : config + storage au boot, flush periodique, save a l'arret. +// Le compteur modulo 100 sur END_SERVER_TICK = ~5 s (20 ticks/s) : zero I/O si pas dirty. +public final class PalaCore { + + private static int tickCounter = 0; + + private PalaCore() { + } + + public static void register() { + boolean hadFile = PalaConfig.load(); + PalaStorage.get().load(); + Pala.LOGGER.info("[SurviePote] Pala core charge (config {}).", + hadFile ? "existante" : "creee par defaut"); + + ServerTickEvents.END_SERVER_TICK.register(server -> { + tickCounter++; + if (tickCounter >= 100) { + tickCounter = 0; + PalaStorage.get().saveIfDirty(); + } + }); + + ServerLifecycleEvents.SERVER_STOPPING.register(server -> { + PalaStorage.get().save(); + Pala.LOGGER.info("[SurviePote] Pala core sauvegarde ({} joueurs).", + PalaStorage.get().playerCount()); + }); + } +} diff --git a/mods/pala/src/main/java/fr/surviepote/pala/core/PalaJobs.java b/mods/pala/src/main/java/fr/surviepote/pala/core/PalaJobs.java new file mode 100644 index 0000000..f6128fc --- /dev/null +++ b/mods/pala/src/main/java/fr/surviepote/pala/core/PalaJobs.java @@ -0,0 +1,64 @@ +package fr.surviepote.pala.core; + +import java.util.List; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.block.state.BlockState; + +// Metiers : XP et niveaux (M0 = moteur minimal, tables completes en M5). +// Wiki VERIFIE : 4 metiers (mineur, fermier, chasseur, alchimiste), ~100 niveaux, +// table XP mineur par bloc (PalaConfig.minerXp). Courbe et recompenses : UNVERIFIED (M5). +public final class PalaJobs { + + public static final List JOBS = List.of("mineur", "fermier", "chasseur", "alchimiste"); + + private PalaJobs() { + } + + public static int levelOf(ServerPlayer player, String job) { + return PalaStorage.get().data(player.getUUID()).jobs + .getOrDefault(job, new PalaStorage.JobData()).level; + } + + public static double xpOf(ServerPlayer player, String job) { + return PalaStorage.get().data(player.getUUID()).jobs + .getOrDefault(job, new PalaStorage.JobData()).xp; + } + + /** Ajoute de l'XP, monte les niveaux franchis, annonce. Retourne le niveau final. */ + public static int addXp(ServerPlayer player, String job, double amount) { + if (amount <= 0) { + return levelOf(player, job); + } + PalaStorage.JobData data = PalaStorage.get().data(player.getUUID()).jobs + .computeIfAbsent(job, k -> new PalaStorage.JobData()); + data.xp += amount; + PalaConfig config = PalaConfig.get(); + while (data.level < 100 && data.xp >= config.xpForLevel(data.level + 1)) { + data.level++; + player.sendSystemMessage(Component.literal( + "§6[Metier] §e" + job + " §7niveau §a" + data.level + " §7atteint !")); + // TODO:recompenses-m5 : lots par palier (voidstone niv.2, /nether niv.3...). Raison : M5. + } + PalaStorage.get().markDirty(); + return data.level; + } + + /** Hook casse-bloc : XP mineur selon la table config. Appele depuis PalaToolEvents. */ + public static void onBlockBreak(ServerPlayer player, ServerLevel level, BlockPos pos, BlockState state) { + Identifier id = level.registryAccess() + .lookupOrThrow(net.minecraft.core.registries.Registries.BLOCK) + .getKey(state.getBlock()); + if (id == null) { + return; + } + Double xp = PalaConfig.get().minerXp.get(id.toString()); + if (xp != null) { + addXp(player, "mineur", xp); + } + } +} diff --git a/mods/pala/src/main/java/fr/surviepote/pala/core/PalaPermissions.java b/mods/pala/src/main/java/fr/surviepote/pala/core/PalaPermissions.java new file mode 100644 index 0000000..d016a8f --- /dev/null +++ b/mods/pala/src/main/java/fr/surviepote/pala/core/PalaPermissions.java @@ -0,0 +1,47 @@ +package fr.surviepote.pala.core; + +import java.util.List; + +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.server.level.ServerPlayer; + +// Permissions internes (M0) : rangs + noeuds pala.*. +// +// Choix systeme interne plutot que LuckPerms en 3 lignes : +// 1. Zero dependance : le serveur actuel n'a pas LuckPerms, M0 doit booter tel quel ; +// 2. Les grades boutique se resolvent en 2 rangs + noeuds explicites, suffisant pour M0-M6 ; +// 3. Si LuckPerms est ajoute plus tard, cette classe devient un adaptateur (1 seul point de contact). +// TODO:luckperms : re-evaluer en M7 (CDC §3.8). Raison : reconciliation avec les grades boutique. +public final class PalaPermissions { + + private PalaPermissions() { + } + + public static String rankOf(ServerPlayer player) { + return PalaStorage.get().data(player.getUUID()).rank; + } + + public static void setRank(ServerPlayer player, String rank) { + PalaStorage.PlayerData data = PalaStorage.get().data(player.getUUID()); + data.rank = rank; + PalaStorage.get().markDirty(); + } + + /** OP niveau 2+ (LEVEL_ADMINS) bypass tout ; sinon noeud exact ou wildcard pala.* du rang. + * Prend la source (PermissionSet vanilla 26.3, verifie au javap) + le joueur (rang interne). */ + public static boolean has(CommandSourceStack source, ServerPlayer player, String node) { + if (net.minecraft.commands.Commands.LEVEL_ADMINS.check(source.permissions())) { + return true; + } + List nodes = PalaConfig.get().rankNodes.getOrDefault(rankOf(player), List.of()); + if (nodes.contains(node) || nodes.contains("pala.*")) { + return true; + } + // Wildcard partiel : pala.job.* couvre pala.job.mineur, etc. + int dot = node.lastIndexOf('.'); + if (dot > 0 && nodes.contains(node.substring(0, dot) + ".*")) { + return true; + } + return false; + } +} diff --git a/mods/pala/src/main/java/fr/surviepote/pala/core/PalaStorage.java b/mods/pala/src/main/java/fr/surviepote/pala/core/PalaStorage.java new file mode 100644 index 0000000..cf4a140 --- /dev/null +++ b/mods/pala/src/main/java/fr/surviepote/pala/core/PalaStorage.java @@ -0,0 +1,110 @@ +package fr.surviepote.pala.core; + +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import net.fabricmc.loader.api.FabricLoader; + +import fr.surviepote.pala.Pala; + +// Donnees joueurs persistantes (M0) : jobs XP/niveaux, rang, monnaie. +// +// Choix JSON fichier unique en 3 lignes : +// 1. M0 n'a besoin que de lectures/ecritures simples (pas de jointures) ; +// 2. Flush differe hors tick (dirty + save 5 s) = zero I/O sur le thread tick ; +// 3. SQLite arrive en M7 avec l'economie (listings, historique) — le schema est prevu +// pour migrer tel quel (1 ligne joueur = 1 document JSON aujourd'hui). +// TODO:sqlite : migrer vers pala.db (JDBC) en M7. Raison : requetes market/ELO hors de portee JSON. +public final class PalaStorage { + + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + + public static final class JobData { + public double xp = 0.0; + public int level = 0; + } + + public static final class PlayerData { + public Map jobs = new HashMap<>(); + public String rank = "default"; + public double money = 0.0; + } + + private final Map players = new HashMap<>(); + private boolean dirty = false; + + private static final PalaStorage INSTANCE = new PalaStorage(); + + private PalaStorage() { + } + + public static PalaStorage get() { + return INSTANCE; + } + + public static Path file() { + return FabricLoader.getInstance().getConfigDir().resolve("pala-players.json"); + } + + public PlayerData data(UUID uuid) { + return players.computeIfAbsent(uuid.toString(), k -> new PlayerData()); + } + + public void markDirty() { + dirty = true; + } + + public void load() { + Path path = file(); + if (!Files.exists(path)) { + return; + } + try (Reader reader = Files.newBufferedReader(path)) { + Map raw = GSON.fromJson(reader, Map.class); + if (raw == null) { + return; + } + for (Map.Entry entry : raw.entrySet()) { + PlayerData data = GSON.fromJson(GSON.toJson(entry.getValue()), PlayerData.class); + if (data != null) { + if (data.jobs == null) { + data.jobs = new HashMap<>(); + } + players.put(String.valueOf(entry.getKey()), data); + } + } + } catch (IOException | com.google.gson.JsonParseException e) { + Pala.LOGGER.warn("[SurviePote] pala-players.json illisible, demarrage vide : {}", e.toString()); + } + } + + public void saveIfDirty() { + if (!dirty) { + return; + } + dirty = false; + save(); + } + + public void save() { + try (Writer writer = Files.newBufferedWriter(file())) { + GSON.toJson(players, writer); + } catch (IOException e) { + Pala.LOGGER.warn("[SurviePote] Ecriture pala-players.json impossible : {}", e.toString()); + } + } + + /** Nombre de joueurs connus (debug /pala). */ + public int playerCount() { + return players.size(); + } +} diff --git a/mods/pala/src/main/java/fr/surviepote/pala/events/PalaToolEvents.java b/mods/pala/src/main/java/fr/surviepote/pala/events/PalaToolEvents.java index 86d093a..b638ad3 100644 --- a/mods/pala/src/main/java/fr/surviepote/pala/events/PalaToolEvents.java +++ b/mods/pala/src/main/java/fr/surviepote/pala/events/PalaToolEvents.java @@ -25,6 +25,7 @@ import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents; import fr.surviepote.pala.PalaBlocks; import fr.surviepote.pala.PalaItems; +import fr.surviepote.pala.core.PalaJobs; // Portage des procedures "bloc detruit avec l'outil / par le joueur" MCreator : // - ProcedurePickaxeOfTheGodBlockDestroyedWithTool : compteur "level" en CustomData, @@ -104,6 +105,9 @@ public final class PalaToolEvents { ItemStack hand = sp.getMainHandItem(); Item held = hand.isEmpty() ? null : hand.getItem(); + // --- Metiers : XP mineur (M0) --- + PalaJobs.onBlockBreak(sp, sl, pos, state); + // --- Pioche divine : compteur + evolution --- if (held != null && GOD_PICKAXES.contains(held)) { if (held == PalaItems.PICKAXE_OF_THE_GOD_LEVEL25) { diff --git a/server/mods/pala-0.2.1.jar b/server/mods/pala-0.2.1.jar index 2965f538becdf6e9a769e2ceac1e706f56a63200..55b184b12b5f84dde2531c3535ae32a484b26662 100644 GIT binary patch delta 38110 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