diff --git a/PALAMOD_CDC.md b/PALAMOD_CDC.md index f76e608..5c07d6d 100644 --- a/PALAMOD_CDC.md +++ b/PALAMOD_CDC.md @@ -701,6 +701,11 @@ avant M4 (TODO:crafts-machines). - M-alchi-4 LIVRE 2026-10-19 ~06:45 : bibliotheque mystique (ID 2955, texture legacy, loot self, decorative v1). ECART : nouveaux enchantements en TODO:M-enchants, sans craft. VERIFIE : build SUCCESSFUL, boot Done, 0 erreur. UNVERIFIED en jeu. +- M-enchants-1 LIVRE 2026-10-19 ~06:50 : voleur d'XP (datapack 4 niveaux + hook + afterDamage : 2 %/40, 4 %/50, 7 %/70, 10 %/90 XP vanilla). ECART : table moddee + absente (table vanilla/enclume//enchant). TODO:M-enchants partiel (bottler, + overwhelmed, unclaim, anti-chute infaisable serveur, fake-water sans degats). + VERIFIE : build SUCCESSFUL, boot Done (datapack accepte), 0 erreur. 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 diff --git a/mods/pala/src/main/java/fr/surviepote/pala/events/PalaJobEvents.java b/mods/pala/src/main/java/fr/surviepote/pala/events/PalaJobEvents.java index fd53e7d..64dd0a7 100644 --- a/mods/pala/src/main/java/fr/surviepote/pala/events/PalaJobEvents.java +++ b/mods/pala/src/main/java/fr/surviepote/pala/events/PalaJobEvents.java @@ -42,6 +42,39 @@ public final class PalaJobEvents { // M-alchi-2 (wiki objets alchimiste) : capture d'eclair — foudre sur joueur avec // casque fer/or + fiole vanilla en main = 1 fiole -> lightning potion + 30 XP@1. // Degats conserves (risque de mort fidele au wiki). + // M-enchants-1 (wiki enchants moddes, Hunter) : voleur d'XP — chance de voler + // l'XP vanilla de la victime (niv 1 : 2 %/40, niv 2 : 4 %/50, niv 3 : 7 %/70, + // niv 4 : 10 %/90). ECART : table moddee absente (table vanilla/enclume//enchant). + private static void xpStealer(ServerPlayer attacker, LivingEntity victim) { + net.minecraft.world.item.ItemStack weapon = attacker.getMainHandItem(); + if (weapon.isEmpty()) { + return; + } + net.minecraft.core.Holder holder = + attacker.level().registryAccess() + .lookupOrThrow(net.minecraft.core.registries.Registries.ENCHANTMENT) + .getOrThrow(net.minecraft.resources.ResourceKey.create( + net.minecraft.core.registries.Registries.ENCHANTMENT, + net.minecraft.resources.Identifier.fromNamespaceAndPath( + "pala", "xp_stealer"))); + int level = net.minecraft.world.item.enchantment.EnchantmentHelper + .getItemEnchantmentLevel(holder, weapon); + if (level < 1 || level > 4) { + return; + } + int[] chances = {0, 2, 4, 7, 10}; + int[] amounts = {0, 40, 50, 70, 90}; + if (Math.random() * 100.0 >= chances[level]) { + return; + } + int take = amounts[level]; + if (victim instanceof ServerPlayer target) { + take = Math.min(take, target.totalExperience); + target.giveExperiencePoints(-take); + } + attacker.giveExperiencePoints(take); + } + private static void afterDamage(LivingEntity entity, DamageSource source, float dealt, float taken, boolean blocked) { Entity killer = source.getEntity(); @@ -55,6 +88,10 @@ public final class PalaJobEvents { net.minecraft.sounds.SoundEvents.CHICKEN_EGG, net.minecraft.sounds.SoundSource.PLAYERS, 1.0F, 1.0F); } + // M-enchants-1 : vol d'XP a chaque coup porte par un joueur. + if (killer instanceof ServerPlayer attacker) { + xpStealer(attacker, entity); + } if (entity instanceof ServerPlayer victim && source.is(net.minecraft.world.damagesource.DamageTypes.LIGHTNING_BOLT)) { net.minecraft.world.item.ItemStack head = 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 e2a1067..8595163 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 @@ -4,6 +4,7 @@ "item.pala.amethyst_mixed_coal": "Amethyst Mixed Coal", "item.pala.amethyst_stick": "Amethyst Stick", "item.pala.compressed_amethyst": "Compressed Amethyst", + "enchantment.pala.xp_stealer": "Voleur d'XP", "block.pala.mystical_bookshelf": "Bibliotheque mystique", "block.pala.cauldron_block": "Bloc du chaudron", "block.pala.cauldron_core": "Coeur du chaudron", diff --git a/mods/pala/src/main/resources/data/pala/enchantment/xp_stealer.json b/mods/pala/src/main/resources/data/pala/enchantment/xp_stealer.json new file mode 100644 index 0000000..0bbd2c4 --- /dev/null +++ b/mods/pala/src/main/resources/data/pala/enchantment/xp_stealer.json @@ -0,0 +1,23 @@ +{ + "anvil_cost": 4, + "description": { + "translate": "enchantment.pala.xp_stealer" + }, + "effects": { + }, + "max_cost": { + "base": 40, + "per_level_above_first": 10 + }, + "max_level": 4, + "min_cost": { + "base": 20, + "per_level_above_first": 10 + }, + "primary_items": "#minecraft:enchantable/sharp_weapon", + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/sharp_weapon", + "weight": 2 +} \ No newline at end of file diff --git a/server/mods/pala-0.2.1.jar b/server/mods/pala-0.2.1.jar index 08edb13..32d9fc1 100644 Binary files a/server/mods/pala-0.2.1.jar and b/server/mods/pala-0.2.1.jar differ