Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,9 @@ jar {
archiveVersion.set("${version}")

from { project(':api').sourceSets.main.output }
from { project(':NMS:v1_21').sourceSets.main.output }
from { project(':NMS:v1_21_4').sourceSets.main.output }
from { project(':NMS:v1_21_6').sourceSets.main.output }
from { project(':nms:v1_21').sourceSets.main.output }
from { project(':nms:v1_21_4').sourceSets.main.output }
from { project(':nms:v1_21_6').sourceSets.main.output }
from sourceSets.main.output
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,12 @@
import github.nighter.smartspawner.spawner.properties.SpawnerManager;
import github.nighter.smartspawner.spawner.utils.SpawnerMobHeadTexture;
import io.papermc.paper.command.brigadier.CommandSourceStack;
import io.papermc.paper.datacomponent.DataComponentType;
import io.papermc.paper.datacomponent.DataComponentTypes;
import io.papermc.paper.datacomponent.item.TooltipDisplay;
import io.papermc.paper.registry.RegistryAccess;
import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.keys.DataComponentTypeKeys;
import org.bukkit.*;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
Expand All @@ -27,6 +33,9 @@
import java.util.stream.Collectors;

public class ListSubCommand extends BaseSubCommand {
private static final Set<DataComponentType> HIDDEN_TOOLTIP_COMPONENTS = Set.of(
RegistryAccess.registryAccess().getRegistry(RegistryKey.DATA_COMPONENT_TYPE).get(DataComponentTypeKeys.BLOCK_ENTITY_DATA)
);
private final SpawnerManager spawnerManager;
private final LanguageManager languageManager;
private final MessageService messageService;
Expand Down Expand Up @@ -447,72 +456,53 @@ private ItemStack createNavigationButton(Material material, String namePath) {
return button;
}

private static void hideTooltip(ItemStack item) {
item.setData(DataComponentTypes.TOOLTIP_DISPLAY,
TooltipDisplay.tooltipDisplay().hiddenComponents(HIDDEN_TOOLTIP_COMPONENTS).build());
}

private ItemStack createSpawnerInfoItem(SpawnerData spawner) {
// Get the custom head for the spawner's entity type
EntityType entityType = spawner.getEntityType();
ItemStack spawnerItem;
ItemMeta meta;
if (entityType == null) {
spawnerItem = new ItemStack(Material.SPAWNER);
meta = spawnerItem.getItemMeta();
if (meta == null) return spawnerItem;
meta.addItemFlags(ItemFlag.HIDE_ENCHANTS, ItemFlag.HIDE_ATTRIBUTES,
ItemFlag.HIDE_ADDITIONAL_TOOLTIP, ItemFlag.HIDE_UNBREAKABLE);
meta.addItemFlags(ItemFlag.HIDE_ENCHANTS, ItemFlag.HIDE_ATTRIBUTES, ItemFlag.HIDE_UNBREAKABLE);
} else {
spawnerItem = SpawnerMobHeadTexture.getCustomHead(entityType);
meta = spawnerItem.getItemMeta();
if (meta == null) return spawnerItem;
}
Location loc = spawner.getSpawnerLocation();

// Set display name with formatted spawner ID
Map<String, String> placeholders = new HashMap<>();
placeholders.put("id", String.valueOf(spawner.getSpawnerId()));
meta.setDisplayName(languageManager.getGuiItemName("spawner_item_list.name", placeholders));

// Add entity type
placeholders.put("entity", languageManager.getFormattedMobName(entityType));

// Add stack size
placeholders.put("size", String.valueOf(spawner.getStackSize()));

// Add status
if (spawner.getSpawnerStop().get()) {
placeholders.put("status_color", "&#ff6b6b");
placeholders.put("status_text", "Inactive");
} else {
placeholders.put("status_color", "&#00E689");
placeholders.put("status_text", "Active");
}

// Add location
placeholders.put("x", String.valueOf(loc.getBlockX()));
placeholders.put("y", String.valueOf(loc.getBlockY()));
placeholders.put("z", String.valueOf(loc.getBlockZ()));

// Add last interacted player
String lastPlayer = spawner.getLastInteractedPlayer();
placeholders.put("last_player", lastPlayer != null ? lastPlayer : "None");

// Get the lore with placeholders replaced
List<String> lore = Arrays.asList(languageManager.getGuiItemLore("spawner_item_list.lore", placeholders));

// Set lore and apply meta
meta.setLore(lore);
spawnerItem.setItemMeta(meta);
hideTooltip(spawnerItem);
return spawnerItem;
}

/**
* Opens the spawner management GUI for a specific spawner
*/
public void openSpawnerManagementGUI(Player player, String spawnerId, String worldName, int listPage) {
spawnerManagementGUI.openManagementMenu(player, spawnerId, worldName, listPage);
}

/**
* Gets the user's current filter preference for a world
*/
public FilterOption getUserFilter(Player player, String worldName) {
return userPreferenceCache.getUserFilter(player, worldName);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@
import github.nighter.smartspawner.SmartSpawner;
import github.nighter.smartspawner.spawner.properties.SpawnerData;
import github.nighter.smartspawner.language.LanguageManager;
import io.papermc.paper.datacomponent.DataComponentType;
import io.papermc.paper.datacomponent.DataComponentTypes;
import io.papermc.paper.datacomponent.item.TooltipDisplay;
import io.papermc.paper.registry.RegistryAccess;
import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.keys.DataComponentTypeKeys;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
Expand All @@ -13,18 +19,19 @@

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Arrays;

/**
* Admin version of the spawner stacker GUI that doesn't require actual spawner items
*/
public class AdminStackerUI {
private static final int GUI_SIZE = 27;
private static final int[] DECREASE_SLOTS = {9, 10, 11};
private static final int[] INCREASE_SLOTS = {17, 16, 15};
private static final int SPAWNER_INFO_SLOT = 13;
private static final int BACK_SLOT = 22;
private static final int[] STACK_AMOUNTS = {64, 10, 1};
private static final Set<DataComponentType> HIDDEN_TOOLTIP_COMPONENTS = Set.of(
RegistryAccess.registryAccess().getRegistry(RegistryKey.DATA_COMPONENT_TYPE).get(DataComponentTypeKeys.BLOCK_ENTITY_DATA)
);

private final SmartSpawner plugin;
private final LanguageManager languageManager;
Expand All @@ -38,60 +45,43 @@ public void openAdminStackerGui(Player player, SpawnerData spawner, String world
if (player == null || spawner == null) {
return;
}

String title = languageManager.getGuiTitle("gui_title_stacker");
Inventory gui = Bukkit.createInventory(new AdminStackerHolder(spawner, worldName, listPage), GUI_SIZE, title);

// Fill GUI with modifier buttons and spawner info
populateStackerGui(gui, spawner);

player.openInventory(gui);
}

private void populateStackerGui(Inventory gui, SpawnerData spawner) {
// Add decrease buttons
for (int i = 0; i < STACK_AMOUNTS.length; i++) {
gui.setItem(DECREASE_SLOTS[i], createActionButton("remove", spawner, STACK_AMOUNTS[i]));
}

// Add increase buttons
for (int i = 0; i < STACK_AMOUNTS.length; i++) {
gui.setItem(INCREASE_SLOTS[i], createActionButton("add", spawner, STACK_AMOUNTS[i]));
}

// Add spawner info button
gui.setItem(SPAWNER_INFO_SLOT, createSpawnerInfoButton(spawner));

// Add back button to return to management GUI
gui.setItem(BACK_SLOT, createBackButton());
}

private ItemStack createActionButton(String action, SpawnerData spawner, int amount) {
Map<String, String> placeholders = createPlaceholders(spawner, amount);

String name = languageManager.getGuiItemName("button_" + action + ".name", placeholders);
String[] lore = languageManager.getGuiItemLore("button_" + action + ".lore", placeholders);

Material material = action.equals("add") ? Material.LIME_STAINED_GLASS_PANE : Material.RED_STAINED_GLASS_PANE;

ItemStack button = createButton(material, name, lore);
button.setAmount(Math.max(1, Math.min(amount, 64)));
return button;
}

private ItemStack createSpawnerInfoButton(SpawnerData spawner) {
Map<String, String> placeholders = createPlaceholders(spawner, 0);

String name = languageManager.getGuiItemName("button_spawner.name", placeholders);
String[] lore = languageManager.getGuiItemLore("button_spawner.lore", placeholders);

return createButton(Material.SPAWNER, name, lore);
}

private ItemStack createBackButton() {
String name = languageManager.getGuiItemName("spawner_management.back.name");
String[] lore = languageManager.getGuiItemLore("spawner_management.back.lore");

return createButton(Material.RED_STAINED_GLASS_PANE, name, lore);
}

Expand All @@ -106,20 +96,23 @@ private Map<String, String> createPlaceholders(SpawnerData spawner, int amount)
return placeholders;
}

private static void hideTooltip(ItemStack item) {
item.setData(DataComponentTypes.TOOLTIP_DISPLAY,
TooltipDisplay.tooltipDisplay().hiddenComponents(HIDDEN_TOOLTIP_COMPONENTS).build());
}

private ItemStack createButton(Material material, String name, String[] lore) {
ItemStack button = new ItemStack(material);
ItemMeta meta = button.getItemMeta();

if (meta != null) {
meta.setDisplayName(name);
if (lore != null && lore.length > 0) {
meta.setLore(Arrays.asList(lore));
}
meta.addItemFlags(ItemFlag.HIDE_ENCHANTS, ItemFlag.HIDE_ATTRIBUTES,
ItemFlag.HIDE_ADDITIONAL_TOOLTIP, ItemFlag.HIDE_UNBREAKABLE);
meta.addItemFlags(ItemFlag.HIDE_ENCHANTS, ItemFlag.HIDE_ATTRIBUTES, ItemFlag.HIDE_UNBREAKABLE);
button.setItemMeta(meta);
}

hideTooltip(button);
return button;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@
import github.nighter.smartspawner.language.MessageService;
import github.nighter.smartspawner.spawner.properties.SpawnerData;
import github.nighter.smartspawner.spawner.properties.SpawnerManager;
import io.papermc.paper.datacomponent.DataComponentType;
import io.papermc.paper.datacomponent.DataComponentTypes;
import io.papermc.paper.datacomponent.item.TooltipDisplay;
import io.papermc.paper.registry.RegistryAccess;
import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.keys.DataComponentTypeKeys;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.Sound;
Expand All @@ -20,6 +24,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class SpawnerManagementGUI {
private static final int INVENTORY_SIZE = 27;
Expand All @@ -28,6 +33,9 @@ public class SpawnerManagementGUI {
private static final int STACK_SLOT = 14;
private static final int REMOVE_SLOT = 16;
private static final int BACK_SLOT = 26;
private static final Set<DataComponentType> HIDDEN_TOOLTIP_COMPONENTS = Set.of(
RegistryAccess.registryAccess().getRegistry(RegistryKey.DATA_COMPONENT_TYPE).get(DataComponentTypeKeys.BLOCK_ENTITY_DATA)
);

private final SmartSpawner plugin;
private final LanguageManager languageManager;
Expand All @@ -47,55 +55,36 @@ public void openManagementMenu(Player player, String spawnerId, String worldName
messageService.sendMessage(player, "spawner_not_found");
return;
}

String title = languageManager.getGuiTitle("spawner_management.title");

Inventory inv = Bukkit.createInventory(
new SpawnerManagementHolder(spawnerId, worldName, listPage),
INVENTORY_SIZE, title
);

player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1.0f, 1.0f);

// Create action items with better materials and positioning
createActionItem(inv, TELEPORT_SLOT, "spawner_management.teleport", Material.ENDER_PEARL);
createActionItem(inv, OPEN_SPAWNER_SLOT, "spawner_management.open_spawner", Material.ENDER_EYE);
createActionItem(inv, STACK_SLOT, "spawner_management.stack", Material.SPAWNER);
createActionItem(inv, REMOVE_SLOT, "spawner_management.remove", Material.BARRIER);
createActionItem(inv, BACK_SLOT, "spawner_management.back", Material.RED_STAINED_GLASS_PANE);

// Fill empty slots with glass panes
// fillEmptySlots(inv);

player.openInventory(inv);
}

private static void hideTooltip(ItemStack item) {
item.setData(DataComponentTypes.TOOLTIP_DISPLAY,
TooltipDisplay.tooltipDisplay().hiddenComponents(HIDDEN_TOOLTIP_COMPONENTS).build());
}

private void createActionItem(Inventory inv, int slot, String langKey, Material material) {
ItemStack item = new ItemStack(material);
ItemMeta meta = item.getItemMeta();
if (meta != null) {
meta.setDisplayName(languageManager.getGuiItemName(langKey + ".name"));
List<String> lore = Arrays.asList(languageManager.getGuiItemLore(langKey + ".lore"));
meta.setLore(lore);
meta.addItemFlags(ItemFlag.HIDE_ENCHANTS, ItemFlag.HIDE_ATTRIBUTES,
ItemFlag.HIDE_ADDITIONAL_TOOLTIP, ItemFlag.HIDE_UNBREAKABLE);
meta.addItemFlags(ItemFlag.HIDE_ENCHANTS, ItemFlag.HIDE_ATTRIBUTES, ItemFlag.HIDE_UNBREAKABLE);
item.setItemMeta(meta);
}
hideTooltip(item);
inv.setItem(slot, item);
}

// private void fillEmptySlots(Inventory inv) {
// ItemStack glass = new ItemStack(Material.GRAY_STAINED_GLASS_PANE);
// ItemMeta meta = glass.getItemMeta();
// if (meta != null) {
// meta.setDisplayName(" ");
// glass.setItemMeta(meta);
// }
//
// for (int i = 0; i < inv.getSize(); i++) {
// if (inv.getItem(i) == null) {
// inv.setItem(i, glass);
// }
// }
// }
}
Loading
Loading