diff --git a/core/src/main/java/github/nighter/smartspawner/commands/list/ListSubCommand.java b/core/src/main/java/github/nighter/smartspawner/commands/list/ListSubCommand.java index e5a9adf5..f4d93f74 100644 --- a/core/src/main/java/github/nighter/smartspawner/commands/list/ListSubCommand.java +++ b/core/src/main/java/github/nighter/smartspawner/commands/list/ListSubCommand.java @@ -295,11 +295,11 @@ public void openSpawnerListGUI(Player player, String worldName, int page, Filter // Apply filtering if (filter == FilterOption.ACTIVE) { worldSpawners = worldSpawners.stream() - .filter(spawner -> !spawner.getSpawnerStop()) + .filter(spawner -> !spawner.getSpawnerStop().get()) .collect(Collectors.toList()); } else if (filter == FilterOption.INACTIVE) { worldSpawners = worldSpawners.stream() - .filter(SpawnerData::getSpawnerStop) + .filter(spawner -> spawner.getSpawnerStop().get()) .collect(Collectors.toList()); } @@ -477,7 +477,7 @@ private ItemStack createSpawnerInfoItem(SpawnerData spawner) { placeholders.put("size", String.valueOf(spawner.getStackSize())); // Add status - if (spawner.getSpawnerStop()) { + if (spawner.getSpawnerStop().get()) { placeholders.put("status_color", "&#ff6b6b"); placeholders.put("status_text", "Inactive"); } else { diff --git a/core/src/main/java/github/nighter/smartspawner/commands/list/gui/adminstacker/AdminStackerHandler.java b/core/src/main/java/github/nighter/smartspawner/commands/list/gui/adminstacker/AdminStackerHandler.java index bdf7efb5..b7f58189 100644 --- a/core/src/main/java/github/nighter/smartspawner/commands/list/gui/adminstacker/AdminStackerHandler.java +++ b/core/src/main/java/github/nighter/smartspawner/commands/list/gui/adminstacker/AdminStackerHandler.java @@ -38,7 +38,7 @@ public AdminStackerHandler(SmartSpawner plugin, SpawnerManagementGUI managementG @EventHandler public void onAdminStackerClick(InventoryClickEvent event) { - if (!(event.getInventory().getHolder() instanceof AdminStackerHolder holder)) return; + if (!(event.getInventory().getHolder(false) instanceof AdminStackerHolder holder)) return; if (!(event.getWhoClicked() instanceof Player player)) return; event.setCancelled(true); @@ -116,4 +116,4 @@ private void handleStackChange(Player player, SpawnerData spawner, String worldN AdminStackerUI adminStackerUI = new AdminStackerUI(plugin); adminStackerUI.openAdminStackerGui(player, spawner, worldName, listPage); } -} \ No newline at end of file +} diff --git a/core/src/main/java/github/nighter/smartspawner/commands/list/gui/management/SpawnerManagementHandler.java b/core/src/main/java/github/nighter/smartspawner/commands/list/gui/management/SpawnerManagementHandler.java index b21768d8..c9e43068 100644 --- a/core/src/main/java/github/nighter/smartspawner/commands/list/gui/management/SpawnerManagementHandler.java +++ b/core/src/main/java/github/nighter/smartspawner/commands/list/gui/management/SpawnerManagementHandler.java @@ -43,7 +43,7 @@ public SpawnerManagementHandler(SmartSpawner plugin, ListSubCommand listSubComma @EventHandler public void onSpawnerManagementClick(InventoryClickEvent event) { - if (!(event.getInventory().getHolder() instanceof SpawnerManagementHolder holder)) return; + if (!(event.getInventory().getHolder(false) instanceof SpawnerManagementHolder holder)) return; if (!(event.getWhoClicked() instanceof Player player)) return; event.setCancelled(true); @@ -109,7 +109,7 @@ private void handleRemoveSpawner(Player player, SpawnerData spawner, String worl Location loc = spawner.getSpawnerLocation(); plugin.getSpawnerGuiViewManager().closeAllViewersInventory(spawner); String spawnerId = spawner.getSpawnerId(); - spawner.setSpawnerStop(true); + spawner.getSpawnerStop().set(true); if (loc.getBlock().getType() == Material.SPAWNER) { loc.getBlock().setType(Material.AIR); } @@ -150,4 +150,4 @@ private boolean isBedrockPlayer(Player player) { } return plugin.getIntegrationManager().getFloodgateHook().isBedrockPlayer(player); } -} \ No newline at end of file +} diff --git a/core/src/main/java/github/nighter/smartspawner/spawner/gui/synchronization/SpawnerGuiViewManager.java b/core/src/main/java/github/nighter/smartspawner/spawner/gui/synchronization/SpawnerGuiViewManager.java index 02eb1fb1..7d9845c1 100644 --- a/core/src/main/java/github/nighter/smartspawner/spawner/gui/synchronization/SpawnerGuiViewManager.java +++ b/core/src/main/java/github/nighter/smartspawner/spawner/gui/synchronization/SpawnerGuiViewManager.java @@ -1266,7 +1266,7 @@ private long calculateTimeUntilNextSpawn(SpawnerData spawner) { // This mirrors the logic from SpawnerMenuUI.calculateInitialTimerValue() to ensure consistency // between initial display and ongoing timer updates boolean isSpawnerInactive = !spawner.getSpawnerActive() || - (spawner.getSpawnerStop() && timeElapsed > cachedDelay * 2); // Only inactive if stopped for more than 2 cycles + (spawner.getSpawnerStop().get() && timeElapsed > cachedDelay * 2); // Only inactive if stopped for more than 2 cycles if (isSpawnerInactive) { return -1; diff --git a/core/src/main/java/github/nighter/smartspawner/spawner/interactions/click/SpawnerClickManager.java b/core/src/main/java/github/nighter/smartspawner/spawner/interactions/click/SpawnerClickManager.java index aaffcb7c..048afd1e 100644 --- a/core/src/main/java/github/nighter/smartspawner/spawner/interactions/click/SpawnerClickManager.java +++ b/core/src/main/java/github/nighter/smartspawner/spawner/interactions/click/SpawnerClickManager.java @@ -3,7 +3,6 @@ import github.nighter.smartspawner.SmartSpawner; import github.nighter.smartspawner.hooks.protections.CheckOpenMenu; import github.nighter.smartspawner.language.MessageService; -import github.nighter.smartspawner.nms.ParticleWrapper; import github.nighter.smartspawner.spawner.gui.main.SpawnerMenuUI; import github.nighter.smartspawner.spawner.gui.main.SpawnerMenuFormUI; import github.nighter.smartspawner.spawner.interactions.stack.SpawnerStackHandler; @@ -11,7 +10,6 @@ import github.nighter.smartspawner.spawner.properties.SpawnerData; import github.nighter.smartspawner.spawner.properties.SpawnerManager; import github.nighter.smartspawner.Scheduler; -import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.CreatureSpawner; @@ -169,7 +167,7 @@ private void handleSpawnerInteraction(Player player, Block block, ItemStack held // Handle spawn egg usage if (isSpawnEgg(itemType)) { - spawnEggHandler.handleSpawnEggUse(player, (CreatureSpawner) block.getState(), spawner, heldItem); + spawnEggHandler.handleSpawnEggUse(player, (CreatureSpawner) block.getState(false), spawner, heldItem); return; } @@ -193,7 +191,7 @@ private void handleInactiveSpawnerInteraction(Player player, Block block, Spawne // Handle spawn egg usage if (isSpawnEgg(itemType)) { - spawnEggHandler.handleSpawnEggUse(player, (CreatureSpawner) block.getState(), spawner, heldItem); + spawnEggHandler.handleSpawnEggUse(player, (CreatureSpawner) block.getState(false), spawner, heldItem); return; } @@ -251,4 +249,4 @@ public void cleanupCooldowns() { public void cleanup() { playerCooldowns.clear(); } -} \ No newline at end of file +} diff --git a/core/src/main/java/github/nighter/smartspawner/spawner/interactions/destroy/SpawnerBreakListener.java b/core/src/main/java/github/nighter/smartspawner/spawner/interactions/destroy/SpawnerBreakListener.java index 0c418893..36b8c9a0 100644 --- a/core/src/main/java/github/nighter/smartspawner/spawner/interactions/destroy/SpawnerBreakListener.java +++ b/core/src/main/java/github/nighter/smartspawner/spawner/interactions/destroy/SpawnerBreakListener.java @@ -91,7 +91,7 @@ public void onSpawnerBreak(BlockBreakEvent event) { handleSmartSpawnerBreak(block, spawner, player); plugin.getRangeChecker().stopSpawnerTask(spawner); } else { - CreatureSpawner creatureSpawner = (CreatureSpawner) block.getState(); + CreatureSpawner creatureSpawner = (CreatureSpawner) block.getState(false); if(callAPIEvent(player, block.getLocation(), 1)) { event.setCancelled(true); return; @@ -277,7 +277,7 @@ private void reduceDurability(ItemStack tool, Player player, int durabilityLoss) } private void cleanupSpawner(Block block, SpawnerData spawner) { - spawner.setSpawnerStop(true); + spawner.getSpawnerStop().set(true); block.setType(Material.AIR); String spawnerId = spawner.getSpawnerId(); @@ -374,4 +374,4 @@ public void onSpawnerDamage(BlockDamageEvent event) { messageService.sendMessage(player, "spawner_break_required_tools"); } } -} \ No newline at end of file +} diff --git a/core/src/main/java/github/nighter/smartspawner/spawner/interactions/destroy/SpawnerExplosionListener.java b/core/src/main/java/github/nighter/smartspawner/spawner/interactions/destroy/SpawnerExplosionListener.java index 2605b08f..64f14c3c 100644 --- a/core/src/main/java/github/nighter/smartspawner/spawner/interactions/destroy/SpawnerExplosionListener.java +++ b/core/src/main/java/github/nighter/smartspawner/spawner/interactions/destroy/SpawnerExplosionListener.java @@ -6,7 +6,6 @@ import github.nighter.smartspawner.spawner.properties.SpawnerManager; import github.nighter.smartspawner.spawner.properties.SpawnerData; import github.nighter.smartspawner.spawner.utils.SpawnerFileHandler; -import github.nighter.smartspawner.spawner.limits.ChunkSpawnerLimiter; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; @@ -59,7 +58,7 @@ private void handleExplosion(List blockList) { e = new SpawnerExplodeEvent(null, spawnerData.getSpawnerLocation(), 1, false); } } else { - spawnerData.setSpawnerStop(true); + spawnerData.getSpawnerStop().set(true); String spawnerId = spawnerData.getSpawnerId(); int stackSize = spawnerData.getStackSize(); @@ -124,4 +123,4 @@ private void cleanupAssociatedHopper(Block block) { hopperHandler.stopHopperTask(blockBelow.getLocation()); } } -} \ No newline at end of file +} diff --git a/core/src/main/java/github/nighter/smartspawner/spawner/interactions/place/SpawnerPlaceListener.java b/core/src/main/java/github/nighter/smartspawner/spawner/interactions/place/SpawnerPlaceListener.java index 693240c5..a520367c 100644 --- a/core/src/main/java/github/nighter/smartspawner/spawner/interactions/place/SpawnerPlaceListener.java +++ b/core/src/main/java/github/nighter/smartspawner/spawner/interactions/place/SpawnerPlaceListener.java @@ -232,7 +232,7 @@ private void handleSpawnerSetup(Block block, Player player, EntityType entityTyp return; } - CreatureSpawner spawner = (CreatureSpawner) block.getState(); + CreatureSpawner spawner = (CreatureSpawner) block.getState(false); if (isVanillaSpawner) { spawner.setSpawnedType(entityType); @@ -245,7 +245,7 @@ private void handleSpawnerSetup(Block block, Player player, EntityType entityTyp return; } - CreatureSpawner delayedSpawner = (CreatureSpawner) block.getState(); + CreatureSpawner delayedSpawner = (CreatureSpawner) block.getState(false); EntityType finalEntityType = getEntityType(entityType, delayedSpawner); delayedSpawner.setSpawnedType(finalEntityType); @@ -272,7 +272,7 @@ private EntityType getEntityType(EntityType storedEntityType, CreatureSpawner pl private void createSmartSpawner(Block block, Player player, EntityType entityType, int stackSize) { String spawnerId = UUID.randomUUID().toString().substring(0, 8); - BlockState state = block.getState(); + BlockState state = block.getState(false); if (state instanceof CreatureSpawner spawner) { spawner.setSpawnedType(entityType); spawner.update(true, false); @@ -322,4 +322,4 @@ public void cleanupPlayer(UUID playerId) { lastPlacementTime.remove(playerId); playerItemCounts.remove(playerId); } -} \ No newline at end of file +} diff --git a/core/src/main/java/github/nighter/smartspawner/spawner/lootgen/RangeMath.java b/core/src/main/java/github/nighter/smartspawner/spawner/lootgen/RangeMath.java new file mode 100644 index 00000000..a1575970 --- /dev/null +++ b/core/src/main/java/github/nighter/smartspawner/spawner/lootgen/RangeMath.java @@ -0,0 +1,77 @@ +package github.nighter.smartspawner.spawner.lootgen; + +import github.nighter.smartspawner.spawner.properties.SpawnerData; +import lombok.Getter; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class RangeMath { + + private final List players; + private final List spawners; + private final List playerLocations = new ArrayList<>(); + private final boolean[] playerIsConnectedAndAlive; + @Getter + private final boolean[] activeSpawners; + + public RangeMath(List players, List spawners) { + this.players = players; + this.spawners = spawners; + + this.activeSpawners = new boolean[spawners.size()]; + this.playerIsConnectedAndAlive = new boolean[players.size()]; + + // Huge allocation improvement + for (int i = 0; i < players.size(); i++) { + this.playerLocations.add(players.get(i).getLocation()); + this.playerIsConnectedAndAlive[i] = players.get(i).isConnected() && !players.get(i).isDead(); + } + } + + public void updateActiveSpawners() { + int i = 0, j; + boolean playerFound; + Location playerLoc; + + for (SpawnerData s : spawners) { + final Location spawnerLoc = s.getSpawnerLocation(); + if (spawnerLoc == null) continue; + + j = 0; + + playerFound = false; + + final double rangeSq = s.getSpawnerRange() * s.getSpawnerRange(); + + for (Player p : players) { + if (p == null || !playerIsConnectedAndAlive[j]) continue; + if (p.getGameMode() == GameMode.SPECTATOR) continue; + + playerLoc = playerLocations.get(j); + + if (playerLoc.getWorld() == null || playerLoc.getWorld() != spawnerLoc.getWorld()) continue; + + if (this.distanceSquared(spawnerLoc, playerLoc) <= rangeSq) { + playerFound = true; + break; + } + + j++; + } + + activeSpawners[i++] = playerFound; + } + } + + private double distanceSquared(Location loc1, Location loc2) { + double dx = loc1.getX() - loc2.getX(); + double dy = loc1.getY() - loc2.getY(); + double dz = loc1.getZ() - loc2.getZ(); + return dx * dx + dy * dy + dz * dz; + } + +} diff --git a/core/src/main/java/github/nighter/smartspawner/spawner/lootgen/SpawnerRangeChecker.java b/core/src/main/java/github/nighter/smartspawner/spawner/lootgen/SpawnerRangeChecker.java index 2e2a6abb..1e7b5bf9 100644 --- a/core/src/main/java/github/nighter/smartspawner/spawner/lootgen/SpawnerRangeChecker.java +++ b/core/src/main/java/github/nighter/smartspawner/spawner/lootgen/SpawnerRangeChecker.java @@ -1,16 +1,17 @@ package github.nighter.smartspawner.spawner.lootgen; +import com.google.common.collect.ImmutableList; import github.nighter.smartspawner.SmartSpawner; import github.nighter.smartspawner.spawner.properties.SpawnerManager; import github.nighter.smartspawner.spawner.properties.SpawnerData; import github.nighter.smartspawner.Scheduler; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.entity.Entity; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; public class SpawnerRangeChecker { private static final long CHECK_INTERVAL = 20L; // 1 second in ticks @@ -18,15 +19,15 @@ public class SpawnerRangeChecker { private final SpawnerManager spawnerManager; private final SpawnerLootGenerator spawnerLootGenerator; private final Map spawnerTasks; - private final Map> playersInRange; private boolean checkGhostSpawnersOnApproach; + private final ExecutorService executor; public SpawnerRangeChecker(SmartSpawner plugin) { this.plugin = plugin; this.spawnerManager = plugin.getSpawnerManager(); this.spawnerLootGenerator = plugin.getSpawnerLootGenerator(); this.spawnerTasks = new ConcurrentHashMap<>(); - this.playersInRange = new ConcurrentHashMap<>(); + this.executor = Executors.newSingleThreadExecutor(); this.checkGhostSpawnersOnApproach = plugin.getConfig().getBoolean("ghost_spawners.remove_on_approach", false); initializeRangeCheckTask(); } @@ -37,56 +38,33 @@ public void reload() { private void initializeRangeCheckTask() { // Using the global scheduler, but only for coordinating region-specific checks - Scheduler.runTaskTimer(() -> - spawnerManager.getAllSpawners().forEach(this::scheduleRegionSpecificCheck), - CHECK_INTERVAL, CHECK_INTERVAL); + Scheduler.runTaskTimer(this::scheduleRegionSpecificCheck, CHECK_INTERVAL, CHECK_INTERVAL); } - private void scheduleRegionSpecificCheck(SpawnerData spawner) { - Location spawnerLoc = spawner.getSpawnerLocation(); - World world = spawnerLoc.getWorld(); - if (world == null) return; + private void scheduleRegionSpecificCheck() { + final List allSpawners = spawnerManager.getAllSpawners(); + final List onlinePlayers = ImmutableList.copyOf(Bukkit.getOnlinePlayers()); - // Schedule the actual entity checking in the correct region - Scheduler.runLocationTask(spawnerLoc, () -> { - boolean playerFound = isPlayerInRange(spawner, spawnerLoc, world); - boolean shouldStop = !playerFound; + this.executor.execute(() -> { + final RangeMath rangeCheck = new RangeMath(onlinePlayers, allSpawners); - if (spawner.getSpawnerStop() != shouldStop) { - spawner.setSpawnerStop(shouldStop); - handleSpawnerStateChange(spawner, shouldStop); - } - }); - } - - private void updateSpawnerStatus(SpawnerData spawner) { - Location spawnerLoc = spawner.getSpawnerLocation(); - World world = spawnerLoc.getWorld(); - if (world == null) return; - - boolean playerFound = isPlayerInRange(spawner, spawnerLoc, world); - boolean shouldStop = !playerFound; - - if (spawner.getSpawnerStop() != shouldStop) { - spawner.setSpawnerStop(shouldStop); - handleSpawnerStateChange(spawner, shouldStop); - } - } + rangeCheck.updateActiveSpawners(); - private boolean isPlayerInRange(SpawnerData spawner, Location spawnerLoc, World world) { - int range = spawner.getSpawnerRange(); - double rangeSquared = range * range; + final boolean[] spawnersPlayerFound = rangeCheck.getActiveSpawners(); - // In Folia, we're now running this in the correct region thread, - // so we can safely check for nearby entities - Collection nearbyPlayers = world.getNearbyPlayers(spawnerLoc, range, range, range); + for (int i = 0; i < spawnersPlayerFound.length; i++) { + final boolean shouldStop = !spawnersPlayerFound[i]; + final SpawnerData sd = allSpawners.get(i); - for (Player player : nearbyPlayers) { - if (player.getLocation().distanceSquared(spawnerLoc) <= rangeSquared) { - return true; + if (sd.getSpawnerStop().get() != shouldStop) { + // Only use the scheduler here + Scheduler.runLocationTask(sd.getSpawnerLocation(), () -> { + sd.getSpawnerStop().set(shouldStop); + handleSpawnerStateChange(sd, shouldStop); + }); + } } - } - return false; + }); } private void handleSpawnerStateChange(SpawnerData spawner, boolean shouldStop) { @@ -103,7 +81,7 @@ private void handleSpawnerStateChange(SpawnerData spawner, boolean shouldStop) { } else { deactivateSpawner(spawner); } - + // Force GUI update when spawner state changes if (plugin.getSpawnerGuiViewManager().hasViewers(spawner)) { plugin.getSpawnerGuiViewManager().forceStateChangeUpdate(spawner); @@ -127,15 +105,15 @@ private void startSpawnerTask(SpawnerData spawner) { // This ensures timer shows full delay countdown when spawner activates long currentTime = System.currentTimeMillis(); spawner.setLastSpawnTime(currentTime); - + Scheduler.Task task = Scheduler.runTaskTimer(() -> { - if (!spawner.getSpawnerStop()) { + if (!spawner.getSpawnerStop().get()) { spawnerLootGenerator.spawnLootToSpawner(spawner); } }, spawner.getSpawnDelay(), spawner.getSpawnDelay()); // Start after one delay period spawnerTasks.put(spawner.getSpawnerId(), task); - + // Immediately update any open GUIs to show the countdown if (plugin.getSpawnerGuiViewManager().hasViewers(spawner)) { plugin.getSpawnerGuiViewManager().updateSpawnerMenuViewers(spawner); @@ -152,6 +130,7 @@ public void stopSpawnerTask(SpawnerData spawner) { public void cleanup() { spawnerTasks.values().forEach(Scheduler.Task::cancel); spawnerTasks.clear(); - playersInRange.clear(); + + executor.shutdown(); } -} \ No newline at end of file +} diff --git a/core/src/main/java/github/nighter/smartspawner/spawner/properties/SpawnerData.java b/core/src/main/java/github/nighter/smartspawner/spawner/properties/SpawnerData.java index d7d88b99..200894fc 100644 --- a/core/src/main/java/github/nighter/smartspawner/spawner/properties/SpawnerData.java +++ b/core/src/main/java/github/nighter/smartspawner/spawner/properties/SpawnerData.java @@ -8,27 +8,10 @@ import github.nighter.smartspawner.spawner.sell.SellResult; import lombok.Getter; import lombok.Setter; -import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockState; -import org.bukkit.block.CreatureSpawner; -import org.bukkit.block.data.BlockData; -import org.bukkit.block.spawner.SpawnRule; -import org.bukkit.block.spawner.SpawnerEntry; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntitySnapshot; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; -import org.bukkit.metadata.MetadataValue; -import org.bukkit.persistence.PersistentDataContainer; -import org.bukkit.persistence.PersistentDataHolder; -import org.bukkit.plugin.Plugin; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.Unmodifiable; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; @@ -59,8 +42,8 @@ public class SpawnerData { private Boolean spawnerActive; @Getter @Setter private Integer spawnerRange; - @Getter @Setter - private Boolean spawnerStop; + @Getter + private AtomicBoolean spawnerStop; @Getter @Setter private Boolean isAtCapacity; @Getter @Setter @@ -134,7 +117,7 @@ public SpawnerData(String id, Location location, EntityType type, SmartSpawner p private void initializeDefaults() { this.spawnerExp = 0; this.spawnerActive = true; - this.spawnerStop = true; + this.spawnerStop = new AtomicBoolean(false); this.isAtCapacity = false; this.stackSize = 1; this.lastSpawnTime = System.currentTimeMillis(); @@ -618,4 +601,4 @@ public boolean removeItemsAndUpdateSellValue(List items) { return removed; } -} \ No newline at end of file +} diff --git a/core/src/main/java/github/nighter/smartspawner/spawner/utils/SpawnerFileHandler.java b/core/src/main/java/github/nighter/smartspawner/spawner/utils/SpawnerFileHandler.java index 5e9bf50c..c1d0d776 100644 --- a/core/src/main/java/github/nighter/smartspawner/spawner/utils/SpawnerFileHandler.java +++ b/core/src/main/java/github/nighter/smartspawner/spawner/utils/SpawnerFileHandler.java @@ -15,8 +15,6 @@ import java.io.File; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.StandardOpenOption; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; @@ -177,7 +175,7 @@ private boolean saveSpawnerBatch(Map spawners) { spawner.getSpawnerExp(), spawner.getSpawnerActive(), spawner.getSpawnerRange(), - spawner.getSpawnerStop(), + spawner.getSpawnerStop().get(), spawner.getSpawnDelay(), spawner.getMaxSpawnerLootSlots(), spawner.getMaxStoredExp(), @@ -333,7 +331,7 @@ private SpawnerData loadSpawnerFromConfig(String spawnerId, boolean logErrors) { spawner.setSpawnerExpData(Integer.parseInt(settings[0])); spawner.setSpawnerActive(Boolean.parseBoolean(settings[1])); spawner.setSpawnerRange(Integer.parseInt(settings[2])); - spawner.setSpawnerStop(Boolean.parseBoolean(settings[3])); + spawner.getSpawnerStop().set(Boolean.parseBoolean(settings[3])); spawner.setSpawnDelay(Integer.parseInt(settings[4])); spawner.setMaxSpawnerLootSlots(Integer.parseInt(settings[5])); spawner.setMaxStoredExp(Integer.parseInt(settings[6])); @@ -348,7 +346,7 @@ private SpawnerData loadSpawnerFromConfig(String spawnerId, boolean logErrors) { spawner.setSpawnerExpData(Integer.parseInt(settings[0])); spawner.setSpawnerActive(Boolean.parseBoolean(settings[1])); spawner.setSpawnerRange(Integer.parseInt(settings[2])); - spawner.setSpawnerStop(Boolean.parseBoolean(settings[3])); + spawner.getSpawnerStop().set(Boolean.parseBoolean(settings[3])); spawner.setSpawnDelay(Integer.parseInt(settings[4])); spawner.setMaxSpawnerLootSlots(Integer.parseInt(settings[5])); spawner.setMaxStoredExp(Integer.parseInt(settings[6])); @@ -478,4 +476,3 @@ public void shutdown() { } } } -