139 lines
5.1 KiB
Java
Executable File
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);
|
|
}
|
|
}
|
|
}
|
|
} |