diff --git a/PALAMOD_CDC.md b/PALAMOD_CDC.md index 4aa359d..a1b1ba1 100644 --- a/PALAMOD_CDC.md +++ b/PALAMOD_CDC.md @@ -591,6 +591,11 @@ avant M4 (TODO:crafts-machines). vert = +50 000 XP fermier, rainbow = +50 000 aux 4 metiers (wiki VERIFIE). Autres couleurs = mapping non publie (TODO:mapping-bonbons, sans effet). VERIFIE : build SUCCESSFUL, boot Done, 0 erreur, lang 228 cles. UNVERIFIED en jeu. +- M-palaforge LIVRE 2026-10-19 ~03:55 : bloc + BE partagee (3e mode) + gate mineur 14 + + table fonte wiki §3.2 (31 items, ratio floor usure) + fuels bois (+buche/planches/baton, + lave exclue : seau non rendu) + craft (1 findium + 4 furnaces + 4 briques, positions + UNVERIFIED) + assets/lang 231. ECART : green non fondu (pas de colonne wiki). VERIFIE : + build SUCCESSFUL, boot Done, 0 erreur. UNVERIFIED en jeu. - M-afk LIVRE 2026-10-19 ~03:50 : kick AFK (wiki reglement/grades) : inactivite pos+rot controlee chaque seconde, limite afkKickMinutes (defaut 10), bypass pala.afk.bypass. Lecon : authlib absent du compileClasspath (getGameProfile inutilisable) -> PermissionSet diff --git a/mods/pala/src/main/java/fr/surviepote/pala/PalaBlockEntities.java b/mods/pala/src/main/java/fr/surviepote/pala/PalaBlockEntities.java index 39cd717..c28879d 100644 --- a/mods/pala/src/main/java/fr/surviepote/pala/PalaBlockEntities.java +++ b/mods/pala/src/main/java/fr/surviepote/pala/PalaBlockEntities.java @@ -21,7 +21,8 @@ public final class PalaBlockEntities { MACHINE = Registry.register(BuiltInRegistries.BLOCK_ENTITY_TYPE, Identifier.fromNamespaceAndPath("pala", "machine"), new BlockEntityType<>(PalaMachineBlockEntity::new, - Set.of(PalaBlocks.PALADIUM_CRUSHER, PalaBlocks.PALADIUM_FURNACE))); + Set.of(PalaBlocks.PALADIUM_CRUSHER, PalaBlocks.PALADIUM_FURNACE, + PalaBlocks.PALAFORGE))); GRINDER = Registry.register(BuiltInRegistries.BLOCK_ENTITY_TYPE, Identifier.fromNamespaceAndPath("pala", "grinder"), new BlockEntityType<>(PalaGrinderBlockEntity::new, diff --git a/mods/pala/src/main/java/fr/surviepote/pala/PalaBlocks.java b/mods/pala/src/main/java/fr/surviepote/pala/PalaBlocks.java index 014587d..a91893e 100644 --- a/mods/pala/src/main/java/fr/surviepote/pala/PalaBlocks.java +++ b/mods/pala/src/main/java/fr/surviepote/pala/PalaBlocks.java @@ -65,6 +65,9 @@ public final class PalaBlocks { public static final Block ORANGE_BLUE_STAGE4 = register("orange_blue_stage4", new Block(BlockBehaviour.Properties.of().setId(blockId("orange_blue_stage4")).strength(0.0F, 0.0F).sound(SoundType.CROP).noCollision().instabreak())); public static final Block PALADIUM_CRUSHER = register("paladium_crusher", new PalaMachineBlock(BlockBehaviour.Properties.of().setId(blockId("paladium_crusher")))); public static final Block PALADIUM_FURNACE = register("paladium_furnace", new PalaMachineBlock(BlockBehaviour.Properties.of().setId(blockId("paladium_furnace")))); + // M-palaforge (wiki Palaforge) : recyclage outils/armures -> lingots selon usure. + // Gate mineur 14, table wiki §3.2, tick dans la BE partagee. + public static final Block PALAFORGE = register("palaforge", new PalaMachineBlock(BlockBehaviour.Properties.of().setId(blockId("palaforge")))); public static final Block PALADIUM_GREEN_ORE = register("paladium_green_ore", new Block(BlockBehaviour.Properties.of().setId(blockId("paladium_green_ore")).strength(5.5F, 9.0F).sound(SoundType.STONE).requiresCorrectToolForDrops())); public static final Block PALADIUM_GREEN_ORE_BLOCK = register("paladium_green_ore_block", new Block(BlockBehaviour.Properties.of().setId(blockId("paladium_green_ore_block")).strength(5.0F, 10.0F).sound(SoundType.METAL).requiresCorrectToolForDrops())); public static final Block PALADIUM_ORE = register("paladium_ore", new Block(BlockBehaviour.Properties.of().setId(blockId("paladium_ore")).strength(5.0F, 8.0F).sound(SoundType.STONE).requiresCorrectToolForDrops())); diff --git a/mods/pala/src/main/java/fr/surviepote/pala/PalaTabs.java b/mods/pala/src/main/java/fr/surviepote/pala/PalaTabs.java index beb972b..c809f4b 100644 --- a/mods/pala/src/main/java/fr/surviepote/pala/PalaTabs.java +++ b/mods/pala/src/main/java/fr/surviepote/pala/PalaTabs.java @@ -177,6 +177,7 @@ public final class PalaTabs { output.accept(PalaBlocks.FIKUTSI_STAGE3); output.accept(PalaBlocks.FINDIUM_ORE); output.accept(PalaBlocks.FINDIUM_ORE_BLOCK); + output.accept(PalaBlocks.PALAFORGE); output.accept(PalaBlocks.GRINDER_BLOCK); output.accept(PalaBlocks.GRINDER_CASING); output.accept(PalaBlocks.GRINDER_FRAME); 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 index 4eca7f9..c2dc722 100644 --- a/mods/pala/src/main/java/fr/surviepote/pala/core/PalaConfig.java +++ b/mods/pala/src/main/java/fr/surviepote/pala/core/PalaConfig.java @@ -133,7 +133,10 @@ public final class PalaConfig { "pala:trixium_ore", "pala:trixium_gem", "pala:findium_ore", "pala:findium_gem")); public java.util.List furnaceFuels = new java.util.ArrayList<>(java.util.List.of( - "minecraft:coal", "minecraft:charcoal")); + "minecraft:coal", "minecraft:charcoal", + // M-palaforge (wiki : "charbon, lave, bois, etc."). Lave exclue : le seau ne serait + // pas rendu (ECART documente). Bois = buche + planches + baton. + "minecraft:oak_log", "minecraft:oak_planks", "minecraft:stick")); private static PalaConfig instance = new PalaConfig(); diff --git a/mods/pala/src/main/java/fr/surviepote/pala/machine/PalaMachineBlock.java b/mods/pala/src/main/java/fr/surviepote/pala/machine/PalaMachineBlock.java index e9a5e97..50bfaa2 100644 --- a/mods/pala/src/main/java/fr/surviepote/pala/machine/PalaMachineBlock.java +++ b/mods/pala/src/main/java/fr/surviepote/pala/machine/PalaMachineBlock.java @@ -62,6 +62,14 @@ public class PalaMachineBlock extends Block implements EntityBlock { + PalaJobs.levelOf(sp, "fermier") + ").")); return InteractionResult.FAIL; } + // M-palaforge (wiki : "disponible qu'a partir du niveau 14 mineur"). + if (!level.isClientSide() && state.is(PalaBlocks.PALAFORGE) + && player instanceof ServerPlayer sp2 && PalaJobs.levelOf(sp2, "mineur") < 14) { + sp2.sendSystemMessage(Component.literal( + "§cPalaforge verrouillee : mineur niveau 14 requis (actuel : " + + PalaJobs.levelOf(sp2, "mineur") + ").")); + return InteractionResult.FAIL; + } if (!level.isClientSide() && level.getBlockEntity(pos) instanceof MenuProvider provider) { player.openMenu(provider); } diff --git a/mods/pala/src/main/java/fr/surviepote/pala/machine/PalaMachineBlockEntity.java b/mods/pala/src/main/java/fr/surviepote/pala/machine/PalaMachineBlockEntity.java index f714d74..c18cd84 100644 --- a/mods/pala/src/main/java/fr/surviepote/pala/machine/PalaMachineBlockEntity.java +++ b/mods/pala/src/main/java/fr/surviepote/pala/machine/PalaMachineBlockEntity.java @@ -58,9 +58,15 @@ public class PalaMachineBlockEntity extends BlockEntity implements MenuProvider return getBlockState().is(PalaBlocks.PALADIUM_CRUSHER); } + public boolean isPalaforge() { + return getBlockState().is(PalaBlocks.PALAFORGE); + } + public void serverTick() { if (isCrusher()) { crusherTick(); + } else if (isPalaforge()) { + palaforgeTick(); } else { furnaceTick(); } @@ -128,6 +134,130 @@ public class PalaMachineBlockEntity extends BlockEntity implements MenuProvider return result == null ? ItemStack.EMPTY : new ItemStack(result); } + // M-palaforge (wiki §3.2, table VERIFIEE) : outil/armure -> [lingot, max]. + // Hammers/fastswords/broadswords exclus (wiki), green exclu (pas de colonne wiki), + // pelle endium = Ø (exclue). Ratio usure : floor(max * restant/max), ex. 8 x 2/3 = 5. + // UNVERIFIED : le cas limite 0 (item presque casse) donne 0 (rien). + private static final java.util.Map MELT_LINGOT = new java.util.HashMap<>(); + private static final java.util.Map MELT_MAX = new java.util.HashMap<>(); + + static { + putMelt(fr.surviepote.pala.PalaItems.AMETHYST_HELMET, + fr.surviepote.pala.PalaItems.AMETHYST_INGOT, 4); + putMelt(fr.surviepote.pala.PalaItems.AMETHYST_CHESTPLATE, + fr.surviepote.pala.PalaItems.AMETHYST_INGOT, 7); + putMelt(fr.surviepote.pala.PalaItems.AMETHYST_LEGGINGS, + fr.surviepote.pala.PalaItems.AMETHYST_INGOT, 6); + putMelt(fr.surviepote.pala.PalaItems.AMETHYST_BOOTS, + fr.surviepote.pala.PalaItems.AMETHYST_INGOT, 3); + putMelt(fr.surviepote.pala.PalaItems.AMETHYST_SWORD, + fr.surviepote.pala.PalaItems.AMETHYST_INGOT, 2); + putMelt(fr.surviepote.pala.PalaItems.AMETHYST_AXE, + fr.surviepote.pala.PalaItems.AMETHYST_INGOT, 2); + putMelt(fr.surviepote.pala.PalaItems.AMETHYST_SHOVEL, + fr.surviepote.pala.PalaItems.AMETHYST_INGOT, 1); + putMelt(fr.surviepote.pala.PalaItems.AMETHYST_PICKAXE, + fr.surviepote.pala.PalaItems.AMETHYST_INGOT, 2); + putMelt(fr.surviepote.pala.PalaItems.TITANE_HELMET, + fr.surviepote.pala.PalaItems.TITANE_INGOT, 5); + putMelt(fr.surviepote.pala.PalaItems.TITANE_CHESTPLATE, + fr.surviepote.pala.PalaItems.TITANE_INGOT, 8); + putMelt(fr.surviepote.pala.PalaItems.TITANE_LEGGINGS, + fr.surviepote.pala.PalaItems.TITANE_INGOT, 7); + putMelt(fr.surviepote.pala.PalaItems.TITANE_BOOTS, + fr.surviepote.pala.PalaItems.TITANE_INGOT, 4); + putMelt(fr.surviepote.pala.PalaItems.TITANE_SWORD, + fr.surviepote.pala.PalaItems.TITANE_INGOT, 2); + putMelt(fr.surviepote.pala.PalaItems.TITANE_AXE, + fr.surviepote.pala.PalaItems.TITANE_INGOT, 2); + putMelt(fr.surviepote.pala.PalaItems.TITANE_SHOVEL, + fr.surviepote.pala.PalaItems.TITANE_INGOT, 1); + putMelt(fr.surviepote.pala.PalaItems.TITANE_PICKAXE, + fr.surviepote.pala.PalaItems.TITANE_INGOT, 2); + putMelt(fr.surviepote.pala.PalaItems.PALADIUM_HELMET, + fr.surviepote.pala.PalaItems.PALADIUM_INGOT, 4); + putMelt(fr.surviepote.pala.PalaItems.PALADIUM_CHESTPLATE, + fr.surviepote.pala.PalaItems.PALADIUM_INGOT, 7); + putMelt(fr.surviepote.pala.PalaItems.PALADIUM_LEGGINGS, + fr.surviepote.pala.PalaItems.PALADIUM_INGOT, 6); + putMelt(fr.surviepote.pala.PalaItems.PALADIUM_BOOTS, + fr.surviepote.pala.PalaItems.PALADIUM_INGOT, 3); + putMelt(fr.surviepote.pala.PalaItems.PALADIUM_SWORD, + fr.surviepote.pala.PalaItems.PALADIUM_INGOT, 2); + putMelt(fr.surviepote.pala.PalaItems.PALADIUM_AXE, + fr.surviepote.pala.PalaItems.PALADIUM_INGOT, 1); + putMelt(fr.surviepote.pala.PalaItems.PALADIUM_SHOVEL, + fr.surviepote.pala.PalaItems.PALADIUM_INGOT, 1); + putMelt(fr.surviepote.pala.PalaItems.PALADIUM_PICKAXE, + fr.surviepote.pala.PalaItems.PALADIUM_INGOT, 1); + putMelt(fr.surviepote.pala.PalaItems.ENDIUM_HELMET, + fr.surviepote.pala.PalaItems.ENDIUM_INGOT, 4); + putMelt(fr.surviepote.pala.PalaItems.ENDIUM_CHESTPLATE, + fr.surviepote.pala.PalaItems.ENDIUM_INGOT, 7); + putMelt(fr.surviepote.pala.PalaItems.ENDIUM_LEGGINGS, + fr.surviepote.pala.PalaItems.ENDIUM_INGOT, 6); + putMelt(fr.surviepote.pala.PalaItems.ENDIUM_BOOTS, + fr.surviepote.pala.PalaItems.ENDIUM_INGOT, 3); + putMelt(fr.surviepote.pala.PalaItems.ENDIUM_SWORD, + fr.surviepote.pala.PalaItems.ENDIUM_INGOT, 2); + putMelt(fr.surviepote.pala.PalaItems.ENDIUM_AXE, + fr.surviepote.pala.PalaItems.ENDIUM_INGOT, 1); + putMelt(fr.surviepote.pala.PalaItems.ENDIUM_PICKAXE, + fr.surviepote.pala.PalaItems.ENDIUM_INGOT, 1); + } + + private static void putMelt(Item gear, Item lingot, int max) { + MELT_LINGOT.put(gear, lingot); + MELT_MAX.put(gear, max); + } + + private void palaforgeTick() { + ItemStack input = inventory.getItem(0); + ItemStack fuel = inventory.getItem(1); + ItemStack output = inventory.getItem(2); + ItemStack result = meltResult(input); + boolean canCook = !result.isEmpty() && isFurnaceFuel(fuel) + && (output.isEmpty() || (ItemStack.isSameItemSameComponents(output, result) + && output.getCount() + result.getCount() <= output.getMaxStackSize())); + if (canCook) { + progress++; + if (progress >= COOK_TIME_FURNACE) { + progress = 0; + input.shrink(1); + fuel.shrink(1); + if (output.isEmpty()) { + inventory.setItem(2, result.copy()); + } else { + output.grow(result.getCount()); + } + } + setChanged(); + } else if (progress != 0) { + progress = 0; + setChanged(); + } + } + + private static ItemStack meltResult(ItemStack input) { + if (input.isEmpty() || !input.isDamageableItem()) { + return ItemStack.EMPTY; + } + Item lingot = MELT_LINGOT.get(input.getItem()); + Integer max = MELT_MAX.get(input.getItem()); + if (lingot == null || max == null) { + return ItemStack.EMPTY; + } + int maxDmg = input.getMaxDamage(); + if (maxDmg <= 0) { + return ItemStack.EMPTY; + } + int count = (int) Math.floor((double) max * (maxDmg - input.getDamageValue()) / maxDmg); + if (count <= 0) { + return ItemStack.EMPTY; + } + return new ItemStack(lingot, count); + } + private static String itemId(ItemStack stack) { return BuiltInRegistries.ITEM.getKey(stack.getItem()).toString(); } @@ -194,6 +324,9 @@ public class PalaMachineBlockEntity extends BlockEntity implements MenuProvider @Override public Component getDisplayName() { + if (isPalaforge()) { + return Component.translatable("container.pala.palaforge"); + } return Component.translatable(isCrusher() ? "container.pala.paladium_crusher" : "container.pala.paladium_furnace"); } diff --git a/mods/pala/src/main/resources/assets/pala/blockstates/palaforge.json b/mods/pala/src/main/resources/assets/pala/blockstates/palaforge.json new file mode 100644 index 0000000..4ae0086 --- /dev/null +++ b/mods/pala/src/main/resources/assets/pala/blockstates/palaforge.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "pala:block/palaforge" + } + } +} diff --git a/mods/pala/src/main/resources/assets/pala/items/palaforge.json b/mods/pala/src/main/resources/assets/pala/items/palaforge.json new file mode 100644 index 0000000..15cdb94 --- /dev/null +++ b/mods/pala/src/main/resources/assets/pala/items/palaforge.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "pala:item/palaforge" + } +} diff --git a/mods/pala/src/main/resources/assets/pala/lang/en_us.json b/mods/pala/src/main/resources/assets/pala/lang/en_us.json index cc9f323..07bbef0 100644 --- a/mods/pala/src/main/resources/assets/pala/lang/en_us.json +++ b/mods/pala/src/main/resources/assets/pala/lang/en_us.json @@ -226,5 +226,8 @@ "item.pala.candy_pink": "Pink Candy", "item.pala.candy_yellow": "Yellow Candy", "item.pala.candy_rainbow": "Rainbow Candy", - "item.pala.job_candy": "Job Candy" + "item.pala.job_candy": "Job Candy", + "block.pala.palaforge": "Palaforge", + "item.pala.palaforge": "Palaforge", + "container.pala.palaforge": "Palaforge" } diff --git a/mods/pala/src/main/resources/assets/pala/models/block/palaforge.json b/mods/pala/src/main/resources/assets/pala/models/block/palaforge.json new file mode 100644 index 0000000..311c975 --- /dev/null +++ b/mods/pala/src/main/resources/assets/pala/models/block/palaforge.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "pala:block/palaforge_side" + } +} diff --git a/mods/pala/src/main/resources/assets/pala/models/item/palaforge.json b/mods/pala/src/main/resources/assets/pala/models/item/palaforge.json new file mode 100644 index 0000000..af7e180 --- /dev/null +++ b/mods/pala/src/main/resources/assets/pala/models/item/palaforge.json @@ -0,0 +1,3 @@ +{ + "parent": "pala:block/palaforge" +} diff --git a/mods/pala/src/main/resources/assets/pala/textures/block/palaforge_side.png b/mods/pala/src/main/resources/assets/pala/textures/block/palaforge_side.png new file mode 100644 index 0000000..dafe7cc Binary files /dev/null and b/mods/pala/src/main/resources/assets/pala/textures/block/palaforge_side.png differ diff --git a/mods/pala/src/main/resources/data/pala/recipe/palaforgerecipe.json b/mods/pala/src/main/resources/data/pala/recipe/palaforgerecipe.json new file mode 100644 index 0000000..7019594 --- /dev/null +++ b/mods/pala/src/main/resources/data/pala/recipe/palaforgerecipe.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ + "BFB", + "FDF", + "BFB" + ], + "key": { + "B": "minecraft:bricks", + "F": "pala:paladium_furnace", + "D": "pala:findium_gem" + }, + "result": { + "id": "pala:palaforge", + "count": 1 + } +} diff --git a/server/mods/pala-0.2.1.jar b/server/mods/pala-0.2.1.jar index 45105fd..0745096 100644 Binary files a/server/mods/pala-0.2.1.jar and b/server/mods/pala-0.2.1.jar differ