Untitled

 avatar
unknown
java
6 months ago
9.5 kB
5
Indexable
package de.cozy.worldguardaddon.oraxen;

import de.cozy.worldguardaddon.Main;
import io.th0rgal.oraxen.api.OraxenItems;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.block.Block;
import org.bukkit.block.Furnace;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.inventory.*;
import org.bukkit.inventory.FurnaceRecipe;
import org.bukkit.inventory.ItemStack;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.inventory.RecipeChoice;

public class CustomOraxenListener implements Listener {

    private final JavaPlugin plugin = Main.getInstance();
    private static final String SMELTER_KEY = "netherite_smelter";

    public CustomOraxenListener() {
        registerCustomRecipes();
    }

    @EventHandler
    public void onBlockPlace(BlockPlaceEvent event) {
        ItemStack item = event.getItemInHand();
        if (OraxenItems.getIdByItem(item).equals(SMELTER_KEY)) {
            Block block = event.getBlockPlaced();
            Furnace furnace = (Furnace) block.getState();
            furnace.getPersistentDataContainer().set(new NamespacedKey(plugin, SMELTER_KEY), PersistentDataType.BYTE, (byte) 1);

            // Setze den benutzerdefinierten Namen mit einfachen Farbcodes
            String customName = ChatColor.translateAlternateColorCodes('&', "&6Netherit-Schmelzofen");
            furnace.setCustomName(customName);

            furnace.update();
        }
    }

    @EventHandler
    public void onInventoryClick(InventoryClickEvent event) {
        if (!(event.getInventory().getHolder() instanceof Furnace)) {
            return;
        }

        Furnace furnace = (Furnace) event.getInventory().getHolder();
        if (!isCustomFurnace(furnace)) {
            return;
        }

        int slot = event.getRawSlot();
        ItemStack cursorItem = event.getCursor();
        ItemStack currentItem = event.getCurrentItem();
        String cursorItemId = cursorItem != null ? OraxenItems.getIdByItem(cursorItem) : null;

        if (event.isShiftClick()) {
            ItemStack shiftItem = event.getCurrentItem();
            String shiftItemId = shiftItem != null ? OraxenItems.getIdByItem(shiftItem) : null;

            if (isCustomSmeltable(shiftItemId) || isCustomFuel(shiftItemId)) {
                // Erlaube Shift-Klick von benutzerdefinierten Items ins Ofen-Inventar
                event.setCancelled(false);
            } else {
                // Verhindere Shift-Klick von anderen Items
                event.setCancelled(true);
            }
            return;
        }

        if (slot >= 0 && slot <= 2) { // Ofen-Slots
            if (cursorItem != null && cursorItem.getType() != Material.AIR) {
                // Spieler versucht, ein Item in den Slot zu legen
                if (slot == 0) { // Input-Slot
                    if (isCustomSmeltable(cursorItemId)) {
                        // Erlauben
                        event.setCancelled(false);
                    } else {
                        // Verhindern
                        event.setCancelled(true);
                    }
                } else if (slot == 1) { // Brennstoff-Slot
                    if (isCustomFuel(cursorItemId)) {
                        // Erlauben
                        event.setCancelled(false);
                    } else {
                        // Verhindern
                        event.setCancelled(true);
                    }
                } else if (slot == 2) { // Ausgabe-Slot
                    // Verhindere das Einlegen von Items in den Ausgabe-Slot
                    event.setCancelled(true);
                }
            } else {
                // Spieler versucht, ein Item aus dem Slot zu entnehmen
                // Erlaube das Entnehmen von Items aus allen Slots
                event.setCancelled(false);
            }
        } else {
            // Klick außerhalb des Ofen-Inventars
            // Keine Aktion erforderlich
        }
    }

