From 7f5d95138fedbf2e4444e3b9cc2828fc65cfd773 Mon Sep 17 00:00:00 2001 From: xFier Date: Wed, 28 Feb 2024 15:05:01 +0000 Subject: [PATCH 1/3] Deoxidise as many blocks as the tool in-hand can --- .../hacks/basic/CopperRail.java | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/plugins/simpleadminhacks-paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/CopperRail.java b/plugins/simpleadminhacks-paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/CopperRail.java index 1195f533a..d5561bcff 100644 --- a/plugins/simpleadminhacks-paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/CopperRail.java +++ b/plugins/simpleadminhacks-paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/CopperRail.java @@ -139,23 +139,35 @@ public class CopperRail extends BasicHack { Block copperBlock = block.getRelative(BlockFace.DOWN); Optional previous = WeatheringCopper.getPrevious(((CraftBlock) copperBlock).getNMS()); - if (previous.isEmpty()) { - copperBlock = copperBlock.getRelative(BlockFace.DOWN); + + int damageToApply = 0; + CraftPlayer player = (CraftPlayer) event.getPlayer(); + net.minecraft.world.item.ItemStack handle = ((CraftItemStack) item).handle; + + while (previous.isPresent() && (handle.getMaxDamage() - handle.getDamageValue()) > damageToApply) { + copperBlock.setType(previous.get().getBukkitMaterial()); + damageToApply++; + previous = WeatheringCopper.getPrevious(((CraftBlock) copperBlock).getNMS()); } + copperBlock = copperBlock.getRelative(BlockFace.DOWN); previous = WeatheringCopper.getPrevious(((CraftBlock) copperBlock).getNMS()); - if (previous.isEmpty()) { + + while (previous.isPresent() && (handle.getMaxDamage() - handle.getDamageValue()) > damageToApply) { + copperBlock.setType(previous.get().getBukkitMaterial()); + damageToApply++; + previous = WeatheringCopper.getPrevious(((CraftBlock) copperBlock).getNMS()); + } + + if (damageToApply == 0) { return; } - copperBlock.setType(previous.get().getBukkitMaterial()); - block.getWorld().playSound(block.getLocation(), Sound.ITEM_AXE_SCRAPE, SoundCategory.BLOCKS, 1, 1); block.getWorld().playEffect(block.getLocation(), Effect.OXIDISED_COPPER_SCRAPE, 0); - CraftPlayer player = (CraftPlayer) event.getPlayer(); // TODO: In 1.19 or above, this can be replaced with ItemStack#damage thanks to Paper - ((CraftItemStack) item).handle.hurtAndBreak(1, player.getHandle(), p -> { + handle.hurtAndBreak(damageToApply, player.getHandle(), p -> { p.broadcastBreakEvent(event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); }); From de5c07461343e1f6eada174320e52797928e2960 Mon Sep 17 00:00:00 2001 From: xFier Date: Sun, 3 Mar 2024 17:01:08 +0000 Subject: [PATCH 2/3] Damage the tool during the loop rather than the end --- .../hacks/basic/CopperRail.java | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/plugins/simpleadminhacks-paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/CopperRail.java b/plugins/simpleadminhacks-paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/CopperRail.java index d5561bcff..95cc87e4c 100644 --- a/plugins/simpleadminhacks-paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/CopperRail.java +++ b/plugins/simpleadminhacks-paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/CopperRail.java @@ -140,37 +140,42 @@ public class CopperRail extends BasicHack { Block copperBlock = block.getRelative(BlockFace.DOWN); Optional previous = WeatheringCopper.getPrevious(((CraftBlock) copperBlock).getNMS()); - int damageToApply = 0; + boolean damaged = false; CraftPlayer player = (CraftPlayer) event.getPlayer(); net.minecraft.world.item.ItemStack handle = ((CraftItemStack) item).handle; - while (previous.isPresent() && (handle.getMaxDamage() - handle.getDamageValue()) > damageToApply) { + while (previous.isPresent() && handle.getMaxDamage() > handle.getDamageValue()) { copperBlock.setType(previous.get().getBukkitMaterial()); - damageToApply++; + damaged = true; + + // TODO: In 1.19 or above, this can be replaced with ItemStack#damage thanks to Paper + handle.hurtAndBreak(1, player.getHandle(), p -> { + p.broadcastBreakEvent(event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); + }); previous = WeatheringCopper.getPrevious(((CraftBlock) copperBlock).getNMS()); } copperBlock = copperBlock.getRelative(BlockFace.DOWN); previous = WeatheringCopper.getPrevious(((CraftBlock) copperBlock).getNMS()); - while (previous.isPresent() && (handle.getMaxDamage() - handle.getDamageValue()) > damageToApply) { + while (previous.isPresent() && handle.getMaxDamage() > handle.getDamageValue()) { copperBlock.setType(previous.get().getBukkitMaterial()); - damageToApply++; + damaged = true; + + // TODO: In 1.19 or above, this can be replaced with ItemStack#damage thanks to Paper + handle.hurtAndBreak(1, player.getHandle(), p -> { + p.broadcastBreakEvent(event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); + }); previous = WeatheringCopper.getPrevious(((CraftBlock) copperBlock).getNMS()); } - if (damageToApply == 0) { + if (!damaged) { return; } block.getWorld().playSound(block.getLocation(), Sound.ITEM_AXE_SCRAPE, SoundCategory.BLOCKS, 1, 1); block.getWorld().playEffect(block.getLocation(), Effect.OXIDISED_COPPER_SCRAPE, 0); - // TODO: In 1.19 or above, this can be replaced with ItemStack#damage thanks to Paper - handle.hurtAndBreak(damageToApply, player.getHandle(), p -> { - p.broadcastBreakEvent(event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); - }); - event.setCancelled(true); } From 939e60a5cc799149e89cb0573fc82a92da734d22 Mon Sep 17 00:00:00 2001 From: xFier Date: Sun, 3 Mar 2024 17:20:07 +0000 Subject: [PATCH 3/3] Check if the material is air --- .../minecraft/simpleadminhacks/hacks/basic/CopperRail.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/simpleadminhacks-paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/CopperRail.java b/plugins/simpleadminhacks-paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/CopperRail.java index 95cc87e4c..2ffaee4a7 100644 --- a/plugins/simpleadminhacks-paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/CopperRail.java +++ b/plugins/simpleadminhacks-paper/src/main/java/com/programmerdan/minecraft/simpleadminhacks/hacks/basic/CopperRail.java @@ -11,6 +11,7 @@ import net.minecraft.world.level.block.WeatheringCopper; import net.minecraft.world.level.block.state.BlockState; import org.bukkit.Effect; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.SoundCategory; import org.bukkit.block.Block; @@ -144,7 +145,7 @@ public class CopperRail extends BasicHack { CraftPlayer player = (CraftPlayer) event.getPlayer(); net.minecraft.world.item.ItemStack handle = ((CraftItemStack) item).handle; - while (previous.isPresent() && handle.getMaxDamage() > handle.getDamageValue()) { + while (previous.isPresent() && event.getItem().getType() != Material.AIR) { copperBlock.setType(previous.get().getBukkitMaterial()); damaged = true; @@ -158,7 +159,7 @@ public class CopperRail extends BasicHack { copperBlock = copperBlock.getRelative(BlockFace.DOWN); previous = WeatheringCopper.getPrevious(((CraftBlock) copperBlock).getNMS()); - while (previous.isPresent() && handle.getMaxDamage() > handle.getDamageValue()) { + while (previous.isPresent() && event.getItem().getType() != Material.AIR) { copperBlock.setType(previous.get().getBukkitMaterial()); damaged = true;