pala M-palaforge: recyclage usure + gate mineur 14 (wiki Palaforge)

This commit is contained in:
Anaïs Saraiva
2026-10-19 03:51:43 +02:00
parent 77fbb485d7
commit 588e516dbe
15 changed files with 200 additions and 3 deletions
+5
View File
@@ -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
@@ -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,
@@ -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()));
@@ -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);
@@ -133,7 +133,10 @@ public final class PalaConfig {
"pala:trixium_ore", "pala:trixium_gem",
"pala:findium_ore", "pala:findium_gem"));
public java.util.List<String> 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();
@@ -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);
}
@@ -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<Item, Item> MELT_LINGOT = new java.util.HashMap<>();
private static final java.util.Map<Item, Integer> 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");
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "pala:block/palaforge"
}
}
}
@@ -0,0 +1,6 @@
{
"model": {
"type": "minecraft:model",
"model": "pala:item/palaforge"
}
}
@@ -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"
}
@@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "pala:block/palaforge_side"
}
}
@@ -0,0 +1,3 @@
{
"parent": "pala:block/palaforge"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -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
}
}
Binary file not shown.