    @EventHandler
    public void onFurnaceBurn(FurnaceBurnEvent event) {
        Block block = event.getBlock();
        Furnace furnace = (Furnace) block.getState();
        ItemStack fuel = event.getFuel();
        String fuelId = OraxenItems.getIdByItem(fuel);

        if (isCustomFuel(fuelId)) {
            if (isCustomFurnace(furnace)) {
                int burnTime = 600; // Brenndauer für 3 Items (3 * 200 Ticks)
                event.setBurnTime(burnTime);
                event.setBurning(true);

                // Manuelles Reduzieren des Brennstoffs im nächsten Server-Tick
                Bukkit.getScheduler().runTask(plugin, () -> {
                    ItemStack furnaceFuel = furnace.getInventory().getFuel();
                    if (furnaceFuel != null && furnaceFuel.getAmount() > 0) {
                        furnaceFuel.setAmount(furnaceFuel.getAmount() - 1);
                        if (furnaceFuel.getAmount() <= 0) {
                            furnace.getInventory().setFuel(null);
                        } else {
                            furnace.getInventory().setFuel(furnaceFuel);
                        }
                    }
                });

                // Speichere die aktuelle Brennstoff-ID
                furnace.getPersistentDataContainer().set(new NamespacedKey(plugin, "current_fuel"), PersistentDataType.STRING, fuelId);
                furnace.update();
            } else {
                // Verhindere das Verwenden der benutzerdefinierten Brennstoffe in normalen Öfen
                event.setCancelled(true);
            }
        } else {
            // Verhindere das Verwenden von anderen Brennstoffen im benutzerdefinierten Ofen
            if (isCustomFurnace(furnace)) {
                event.setCancelled(true);
            }
        }
    }


    @EventHandler
    public void onFurnaceSmelt(FurnaceSmeltEvent event) {
        Block block = event.getBlock();
        Furnace furnace = (Furnace) block.getState();
        ItemStack source = event.getSource();
        String sourceId = OraxenItems.getIdByItem(source);

        if (isCustomFurnace(furnace)) {
            String fuelId = furnace.getPersistentDataContainer().get(new NamespacedKey(plugin, "current_fuel"), PersistentDataType.STRING);

            if (isCustomSmeltable(sourceId) && fuelId != null) {
                // Überprüfe, ob Brennstoff und Erz zusammenpassen
                if ((sourceId.equals("titan_ore") && fuelId.equals("inferno_coal")) ||
                        (sourceId.equals("platin_ore") && fuelId.equals("lava_crystal"))) {

                    ItemStack result = null;
                    switch (sourceId) {
                        case "titan_ore":
                            result = OraxenItems.getItemById("titan_nugget").build();
                            break;
                        case "platin_ore":
                            result = OraxenItems.getItemById("platin_nugget").build();
                            break;
                    }
                    event.setResult(result);
                } else {
                    // Erz und Brennstoff passen nicht zusammen, Schmelzen verhindern
                    event.setCancelled(true);
                }
            } else {
                // Verhindern, dass andere Items geschmolzen werden
                event.setCancelled(true);
            }
        } else {
            // Verhindere das Schmelzen der benutzerdefinierten Erze in normalen Öfen
            if (isCustomSmeltable(sourceId)) {
                event.setCancelled(true);
            }
        }
    }

    private boolean isCustomFurnace(Furnace furnace) {
        return furnace.getPersistentDataContainer().has(new NamespacedKey(plugin, SMELTER_KEY), PersistentDataType.BYTE);
    }

    private boolean isCustomFuel(String itemId) {
        return itemId != null && (itemId.equals("inferno_coal") || itemId.equals("lava_crystal"));
    }

    private boolean isCustomSmeltable(String itemId) {
        return itemId != null && (itemId.equals("titan_ore") || itemId.equals("platin_ore"));
    }

    private void registerCustomRecipes() {
        // Titanerz zu Titannugget
        ItemStack titanNugget = OraxenItems.getItemById("titan_nugget").build();
        FurnaceRecipe titanRecipe = new FurnaceRecipe(
                new NamespacedKey(plugin, "titan_nugget_smelting"),
                titanNugget,
                new RecipeChoice.ExactChoice(OraxenItems.getItemById("titan_ore").build()),
                0.1f,
                200
        );
        Bukkit.addRecipe(titanRecipe);

        // Platinerz zu Platinnugget
        ItemStack platinNugget = OraxenItems.getItemById("platin_nugget").build();
        FurnaceRecipe platinRecipe = new FurnaceRecipe(
                new NamespacedKey(plugin, "platin_nugget_smelting"),
                platinNugget,
                new RecipeChoice.ExactChoice(OraxenItems.getItemById("platin_ore").build()),
                0.1f,
                200
        );
        Bukkit.addRecipe(platinRecipe);
    }
}
Editor is loading...
Leave a Comment