From 32b44891c8f4217abbf476e3290ac52639cc8616 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 27 Aug 2025 13:11:45 +0200 Subject: [PATCH] feat: add dirt to mud in cauldron; fix: filter not working in 1.21.8; fix: InfinityBucket won't fill cauldron --- .../main/java/de/hessj/environmentex/App.java | 10 +- .../hessj/environmentex/BetterCauldrons.java | 44 +++++++ .../hessj/environmentex/CauldronConcrete.java | 34 ----- .../java/de/hessj/environmentex/Filter.java | 120 +++++++----------- .../environmentex/InfinityWaterBucket.java | 6 +- 5 files changed, 93 insertions(+), 121 deletions(-) create mode 100755 environmentex/src/main/java/de/hessj/environmentex/BetterCauldrons.java delete mode 100755 environmentex/src/main/java/de/hessj/environmentex/CauldronConcrete.java diff --git a/environmentex/src/main/java/de/hessj/environmentex/App.java b/environmentex/src/main/java/de/hessj/environmentex/App.java index f65088a..13cb245 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/App.java +++ b/environmentex/src/main/java/de/hessj/environmentex/App.java @@ -6,9 +6,6 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scoreboard.ScoreboardManager; -import de.hessj.helper.Helper.Type; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextDecoration; import net.md_5.bungee.api.ChatColor; @@ -26,8 +23,6 @@ import org.bukkit.inventory.RecipeChoice.MaterialChoice; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.components.CustomModelDataComponent; import org.bukkit.persistence.PersistentDataType; - -import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -35,9 +30,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.bukkit.scoreboard.Scoreboard; -import java.time.*; -import java.util.Map.Entry; public class App extends JavaPlugin { public static de.hessj.helper.Helper helper = new de.hessj.helper.Helper(); @@ -572,7 +564,7 @@ for (Player p : Bukkit.getOnlinePlayers()) { pM.registerEvents(new MobBurner(), this); pM.registerEvents(new AutoCrafter(), this); pM.registerEvents(new AFKListener(), this); - pM.registerEvents(new CauldronConcrete(), this); + pM.registerEvents(new BetterCauldrons(), this); pM.registerEvents(new InfinityWaterBucket(), this); pM.registerEvents(new ArmoredElytra(), this); pM.registerEvents(new ShulkerPreview(), this); diff --git a/environmentex/src/main/java/de/hessj/environmentex/BetterCauldrons.java b/environmentex/src/main/java/de/hessj/environmentex/BetterCauldrons.java new file mode 100755 index 0000000..87e5cb5 --- /dev/null +++ b/environmentex/src/main/java/de/hessj/environmentex/BetterCauldrons.java @@ -0,0 +1,44 @@ +//GPT'd +package de.hessj.environmentex; + +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Item; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; +import com.google.common.base.Enums; +import io.papermc.paper.event.entity.EntityInsideBlockEvent; + +public class BetterCauldrons implements Listener { + + @EventHandler + public void onPowderDrop(EntityInsideBlockEvent event) { + if (!(event.getEntity() instanceof Item item)) + return; + + Block block = event.getBlock(); + if (block.getType() != Material.WATER_CAULDRON) + return; + + ItemStack stack = item.getItemStack(); + Material type = stack.getType(); + + if (!type.name().endsWith("_CONCRETE_POWDER") && type != Material.DIRT && type != Material.ROOTED_DIRT + && type != Material.COARSE_DIRT) { + return; + } + + if (type == Material.DIRT || type == Material.ROOTED_DIRT || type == Material.COARSE_DIRT) { + item.getWorld().dropItem(item.getLocation(), new ItemStack(Material.MUD, stack.getAmount())); + } else { + String hardenedName = type.name().replace("_POWDER", ""); + Material hardened = Enums.getIfPresent(Material.class, hardenedName).orNull(); + if (hardened == null) + return; + + item.getWorld().dropItem(item.getLocation(), new ItemStack(hardened, stack.getAmount())); + } + item.remove(); + } +} \ No newline at end of file diff --git a/environmentex/src/main/java/de/hessj/environmentex/CauldronConcrete.java b/environmentex/src/main/java/de/hessj/environmentex/CauldronConcrete.java deleted file mode 100755 index 660f3cb..0000000 --- a/environmentex/src/main/java/de/hessj/environmentex/CauldronConcrete.java +++ /dev/null @@ -1,34 +0,0 @@ -//GPT'd -package de.hessj.environmentex; - -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Item; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.inventory.ItemStack; -import com.google.common.base.Enums; -import io.papermc.paper.event.entity.EntityInsideBlockEvent; - -public class CauldronConcrete implements Listener { - - @EventHandler - public void onPowderDrop(EntityInsideBlockEvent event) { - if (!(event.getEntity() instanceof Item item)) return; - - Block block = event.getBlock(); - if (block.getType() != Material.WATER_CAULDRON) return; - - ItemStack stack = item.getItemStack(); - Material type = stack.getType(); - - if (!type.name().endsWith("_CONCRETE_POWDER")) return; - - String hardenedName = type.name().replace("_POWDER", ""); - Material hardened = Enums.getIfPresent(Material.class, hardenedName).orNull(); - if (hardened == null) return; - - item.getWorld().dropItem(item.getLocation(), new ItemStack(hardened, stack.getAmount())); - item.remove(); - } -} \ No newline at end of file diff --git a/environmentex/src/main/java/de/hessj/environmentex/Filter.java b/environmentex/src/main/java/de/hessj/environmentex/Filter.java index 8802f15..db29168 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/Filter.java +++ b/environmentex/src/main/java/de/hessj/environmentex/Filter.java @@ -1,15 +1,13 @@ -//TODO: needs fix! +//GPT'd package de.hessj.environmentex; import java.time.Instant; import java.util.ArrayList; import java.util.List; - import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftItem; -import org.bukkit.entity.Entity; +import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -20,94 +18,72 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BookMeta; import de.hessj.helper.Helper.Type; -import net.kyori.adventure.inventory.Book; import net.kyori.adventure.text.Component; public class Filter implements Listener { - long creationTime = 0; - public de.hessj.helper.Helper helper= new de.hessj.helper.Helper(); + private long creationTime = 0; + private final de.hessj.helper.Helper helper = new de.hessj.helper.Helper(); public void addToBook(Player pl, Material m, String name) { if (creationTime == 0) { - BookMeta bm = (BookMeta) pl.getInventory().getItemInMainHand().getItemMeta(); + ItemStack book = pl.getInventory().getItemInMainHand(); + if (!(book.getItemMeta() instanceof BookMeta bm)) { + return; + } + if (bm.getPageCount() < 100) { + boolean isWritten = false; + List pages = new ArrayList<>(bm.pages()); + Component matchedPage = null; - ItemStack b = pl.getInventory().getItemInMainHand(); - Boolean isWritten = false; - List pages = new ArrayList<>(); - - for (Component p : bm.pages()) { - - String answer = p.toString().substring(p.toString().indexOf("content=\"")); - answer = answer.substring(answer.indexOf("\"")); - answer = answer.substring(1, answer.indexOf("\"", answer.indexOf("\"") + 1)); - - if (answer != "") { - pages.add(p); - } - } - Component testp = null; for (Component p : pages) { - - String answer = p.toString().substring(p.toString().indexOf("content=\"")); - answer = answer.substring(answer.indexOf("\"")); - answer = answer.substring(1, answer.indexOf("\"", answer.indexOf("\"") + 1)); - - if (answer.equals(m.toString())) { + String content = p instanceof net.kyori.adventure.text.TextComponent tc ? tc.content() : ""; + if (content.equalsIgnoreCase(m.toString())) { isWritten = true; - testp = p; + matchedPage = p; break; } - } + if (isWritten) { - - pl - .sendMessage(helper.R3SMessage(Type.INFO, "[ItemFilter] " + name + " wurde aus dem Buch ausgetragen!")); - pages.remove(testp); - + pl.sendMessage(helper.R3SMessage(Type.INFO, "[ItemFilter] " + name + " wurde aus dem Buch ausgetragen!")); + pages.remove(matchedPage); } else { pages.add(Component.text(m.toString())); pl.sendMessage(helper.R3SMessage(Type.INFO, "[ItemFilter] " + name + " wurde in das Buch übertragen!")); } + bm.pages(pages); - b.setItemMeta(bm); + book.setItemMeta(bm); } else { - pl - .sendMessage(helper.R3SMessage(Type.ERROR, "[ItemFilter] Du kannst nur bis zu 100 Items filtern! Entferne ein paar Seiten aus dem Buch!")); + pl.sendMessage(helper.R3SMessage(Type.ERROR, + "[ItemFilter] Du kannst nur bis zu 100 Items filtern! Entferne ein paar Seiten aus dem Buch!")); } + creationTime = Instant.now().getEpochSecond(); - Bukkit.getScheduler().scheduleSyncDelayedTask(App.main, new Runnable() { - public void run() { - creationTime = 0; - return; - } - }, 15); + Bukkit.getScheduler().runTaskLater(App.main, () -> creationTime = 0, 15L); } } @EventHandler public void selectFilter(PlayerInteractEvent e) { if (e.getAction() == Action.LEFT_CLICK_BLOCK) { - if (e.getPlayer().getInventory().getItemInMainHand() != null - && e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.WRITABLE_BOOK) - && e.getPlayer().getInventory().getItemInMainHand().hasItemMeta() - && e.getPlayer().getInventory().getItemInMainHand().getItemMeta().hasDisplayName() && - e.getPlayer().getInventory().getItemInMainHand().getItemMeta().displayName() - .equals(Component.text("Filter"))) { + ItemStack hand = e.getPlayer().getInventory().getItemInMainHand(); + if (hand != null && hand.getType() == Material.WRITABLE_BOOK && hand.hasItemMeta() + && hand.getItemMeta().hasDisplayName() + && Component.text("Filter").equals(hand.getItemMeta().displayName())) { Location loc = e.getClickedBlock().getLocation(); + List nearbyItems = new ArrayList<>(loc.getNearbyEntitiesByType(Item.class, 1, 2, 1)); - if (loc.getNearbyEntitiesByType(CraftItem.class, 1, 2, 1).size() > 1) { - e.getPlayer().sendMessage(helper.R3SMessage(Type.ERROR, "[ItemFilter] Bitte nur ein Item gleichzeitig!")); - } else { - for (Entity en : loc.getNearbyEntitiesByType(CraftItem.class, 1, 2, 1)) { - CraftItem itm = (CraftItem) en; - addToBook(e.getPlayer(), itm.getItemStack().getType(), itm.getItemStack().getType().name()); - break; - } + if (nearbyItems.size() > 1) { + e.getPlayer().sendMessage(helper.R3SMessage(Type.ERROR, + "[ItemFilter] Bitte nur ein Item gleichzeitig!")); + } else if (!nearbyItems.isEmpty()) { + Item itm = nearbyItems.get(0); + addToBook(e.getPlayer(), itm.getItemStack().getType(), itm.getItemStack().getType().name()); } } } @@ -115,33 +91,23 @@ public class Filter implements Listener { @EventHandler public void onPickup(PlayerAttemptPickupItemEvent e) { - BookMeta bm = null; - Book b = null; - for (ItemStack is : e.getPlayer().getInventory().getContents()) { - if (is != null && is.getType().equals(Material.WRITABLE_BOOK)) { - bm = (BookMeta) is.getItemMeta(); - b = bm; + if (is != null && is.getType() == Material.WRITABLE_BOOK) { + if (!(is.getItemMeta() instanceof BookMeta bm)) continue; if (is.hasItemMeta() && is.getItemMeta().hasDisplayName() - && is.getItemMeta().displayName().equals(Component.text("Filter"))) { + && Component.text("Filter").equals(is.getItemMeta().displayName())) { - for (Component p : b.pages()) { - - String answer = p.toString().substring(p.toString().indexOf("content=\"")); - answer = answer.substring(answer.indexOf("\"")); - answer = answer.substring(1, answer.indexOf("\"", answer.indexOf("\"") + 1)); - - if (answer.equals(e.getItem().getItemStack().getType().toString())) { + for (Component p : bm.pages()) { + String content = p instanceof net.kyori.adventure.text.TextComponent tc ? tc.content() : ""; + if (content.equalsIgnoreCase(e.getItem().getItemStack().getType().toString())) { e.setCancelled(true); + break; } - } - } - return; } } } -} +} \ No newline at end of file diff --git a/environmentex/src/main/java/de/hessj/environmentex/InfinityWaterBucket.java b/environmentex/src/main/java/de/hessj/environmentex/InfinityWaterBucket.java index 4b8068c..22dec7e 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/InfinityWaterBucket.java +++ b/environmentex/src/main/java/de/hessj/environmentex/InfinityWaterBucket.java @@ -103,13 +103,17 @@ public class InfinityWaterBucket implements Listener { Player player = event.getPlayer(); - if (player.getWorld().getEnvironment() == Environment.NETHER){ + if (player.getWorld().getEnvironment() == Environment.NETHER) { event.setCancelled(true); return; } if ((App.helper.isInteractable(event.getClickedBlock()) && !player.isSneaking())) { return; } + if (event.getClickedBlock().getType() == Material.CAULDRON + || event.getClickedBlock().getType() == Material.WATER_CAULDRON) { + return; + } event.setCancelled(true); Block clickedBlock = event.getClickedBlock();