diff --git a/README.md b/README.md index 54b8faf..a74425e 100755 --- a/README.md +++ b/README.md @@ -16,4 +16,5 @@ TO RELEASE: jukeboxes können mit Redstone gesteuert werden + crafted music TO RELEASE: Squids won't spawn + GLOWSTONE DUST für Rahmen TO RELEASE: MUTE FUNCTION FOR TAGGED MOBS r3load command? -TO RELEASE: SHIFT RIGHT CLICK INV SORT \ No newline at end of file +TO RELEASE: SHIFT RIGHT CLICK INV SORT +TO RELEASE: right click with bell on villager folow \ No newline at end of file diff --git a/environmentex/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/environmentex/.gradle/buildOutputCleanup/buildOutputCleanup.lock index ab34f06..bbd758c 100644 Binary files a/environmentex/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/environmentex/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/environmentex/.gradle/caches/paperweight/taskCache/reobfJar.log b/environmentex/.gradle/caches/paperweight/taskCache/reobfJar.log index 9117595..84325fa 100644 --- a/environmentex/.gradle/caches/paperweight/taskCache/reobfJar.log +++ b/environmentex/.gradle/caches/paperweight/taskCache/reobfJar.log @@ -1,2 +1,2 @@ Command: /opt/homebrew/Cellar/openjdk/23.0.2/libexec/openjdk.jdk/Contents/Home/bin/java -Xmx1G -classpath /Users/janik/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.11.1/6c1f29838864ba8f495855edfc8ef17706fedb5d/tiny-remapper-0.11.1-fat.jar net.fabricmc.tinyremapper.Main /Users/janik/Desktop/MCPlugins/environmentex-1.0-SNAPSHOT.jar /Users/janik/Desktop/MCPlugins/environmentex/build/libs/environmentex-1.0-SNAPSHOT-reobf.jar /Users/janik/Desktop/MCPlugins/environmentex/.gradle/caches/paperweight/taskCache/reobfMappings.tiny mojang spigot /Users/janik/Desktop/MCPlugins/environmentex/.gradle/caches/paperweight/taskCache/mappedServerJar.jar --threads=1 -[INFO] Finished after 1014,68 ms. +[INFO] Finished after 896,39 ms. diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/AFKListener$1.class b/environmentex/build/classes/java/main/de/hessj/environmentex/AFKListener$1.class deleted file mode 100644 index d5138f2..0000000 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/AFKListener$1.class and /dev/null differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/AFKListener.class b/environmentex/build/classes/java/main/de/hessj/environmentex/AFKListener.class index ddad2a0..7379752 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/AFKListener.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/AFKListener.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/App$1.class b/environmentex/build/classes/java/main/de/hessj/environmentex/App$1.class index 64fef0a..3620df2 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/App$1.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/App$1.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/App$2.class b/environmentex/build/classes/java/main/de/hessj/environmentex/App$2.class index 8aee0cf..5b13126 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/App$2.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/App$2.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/App.class b/environmentex/build/classes/java/main/de/hessj/environmentex/App.class index b89285c..48cf7b6 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/App.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/App.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/ArmoredElytra$1.class b/environmentex/build/classes/java/main/de/hessj/environmentex/ArmoredElytra$1.class index 71532dc..e4cb42a 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/ArmoredElytra$1.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/ArmoredElytra$1.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/ArmoredElytra$2.class b/environmentex/build/classes/java/main/de/hessj/environmentex/ArmoredElytra$2.class index 9e3c42e..fbaa58b 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/ArmoredElytra$2.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/ArmoredElytra$2.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/ArmoredElytra$3.class b/environmentex/build/classes/java/main/de/hessj/environmentex/ArmoredElytra$3.class deleted file mode 100644 index 4d00431..0000000 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/ArmoredElytra$3.class and /dev/null differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/ArmoredElytra.class b/environmentex/build/classes/java/main/de/hessj/environmentex/ArmoredElytra.class index 224de98..21ee7df 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/ArmoredElytra.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/ArmoredElytra.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/AutoCrafter$1.class b/environmentex/build/classes/java/main/de/hessj/environmentex/AutoCrafter$1.class index 56eece6..0b28ddd 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/AutoCrafter$1.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/AutoCrafter$1.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/AutoCrafter.class b/environmentex/build/classes/java/main/de/hessj/environmentex/AutoCrafter.class index c914d08..0e156b2 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/AutoCrafter.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/AutoCrafter.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/BetterTotems.class b/environmentex/build/classes/java/main/de/hessj/environmentex/BetterTotems.class index ad6b663..7ae093d 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/BetterTotems.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/BetterTotems.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/CauldronConcrete.class b/environmentex/build/classes/java/main/de/hessj/environmentex/CauldronConcrete.class index 93e8534..33dd100 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/CauldronConcrete.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/CauldronConcrete.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/CustomMusicDiscs$1.class b/environmentex/build/classes/java/main/de/hessj/environmentex/CustomMusicDiscs$1.class index 625779b..a15754f 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/CustomMusicDiscs$1.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/CustomMusicDiscs$1.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/CustomMusicDiscs$Song.class b/environmentex/build/classes/java/main/de/hessj/environmentex/CustomMusicDiscs$Song.class index 739989a..0f02873 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/CustomMusicDiscs$Song.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/CustomMusicDiscs$Song.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/CustomMusicDiscs.class b/environmentex/build/classes/java/main/de/hessj/environmentex/CustomMusicDiscs.class index 50a4577..c94c814 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/CustomMusicDiscs.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/CustomMusicDiscs.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/CustomRecipes.class b/environmentex/build/classes/java/main/de/hessj/environmentex/CustomRecipes.class index 88aa6b1..274d69a 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/CustomRecipes.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/CustomRecipes.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/DoubleDoorListener$1.class b/environmentex/build/classes/java/main/de/hessj/environmentex/DoubleDoorListener$1.class index 4e30bec..bc38997 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/DoubleDoorListener$1.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/DoubleDoorListener$1.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/DoubleDoorListener$2.class b/environmentex/build/classes/java/main/de/hessj/environmentex/DoubleDoorListener$2.class index e9aafbe..c5b5196 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/DoubleDoorListener$2.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/DoubleDoorListener$2.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/DoubleDoorListener.class b/environmentex/build/classes/java/main/de/hessj/environmentex/DoubleDoorListener.class index 3e5e852..c99e943 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/DoubleDoorListener.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/DoubleDoorListener.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/Filter$1.class b/environmentex/build/classes/java/main/de/hessj/environmentex/Filter$1.class index f5097f8..cba3af6 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/Filter$1.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/Filter$1.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/Filter.class b/environmentex/build/classes/java/main/de/hessj/environmentex/Filter.class index e3d98b8..6f2be7a 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/Filter.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/Filter.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/HealthBarListener.class b/environmentex/build/classes/java/main/de/hessj/environmentex/HealthBarListener.class index a24fa5e..21a7b0a 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/HealthBarListener.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/HealthBarListener.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/InfinityWaterBucket$1.class b/environmentex/build/classes/java/main/de/hessj/environmentex/InfinityWaterBucket$1.class index 7457ce7..b5e244b 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/InfinityWaterBucket$1.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/InfinityWaterBucket$1.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/InfinityWaterBucket.class b/environmentex/build/classes/java/main/de/hessj/environmentex/InfinityWaterBucket.class index f9472f2..d592e30 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/InfinityWaterBucket.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/InfinityWaterBucket.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/LoginListener.class b/environmentex/build/classes/java/main/de/hessj/environmentex/LoginListener.class index e434fe5..8b1e18a 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/LoginListener.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/LoginListener.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/MobBurner.class b/environmentex/build/classes/java/main/de/hessj/environmentex/MobBurner.class index a40b831..9953348 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/MobBurner.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/MobBurner.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/VillagerListener$1.class b/environmentex/build/classes/java/main/de/hessj/environmentex/VillagerListener$1.class index 9668139..a4b9429 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/VillagerListener$1.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/VillagerListener$1.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/VillagerListener.class b/environmentex/build/classes/java/main/de/hessj/environmentex/VillagerListener.class index f2d75aa..7c90171 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/VillagerListener.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/VillagerListener.class differ diff --git a/environmentex/build/classes/java/main/de/hessj/environmentex/WorkbenchToGo.class b/environmentex/build/classes/java/main/de/hessj/environmentex/WorkbenchToGo.class index bfdc0c3..8e047ba 100644 Binary files a/environmentex/build/classes/java/main/de/hessj/environmentex/WorkbenchToGo.class and b/environmentex/build/classes/java/main/de/hessj/environmentex/WorkbenchToGo.class differ diff --git a/environmentex/build/libs/environmentex-1.0-SNAPSHOT-reobf.jar b/environmentex/build/libs/environmentex-1.0-SNAPSHOT-reobf.jar index caaab54..94a11fc 100644 Binary files a/environmentex/build/libs/environmentex-1.0-SNAPSHOT-reobf.jar and b/environmentex/build/libs/environmentex-1.0-SNAPSHOT-reobf.jar differ diff --git a/environmentex/build/reports/problems/problems-report.html b/environmentex/build/reports/problems/problems-report.html index f5b6fd8..68e1170 100644 --- a/environmentex/build/reports/problems/problems-report.html +++ b/environmentex/build/reports/problems/problems-report.html @@ -650,7 +650,7 @@ code + .copy-button { diff --git a/environmentex/build/tmp/compileJava/previous-compilation-data.bin b/environmentex/build/tmp/compileJava/previous-compilation-data.bin index 8ba1025..7c35da3 100644 Binary files a/environmentex/build/tmp/compileJava/previous-compilation-data.bin and b/environmentex/build/tmp/compileJava/previous-compilation-data.bin differ diff --git a/environmentex/src/main/java/de/hessj/environmentex/AFKListener.java b/environmentex/src/main/java/de/hessj/environmentex/AFKListener.java index 7474b83..603fd09 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/AFKListener.java +++ b/environmentex/src/main/java/de/hessj/environmentex/AFKListener.java @@ -1,37 +1,59 @@ +//GPT'd package de.hessj.environmentex; -import java.util.HashMap; -import java.util.UUID; +import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.scheduler.BukkitTask; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; import de.hessj.helper.Helper.Type; -import net.kyori.adventure.text.Component; public class AFKListener implements Listener { - public static HashMap timers = new HashMap(); + + private final static Map afkTimers = new HashMap<>(); + + private static final long AFK_DELAY_TICKS = 5 * 60 * 20; // 5 minutes @EventHandler - public void onMove(PlayerMoveEvent e) { - resetTimer(e.getPlayer()); + public void onPlayerMove(PlayerMoveEvent event) { + Player player = event.getPlayer(); + resetAfkTimer(player); } - public void resetTimer(Player p) { - timers.get(p.getUniqueId()).cancel(); - p.playerListName(Component.text(p.getName())); - createAFKTimer(p); + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + UUID uuid = event.getPlayer().getUniqueId(); + BukkitTask task = afkTimers.remove(uuid); + if (task != null) { + task.cancel(); + } } - public static void createAFKTimer(Player p) { - BukkitTask i = Bukkit.getServer().getScheduler().runTaskLater(App.main, new Runnable() { - @Override - public void run() { - p.playerListName(App.helper.R3SMessage(Type.ERROR, "[AFK] " + p.getName())); + public static void resetAfkTimer(Player player) { + UUID uuid = player.getUniqueId(); + + // Cancel old task if it exists + BukkitTask oldTask = afkTimers.remove(uuid); + if (oldTask != null) { + oldTask.cancel(); + } + + // Reset player list name in case they were AFK + player.playerListName(Component.text(player.getName())); + + // Create and store new task + BukkitTask newTask = Bukkit.getScheduler().runTaskLater(App.main, () -> { + if (player.isOnline()) { + player.playerListName(App.helper.R3SMessage(Type.ERROR, "[AFK] " + player.getName())); } - }, (5 * 60 * 20)); - timers.put(p.getUniqueId(), i); + }, AFK_DELAY_TICKS); + + afkTimers.put(uuid, newTask); } -} +} \ No newline at end of file diff --git a/environmentex/src/main/java/de/hessj/environmentex/App.java b/environmentex/src/main/java/de/hessj/environmentex/App.java index 9dce0ef..0859a7a 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/App.java +++ b/environmentex/src/main/java/de/hessj/environmentex/App.java @@ -57,7 +57,6 @@ public class App extends JavaPlugin { public NamespacedKey nskLockedChestRecipe = new NamespacedKey(this, "R3SLockedChestRecipe"); public ItemStack lockedChest; - @Override public void onEnable() { SquidPrevention.removeSquidReceipes(); @@ -76,11 +75,9 @@ public class App extends JavaPlugin { safechestRecipe.setIngredient('L', rc); safechestRecipe.setIngredient('K', Material.TRIPWIRE_HOOK); safechestRecipe.setIngredient('I', Material.IRON_INGOT); - if (getServer().getRecipe(nskLockedChestRecipe) == null) { - App.main.getServer().addRecipe(safechestRecipe); - } - - + if (getServer().getRecipe(nskLockedChestRecipe) == null) { + App.main.getServer().addRecipe(safechestRecipe); + } getServer().recipeIterator().forEachRemaining(recipe -> { if (recipe instanceof ShapelessRecipe) { @@ -100,13 +97,11 @@ public class App extends JavaPlugin { }, 1000 * 20 / 1000, 1000 * 20 / 1000); getLogger().info("Plugin enabled!"); - - - // if(App.main.getServer().getPort() == 25588){ + // if(App.main.getServer().getPort() == 25588){ CustomMusicDiscs cmd = new CustomMusicDiscs(); cmd.createDiscs(App.main); - //} + // } backPack = new ItemStack(Material.BARRIER, 1); ItemMeta im = backPack.getItemMeta(); @@ -329,7 +324,7 @@ public class App extends JavaPlugin { Collection onlinePlayer = Bukkit.getServer().getOnlinePlayers(); for (Player p : onlinePlayer) { hmActionbar.put(p, true); - AFKListener.createAFKTimer(p); + AFKListener.resetAfkTimer(p); } try { @@ -468,6 +463,7 @@ public class App extends JavaPlugin { pM.registerEvents(new BetterHoes(), this); pM.registerEvents(new ChestEx(), this); pM.registerEvents(new Backpacks(), this); + pM.registerEvents(new DeathLoc(), this); getCommand("test").setExecutor(new EnvironmentExCommands()); getCommand("y").setExecutor(new EnvironmentExCommands()); getCommand("n").setExecutor(new EnvironmentExCommands()); @@ -493,4 +489,9 @@ public class App extends JavaPlugin { return true; } + + public static boolean isRaining() { + World world = Bukkit.getServer().getWorlds().get(0); + return world.hasStorm() || world.isThundering(); + } } diff --git a/environmentex/src/main/java/de/hessj/environmentex/ArmoredElytra.java b/environmentex/src/main/java/de/hessj/environmentex/ArmoredElytra.java index 5898094..de46e72 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/ArmoredElytra.java +++ b/environmentex/src/main/java/de/hessj/environmentex/ArmoredElytra.java @@ -1,10 +1,10 @@ +//GPT failed a little package de.hessj.environmentex; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.attribute.Attribute; @@ -14,7 +14,6 @@ import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.inventory.EquipmentSlotGroup; import org.bukkit.inventory.ItemStack; @@ -28,20 +27,6 @@ import net.kyori.adventure.text.format.TextDecoration; public class ArmoredElytra implements Listener { - @EventHandler - public void tes(PlayerDeathEvent e) { - Location deathLoc = e.getPlayer().getLocation(); - - new BukkitRunnable() { - @Override - public void run() { - e.getPlayer().spigot().respawn(); - e.getPlayer().sendMessage("Todes koordinaten: " + deathLoc.getBlockX() + " " + deathLoc.getBlockY() - + " " + deathLoc.getBlockZ()); - } - }.runTaskLater(App.main, 1L); // Run next tick to prevent death screen - } - private final List CHESTPLATES = Arrays.asList("LEATHER_CHESTPLATE", "IRON_CHESTPLATE", "DIAMOND_CHESTPLATE", "NETHERITE_CHESTPLATE", "GOLDEN_CHESTPLATE", "CHAINMAIL_CHESTPLATE"); diff --git a/environmentex/src/main/java/de/hessj/environmentex/AutoCrafter.java b/environmentex/src/main/java/de/hessj/environmentex/AutoCrafter.java index a0225ff..2e609ca 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/AutoCrafter.java +++ b/environmentex/src/main/java/de/hessj/environmentex/AutoCrafter.java @@ -1,11 +1,7 @@ +//GPT'd package de.hessj.environmentex; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.Dispenser; @@ -15,16 +11,48 @@ import org.bukkit.entity.ItemFrame; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockDispenseEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.Recipe; -import org.bukkit.inventory.ShapedRecipe; -import org.bukkit.inventory.ShapelessRecipe; +import org.bukkit.inventory.*; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.Vector; +import java.util.*; public class AutoCrafter implements Listener { + @EventHandler + private void onThrow(BlockDispenseEvent event) { + if (event.getBlock().getType() != Material.DISPENSER) return; + + Dispenser dispenser = (Dispenser) event.getBlock().getState(); + BlockFace facing = ((Directional) dispenser.getBlockData()).getFacing(); + Inventory tempInventory = dispenser.getInventory(); + + Collection frames = event.getBlock().getLocation().getNearbyEntitiesByType(ItemFrame.class, 1.5); + if (frames.isEmpty()) return; + + for (ItemFrame frame : frames) { + ItemStack frameItem = frame.getItem(); + if (frameItem.getType() == Material.AIR) return; + + event.setCancelled(true); + Material outputMaterial = frameItem.getType(); + Recipe recipe = findRecipe(outputMaterial); + if (recipe == null) return; + + Map required = extractIngredients(recipe); + if (required.isEmpty()) return; + + new BukkitRunnable() { + @Override + public void run() { + if (!hasRequiredMaterials(tempInventory, required)) return; + + removeMaterials(tempInventory, required); + dispenseThroughFace(event.getBlock(), new ItemStack(outputMaterial), facing); + } + }.runTaskLater(App.main, 0L); + } + } + private Recipe findRecipe(Material output) { for (Recipe recipe : Bukkit.getServer().getRecipesFor(new ItemStack(output))) { if (recipe.getResult().getType() == output) { @@ -34,110 +62,78 @@ public class AutoCrafter implements Listener { return null; } - @EventHandler - private void onThrow(BlockDispenseEvent event) { - if (event.getBlock().getType() != Material.DISPENSER) { - return; - } + private Map extractIngredients(Recipe recipe) { + Map required = new HashMap<>(); - Dispenser dispenser = (Dispenser) event.getBlock().getState(); - BlockFace facing = ((Directional) dispenser.getBlockData()).getFacing(); - Inventory tempInventory = dispenser.getInventory(); + if (recipe instanceof ShapedRecipe shaped) { + String[] shape = shaped.getShape(); + Map choiceMap = shaped.getChoiceMap(); - Collection frames = event.getBlock().getLocation().getNearbyEntitiesByType(ItemFrame.class, 1.5); - if (frames.toArray().length == 0) - return; - - for (ItemFrame frame : frames) { - if (frame.getItem().getType() == Material.AIR) - return; - - event.setCancelled(true); - String outputItemName = frame.getItem().getType().name(); - Recipe recipe = findRecipe(Material.matchMaterial(outputItemName)); - - if (recipe == null) { - return; - } - - Map required = new HashMap<>(); - - if (recipe instanceof ShapedRecipe) { - ShapedRecipe shapedRecipe = (ShapedRecipe) recipe; - shapedRecipe.getIngredientMap().values().forEach(item -> { - if (item != null) { - required.put(item.getType(), required.getOrDefault(item.getType(), 0) + 1); + for (String row : shape) { + for (char key : row.toCharArray()) { + RecipeChoice choice = choiceMap.get(key); + if (choice instanceof RecipeChoice.MaterialChoice matChoice && !matChoice.getChoices().isEmpty()) { + Material mat = matChoice.getChoices().get(0); // Take first acceptable material + required.put(mat, required.getOrDefault(mat, 0) + 1); } - }); - } else if (recipe instanceof ShapelessRecipe) { - ShapelessRecipe shapelessRecipe = (ShapelessRecipe) recipe; - shapelessRecipe.getIngredientList().forEach(item -> { - required.put(item.getType(), required.getOrDefault(item.getType(), 0) + 1); - }); - } - - new BukkitRunnable() { - @Override - public void run() { - if (!hasRequiredMaterials(tempInventory, required)) { - return; - } - for (Map.Entry entry : required.entrySet()) { - - removeMaterialFromInventory(dispenser.getInventory(), entry.getKey(), entry.getValue()); - } - dispenseThroughFace(event.getBlock(), new ItemStack(Material.matchMaterial(outputItemName)), - facing); } - - }.runTaskLater(App.main, 0L); + } + } else if (recipe instanceof ShapelessRecipe shapeless) { + for (RecipeChoice choice : shapeless.getChoiceList()) { + if (choice instanceof RecipeChoice.MaterialChoice matChoice && !matChoice.getChoices().isEmpty()) { + Material mat = matChoice.getChoices().get(0); + required.put(mat, required.getOrDefault(mat, 0) + 1); + } + } } - } - private void dispenseThroughFace(Block dispenser, ItemStack item, BlockFace facing) { - Location dispenseLocation = dispenser.getRelative(facing).getLocation().add(0.5, 0.5, 0.5); - Item droppedItem = dispenser.getWorld().dropItem(dispenseLocation, item); - Vector velocity = new Vector(facing.getModX(), facing.getModY(), facing.getModZ()).multiply(0.3); - droppedItem.setVelocity(velocity); + return required; } private boolean hasRequiredMaterials(Inventory inventory, Map required) { - for (Map.Entry entry : required.entrySet()) { - int materialCount = countMaterialInInventory(inventory, entry.getKey()); - if (materialCount < entry.getValue()) { + if (countMaterial(inventory, entry.getKey()) < entry.getValue()) { return false; } } return true; } - private int countMaterialInInventory(Inventory inventory, Material material) { - + private int countMaterial(Inventory inventory, Material material) { int count = 0; - for (int i = 0; i < inventory.getSize(); i++) { - if (inventory.getItem(i) != null && inventory.getItem(i).getType() == material) { - count += inventory.getItem(i).getAmount(); + for (ItemStack item : inventory.getContents()) { + if (item != null && item.getType() == material) { + count += item.getAmount(); } } return count; } - private void removeMaterialFromInventory(Inventory inventory, Material material, int amount) { - for (int i = 0; i < inventory.getSize(); i++) { - if (inventory.getItem(i) != null && inventory.getItem(i).getType() == material) { - int currentAmount = inventory.getItem(i).getAmount(); - if (currentAmount <= amount) { - amount -= currentAmount; - inventory.clear(i); - } else { - inventory.getItem(i).setAmount(currentAmount - amount); - break; - } - if (amount <= 0) { - break; + private void removeMaterials(Inventory inventory, Map required) { + for (Map.Entry entry : required.entrySet()) { + Material mat = entry.getKey(); + int amount = entry.getValue(); + + for (int i = 0; i < inventory.getSize(); i++) { + ItemStack item = inventory.getItem(i); + if (item != null && item.getType() == mat) { + int stackAmount = item.getAmount(); + if (stackAmount <= amount) { + amount -= stackAmount; + inventory.clear(i); + } else { + item.setAmount(stackAmount - amount); + break; + } } } } } + + private void dispenseThroughFace(Block dispenserBlock, ItemStack item, BlockFace facing) { + Location loc = dispenserBlock.getRelative(facing).getLocation().add(0.5, 0.5, 0.5); + Item dropped = dispenserBlock.getWorld().dropItem(loc, item); + Vector velocity = new Vector(facing.getModX(), facing.getModY(), facing.getModZ()).multiply(0.3); + dropped.setVelocity(velocity); + } } \ No newline at end of file diff --git a/environmentex/src/main/java/de/hessj/environmentex/Backpacks.java b/environmentex/src/main/java/de/hessj/environmentex/Backpacks.java index 966cd15..3ffba15 100644 --- a/environmentex/src/main/java/de/hessj/environmentex/Backpacks.java +++ b/environmentex/src/main/java/de/hessj/environmentex/Backpacks.java @@ -1,8 +1,8 @@ +//GPT failed package de.hessj.environmentex; import java.io.IOException; import java.util.HashMap; - import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.Sound; @@ -28,7 +28,6 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataType; - import de.hessj.helper.Helper; import net.kyori.adventure.text.Component; diff --git a/environmentex/src/main/java/de/hessj/environmentex/BetterHoes.java b/environmentex/src/main/java/de/hessj/environmentex/BetterHoes.java index acb9f37..fce35cf 100644 --- a/environmentex/src/main/java/de/hessj/environmentex/BetterHoes.java +++ b/environmentex/src/main/java/de/hessj/environmentex/BetterHoes.java @@ -1,3 +1,4 @@ +//GPT'd package de.hessj.environmentex; import org.bukkit.*; @@ -19,7 +20,6 @@ import org.bukkit.inventory.meta.EnchantmentStorageMeta; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.view.AnvilView; import org.bukkit.scheduler.BukkitRunnable; - import io.netty.util.internal.ThreadLocalRandom; import java.util.EnumSet; import java.util.Random; @@ -41,12 +41,10 @@ public class BetterHoes implements Listener { if (!(right.getItemMeta() instanceof EnchantmentStorageMeta bookMeta)) return; if (!bookMeta.hasStoredEnchant(Enchantment.INFINITY)) return; - // Create the new hoe with Infinity ItemStack result = left.clone(); result.addUnsafeEnchantment(Enchantment.INFINITY, 1); event.setResult(result); - // Set repair cost using the view (modern API) new BukkitRunnable() { @Override public void run() { @@ -130,7 +128,6 @@ public class BetterHoes implements Listener { } } - // Also process the center block last to guarantee it runs even with radius 0 tryHarvestCrop(event, center, helper); } @@ -152,10 +149,9 @@ public class BetterHoes implements Listener { block.setType(Material.AIR); helper.damageTool(toolDamageChance(helper.getTool().getType())); - // block.getWorld().dropItemNaturally(block.getLocation(), getCropDrop(cropType)); dropCrop(cropType, block.getLocation(), helper.getTool()); if (hasInfinity(helper.getTool())) { - block.setType(cropType); // reset crop + block.setType(cropType); } } @@ -171,13 +167,13 @@ public class BetterHoes implements Listener { switch (cropType) { case WHEAT -> { world.dropItemNaturally(location, new ItemStack(Material.WHEAT)); - int seedCount = 1 + random.nextInt(3); // vanilla: 0–3 seeds (simplified) + int seedCount = 1 + random.nextInt(3); world.dropItemNaturally(location, new ItemStack(Material.WHEAT_SEEDS, seedCount)); } case CARROTS -> { int base = 1; - int extra = random.nextInt(fortuneLevel + 2); // fortune increases upper bound + int extra = random.nextInt(fortuneLevel + 2); int total = base + extra; world.dropItemNaturally(location, new ItemStack(Material.CARROT, total)); } @@ -188,7 +184,6 @@ public class BetterHoes implements Listener { int total = base + extra; world.dropItemNaturally(location, new ItemStack(Material.POTATO, total)); - // Slightly increase chance of poisonous potato with Fortune double poisonChance = 0.02 + (0.005 * fortuneLevel); if (random.nextDouble() < poisonChance) { world.dropItemNaturally(location, new ItemStack(Material.POISONOUS_POTATO)); @@ -220,7 +215,6 @@ public class BetterHoes implements Listener { return new Random().nextDouble() < chance ? 0 : 1; } - // Helper class for handling tool durability and inventory safely static class PlayerInventoryHelper { private final org.bukkit.entity.Player player; private final ItemStack tool; diff --git a/environmentex/src/main/java/de/hessj/environmentex/BetterTotems.java b/environmentex/src/main/java/de/hessj/environmentex/BetterTotems.java index c498677..ed0125e 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/BetterTotems.java +++ b/environmentex/src/main/java/de/hessj/environmentex/BetterTotems.java @@ -1,181 +1,111 @@ +//GPT'd package de.hessj.environmentex; -import java.io.IOException; -import java.util.Iterator; -import org.bukkit.Bukkit; -import org.bukkit.EntityEffect; -import org.bukkit.Material; -import org.bukkit.block.ShulkerBox; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityDamageEvent.DamageCause; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.inventory.meta.BlockStateMeta; -import org.bukkit.persistence.PersistentDataType; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; import de.hessj.helper.Helper; import net.kyori.adventure.text.Component; +import org.bukkit.*; +import org.bukkit.block.ShulkerBox; +import org.bukkit.entity.Player; +import org.bukkit.event.*; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.inventory.*; +import org.bukkit.inventory.meta.BlockStateMeta; +import org.bukkit.persistence.PersistentDataType; +import org.bukkit.potion.*; +import java.io.IOException; +import java.util.*; public class BetterTotems implements Listener { - ItemStack totem = new ItemStack(Material.TOTEM_OF_UNDYING, 1); - Inventory temp_inv = Bukkit.createInventory(null, 9, Component.translatable("tempBackpack")); - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerDamage(EntityDamageEvent event) throws IOException { - if (event.getEntity() instanceof Player) { - Player player = (Player) event.getEntity(); - double pHealth = player.getHealth(); - double pDamage = event.getFinalDamage(); - if (event.getCause().equals(DamageCause.VOID)) { + private static final ItemStack TOTEM = new ItemStack(Material.TOTEM_OF_UNDYING, 1); + + private record BackpackConfig(String key, String configPath, int size) {} + + private static final List backpacks = List.of( + new BackpackConfig("R3S_kleiner_Rucksack", "backpack.contents.leatherbackpack", 9), + new BackpackConfig("R3S_Rucksack", "backpack.contents.ironbackpack", 18), + new BackpackConfig("R3S_großer_Rucksack", "backpack.contents.goldbackpack", 27), + new BackpackConfig("R3S_riesiger_Rucksack", "backpack.contents.diamondbackpack", 36) + ); + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerDamage(EntityDamageEvent event) throws IOException { + if (!(event.getEntity() instanceof Player player)) return; + if (event.getCause() == DamageCause.VOID) return; + + double remainingHealth = player.getHealth() - event.getFinalDamage(); + if (remainingHealth > 0) return; + + PlayerInventory pInv = player.getInventory(); + + if (pInv.containsAtLeast(TOTEM, 1)) { + pInv.removeItem(TOTEM); + resurrect(event, player); return; - } - if (pHealth - pDamage <= 0) { - PlayerInventory pInv = player.getInventory(); - boolean hasTotem = pInv.containsAtLeast(totem, 1); - Iterator var17; - if (hasTotem) { - pInv.removeItem(totem); - resurrect(event, player); - } else { - var17 = pInv.iterator(); + } - while (var17.hasNext()) { - ItemStack item = (ItemStack) var17.next(); + for (ItemStack item : pInv) { + if (item == null || !item.hasItemMeta()) continue; - if (item != null && item.hasItemMeta() - && item.getItemMeta().getPersistentDataContainer().has(App.main.nsk, PersistentDataType.STRING) - && (item.getItemMeta().getPersistentDataContainer().get(App.main.nsk, PersistentDataType.STRING) - .equals("R3S_kleiner_Rucksack"))) { + for (int i = 0; i < backpacks.size(); i++) { + BackpackConfig config = backpacks.get(i); + NamespacedKey key = switch (i) { + case 0 -> App.main.nsk; + case 1 -> App.main.nsk2; + case 2 -> App.main.nsk3; + case 3 -> App.main.nsk4; + default -> null; + }; + if (key == null) continue; - App.main.log("bin drin + k"); - temp_inv = Bukkit.createInventory(null, 9, Component.translatable("tempBackpack")); - ItemStack[] is; + var pdc = item.getItemMeta().getPersistentDataContainer(); + if (!pdc.has(key, PersistentDataType.STRING)) continue; + if (!Objects.equals(pdc.get(key, PersistentDataType.STRING), config.key())) continue; - is = Helper.itemStackArrayFromBase64( - App.main.getConfig().getString(player.getUniqueId() + ".backpack.contents.leatherbackpack")); - temp_inv.setContents(is); - if (temp_inv.containsAtLeast(totem, 1)) { - temp_inv.removeItem(totem); - resurrect(event, player); - App.main.getConfig().set(player.getUniqueId() + ".backpack.contents.leatherbackpack", - Helper.itemStackArrayToBase64(temp_inv.getContents())); - App.main.saveConfig(); - App.main.reloadConfig(); - break; - } - } + String encoded = App.main.getConfig().getString(player.getUniqueId() + "." + config.configPath()); + if (encoded == null) continue; - if (item != null && item.hasItemMeta() - && item.getItemMeta().getPersistentDataContainer().has(App.main.nsk2, PersistentDataType.STRING) - && (item.getItemMeta().getPersistentDataContainer() - .get(App.main.nsk2, PersistentDataType.STRING) - .equals("R3S_Rucksack"))) { + Inventory inv = Bukkit.createInventory(null, config.size(), Component.translatable("tempBackpack")); + inv.setContents(Helper.itemStackArrayFromBase64(encoded)); - App.main.log("bin drin + r"); - temp_inv = Bukkit.createInventory(null, 18, Component.translatable("tempBackpack")); - ItemStack[] is; - - is = Helper.itemStackArrayFromBase64( - App.main.getConfig().getString(player.getUniqueId() + ".backpack.contents.ironbackpack")); - temp_inv.setContents(is); - if (temp_inv.containsAtLeast(totem, 1)) { - temp_inv.removeItem(totem); - resurrect(event, player); - App.main.getConfig().set(player.getUniqueId() + ".backpack.contents.ironbackpack", - Helper.itemStackArrayToBase64(temp_inv.getContents())); - App.main.saveConfig(); - App.main.reloadConfig(); - break; - } - } - - if (item != null && item.hasItemMeta() - && item.getItemMeta().getPersistentDataContainer().has(App.main.nsk3, PersistentDataType.STRING) - && (item.getItemMeta().getPersistentDataContainer() - .get(App.main.nsk3, PersistentDataType.STRING) - .equals("R3S_großer_Rucksack"))) { - - App.main.log("bin drin + g"); - temp_inv = Bukkit.createInventory(null, 27, Component.translatable("tempBackpack")); - ItemStack[] is; - - is = Helper.itemStackArrayFromBase64( - App.main.getConfig().getString(player.getUniqueId() + ".backpack.contents.goldbackpack")); - temp_inv.setContents(is); - if (temp_inv.containsAtLeast(totem, 1)) { - temp_inv.removeItem(totem); - resurrect(event, player); - App.main.getConfig().set(player.getUniqueId() + ".backpack.contents.goldbackpack", - Helper.itemStackArrayToBase64(temp_inv.getContents())); - App.main.saveConfig(); - App.main.reloadConfig(); - break; - } - } - - if (item != null && item.hasItemMeta() - && item.getItemMeta().getPersistentDataContainer().has(App.main.nsk4, PersistentDataType.STRING) - && (item.getItemMeta().getPersistentDataContainer() - .get(App.main.nsk4, PersistentDataType.STRING) - .equals("R3S_riesiger_Rucksack"))) { - - App.main.log("bin drin + riesig"); - temp_inv = Bukkit.createInventory(null, 36, Component.translatable("tempBackpack")); - ItemStack[] is; - - is = Helper.itemStackArrayFromBase64( - App.main.getConfig().getString(player.getUniqueId() + ".backpack.contents.diamondbackpack")); - temp_inv.setContents(is); - if (temp_inv.containsAtLeast(totem, 1)) { - temp_inv.removeItem(totem); - resurrect(event, player); - App.main.getConfig().set(player.getUniqueId() + ".backpack.contents.diamondbackpack", - Helper.itemStackArrayToBase64(temp_inv.getContents())); - App.main.saveConfig(); - App.main.reloadConfig(); - break; - } - } - if (item != null && (item.getType().toString().endsWith("SHULKER_BOX"))) { - - BlockStateMeta blockMeta = (BlockStateMeta) item.getItemMeta(); - if (blockMeta.getBlockState() instanceof ShulkerBox) { - ShulkerBox box = (ShulkerBox) blockMeta.getBlockState(); - Inventory inv = box.getSnapshotInventory(); - - if (inv.containsAtLeast(totem, 1)) { - inv.removeItem(new ItemStack[] { totem }); - box.update(true, false); - blockMeta.setBlockState(box); - item.setItemMeta(blockMeta); - break; - } - } - - } - } + if (inv.containsAtLeast(TOTEM, 1)) { + inv.removeItem(TOTEM); + resurrect(event, player); + App.main.getConfig().set(player.getUniqueId() + "." + config.configPath(), + Helper.itemStackArrayToBase64(inv.getContents())); + App.main.saveConfig(); + App.main.reloadConfig(); + return; + } } - } + if (item.getType().toString().endsWith("SHULKER_BOX")) { + BlockStateMeta meta = (BlockStateMeta) item.getItemMeta(); + if (!(meta.getBlockState() instanceof ShulkerBox box)) continue; - } - } + Inventory shulkerInv = box.getSnapshotInventory(); + if (shulkerInv.containsAtLeast(TOTEM, 1)) { + shulkerInv.removeItem(TOTEM); + box.update(true, false); + meta.setBlockState(box); + item.setItemMeta(meta); + resurrect(event, player); + return; + } + } + } + } - private void resurrect(EntityDamageEvent event, Player player) { - event.setDamage(0.0D); - player.setHealth(5); - player.addPotionEffect(new PotionEffect(PotionEffectType.ABSORPTION, 5 * 20, 2)); - player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 45 * 20, 2)); - player.addPotionEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE, 40 * 20, 1)); - if (event.getCause().equals(DamageCause.DROWNING)) { - player.addPotionEffect(new PotionEffect(PotionEffectType.WATER_BREATHING, 5 * 20, 1)); - } - player.playEffect(EntityEffect.PROTECTED_FROM_DEATH); - } -} + private void resurrect(EntityDamageEvent event, Player player) { + event.setDamage(0.0D); + player.setHealth(5); + player.addPotionEffect(new PotionEffect(PotionEffectType.ABSORPTION, 100, 2)); + player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 900, 2)); + player.addPotionEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE, 800, 1)); + if (event.getCause() == DamageCause.DROWNING) { + player.addPotionEffect(new PotionEffect(PotionEffectType.WATER_BREATHING, 100, 1)); + } + player.playEffect(EntityEffect.PROTECTED_FROM_DEATH); + } +} \ 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 index fde77af..660f3cb 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/CauldronConcrete.java +++ b/environmentex/src/main/java/de/hessj/environmentex/CauldronConcrete.java @@ -1,3 +1,4 @@ +//GPT'd package de.hessj.environmentex; import org.bukkit.Material; @@ -10,18 +11,24 @@ import com.google.common.base.Enums; import io.papermc.paper.event.entity.EntityInsideBlockEvent; public class CauldronConcrete implements Listener { -@EventHandler - public void onPowderDrop(EntityInsideBlockEvent e){ - Block block = e.getBlock(); - if(block.getType()==Material.WATER_CAULDRON && e.getEntity() instanceof Item){ - Item item = (Item) e.getEntity(); - ItemStack concrete = item.getItemStack(); - if(!concrete.getType().toString().endsWith("_CONCRETE_POWDER")) return; - Material mat = Enums.getIfPresent(Material.class, concrete.getType().toString().replace("_POWDER", "")).orNull(); - if(mat != null){ - item.getWorld().dropItem(item.getLocation(), new ItemStack(mat,concrete.getAmount())); - item.remove(); - } - } + + @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/CustomMusicDiscs.java b/environmentex/src/main/java/de/hessj/environmentex/CustomMusicDiscs.java index fe93970..6b1ab71 100644 --- a/environmentex/src/main/java/de/hessj/environmentex/CustomMusicDiscs.java +++ b/environmentex/src/main/java/de/hessj/environmentex/CustomMusicDiscs.java @@ -1,3 +1,4 @@ +//GPT package de.hessj.environmentex; import java.util.ArrayList; diff --git a/environmentex/src/main/java/de/hessj/environmentex/CustomRecipes.java b/environmentex/src/main/java/de/hessj/environmentex/CustomRecipes.java index 15efc44..c4ac248 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/CustomRecipes.java +++ b/environmentex/src/main/java/de/hessj/environmentex/CustomRecipes.java @@ -1,3 +1,4 @@ +//GPT'd package de.hessj.environmentex; import org.bukkit.Material; @@ -9,22 +10,44 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.ShapelessRecipe; import org.bukkit.inventory.StonecuttingRecipe; + public class CustomRecipes implements Listener { - + @EventHandler public void onEnable(ServerLoadEvent e) { - StonecuttingRecipe scrStoneToCobble = new StonecuttingRecipe(new NamespacedKey(App.main, "R3S_SCR_STONE"), new ItemStack(Material.COBBLESTONE), Material.STONE); - App.main.getServer().addRecipe(scrStoneToCobble); - App.main.recipeKeys.add(scrStoneToCobble.getKey()); - ShapelessRecipe srGlowberryToGlowpowder = new ShapelessRecipe(new NamespacedKey(App.main, "R3S_SLR_GLOWBERRY"), new ItemStack(Material.GLOWSTONE_DUST)); - srGlowberryToGlowpowder.addIngredient(new ItemStack(Material.GLOW_BERRIES)); - App.main.getServer().addRecipe(srGlowberryToGlowpowder); - App.main.recipeKeys.add(srGlowberryToGlowpowder.getKey()); - ShapedRecipe srSoulsoil = new ShapedRecipe(new NamespacedKey(App.main, "R3S_SR_SOULSOIL"), new ItemStack(Material.SOUL_SOIL)); - srSoulsoil.shape("DS ","SD "," "); + StonecuttingRecipe scrStoneToCobble = new StonecuttingRecipe( + new NamespacedKey(App.main, "R3S_SCR_STONE"), + new ItemStack(Material.COBBLESTONE), + Material.STONE); + registerRecipe(scrStoneToCobble); + + ShapelessRecipe srGlowberryToGlowpowder = new ShapelessRecipe( + new NamespacedKey(App.main, "R3S_SLR_GLOWBERRY"), + new ItemStack(Material.GLOWSTONE_DUST)); + srGlowberryToGlowpowder.addIngredient(Material.GLOW_BERRIES); + registerRecipe(srGlowberryToGlowpowder); + + ShapedRecipe srSoulsoil = new ShapedRecipe( + new NamespacedKey(App.main, "R3S_SR_SOULSOIL"), + new ItemStack(Material.SOUL_SOIL)); + srSoulsoil.shape("DS ", "SD ", " "); srSoulsoil.setIngredient('S', Material.SOUL_SAND); srSoulsoil.setIngredient('D', Material.DIRT); - App.main.getServer().addRecipe(srSoulsoil); - App.main.recipeKeys.add(srSoulsoil.getKey()); + registerRecipe(srSoulsoil); } -} + + private void registerRecipe(ShapedRecipe recipe) { + App.main.getServer().addRecipe(recipe); + App.main.recipeKeys.add(recipe.getKey()); + } + + private void registerRecipe(ShapelessRecipe recipe) { + App.main.getServer().addRecipe(recipe); + App.main.recipeKeys.add(recipe.getKey()); + } + + private void registerRecipe(StonecuttingRecipe recipe) { + App.main.getServer().addRecipe(recipe); + App.main.recipeKeys.add(recipe.getKey()); + } +} \ No newline at end of file diff --git a/environmentex/src/main/java/de/hessj/environmentex/DoubleDoorListener.java b/environmentex/src/main/java/de/hessj/environmentex/DoubleDoorListener.java index 6fd2f38..3a51b10 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/DoubleDoorListener.java +++ b/environmentex/src/main/java/de/hessj/environmentex/DoubleDoorListener.java @@ -1,3 +1,4 @@ +//GPT failed package de.hessj.environmentex; import org.bukkit.event.block.BlockRedstoneEvent; diff --git a/environmentex/src/main/java/de/hessj/environmentex/EntityMuter.java b/environmentex/src/main/java/de/hessj/environmentex/EntityMuter.java index 36e4964..2dc512a 100644 --- a/environmentex/src/main/java/de/hessj/environmentex/EntityMuter.java +++ b/environmentex/src/main/java/de/hessj/environmentex/EntityMuter.java @@ -1,3 +1,4 @@ +//GPT not needed package de.hessj.environmentex; import org.bukkit.entity.EntityType; @@ -8,7 +9,8 @@ import org.bukkit.event.entity.EntityTargetEvent; public class EntityMuter implements Listener { @EventHandler public void onEntitySound(EntityTargetEvent event) { - if (event.getEntity().getType() != EntityType.ZOMBIE && event.getTarget() != null && event.getTarget().getType() != EntityType.VILLAGER) { + if (event.getEntity().getType() != EntityType.ZOMBIE && event.getTarget() != null + && event.getTarget().getType() != EntityType.VILLAGER) { return; } if (event.getEntity().customName() != null) { diff --git a/environmentex/src/main/java/de/hessj/environmentex/Filter.java b/environmentex/src/main/java/de/hessj/environmentex/Filter.java index 9edbb63..8802f15 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/Filter.java +++ b/environmentex/src/main/java/de/hessj/environmentex/Filter.java @@ -1,3 +1,4 @@ +//TODO: needs fix! package de.hessj.environmentex; import java.time.Instant; diff --git a/environmentex/src/main/java/de/hessj/environmentex/HealthBarListener.java b/environmentex/src/main/java/de/hessj/environmentex/HealthBarListener.java index 89d1938..dddedc2 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/HealthBarListener.java +++ b/environmentex/src/main/java/de/hessj/environmentex/HealthBarListener.java @@ -1,4 +1,4 @@ - +//GPT failed package de.hessj.environmentex; import java.util.Collection; @@ -34,7 +34,7 @@ public class HealthBarListener implements Listener { public void setBarString(Double remainingHearts, Double fullHearts, Double finaldmg, LivingEntity lentity) { lentity.setCustomNameVisible(true); if (remainingHearts > 0 && remainingHearts < 1) { - lentity.customName(Component.text("Stehend K.O")); + lentity.customName(Component.text("One hit wonder")); } else if (remainingHearts > 0) { lentity.customName( diff --git a/environmentex/src/main/java/de/hessj/environmentex/InfinityWaterBucket.java b/environmentex/src/main/java/de/hessj/environmentex/InfinityWaterBucket.java index 9f8fdfb..ddba20f 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/InfinityWaterBucket.java +++ b/environmentex/src/main/java/de/hessj/environmentex/InfinityWaterBucket.java @@ -1,6 +1,6 @@ +//GPT'd package de.hessj.environmentex; -import java.util.Map; import org.bukkit.Material; import org.bukkit.World.Environment; import org.bukkit.block.Block; @@ -31,103 +31,106 @@ 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 e) { - if (e.getView().getBottomInventory().getHolder() instanceof Player) { - AnvilView av = e.getView(); - ItemStack slot1 = av.getItem(0); - ItemStack slot2 = av.getItem(1); - if (slot1 == null || slot2 == null) + 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 (slot1.getType() == Material.WATER_BUCKET && slot2.getType() == Material.ENCHANTED_BOOK) { - EnchantmentStorageMeta enchMeta = (EnchantmentStorageMeta) slot2.getItemMeta(); - Map enchs = enchMeta.getStoredEnchants(); - if (enchs.containsKey(Enchantment.INFINITY) && enchs.get(Enchantment.INFINITY) > 0) { - ItemStack result = slot1.clone(); - ItemMeta meta = result.getItemMeta(); - meta.displayName(Component.text(av.getRenameText())); - Style st = Style.style().decoration(TextDecoration.ITALIC, false).build(); - if (av.getRenameText().length() == 0) { - meta.displayName(Component.translatable(slot1.getType().getItemTranslationKey()).style(st)); - } else { - meta.displayName(Component.text(av.getRenameText()).style(st)); - } + if (meta.hasStoredEnchant(Enchantment.INFINITY)) { + ItemStack result = slot1.clone(); + ItemMeta resultMeta = result.getItemMeta(); - meta.addEnchant(Enchantment.INFINITY, 1, true); - - new BukkitRunnable() { - @Override - public void run() { - result.setItemMeta(meta); - av.setRepairCost(2); - av.setItem(2, result); - } - }.runTaskLater(App.main, 1); + 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 e) { - var helper = new Helper(); - Player player = e.getPlayer(); - ItemStack item = e.getOriginalBucket(); - if (item == null) + public void onFishPickUp(PlayerBucketEntityEvent event) { + ItemStack item = event.getOriginalBucket(); + if (item == null || item.getEnchantments().isEmpty()) return; - if (item.getEnchantments().size() <= 0) - return; - if (e.getEntity() instanceof Fish || e.getEntity() instanceof Axolotl) { - e.setCancelled(true); - player.sendMessage(helper.R3SMessage(Type.ERROR, "Du kannst mit diesem Eimer nichts fangen!")); + + 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 e) { - if (e.getItem() == null) + public void onBucketUse(PlayerInteractEvent event) { + if (event.getItem() == null) return; - ItemStack itm = e.getItem().clone(); - if (itm.getType() == Material.WATER_BUCKET && itm.getEnchantments().size() > 0 - && e.getAction() == Action.RIGHT_CLICK_BLOCK && e.useItemInHand() != Result.DENY) { - e.setCancelled(true); - Player player = e.getPlayer(); - if (player.getWorld().getEnvironment() == Environment.NETHER - || (App.helper.isInteractable(e.getClickedBlock()) && !e.getPlayer().isSneaking())) - return; - Block block = e.getClickedBlock().getRelative(e.getBlockFace()); + ItemStack bucket = event.getItem(); + if (bucket.getType() != Material.WATER_BUCKET || bucket.getEnchantments().isEmpty()) + return; - if (!e.getClickedBlock().isEmpty() && e.getClickedBlock().getBlockData() instanceof Waterlogged) { + if (event.getAction() != Action.RIGHT_CLICK_BLOCK || event.useItemInHand() == Result.DENY) + return; - Waterlogged waterlogged = (Waterlogged) e.getClickedBlock().getBlockData(); + Player player = event.getPlayer(); - if (!waterlogged.isWaterlogged()) { - waterlogged.setWaterlogged(true); - e.getClickedBlock().setBlockData(waterlogged); - } else { - waterlogged.setWaterlogged(false); - e.getClickedBlock().setBlockData(waterlogged); - } + 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 { - if (block.getType().equals(Material.WATER)) { // aber nicht bei flowing water!! - - Levelled lv = (Levelled) block.getBlockData(); - - if (lv.getLevel() == 0) { - block.setType(Material.AIR, true); - } else { - block.setType(Material.WATER, true); - } - - } else { - block.setType(Material.WATER, true); - } - + targetBlock.setType(Material.WATER); // refresh water } - + } else { + targetBlock.setType(Material.WATER); } } } \ No newline at end of file diff --git a/environmentex/src/main/java/de/hessj/environmentex/LoginListener.java b/environmentex/src/main/java/de/hessj/environmentex/LoginListener.java index 06e6465..44c4df2 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/LoginListener.java +++ b/environmentex/src/main/java/de/hessj/environmentex/LoginListener.java @@ -26,7 +26,7 @@ public class LoginListener implements Listener { App.main.hmActionbar.put(e.getPlayer(), true); e.getPlayer().discoverRecipes(App.main.recipeKeys); - AFKListener.createAFKTimer(e.getPlayer()); + AFKListener.resetAfkTimer(e.getPlayer()); e.joinMessage(null); if (!customConfig.contains("players." + e.getPlayer().getUniqueId())) { diff --git a/environmentex/src/main/java/de/hessj/environmentex/MobBurner.java b/environmentex/src/main/java/de/hessj/environmentex/MobBurner.java index 56909e1..a7bccf5 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/MobBurner.java +++ b/environmentex/src/main/java/de/hessj/environmentex/MobBurner.java @@ -1,39 +1,35 @@ +//GPT'd package de.hessj.environmentex; -import java.util.ArrayList; import java.util.List; - +import java.util.stream.Collectors; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; -import org.bukkit.entity.Entity; +import org.bukkit.entity.Creeper; import org.bukkit.entity.EntityType; import org.bukkit.event.Listener; public class MobBurner implements Listener { - public static Boolean isRaining(){ - World w = Bukkit.getServer().getWorlds().get(0); - if(w.hasStorm() || w.isThundering()){ - return true; - } - return false; - } + private static final int FIRE_DURATION_TICKS = 20; - public static void tryBurning() { - if(App.isDay() && !isRaining()){ - World w = Bukkit.getServer().getWorlds().get(0); - List entities = new ArrayList(w.getLivingEntities()); - for(Entity e: entities){ - if(e.getType().equals(EntityType.CREEPER)){ - Location loc = e.getLocation(); - if (loc.getBlockY() >= w.getHighestBlockYAt(loc)) - { - e.setFireTicks(1000 * 20 / 1000); - } + if (!App.isDay() || App.isRaining()) { + return; + } + + World world = Bukkit.getServer().getWorlds().get(0); + List creepers = world.getLivingEntities().stream() + .filter(e -> e.getType() == EntityType.CREEPER) + .map(e -> (Creeper) e) + .collect(Collectors.toList()); + + for (Creeper creeper : creepers) { + Location loc = creeper.getLocation(); + if (loc.getBlockY() >= world.getHighestBlockYAt(loc)) { + creeper.setFireTicks(FIRE_DURATION_TICKS); } } } -} -} +} \ No newline at end of file diff --git a/environmentex/src/main/java/de/hessj/environmentex/SquidPrevention.java b/environmentex/src/main/java/de/hessj/environmentex/SquidPrevention.java index c352d96..5cef7f3 100644 --- a/environmentex/src/main/java/de/hessj/environmentex/SquidPrevention.java +++ b/environmentex/src/main/java/de/hessj/environmentex/SquidPrevention.java @@ -1,7 +1,7 @@ +//GPT'd package de.hessj.environmentex; import java.util.Iterator; - import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.NamespacedKey; @@ -15,62 +15,53 @@ import org.bukkit.inventory.RecipeChoice; import org.bukkit.inventory.ShapelessRecipe; public class SquidPrevention implements Listener { + + private static final String NAMESPACE = "environmentex"; + @EventHandler public void onSquidSpawn(EntitySpawnEvent event) { - if (event.getEntityType() == EntityType.SQUID || event.getEntityType() == EntityType.GLOW_SQUID) { + EntityType type = event.getEntityType(); + if (type == EntityType.SQUID || type == EntityType.GLOW_SQUID) { event.setCancelled(true); } } public static void removeSquidReceipes() { Iterator it = Bukkit.recipeIterator(); + while (it.hasNext()) { Recipe recipe = it.next(); - if (recipe instanceof ShapelessRecipe sr && - sr.getResult().getType() == Material.WRITABLE_BOOK) { - it.remove(); // remove the default Book and Quill recipe + + if (!(recipe instanceof ShapelessRecipe sr)) { + continue; } - if (recipe instanceof ShapelessRecipe sr && - sr.getResult().getType() == Material.GLOW_ITEM_FRAME) { - it.remove(); // remove the default Book and Quill recipe + + Material resultType = sr.getResult().getType(); + + if (resultType == Material.WRITABLE_BOOK || resultType == Material.GLOW_ITEM_FRAME) { + it.remove(); } } } public static void addCustomSquidRecipes() { ItemStack bookAndQuill = new ItemStack(Material.WRITABLE_BOOK); + ShapelessRecipe bookRecipe = new ShapelessRecipe(new NamespacedKey(NAMESPACE, "custom_book_and_quill"), bookAndQuill); + bookRecipe.addIngredient(Material.BOOK); + bookRecipe.addIngredient(Material.FEATHER); + bookRecipe.addIngredient(Material.BLACK_DYE); + Bukkit.addRecipe(bookRecipe); - ShapelessRecipe customRecipe = new ShapelessRecipe( - new NamespacedKey("environmentex", "custom_book_and_quill"), - bookAndQuill); - - customRecipe.addIngredient(Material.BOOK); - customRecipe.addIngredient(Material.FEATHER); - customRecipe.addIngredient(Material.BLACK_DYE); - Bukkit.addRecipe(customRecipe); - - ItemStack blackdye = new ItemStack(Material.BLACK_DYE); - - ShapelessRecipe blackcustomRecipe = new ShapelessRecipe( - new NamespacedKey("environmentex", "custom_black_dye"), - blackdye); - - // Use RecipeChoice.MaterialChoice for multiple options - RecipeChoice choice = new RecipeChoice.MaterialChoice(Material.COAL, Material.CHARCOAL); - blackcustomRecipe.addIngredient(choice); - - Bukkit.addRecipe(blackcustomRecipe); - - ItemStack glow_frame = new ItemStack(Material.GLOW_ITEM_FRAME); - - ShapelessRecipe glow_framecustomRecipe = new ShapelessRecipe( - new NamespacedKey("environmentex", "custom_glow_frame"), - glow_frame); - - glow_framecustomRecipe.addIngredient(Material.GLOWSTONE_DUST); - glow_framecustomRecipe.addIngredient(Material.ITEM_FRAME); - - Bukkit.addRecipe(glow_framecustomRecipe); + ItemStack blackDye = new ItemStack(Material.BLACK_DYE); + ShapelessRecipe blackDyeRecipe = new ShapelessRecipe(new NamespacedKey(NAMESPACE, "custom_black_dye"), blackDye); + RecipeChoice.MaterialChoice coalChoice = new RecipeChoice.MaterialChoice(Material.COAL, Material.CHARCOAL); + blackDyeRecipe.addIngredient(coalChoice); + Bukkit.addRecipe(blackDyeRecipe); + ItemStack glowFrame = new ItemStack(Material.GLOW_ITEM_FRAME); + ShapelessRecipe glowFrameRecipe = new ShapelessRecipe(new NamespacedKey(NAMESPACE, "custom_glow_frame"), glowFrame); + glowFrameRecipe.addIngredient(Material.GLOWSTONE_DUST); + glowFrameRecipe.addIngredient(Material.ITEM_FRAME); + Bukkit.addRecipe(glowFrameRecipe); } -} +} \ No newline at end of file diff --git a/environmentex/src/main/java/de/hessj/environmentex/VillagerListener.java b/environmentex/src/main/java/de/hessj/environmentex/VillagerListener.java index fa98eec..d270e7c 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/VillagerListener.java +++ b/environmentex/src/main/java/de/hessj/environmentex/VillagerListener.java @@ -1,84 +1,144 @@ +//GPT'd package de.hessj.environmentex; import java.util.Collection; +import java.util.HashMap; import java.util.Map; +import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.Villager; import org.bukkit.entity.Villager.Profession; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerInteractAtEntityEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.MerchantRecipe; import org.bukkit.inventory.meta.EnchantmentStorageMeta; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import com.destroystokyo.paper.entity.Pathfinder; import net.kyori.adventure.text.Component; import net.kyori.adventure.title.Title; public class VillagerListener implements Listener { + + private final Map activeVillagerTasks = new HashMap<>(); + @EventHandler public void onClickNPC(PlayerInteractAtEntityEvent e) { - if (e.getPlayer().displayName().toString().contains("R3STEAS")) { - if (e.getRightClicked() instanceof Villager - && e.getPlayer().getInventory().getItemInMainHand().getType() == Material.BELL) { + Player player = e.getPlayer(); + String playerName = player.displayName().toString(); - Villager vil = (Villager) e.getRightClicked(); - if (vil.getProfession() == Profession.LIBRARIAN && vil.getVillagerExperience() == 0) { - vil.setProfession(Profession.NONE); + if (!playerName.contains("R3STEAS")) + return; - vil.setProfession(Profession.LIBRARIAN); - Bukkit.getScheduler().scheduleSyncDelayedTask(App.main, new Runnable() { - public void run() { - e.getPlayer().getOpenInventory().close(); + if (!(e.getRightClicked() instanceof Villager vil)) + return; + if (player.getInventory().getItemInMainHand().getType() != Material.BELL) + return; - for (MerchantRecipe mr : vil.getRecipes()) { + if (vil.getProfession() == Profession.LIBRARIAN && vil.getVillagerExperience() == 0) { + // Reset profession, probably to refresh trades + vil.setProfession(Profession.NONE); + vil.setProfession(Profession.LIBRARIAN); - Collection en = Bukkit.getServer().getWorlds().get(0) - .getNearbyPlayers(vil.getLocation(), 5); + Bukkit.getScheduler().runTaskLater(App.main, () -> { + player.getOpenInventory().close(); + showEnchantmentInfoToNearbyPlayers(vil); + }, 1L); + } + } - for (Entity ent : en) { - if (ent instanceof Player) { - Player enti = (Player) ent; - if(!enti.getPlayer().displayName().toString().contains("R3STEAS")){ - return; - } - if (mr.getResult().getItemMeta() instanceof EnchantmentStorageMeta) { - EnchantmentStorageMeta meta = (EnchantmentStorageMeta) mr.getResult() - .getItemMeta(); - Map storedEn = meta.getStoredEnchants(); - for (Map.Entry entry : storedEn.entrySet()) { - Enchantment entc = entry.getKey(); - Integer val = entry.getValue(); + private void showEnchantmentInfoToNearbyPlayers(Villager vil) { + Collection nearbyPlayers = Bukkit.getWorlds().get(0).getNearbyPlayers(vil.getLocation(), 5); - String enchantmentName = "enchantment.minecraft." - + entc.getKey().getKey(); + for (MerchantRecipe mr : vil.getRecipes()) { + nearbyPlayers.stream() + .filter(p -> p.displayName().toString().contains("R3STEAS")) + .forEach(p -> showEnchantmentInfo(p, mr)); + } + } - if (val == entc.getMaxLevel()) { - ent.showTitle(Title.title(Component.text("MAX LEVEL!"), - Component.translatable(enchantmentName))); - } else { - ent.sendMessage("----"); - ent.sendMessage(""); - ent.sendMessage(Component.translatable(enchantmentName)); - ent.sendMessage(Component.text("LVL " + val)); - } - } + private void showEnchantmentInfo(Player player, MerchantRecipe recipe) { + if (!(recipe.getResult().getItemMeta() instanceof EnchantmentStorageMeta meta)) + return; - } + Map storedEnchants = meta.getStoredEnchants(); + for (Map.Entry entry : storedEnchants.entrySet()) { + Enchantment enchant = entry.getKey(); + int level = entry.getValue(); - } + String enchantmentName = "enchantment.minecraft." + enchant.getKey().getKey(); - } - } - - } - - }, 1L); - } + if (level == enchant.getMaxLevel()) { + player.showTitle(Title.title(Component.text("MAX LEVEL!"), Component.translatable(enchantmentName))); + } else { + player.sendMessage("----"); + player.sendMessage(""); + player.sendMessage(Component.translatable(enchantmentName)); + player.sendMessage(Component.text("LVL " + level)); } } - } -} + + @EventHandler + public void onVillagerClick(PlayerInteractEntityEvent event) { + if (!(event.getRightClicked() instanceof Villager villager)) + return; + + Player player = event.getPlayer(); + ItemStack heldItem = player.getInventory().getItemInMainHand(); + + if (heldItem.getType() != Material.BELL) + return; + + UUID villagerId = villager.getUniqueId(); + + cancelAndRemoveTask(villagerId); + + BukkitTask task = new BukkitRunnable() { + @Override + public void run() { + if (!villager.isValid() || !player.isOnline()) { + cancelAndRemoveTask(villagerId); + cancel(); + return; + } + + ItemStack currentItem = player.getInventory().getItemInMainHand(); + if (currentItem.getType() != Material.BELL) { + cancelAndRemoveTask(villagerId); + cancel(); + return; + } + + double maxDistance = 16.0; + double distanceSquared = villager.getLocation().distanceSquared(player.getLocation()); + + if (distanceSquared > maxDistance * maxDistance) { + cancelAndRemoveTask(villagerId); + cancel(); + return; + } + + if (distanceSquared > 2.0) { // avoid jitter when close + Pathfinder pathfinder = villager.getPathfinder(); + pathfinder.moveTo(player.getLocation(), 0.45); + } + } + }.runTaskTimer(App.main, 0L, 10L); // every 10 ticks (0.5s) + + activeVillagerTasks.put(villagerId, task); + } + + private void cancelAndRemoveTask(UUID villagerId) { + BukkitTask existing = activeVillagerTasks.remove(villagerId); + if (existing != null) { + existing.cancel(); + } + } +} \ No newline at end of file diff --git a/environmentex/src/main/java/de/hessj/environmentex/WorkbenchToGo.java b/environmentex/src/main/java/de/hessj/environmentex/WorkbenchToGo.java index c26c350..b3c9e89 100755 --- a/environmentex/src/main/java/de/hessj/environmentex/WorkbenchToGo.java +++ b/environmentex/src/main/java/de/hessj/environmentex/WorkbenchToGo.java @@ -1,8 +1,7 @@ +//GPT'd package de.hessj.environmentex; -import java.util.Arrays; -import java.util.List; - +import java.util.Collections; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.event.EventHandler; @@ -17,56 +16,78 @@ import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.components.CustomModelDataComponent; import org.bukkit.persistence.PersistentDataType; - import net.kyori.adventure.text.Component; import net.md_5.bungee.api.ChatColor; public class WorkbenchToGo implements Listener { - private Component nameWorkbench = Component.text(ChatColor.WHITE + "Portable Werkbank"); - private NamespacedKey nskWorkbench = new NamespacedKey(App.main, "R3S_WORKBENCH"); + private static final int CUSTOM_MODEL_DATA = 1000020; + private static final String WORKBENCH_KEY_VALUE = "R3S_WORKBENCH"; + private static final Component NAME_WORKBENCH = Component.text(ChatColor.WHITE + "Portable Werkbank"); + private final NamespacedKey nskWorkbench = new NamespacedKey(App.main, WORKBENCH_KEY_VALUE); @EventHandler public void onLoad(ServerLoadEvent e) { - ItemStack isWorkbench = new ItemStack(Material.BARRIER); - ItemMeta mWorkbench = isWorkbench.getItemMeta(); - mWorkbench.getPersistentDataContainer().set(nskWorkbench, PersistentDataType.STRING, "R3S_WORKBENCH"); - mWorkbench.displayName(nameWorkbench); - mWorkbench.setCustomModelData(1000020); - CustomModelDataComponent cmdc = mWorkbench.getCustomModelDataComponent(); - List list = Arrays.asList("crafting_table_to_go"); - cmdc.setStrings(list); - mWorkbench.setCustomModelDataComponent(cmdc); - isWorkbench.setItemMeta(mWorkbench); - ShapedRecipe srWorkbench = new ShapedRecipe(new NamespacedKey(App.main, "R3S_SR_Workbench"), isWorkbench); - srWorkbench.shape("DDD", "DWD", "DDD"); - srWorkbench.setIngredient('D', Material.DIAMOND); - srWorkbench.setIngredient('W', Material.CRAFTING_TABLE); - App.main.getServer().addRecipe(srWorkbench); - App.main.recipeKeys.add(srWorkbench.getKey()); + var portableWorkbench = new ItemStack(Material.BARRIER); + ItemMeta meta = portableWorkbench.getItemMeta(); + + meta.getPersistentDataContainer().set(nskWorkbench, PersistentDataType.STRING, WORKBENCH_KEY_VALUE); + meta.displayName(NAME_WORKBENCH); + meta.setCustomModelData(CUSTOM_MODEL_DATA); + + CustomModelDataComponent cmdc = meta.getCustomModelDataComponent(); + cmdc.setStrings(Collections.singletonList("crafting_table_to_go")); + meta.setCustomModelDataComponent(cmdc); + + portableWorkbench.setItemMeta(meta); + + ShapedRecipe recipe = new ShapedRecipe(new NamespacedKey(App.main, "R3S_SR_Workbench"), portableWorkbench); + recipe.shape("DDD", "DWD", "DDD"); + recipe.setIngredient('D', Material.DIAMOND); + recipe.setIngredient('W', Material.CRAFTING_TABLE); + + App.main.getServer().addRecipe(recipe); + App.main.recipeKeys.add(recipe.getKey()); } @EventHandler public void onInteract(PlayerInteractEvent e) { - if (e.getPlayer().getInventory().getItemInMainHand() != null - && e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.BARRIER)) { - if (e.getPlayer().getInventory().getItemInMainHand().hasItemMeta() - && e.getPlayer().getInventory().getItemInMainHand().getItemMeta() - .getPersistentDataContainer() != null - && e.getPlayer().getInventory().getItemInMainHand().getItemMeta().getPersistentDataContainer() - .has(nskWorkbench, PersistentDataType.STRING)) { + ItemStack item = e.getPlayer().getInventory().getItemInMainHand(); - if (e.getAction() == Action.LEFT_CLICK_AIR || e.getAction() == Action.LEFT_CLICK_BLOCK - || e.getAction() == Action.PHYSICAL - || (e.getClickedBlock() != null && App.helper.isInteractable(e.getClickedBlock()))) { - return; - } - e.setCancelled(true); - MenuType.Typed craftingMenuType = MenuType.CRAFTING; - InventoryView craftingView = craftingMenuType.builder() - .title(Component.text("Custom Crafting")) - .build(e.getPlayer()); - e.getPlayer().openInventory(craftingView); - } + if (!isPortableWorkbench(item)) { + return; } + + if (shouldIgnoreAction(e)) { + return; + } + + e.setCancelled(true); + + InventoryView craftingView = MenuType.CRAFTING.builder() + .title(Component.translatable("container.crafting")) + .build(e.getPlayer()); + + e.getPlayer().openInventory(craftingView); + } + + private boolean isPortableWorkbench(ItemStack item) { + if (item == null || item.getType() != Material.BARRIER) + return false; + if (!item.hasItemMeta()) + return false; + + var container = item.getItemMeta().getPersistentDataContainer(); + return container.has(nskWorkbench, PersistentDataType.STRING); + } + + private boolean shouldIgnoreAction(PlayerInteractEvent e) { + Action action = e.getAction(); + if (action == Action.LEFT_CLICK_AIR || action == Action.LEFT_CLICK_BLOCK || action == Action.PHYSICAL) { + return true; + } + if (e.getClickedBlock() != null && App.helper.isInteractable(e.getClickedBlock())) { + return true; + } + return false; } } \ No newline at end of file