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 extends Player> 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