Cleaned tracked files and applied .gitignore + better filterhoppers
All checks were successful
Gitea Actions Demo / Build-Gradle (push) Successful in 2m56s

This commit is contained in:
Your Name
2025-07-30 16:52:54 +02:00
parent 6b55783f5a
commit 9c71b6db25
86 changed files with 510 additions and 160847 deletions

View File

@@ -1,2 +0,0 @@
#Wed Jul 30 01:48:01 CEST 2025
gradle.version=8.14.2

View File

@@ -1,2 +0,0 @@
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 1086,27 ms.

View File

@@ -1,3 +0,0 @@
{
"java.compile.nullAnalysis.mode": "automatic"
}

File diff suppressed because one or more lines are too long

View File

@@ -1,33 +0,0 @@
main: de.hessj.environmentex.App
name: EnvironmentExtenderPlugin
version: 0.1
api-version: 1.19
depend: [HelperPlugin]
commands:
test:
description: Vote mit "Ja" für den Nachtskip
usage: /<command>
y:
description: Vote mit "Ja" für den Nachtskip
usage: /<command>
n:
description: Vote mit "Nein" für den Nachtskip
usage: /<command>
add:
description: Setzt den Whiteliststatus auf accepted
usage: /<command> <UUID>
afk:
description: Setzt den AFK Status
usage: /<command>
pin:
description: ----
usage: /<command>
ignorevote:
description: Setzt den Ignorevote Status
usage: /<command>
r3load:
description: ----
usage: /<command>
quest:
description: Zeigt die heutigen Quests an
usage: /<command>

View File

@@ -1,3 +0,0 @@
Manifest-Version: 1.0
paperweight-mappings-namespace: mojang

Binary file not shown.

View File

