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 @@ -234,8 +234,8 @@ public Map<String, SpawnerData> loadAllSpawnersRaw() {

for (String spawnerId : spawnersSection.getKeys(false)) {
try {
// Use non-logging version to suppress "World not found" errors during startup
SpawnerData spawner = loadSpawnerFromConfig(spawnerId, false);
// Use non-logging version and skip hopper restart during batch load
SpawnerData spawner = loadSpawnerFromConfig(spawnerId, false, false);
// Add to map even if null (world not loaded)
loadedSpawners.put(spawnerId, spawner);
} catch (Exception e) {
Expand Down Expand Up @@ -266,10 +266,14 @@ public String getRawLocationString(String spawnerId) {
}

private SpawnerData loadSpawnerFromConfig(String spawnerId) {
return loadSpawnerFromConfig(spawnerId, true);
return loadSpawnerFromConfig(spawnerId, true, true);
}

private SpawnerData loadSpawnerFromConfig(String spawnerId, boolean logErrors) {
return loadSpawnerFromConfig(spawnerId, logErrors, true);
}

private SpawnerData loadSpawnerFromConfig(String spawnerId, boolean logErrors, boolean restartHopper) {
String path = "spawners." + spawnerId;

String locationString = spawnerData.getString(path + ".location");
Expand Down Expand Up @@ -341,7 +345,7 @@ private SpawnerData loadSpawnerFromConfig(String spawnerId, boolean logErrors) {
spawner.setMaxStoredExp(Integer.parseInt(settings[6]));
spawner.setMinMobs(Integer.parseInt(settings[7]));
spawner.setMaxMobs(Integer.parseInt(settings[8]));
spawner.setStackSize(Integer.parseInt(settings[9]));
spawner.setStackSize(Integer.parseInt(settings[9]), restartHopper);
spawner.setMaxStackSize(Integer.parseInt(settings[10]));
spawner.setLastSpawnTime(Long.parseLong(settings[11]));
spawner.setIsAtCapacity(Boolean.parseBoolean(settings[12]));
Expand All @@ -356,7 +360,7 @@ private SpawnerData loadSpawnerFromConfig(String spawnerId, boolean logErrors) {
spawner.setMaxStoredExp(Integer.parseInt(settings[6]));
spawner.setMinMobs(Integer.parseInt(settings[7]));
spawner.setMaxMobs(Integer.parseInt(settings[8]));
spawner.setStackSize(Integer.parseInt(settings[9]));
spawner.setStackSize(Integer.parseInt(settings[9]), restartHopper);
spawner.setLastSpawnTime(Long.parseLong(settings[10]));
spawner.setIsAtCapacity(false);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,13 @@ public void attemptInitialSpawnerLoad() {

// Initialize chunk spawner limits after spawners are loaded
plugin.getChunkSpawnerLimiter().reloadConfig();

// Restart all hoppers after batch loading is complete
// This is more efficient than restarting hopper for each spawner individually
if (loadedCount > 0 && plugin.getHopperHandler() != null) {
plugin.getHopperHandler().restartAllHoppers();
plugin.debug("Restarted all hoppers after batch spawner load");
}
}

/**
Expand Down Expand Up @@ -185,6 +192,12 @@ private void loadPendingSpawnersForWorld(String worldName) {

// Reinitialize chunk spawner limits after loading pending spawners
plugin.getChunkSpawnerLimiter().reloadConfig();

// Restart hoppers for the spawners in this world
if (plugin.getHopperHandler() != null) {
plugin.getHopperHandler().restartAllHoppers();
plugin.debug("Restarted hoppers after loading pending spawners for world: " + worldName);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,10 @@ private void createHologram() {
}

public void setStackSize(int stackSize) {
setStackSize(stackSize, true);
}

public void setStackSize(int stackSize, boolean restartHopper) {
// Acquire locks in consistent order to prevent deadlocks:
// 1. dataLock - for metadata changes
// 2. inventoryLock - to prevent inventory operations during virtual inventory replacement
Expand All @@ -206,7 +210,7 @@ public void setStackSize(int stackSize) {
try {
inventoryLock.lock();
try {
updateStackSize(stackSize);
updateStackSize(stackSize, restartHopper);
} finally {
inventoryLock.unlock();
}
Expand All @@ -215,7 +219,7 @@ public void setStackSize(int stackSize) {
}
}

private void updateStackSize(int newStackSize) {
private void updateStackSize(int newStackSize, boolean restartHopper) {
if (newStackSize <= 0) {
this.stackSize = 1;
plugin.getLogger().warning("Invalid stack size. Setting to 1");
Expand Down Expand Up @@ -251,7 +255,8 @@ private void updateStackSize(int newStackSize) {

// Restart hopper task if hopper integration is enabled
// This ensures hopper continues to work after stack size changes
if (plugin.getHopperHandler() != null) {
// Skip during batch loading to avoid performance bottleneck
if (restartHopper && plugin.getHopperHandler() != null) {
plugin.getHopperHandler().restartHopperForSpawner(this.spawnerLocation);
}
}
Expand Down