pala M1: worldgen amethyste/titane calibre wiki (size 8, trapezoid 6-10, deep ocean) + /pala orestats

This commit is contained in:
Anaïs Saraiva
2026-10-18 23:44:02 +02:00
parent 86cc852c81
commit cc7a5f7c77
10 changed files with 154 additions and 16 deletions
+16 -8
View File
@@ -32,7 +32,7 @@ n'utilise ni l'un ni l'autre). Conclusion : OCR automatique des images wiki = NO
Decision : les patterns de craft retiennent (1) le texte wiki "Ressources necessaires" quand present, Decision : les patterns de craft retiennent (1) le texte wiki "Ressources necessaires" quand present,
(2) les slots exacts de elements/*.mod.json (90 recettes, donnees machine VERIFIEES, ex §3.1), (2) les slots exacts de elements/*.mod.json (90 recettes, donnees machine VERIFIEES, ex §3.1),
(3) le reste est marque UNVERIFIED et devra etre releve en jeu via JEI (screenshots table de craft). (3) le reste est marque UNVERIFIED et devra etre releve en jeu via JEI (screenshots table de craft).
TODO:OCR-fiable : re-essayer l'OCR uniquement sur images >= 50 Ko ou captures JEI en jeu. Raison : TODO:ocr-fiable : re-essayer l'OCR uniquement sur images >= 50 Ko ou captures JEI en jeu. Raison :
en dessous de ce seuil, hallucination demontree sur 3/3 echantillons. en dessous de ce seuil, hallucination demontree sur 3/3 echantillons.
Reference existante (etat des lieux, PAS copiee) : mods/pala/ : Reference existante (etat des lieux, PAS copiee) : mods/pala/ :
@@ -58,8 +58,8 @@ Convention : [PORTE] = present dans mods/pala/src ou data/ (partiel = logique in
| Famille | Minerai | Lingot/gemme | Bloc | Worldgen wiki (VERIFIE) | Mapping | | Famille | Minerai | Lingot/gemme | Bloc | Worldgen wiki (VERIFIE) | Mapping |
|---|---|---|---|---|---| |---|---|---|---|---|---|
| Amethyste | amethyst_ore [PORTE] | amethyst_ingot [PORTE] | amethyst_ore_block [PORTE] | filons 1-8, couches 6-10 + deep ocean des couche 25 | worldgen PORTE (overworld), couches UNVERIFIED | | Amethyste | amethyst_ore [PORTE] | amethyst_ingot [PORTE] | amethyst_ore_block [PORTE] | filons 1-8, couches 6-10 + deep ocean des couche 25 | M1 : size 8, trapezoid 6-10, placed deep uniform 25-40 (4 biomes deep) |
| Titane | titane_ore [PORTE] | titane_ingot [PORTE] | titane_ore_block [PORTE] | deep ocean + grottes, filons 1-8, couches 6-10 | PORTE (overworld+end). ECART : wiki ne cite pas l'End → verifier | | Titane | titane_ore [PORTE] | titane_ingot [PORTE] | titane_ore_block [PORTE] | deep ocean + grottes, filons 1-8, couches 6-10 | M1 : idem amethyste. ECART : wiki ne cite pas l'End → verifier |
| Paladium | paladium_ore [PORTE] | paladium_ingot [PORTE] | paladium_ore_block [PORTE] | page minerais (texte tronque JS, re-crawl partiel) | PORTE, couches UNVERIFIED | | Paladium | paladium_ore [PORTE] | paladium_ingot [PORTE] | paladium_ore_block [PORTE] | page minerais (texte tronque JS, re-crawl partiel) | PORTE, couches UNVERIFIED |
| Paladium vert | paladium_green_ore [PORTE] | paladium_green_ingot [PORTE] | paladium_green_ore_block [PORTE] | idem | PORTE, obtention (fonderie ?) UNVERIFIED | | Paladium vert | paladium_green_ore [PORTE] | paladium_green_ingot [PORTE] | paladium_green_ore_block [PORTE] | idem | PORTE, obtention (fonderie ?) UNVERIFIED |
| Trixium | trixium_ore [PORTE] | trixium_gem [PORTE] | trixium_ore_block [PORTE] | idem | PORTE | | Trixium | trixium_ore [PORTE] | trixium_gem [PORTE] | trixium_ore_block [PORTE] | idem | PORTE |
@@ -69,8 +69,10 @@ Convention : [PORTE] = present dans mods/pala/src ou data/ (partiel = logique in
Drops/smelting : *_ore_smelting + block<->lingot 9x/1x/9x dans elements (ex AmethystBlockOreRecipe Drops/smelting : *_ore_smelting + block<->lingot 9x/1x/9x dans elements (ex AmethystBlockOreRecipe
shapeless 1 bloc → 9 lingots VERIFIE). Patterns compacts standards : VERIFIE via elements. shapeless 1 bloc → 9 lingots VERIFIE). Patterns compacts standards : VERIFIE via elements.
TODO:worldgen-couches : calibrer chaque placed_feature (count/size/hauteur) sur les donnees wiki TODO:worldgen-couches : RESTE pour paladium/trixium/findium/green (tailles MCreator conservees :
(couches 6-10 + deep ocean). Raison : le portage injecte en overworld sans contrainte de hauteur. 4/8/3/4, hauteurs 18/25/33/18 — non relues en detail wiki) + borne max deep 40 UNVERIFIED
(wiki dit "a partir de la couche 25" sans max ; 25-40 choisi, TrapezoidHeight verifie au unzip).
Lecon M1 VERIFIEE au boot : minecraft:triangle N'EXISTE PAS en 26.3 (crash datapacks) → trapezoid.
### 1.2 Outils et armes ### 1.2 Outils et armes
@@ -450,8 +452,9 @@ avant M4 (TODO:crafts-machines).
- Features wiki couvertes (entree CDC) : ~210 (§1.14). Portage existant : ~120 (assets+registres). - Features wiki couvertes (entree CDC) : ~210 (§1.14). Portage existant : ~120 (assets+registres).
Logique specifiee restant a implementer : ~90. Couverture spec : 100 % des pages FR Java ingestionnees. Logique specifiee restant a implementer : ~90. Couverture spec : 100 % des pages FR Java ingestionnees.
- TODO explicites : 11 nommes (grep 2026-10-18 : ocr-fiable, worldgen-couches, broadsword, - TODO explicites : 12 nommes (grep : ocr-fiable, worldgen-couches, broadsword,
crafts-machines, chervil, commandes-exactes, ghost, luckperms, runclient, mcp-ocular, shebang) crafts-machines, chervil, commandes-exactes, ghost, luckperms, runclient, mcp-ocular, shebang,
java-home)
+ 4 points UNVERIFIED (seuils XP 6-100, durees sticks, valeurs armures wiki vs MCreator, + 4 points UNVERIFIED (seuils XP 6-100, durees sticks, valeurs armures wiki vs MCreator,
patterns machines images). patterns machines images).
- Methode : WAVES (crawl 137 articles → stub JS isoles → re-crawl navigateur → verifie) + ETERNAL CODE - Methode : WAVES (crawl 137 articles → stub JS isoles → re-crawl navigateur → verifie) + ETERNAL CODE
@@ -474,7 +477,7 @@ avant M4 (TODO:crafts-machines).
(biomesoplenty/clumps/glitchcore/patpat, message standard "ignorer hors dev"). (biomesoplenty/clumps/glitchcore/patpat, message standard "ignorer hors dev").
Serveur arrete apres test (port 25565 libere), eula.txt restaure a false, Serveur arrete apres test (port 25565 libere), eula.txt restaure a false,
server.properties/packetfixer.properties restaures (le boot ne change que leurs timestamps). 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 - M0 LIVRE 2026-10-18 23:35 (commit 86cc852, pousse) : package core (PalaConfig JSON rechargeable
22 entrees minerXp wiki, PalaStorage joueurs JSON + flush 5 s, PalaPermissions rangs+noeuds, 22 entrees minerXp wiki, PalaStorage joueurs JSON + flush 5 s, PalaPermissions rangs+noeuds,
PalaJobs moteur XP/niveaux, PalaCore lifecycle), /pala reload|info|rank, /jobs, PalaJobs moteur XP/niveaux, PalaCore lifecycle), /pala reload|info|rank, /jobs,
/nether gate mineur niv.3, hook XP dans PalaToolEvents. VERIFIE : ./gradlew compileJava+build /nether gate mineur niv.3, hook XP dans PalaToolEvents. VERIFIE : ./gradlew compileJava+build
@@ -485,6 +488,11 @@ avant M4 (TODO:crafts-machines).
cd mods/pala && nix-shell <repo>/shell.nix --run "export JAVA_HOME=$(dirname $(dirname cd mods/pala && nix-shell <repo>/shell.nix --run "export JAVA_HOME=$(dirname $(dirname
$(readlink -f $(which java)))); ./gradlew build". TODO:java-home : fixer shell.nix racine $(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). (export JAVA_HOME jdk25) pour ne plus bricoler. Raison : decouvert en testant (3 essais).
- M1 LIVRE 2026-10-18 23:40 : worldgen amethyste/titane calibre wiki (size 8, trapezoid 6-10,
placed deep 25-40 + injection 4 biomes deep ocean), /pala orestats (scan + histo Y).
VERIFIE : build SUCCESSFUL, boot Done (0.345s), config persistee ("config existante"),
0 ERROR/Exception/datapack au log. UNVERIFIED en jeu : /pala orestats (pas de joueur connecte
pendant le test) + distribution reelle sur nouveaux chunks.
- Client/mod : ./gradlew runClient dans mods/pala/ : NON LANCE (session : pas d'affichage ; screenshots - 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. ocular impossibles ici). TODO:runclient : 1 screenshot/feature dans mods/pala/docs/screens/ avant M10.
Raison : environnement headless, a faire sur poste avec X. Raison : environnement headless, a faire sur poste avec X.
@@ -57,6 +57,13 @@ public final class PalaCommands {
.then(Commands.literal("info") .then(Commands.literal("info")
.requires(source -> isAdmin(source)) .requires(source -> isAdmin(source))
.executes(command -> info(command.getSource()))) .executes(command -> info(command.getSource())))
.then(Commands.literal("orestats")
.requires(source -> isAdmin(source))
.then(Commands.argument("rayon",
com.mojang.brigadier.arguments.IntegerArgumentType.integer(8, 32))
.executes(command -> orestats(command.getSource(),
com.mojang.brigadier.arguments.IntegerArgumentType
.getInteger(command, "rayon")))))
.then(Commands.literal("rank") .then(Commands.literal("rank")
.requires(source -> isAdmin(source)) .requires(source -> isAdmin(source))
.then(joueurArg))); .then(joueurArg)));
@@ -87,6 +94,63 @@ public final class PalaCommands {
return Command.SINGLE_SUCCESS; return Command.SINGLE_SUCCESS;
} }
// 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).
private static int orestats(CommandSourceStack source, int rayon) {
ServerPlayer player = source.getPlayer();
if (player == null) {
source.sendFailure(Component.literal("§cCommande joueur uniquement."));
return 0;
}
ServerLevel level = player.level();
BlockPos center = player.blockPosition();
java.util.Map<String, Integer> counts = new java.util.HashMap<>();
java.util.Map<String, int[]> histo = new java.util.HashMap<>();
net.minecraft.world.level.block.Block[] ores = {PalaBlocks.AMETHYST_ORE, PalaBlocks.TITANE_ORE,
PalaBlocks.PALADIUM_ORE, PalaBlocks.PALADIUM_GREEN_ORE, PalaBlocks.TRIXIUM_ORE,
PalaBlocks.FINDIUM_ORE, PalaBlocks.KISAKAY_ORE};
for (int dx = -rayon; dx <= rayon; dx++) {
for (int dy = -rayon; dy <= rayon; dy++) {
for (int dz = -rayon; dz <= rayon; dz++) {
BlockPos pos = center.offset(dx, dy, dz);
net.minecraft.world.level.block.state.BlockState state = level.getBlockState(pos);
for (net.minecraft.world.level.block.Block ore : ores) {
if (state.is(ore)) {
String id = net.minecraft.core.registries.BuiltInRegistries.BLOCK
.getKey(ore).toString();
counts.merge(id, 1, Integer::sum);
if (ore == PalaBlocks.AMETHYST_ORE || ore == PalaBlocks.TITANE_ORE) {
int[] bars = histo.computeIfAbsent(id, k -> new int[8]);
int band = Math.min(7, Math.max(0, (pos.getY() + 64) / 16));
bars[band]++;
}
break;
}
}
}
}
}
StringBuilder out = new StringBuilder("§6[Orestats r=" + rayon + "]");
java.util.List<String> ids = new java.util.ArrayList<>(counts.keySet());
java.util.Collections.sort(ids);
for (String id : ids) {
out.append("\n§e").append(id).append(" §7x§a").append(counts.get(id));
int[] bars = histo.get(id);
if (bars != null) {
out.append(" §8Y[-64..63 par 16]=");
for (int b = 0; b < bars.length; b++) {
out.append(bars[b]).append(b < bars.length - 1 ? "/" : "");
}
}
}
if (ids.isEmpty()) {
out.append("\n§7aucun minerai pala dans la zone.");
}
source.sendSuccess(() -> Component.literal(out.toString()), false);
return Command.SINGLE_SUCCESS;
}
private static int rank(CommandSourceStack source, ServerPlayer target, String rank) { private static int rank(CommandSourceStack source, ServerPlayer target, String rank) {
if (!PalaConfig.get().rankNodes.containsKey(rank)) { if (!PalaConfig.get().rankNodes.containsKey(rank)) {
source.sendFailure(Component.literal("§cRang inconnu : " + rank)); source.sendFailure(Component.literal("§cRang inconnu : " + rank));
@@ -5,6 +5,7 @@ import net.fabricmc.fabric.api.biome.v1.BiomeSelectors;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.resources.Identifier; import net.minecraft.resources.Identifier;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.biome.Biomes;
import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.GenerationStep;
import net.minecraft.world.level.levelgen.placement.PlacedFeature; import net.minecraft.world.level.levelgen.placement.PlacedFeature;
@@ -50,5 +51,16 @@ public final class PalaWorldgen {
BiomeSelectors.foundInOverworld().or(BiomeSelectors.foundInTheEnd()), BiomeSelectors.foundInOverworld().or(BiomeSelectors.foundInTheEnd()),
GenerationStep.Decoration.UNDERGROUND_ORES, key("titane_ore")); GenerationStep.Decoration.UNDERGROUND_ORES, key("titane_ore"));
addOverworld("trixium_ore"); addOverworld("trixium_ore");
// M1 (wiki minerais, VERIFIE) : amethyste + titane des la couche 25 dans les
// fonds marins des biomes deep ocean (les 4 variants). Placed *_deep dedies.
addDeepOcean("amethyst_ore_deep");
addDeepOcean("titane_ore_deep");
}
private static void addDeepOcean(String path) {
BiomeModifications.addFeature(
BiomeSelectors.includeByKey(Biomes.DEEP_OCEAN, Biomes.DEEP_LUKEWARM_OCEAN,
Biomes.DEEP_COLD_OCEAN, Biomes.DEEP_FROZEN_OCEAN),
GenerationStep.Decoration.UNDERGROUND_ORES, key(path));
} }
} }
@@ -1,7 +1,7 @@
{ {
"type": "minecraft:ore", "type": "minecraft:ore",
"discard_chance_on_air_exposure": 0.0, "discard_chance_on_air_exposure": 0.0,
"size": 5, "size": 8,
"targets": [ "targets": [
{ {
"state": "pala:amethyst_ore", "state": "pala:amethyst_ore",
@@ -1,7 +1,7 @@
{ {
"type": "minecraft:ore", "type": "minecraft:ore",
"discard_chance_on_air_exposure": 0.0, "discard_chance_on_air_exposure": 0.0,
"size": 4, "size": 8,
"targets": [ "targets": [
{ {
"state": "pala:titane_ore", "state": "pala:titane_ore",
@@ -11,12 +11,12 @@
{ {
"type": "minecraft:height_range", "type": "minecraft:height_range",
"height": { "height": {
"type": "minecraft:uniform", "type": "minecraft:trapezoid",
"min_inclusive": { "min_inclusive": {
"absolute": 1 "absolute": 6
}, },
"max_inclusive": { "max_inclusive": {
"absolute": 25 "absolute": 10
} }
} }
}, },
@@ -0,0 +1,27 @@
{
"feature": "pala:amethyst_ore",
"placement": [
{
"type": "minecraft:count",
"count": 4
},
{
"type": "minecraft:in_square"
},
{
"type": "minecraft:height_range",
"height": {
"type": "minecraft:uniform",
"min_inclusive": {
"absolute": 25
},
"max_inclusive": {
"absolute": 40
}
}
},
{
"type": "minecraft:biome"
}
]
}
@@ -11,12 +11,12 @@
{ {
"type": "minecraft:height_range", "type": "minecraft:height_range",
"height": { "height": {
"type": "minecraft:uniform", "type": "minecraft:trapezoid",
"min_inclusive": { "min_inclusive": {
"absolute": 1 "absolute": 6
}, },
"max_inclusive": { "max_inclusive": {
"absolute": 19 "absolute": 10
} }
} }
}, },
@@ -0,0 +1,27 @@
{
"feature": "pala:titane_ore",
"placement": [
{
"type": "minecraft:count",
"count": 4
},
{
"type": "minecraft:in_square"
},
{
"type": "minecraft:height_range",
"height": {
"type": "minecraft:uniform",
"min_inclusive": {
"absolute": 25
},
"max_inclusive": {
"absolute": 40
}
}
},
{
"type": "minecraft:biome"
}
]
}
Binary file not shown.