@@ -10,6 +10,7 @@ import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scoreboard.ScoreboardManager;
import de.hessj.helper.Helper.Type;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.TextDecoration;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.NamespacedKey;
import org.bukkit.World;
@@ -77,7 +78,7 @@ public class App extends JavaPlugin {
public ItemStack eBottle;
public final List<NamespacedKey> recipeKeys = new ArrayList<>();
public NamespacedKey nskHopper;
private final String name = "Trichterfilter";
private final String filter_hopper_name = "Filtertrichter";
public static boolean coordinateRunner = false;
public PluginManager pM = Bukkit.getPluginManager();
public HashMap<Player, Boolean> hmActionbar = new HashMap<Player, Boolean>();
@@ -90,7 +91,7 @@ public NamespacedKey nskHopper;
if (!is.hasItemMeta()) return false;
if (is.getItemMeta().displayName() == null) return false;
return is.getItemMeta().displayName().toString().contains(name);
return is.getItemMeta().displayName().toString().contains(filter_hopper_name);
}
public String getHopperConfigPath(org.bukkit.Location loc) {
@@ -102,9 +103,9 @@ public NamespacedKey nskHopper;
ItemStack hopper = new ItemStack(Material.HOPPER);
ItemMeta im = hopper.getItemMeta();
im.displayName(Component.text(ChatColor.WHITE + name));
im.displayName(Component.text(filter_hopper_name).decoration(TextDecoration.ITALIC, false));
im.lore(Arrays.asList(
Component.text(ChatColor.GRAY + "STRG + Rechtsklick auf den platzierten Filter"),
Component.text(ChatColor.GRAY + "SHIFT + Rechtsklick auf den platzierten Filter"),
Component.text(ChatColor.GRAY + "ohne Item in der Hand, um den Filter zu öffnen")
));
im.setCustomModelData(1000021);
@@ -168,7 +169,7 @@ public NamespacedKey nskHopper;
main = this;
BetterHoppers.restoreAllDisplays();
nskPokeball = new NamespacedKey(this, "R3SPokeball");
nskUsedPokeball = new NamespacedKey(this, "R3SUsedPokeball");
nskEntityPokeball = new NamespacedKey(this, "R3SEntity");

View File

@@ -2,11 +2,15 @@
package de.hessj.environmentex;
import java.io.IOException;
import java.util.logging.Level;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.entity.Display.Billboard;
import org.bukkit.entity.Entity;
import org.bukkit.entity.ItemDisplay;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@@ -22,12 +26,17 @@ import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.util.Transformation;
import org.joml.AxisAngle4f;
import org.joml.Vector3f;
import de.hessj.helper.Helper;
import net.kyori.adventure.text.Component;
public class BetterHoppers implements Listener {
private static final Component inventoryName = Component.text("Items zum filtern:");
private static final Component inventoryName = Component.text("Diese Items durchlassen:");
static Material displayHopper = Material.REDSTONE;
@EventHandler
public void onLogin(final PlayerJoinEvent event) {
@@ -43,6 +52,7 @@ public class BetterHoppers implements Listener {
App.main.getConfig()
.set(App.main.getHopperConfigPath(loc), Helper.itemStackArrayToBase64(newHopperInv.getContents()));
App.main.saveConfig();
spawnDisplay(loc);
}
}
@@ -51,21 +61,24 @@ public class BetterHoppers implements Listener {
try {
if (e.getPlayer().getInventory().getItemInMainHand().getType() == Material.AIR
&& e.getAction() == Action.RIGHT_CLICK_BLOCK
&& e.getPlayer().isSneaking()
&& e.getClickedBlock() != null
&& e.getPlayer().isSneaking()
&& e.getClickedBlock().getType() == Material.HOPPER) {
e.setCancelled(true);
Entity hopperDisplay = getNearbyHopperDisplay(e.getClickedBlock().getLocation());
if (hopperDisplay != null) {
final Location loc = e.getClickedBlock().getLocation();
final String path = App.main.getHopperConfigPath(loc);
final Location loc = e.getClickedBlock().getLocation();
final String path = App.main.getHopperConfigPath(loc);
if (App.main.getConfig().contains(path)) {
e.setCancelled(true);
final InventoryHolder invHolder = (InventoryHolder) e.getClickedBlock().getState();
final Inventory hopperInv = Bukkit.createInventory(invHolder, 9, inventoryName);
if (App.main.getConfig().contains(path)) {
final InventoryHolder invHolder = (InventoryHolder) e.getClickedBlock().getState();
final Inventory hopperInv = Bukkit.createInventory(invHolder, 9, inventoryName);
hopperInv.setContents(Helper.itemStackArrayFromBase64(App.main.getConfig().getString(path)));
e.getPlayer().openInventory(hopperInv);
hopperInv.setContents(Helper.itemStackArrayFromBase64(App.main.getConfig().getString(path)));
e.getPlayer().openInventory(hopperInv);
}
}
}
} catch (IllegalArgumentException | IOException ex) {
@@ -116,38 +129,113 @@ public class BetterHoppers implements Listener {
}
@EventHandler
public void onBlockBreak(final BlockBreakEvent e) {
if (e.getPlayer() != null && e.getPlayer().getGameMode() == GameMode.SURVIVAL) {
final Block block = e.getBlock();
if (block.getType() == Material.HOPPER) {
if (removeFilterHopperData(block)) {
e.setCancelled(true);
public void onBlockBreak(BlockBreakEvent e) {
Location loc = e.getBlock().getLocation();
Entity display = getNearbyHopperDisplay(loc);
if (display != null) {
display.remove();
e.getBlock().setType(Material.AIR);
String basePath = App.main.getHopperConfigPath(loc).replace(".filterinventory", "");
App.main.getConfig().set(basePath, null);
App.main.saveConfig();
e.setCancelled(true);
loc.getWorld().dropItemNaturally(loc, new ItemStack(Material.HOPPER));
loc.getWorld().dropItemNaturally(loc, new ItemStack(Material.COMPARATOR));
}
}
private Entity getNearbyHopperDisplay(Location loc) {
for (Entity entity : loc.getWorld().getNearbyEntities(loc.toCenterLocation(), 0.5, 0.5, 0.5)) {
if (entity instanceof ItemDisplay display) {
ItemStack item = display.getItemStack();
if (item != null && item.getType() == displayHopper) {
ItemMeta meta = item.getItemMeta();
if (meta != null && meta.hasCustomModelData() && meta.getCustomModelData() == 1001) {
return display;
}
}
}
}
return null;
}
@EventHandler
public void onEntityExplode(final EntityExplodeEvent e) {
for (final Block block : e.blockList()) {
if (block.getType() == Material.HOPPER) {
removeFilterHopperData(block);
Location loc = block.getLocation();
Entity display = getNearbyHopperDisplay(loc);
if (display != null) {
display.remove();
block.setType(Material.AIR);
String basePath = App.main.getHopperConfigPath(loc).replace(".filterinventory", "");
App.main.getConfig().set(basePath, null);
App.main.saveConfig();
block.setType(Material.AIR);
loc.getWorld().dropItemNaturally(loc, new ItemStack(Material.HOPPER));
loc.getWorld().dropItemNaturally(loc, new ItemStack(Material.COMPARATOR));
}
}
}
}
private boolean removeFilterHopperData(final Block block) {
final Location loc = block.getLocation();
final String path = App.main.getHopperConfigPath(loc).replace(".filterinventory", "");
if (App.main.getConfig().contains(path + ".filterinventory")) {
App.main.getConfig().set(path, null);
App.main.saveConfig();
block.setType(Material.AIR);
block.getWorld().dropItemNaturally(loc, new ItemStack(Material.HOPPER));
block.getWorld().dropItemNaturally(loc, new ItemStack(Material.COMPARATOR));
return true;
public static void spawnDisplay(Location loc) {
World world = loc.getWorld();
if (world == null)
return;
// Center location of the hopper
Location baseLoc = loc.toCenterLocation();
// Create the item stack to use for all displays
ItemStack fakeHopperItem = new ItemStack(displayHopper);
ItemMeta meta = fakeHopperItem.getItemMeta();
if (meta != null) {
meta.setCustomModelData(1001); // Your resource pack model
meta.displayName(Component.text("§8Filter Hopper"));
fakeHopperItem.setItemMeta(meta);
}
Location offsetLoc = baseLoc.clone().add(0, 0.3, 0);
ItemDisplay display = world.spawn(offsetLoc, ItemDisplay.class, entity -> {
entity.setItemStack(fakeHopperItem);
entity.setBillboard(Billboard.FIXED);
entity.setGlowing(false);
entity.setGravity(false);
entity.setPersistent(true);
entity.setTransformation(new Transformation(
new Vector3f(0f, .05f, .51f), // translation
new AxisAngle4f(0f, 0f, 1f, 0f), // rotation
new Vector3f(0.4f, 0.4f, 0.4f), // scale (adjust this as needed)
new AxisAngle4f(0f, 0f, 0f, 1f) // left rotation
));
});
// Optional: Save UUIDs per face if you want to remove later
String path = App.main.getHopperConfigPath(loc).replace(".filterinventory", "") + ".display_uuid";
App.main.getConfig().set(path, display.getUniqueId().toString());
App.main.saveConfig();
}
public static void restoreAllDisplays() {
for (String key : App.main.getConfig().getKeys(true)) {
if (!key.endsWith(".display_uuid"))
continue;
String locKey = key.replace("hopper.", "").replace(".display_uuid", "");
String[] parts = locKey.split(":");
try {
World world = Bukkit.getWorld(parts[0]);
int x = Integer.parseInt(parts[1]);
int y = Integer.parseInt(parts[2]);
int z = Integer.parseInt(parts[3]);
Location loc = new Location(world, x, y, z);
spawnDisplay(loc);
} catch (Exception ex) {
Bukkit.getLogger().log(Level.WARNING, "Failed to restore display for: " + key);
}
}
return false;
}
@EventHandler