Files
MCPlugins/environmentex/src/main/java/de/hessj/environmentex/InfinityWaterBucket.java
Your Name 4bb38cd893
Some checks failed
Gitea Actions Demo / Build-Gradle (push) Failing after 1m46s
fix: infitiy bucket can replace interactive blocks if clicked on block directly next to it
2025-07-31 21:28:19 +02:00

139 lines
5.1 KiB
Java
Executable File

//GPT'd
package de.hessj.environmentex;
import org.bukkit.Material;
import org.bukkit.World.Environment;
import org.bukkit.block.Block;
import org.bukkit.block.data.Levelled;
import org.bukkit.block.data.Waterlogged;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Axolotl;
import org.bukkit.entity.Fish;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.Event.Result;
import org.bukkit.event.block.Action;
import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.event.player.PlayerBucketEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.view.AnvilView;
import org.bukkit.scheduler.BukkitRunnable;
import de.hessj.helper.Helper;
import de.hessj.helper.Helper.Type;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.Style;
import net.kyori.adventure.text.format.TextDecoration;
public class InfinityWaterBucket implements Listener {
private final Helper helper = new Helper(); // Avoid repeated instantiations
@EventHandler(priority = EventPriority.HIGHEST)
public void onAnvilUse(PrepareAnvilEvent event) {
if (!(event.getView().getBottomInventory().getHolder() instanceof Player))
return;
AnvilView anvil = event.getView();
ItemStack slot1 = anvil.getItem(0);
ItemStack slot2 = anvil.getItem(1);
if (slot1 == null || slot2 == null)
return;
if (slot1.getType() == Material.WATER_BUCKET && slot2.getType() == Material.ENCHANTED_BOOK) {
if (!(slot2.getItemMeta() instanceof EnchantmentStorageMeta meta))
return;
if (meta.hasStoredEnchant(Enchantment.INFINITY)) {
ItemStack result = slot1.clone();
ItemMeta resultMeta = result.getItemMeta();
Style style = Style.style().decoration(TextDecoration.ITALIC, false).build();
String renameText = anvil.getRenameText();
if (renameText == null || renameText.isEmpty()) {
resultMeta
.displayName(Component.translatable(slot1.getType().getItemTranslationKey()).style(style));
} else {
resultMeta.displayName(Component.text(renameText).style(style));
}
resultMeta.addEnchant(Enchantment.INFINITY, 1, true);
new BukkitRunnable() {
@Override
public void run() {
result.setItemMeta(resultMeta);
anvil.setRepairCost(2);
anvil.setItem(2, result);
}
}.runTaskLater(App.main, 1L);
}
}
}
@EventHandler
public void onFishPickUp(PlayerBucketEntityEvent event) {
ItemStack item = event.getOriginalBucket();
if (item == null || item.getEnchantments().isEmpty())
return;
if (event.getEntity() instanceof Fish || event.getEntity() instanceof Axolotl) {
event.setCancelled(true);
event.getPlayer().sendMessage(helper.R3SMessage(Type.ERROR, "Du kannst mit diesem Eimer nichts fangen!"));
}
}
@EventHandler
public void onBucketUse(PlayerInteractEvent event) {
if (event.getItem() == null)
return;
ItemStack bucket = event.getItem();
if (bucket.getType() != Material.WATER_BUCKET || bucket.getEnchantments().isEmpty())
return;
if (event.getAction() != Action.RIGHT_CLICK_BLOCK || event.useItemInHand() == Result.DENY)
return;
Player player = event.getPlayer();
if (player.getWorld().getEnvironment() == Environment.NETHER ||
(App.helper.isInteractable(event.getClickedBlock()) && !player.isSneaking())) {
return;
}
event.setCancelled(true);
Block clickedBlock = event.getClickedBlock();
if (clickedBlock == null)
return;
Block targetBlock = clickedBlock.getRelative(event.getBlockFace());
// Waterlog toggle
if (!clickedBlock.isEmpty() && clickedBlock.getBlockData() instanceof Waterlogged waterlogged) {
waterlogged.setWaterlogged(!waterlogged.isWaterlogged());
clickedBlock.setBlockData(waterlogged);
return;
}
// Remove full water source or place new water
if (targetBlock.getType() == Material.WATER && targetBlock.getBlockData() instanceof Levelled levelled) {
if (levelled.getLevel() == 0) {
targetBlock.setType(Material.AIR);
} else {
targetBlock.setType(Material.WATER); // refresh water
}
} else {
// Only place water if the target block is replaceable or air
if (targetBlock.isEmpty() || targetBlock.isPassable()) {
targetBlock.setType(Material.WATER);
}
}
}
}