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
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import github.nighter.smartspawner.commands.list.gui.adminstacker.AdminStackerHandler;
import github.nighter.smartspawner.commands.list.gui.serverselection.ServerSelectionHandler;
import github.nighter.smartspawner.commands.prices.PricesGUI;
import github.nighter.smartspawner.config.Config;
import github.nighter.smartspawner.extras.HopperConfig;
import github.nighter.smartspawner.spawner.config.SpawnerSettingsConfig;
import github.nighter.smartspawner.spawner.config.ItemSpawnerSettingsConfig;
Expand Down Expand Up @@ -167,6 +168,7 @@ public class SmartSpawner extends JavaPlugin implements SmartSpawnerPlugin {
public void onEnable() {
long startTime = System.currentTimeMillis();
instance = this;
Config.load(this);

// Initialize version-specific components
initializeVersionComponents();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.mojang.brigadier.context.CommandContext;
import github.nighter.smartspawner.SmartSpawner;
import github.nighter.smartspawner.commands.BaseSubCommand;
import github.nighter.smartspawner.config.Config;
import io.papermc.paper.command.brigadier.CommandSourceStack;
import org.bukkit.command.CommandSender;
import org.jspecify.annotations.NullMarked;
Expand Down Expand Up @@ -54,6 +55,7 @@ private void reloadAll(CommandSender sender) {

// Reload all configurations
plugin.reloadConfig();
Config.reload(plugin);

// Reload components in dependency order
plugin.setUpHopperHandler();
Expand Down
32 changes: 32 additions & 0 deletions core/src/main/java/github/nighter/smartspawner/config/Config.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package github.nighter.smartspawner.config;

import github.nighter.smartspawner.SmartSpawner;
import lombok.AccessLevel;
import lombok.Getter;
import org.bukkit.configuration.file.FileConfiguration;

@Getter
public class Config {
@Getter(AccessLevel.NONE)
private static volatile Config instance;

private final boolean approximateLoot;
private final int approximationThreshold;

private Config(FileConfiguration config) {
this.approximateLoot = config.getBoolean("loot_generation.approximate_loot", false);
this.approximationThreshold = config.getInt("loot_generation.approximation_threshold", 1000);
}

public static Config get() {
return instance;
}

public static void reload(SmartSpawner plugin) {
load(plugin);
}

public static void load(SmartSpawner plugin) {
instance = new Config(plugin.getConfig());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import github.nighter.smartspawner.SmartSpawner;
import github.nighter.smartspawner.spawner.data.storage.SpawnerStorage;
import github.nighter.smartspawner.spawner.properties.ItemSignature;
import github.nighter.smartspawner.spawner.properties.SpawnerData;
import github.nighter.smartspawner.spawner.properties.VirtualInventory;
import github.nighter.smartspawner.Scheduler;
Expand Down Expand Up @@ -229,7 +230,7 @@ private boolean saveSpawnerBatch(Map<String, SpawnerData> spawners) {

VirtualInventory virtualInv = spawner.getVirtualInventory();
if (virtualInv != null) {
Map<VirtualInventory.ItemSignature, Long> items = virtualInv.getConsolidatedItems();
Map<ItemSignature, Long> items = virtualInv.getConsolidatedItems();
List<String> serializedItems = ItemStackSerializer.serializeInventory(items);
spawnerData.set(path + ".inventory", serializedItems);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import github.nighter.smartspawner.commands.list.gui.CrossServerSpawnerData;
import github.nighter.smartspawner.spawner.data.storage.SpawnerStorage;
import github.nighter.smartspawner.spawner.data.storage.StorageMode;
import github.nighter.smartspawner.spawner.properties.ItemSignature;
import github.nighter.smartspawner.spawner.properties.SpawnerData;
import github.nighter.smartspawner.spawner.properties.VirtualInventory;
import github.nighter.smartspawner.spawner.utils.ItemStackSerializer;
Expand Down Expand Up @@ -595,7 +596,7 @@ private String serializeInventory(VirtualInventory virtualInv) {
return null;
}

Map<VirtualInventory.ItemSignature, Long> items = virtualInv.getConsolidatedItems();
Map<ItemSignature, Long> items = virtualInv.getConsolidatedItems();
if (items.isEmpty()) {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package github.nighter.smartspawner.spawner.gui.main;

import github.nighter.smartspawner.spawner.properties.ItemSignature;
import net.kyori.adventure.text.Component;
import github.nighter.smartspawner.SmartSpawner;
import github.nighter.smartspawner.nms.VersionInitializer;
Expand Down Expand Up @@ -255,7 +256,7 @@ public ItemStack createLootStorageItem(SpawnerData spawner) {
}
List<Component> lootComponents = Collections.emptyList();
if (usedPlaceholders.contains("loot_items")) {
Map<VirtualInventory.ItemSignature, Long> storedItems = virtualInventory.getConsolidatedItems();
Map<ItemSignature, Long> storedItems = virtualInventory.getConsolidatedItems();
lootComponents = buildLootItemComponents(spawner.getEntityType(), storedItems);
}

Expand All @@ -282,10 +283,10 @@ public ItemStack createLootStorageItem(SpawnerData spawner) {
return chestItem;
}

private String buildLootItemsText(EntityType entityType, Map<VirtualInventory.ItemSignature, Long> storedItems) {
private String buildLootItemsText(EntityType entityType, Map<ItemSignature, Long> storedItems) {
// Create material-to-amount map for quick lookups
Map<Material, Long> materialAmountMap = new HashMap<>();
for (Map.Entry<VirtualInventory.ItemSignature, Long> entry : storedItems.entrySet()) {
for (Map.Entry<ItemSignature, Long> entry : storedItems.entrySet()) {
Material material = entry.getKey().getTemplateRef().getType();
materialAmountMap.merge(material, entry.getValue(), Long::sum);
}
Expand Down Expand Up @@ -327,11 +328,11 @@ private String buildLootItemsText(EntityType entityType, Map<VirtualInventory.It
}
} else if (!storedItems.isEmpty()) {
// Sort items by name
List<Map.Entry<VirtualInventory.ItemSignature, Long>> sortedItems =
List<Map.Entry<ItemSignature, Long>> sortedItems =
new ArrayList<>(storedItems.entrySet());
sortedItems.sort(Comparator.comparing(e -> e.getKey().getMaterialName()));

for (Map.Entry<VirtualInventory.ItemSignature, Long> entry : sortedItems) {
for (Map.Entry<ItemSignature, Long> entry : sortedItems) {
ItemStack templateItem = entry.getKey().getTemplateRef();
Material material = templateItem.getType();
long amount = entry.getValue();
Expand Down Expand Up @@ -602,9 +603,9 @@ private int calculatePercentage(long current, long maximum) {
return maximum > 0 ? (int) ((double) current / maximum * 100) : 0;
}

private List<Component> buildLootItemComponents(EntityType entityType, Map<VirtualInventory.ItemSignature, Long> storedItems) {
private List<Component> buildLootItemComponents(EntityType entityType, Map<ItemSignature, Long> storedItems) {
Map<Material, Long> materialAmountMap = new HashMap<>();
for (Map.Entry<VirtualInventory.ItemSignature, Long> entry : storedItems.entrySet()) {
for (Map.Entry<ItemSignature, Long> entry : storedItems.entrySet()) {
Material material = entry.getKey().getTemplateRef().getType();
materialAmountMap.merge(material, entry.getValue(), Long::sum);
}
Expand All @@ -628,10 +629,10 @@ private List<Component> buildLootItemComponents(EntityType entityType, Map<Virtu
LOOT_ITEM_FORMAT_KEY, material, formattedAmount, chance));
}
} else {
List<Map.Entry<VirtualInventory.ItemSignature, Long>> sortedItems =
List<Map.Entry<ItemSignature, Long>> sortedItems =
new ArrayList<>(storedItems.entrySet());
sortedItems.sort(Comparator.comparing(e -> e.getKey().getMaterialName()));
for (Map.Entry<VirtualInventory.ItemSignature, Long> entry : sortedItems) {
for (Map.Entry<ItemSignature, Long> entry : sortedItems) {
Material material = entry.getKey().getTemplateRef().getType();
long amount = entry.getValue();
String formattedAmount = languageManager.formatNumber(amount);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package github.nighter.smartspawner.spawner.gui.sell;

import github.nighter.smartspawner.spawner.properties.ItemSignature;
import net.kyori.adventure.text.Component;
import github.nighter.smartspawner.SmartSpawner;
import github.nighter.smartspawner.language.LanguageManager;
Expand All @@ -10,7 +11,6 @@
import github.nighter.smartspawner.spawner.lootgen.loot.EntityLootConfig;
import github.nighter.smartspawner.spawner.lootgen.loot.LootItem;
import github.nighter.smartspawner.spawner.properties.SpawnerData;
import github.nighter.smartspawner.spawner.properties.VirtualInventory;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
Expand Down Expand Up @@ -164,7 +164,7 @@ private ItemStack createConfirmButton(Material material, Map<String, String> pla

private ItemStack createSpawnerInfoButton(Player player, SpawnerData spawner, Map<String, String> placeholders) {
// Build loot item components for {loot_items} placeholder
Map<VirtualInventory.ItemSignature, Long> storedItems = spawner.getVirtualInventory().getConsolidatedItems();
Map<ItemSignature, Long> storedItems = spawner.getVirtualInventory().getConsolidatedItems();
List<Component> lootComponents = buildSellInfoLootComponents(spawner, storedItems);

// Prepare the meta modifier consumer
Expand Down Expand Up @@ -200,9 +200,9 @@ private ItemStack createSpawnerInfoButton(Player player, SpawnerData spawner, Ma
return spawnerItem;
}

private List<Component> buildSellInfoLootComponents(SpawnerData spawner, Map<VirtualInventory.ItemSignature, Long> storedItems) {
private List<Component> buildSellInfoLootComponents(SpawnerData spawner, Map<ItemSignature, Long> storedItems) {
Map<Material, Long> materialAmountMap = new HashMap<>();
for (Map.Entry<VirtualInventory.ItemSignature, Long> entry : storedItems.entrySet()) {
for (Map.Entry<ItemSignature, Long> entry : storedItems.entrySet()) {
Material material = entry.getKey().getTemplateRef().getType();
materialAmountMap.merge(material, entry.getValue(), Long::sum);
}
Expand All @@ -227,9 +227,9 @@ private List<Component> buildSellInfoLootComponents(SpawnerData spawner, Map<Vir
"button_sell_info.loot_items", material, formattedAmount, chance));
}
} else {
List<Map.Entry<VirtualInventory.ItemSignature, Long>> sortedItems = new ArrayList<>(storedItems.entrySet());
List<Map.Entry<ItemSignature, Long>> sortedItems = new ArrayList<>(storedItems.entrySet());
sortedItems.sort(Comparator.comparing(e -> e.getKey().getMaterialName()));
for (Map.Entry<VirtualInventory.ItemSignature, Long> entry : sortedItems) {
for (Map.Entry<ItemSignature, Long> entry : sortedItems) {
Material material = entry.getKey().getTemplateRef().getType();
long amount = entry.getValue();
String formattedAmount = languageManager.formatNumber(amount);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
import github.nighter.smartspawner.spawner.gui.layout.GuiLayoutConfig;
import github.nighter.smartspawner.spawner.lootgen.loot.EntityLootConfig;
import github.nighter.smartspawner.spawner.lootgen.loot.LootItem;
import github.nighter.smartspawner.spawner.properties.ItemSignature;
import github.nighter.smartspawner.spawner.properties.VirtualInventory;
import github.nighter.smartspawner.spawner.properties.SpawnerData;
import github.nighter.smartspawner.Scheduler;
import github.nighter.smartspawner.Scheduler.Task;
import lombok.Getter;
import net.kyori.adventure.text.Component;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
Expand Down Expand Up @@ -536,7 +536,7 @@ private ItemStack createSortButton(SpawnerData spawner, Material material) {
}

private ItemStack createStorageSpawnerInfoButton(SpawnerData spawner, Material material) {
Map<VirtualInventory.ItemSignature, Long> storedItems = spawner.getVirtualInventory().getConsolidatedItems();
Map<ItemSignature, Long> storedItems = spawner.getVirtualInventory().getConsolidatedItems();
List<Component> lootComponents = buildStorageInfoLootComponents(spawner, storedItems);

Map<String, String> placeholders = new HashMap<>();
Expand Down Expand Up @@ -588,9 +588,9 @@ private ItemStack createStorageSpawnerInfoButton(SpawnerData spawner, Material m
}

private List<Component> buildStorageInfoLootComponents(SpawnerData spawner,
Map<VirtualInventory.ItemSignature, Long> storedItems) {
Map<ItemSignature, Long> storedItems) {
Map<Material, Long> materialAmountMap = new HashMap<>();
for (Map.Entry<VirtualInventory.ItemSignature, Long> entry : storedItems.entrySet()) {
for (Map.Entry<ItemSignature, Long> entry : storedItems.entrySet()) {
Material mat = entry.getKey().getTemplateRef().getType();
materialAmountMap.merge(mat, entry.getValue(), Long::sum);
}
Expand Down Expand Up @@ -619,9 +619,9 @@ private List<Component> buildStorageInfoLootComponents(SpawnerData spawner,
"storage_spawner_info_button.loot_items", mat, formattedAmount, chance));
}
} else {
List<Map.Entry<VirtualInventory.ItemSignature, Long>> sortedItems = new ArrayList<>(storedItems.entrySet());
List<Map.Entry<ItemSignature, Long>> sortedItems = new ArrayList<>(storedItems.entrySet());
sortedItems.sort(Comparator.comparing(e -> e.getKey().getMaterialName()));
for (Map.Entry<VirtualInventory.ItemSignature, Long> entry : sortedItems) {
for (Map.Entry<ItemSignature, Long> entry : sortedItems) {
Material mat = entry.getKey().getTemplateRef().getType();
long amount = entry.getValue();
String formattedAmount = languageManager.formatNumber(amount);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ private void setupFilterInventory(Inventory inventory, SpawnerData spawner) {

// Categorize items based on filter status
for (LootItem lootItem : allLootItems) {
ItemStack displayItem = lootItem.createItemStack(new Random());
ItemStack displayItem = lootItem.createItemStack();
if (displayItem == null) continue;

Material itemType = displayItem.getType();
Expand Down
Loading
Loading