SMPEconomyMod
Crée un mod Minecraft Java Fabric (dernière version stable + Fabric API) recréant un système SMP économique/social complet. Utilise Brigadier (CommandRegistrationCallback) et une persistance JSON par UUID. TÉLÉPORTATION: /home <nom>, /sethome <nom>, /delhome <nom> (limite configurable) ; /tpa, /tpahere <joueur> + /tpaccept /tpdeny /tpacancel /tpauto ; /rtp (téléportation aléatoire sécurisée) ; /afklobby. ÉCONOMIE: /balance, /baltop, /pay <joueur> <montant> ; /shop (GUI achat/ vente rapide), /sell (menu vente), /sellhistory, /worth <objet> ; /ah
Read the full description
<objet> et /ah sell <prix> (hôtel des ventes avec expiration) ; /order <objet> (marché d'ordres entre joueurs) ; /shards et /shardshop (monnaie premium = VIP Coins) ; /bounty, /bounty add <joueur> <montant>. SOCIAL: /friend (add/list/search/followers/following) ; /message (alias /msg /tell /whisper) <joueur> <texte> ; /reply ; /block /unblock /ignore /unignore <joueur> ; /stats <joueur> ; /leaderboard. UTILITAIRE: /settings (GUI préférences), /nightvision (/nv), /phantom, /kill, /ping, /help, /rules, /findplayer (/fp) <joueur>. SCOREBOARD: tableau latéral permanent (API Scoreboard vanilla, Team + ScoreboardObjective) affichant en temps réel: solde d'argent, solde de VIP Coins, grade du joueur. Rafraîchi à la connexion et à chaque changement de solde/grade. GRADES (du plus haut au plus bas): 1. Owner - accès total, gestion complète du serveur 2. Admin - gère joueurs (ban/kick/mute), warps, économie 3. Moderateur - sanctionne le chat (mute/warn), surveille les joueurs 4. Membre - grade par défaut, commandes de base uniquement Implémente: stockage du grade par UUID ; commande /grade <joueur> <Owner|Admin|Moderateur|Membre> réservée aux Owner ; préfixe coloré devant le pseudo dans chat et tab-list (rouge/orange/bleu/gris) ; vérification de permission sur chaque commande sensible ; grade visible sur le scoreboard. STRUCTURE: classe principale (ModInitializer), une classe par commande/ groupe, EconomyManager (argent + VIP Coins), RankManager, ScoreboardManager, dossier data/ pour homes/soldes/amis/AH/grades en JSON, couleurs et ordre des grades dans ranks.json séparé. Fournis fabric.mod.json complet avec dépendances (fabric-api, fabric-loader, yarn mappings).
package eu.codexe.smpeconomymod.data;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonParseException;
import com.google.gson.reflect.TypeToken;
import eu.codexe.smpeconomymod.SMPEconomyMod;
import eu.codexe.smpeconomymod.model.AuctionEntry;
import eu.codexe.smpeconomymod.model.BountyEntry;
import eu.codexe.smpeconomymod.model.HomeData;
import eu.codexe.smpeconomymod.model.PlayerData;
import eu.codexe.smpeconomymod.model.PlayerRelationshipData;
import eu.codexe.smpeconomymod.model.RankDefinition;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.UUID;
public final class DataManager {
private final Gson gson = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();
private final Path root = Path.of("config", SMPEconomyMod.MOD_ID, "data");
private final Path homesFile = root.resolve("homes.json");
private final Path economyFile = root.resolve("economy.json");
private final Path relationshipsFile = root.resolve("relationships.json");
private final Path auctionFile = root.resolve("auctionhouse.json");
private final Path bountyFile = root.resolve("bounties.json");
private final Path ranksFile = root.resolve("ranks.json");
private final Map<UUID, HomeData> homes = new LinkedHashMap<>();
private final Map<UUID, PlayerData> economy = new LinkedHashMap<>();
private final Map<UUID, PlayerRelationshipData> relationships = new LinkedHashMap<>();
private final Map<String, AuctionEntry> auctions = new LinkedHashMap<>();
private final Map<String, BountyEntry> bounties = new LinkedHashMap<>();
private RankDefinition rankDefinition = RankDefinition.defaults();
public void loadAll() {
try {
Files.createDirectories(root);
loadHomes();
loadEconomy();
loadRelationships();
loadAuctions();
loadBounties();
loadRanks();
ensureDefaults();
saveAll();
} catch (IOException e) {
throw new IllegalStateException("Unable to initialize data storage under " + root.toAbsolutePath(), e);
}
}
public void saveAll() {
writeJson(homesFile, homes);
writeJson(economyFile, economy);
writeJson(relationshipsFile, relationships);
writeJson(auctionFile, auctions);