mirror of
https://github.com/BentoBoxWorld/BentoBox.git
synced 2025-01-05 16:08:46 +01:00
Quarantines duplicate islands so they don't load continuously
https://github.com/BentoBoxWorld/BentoBox/issues/505
This commit is contained in:
parent
271d6aa5e9
commit
804d0f9878
@ -107,6 +107,12 @@ public class Island implements DataObject {
|
||||
private int levelHandicap;
|
||||
@Expose
|
||||
private Map<Environment, Location> spawnPoint = new EnumMap<>(Environment.class);
|
||||
|
||||
/**
|
||||
* This flag is used to quarantine islands that cannot be loaded and should be purged at some point
|
||||
*/
|
||||
@Expose
|
||||
private boolean doNotLoad;
|
||||
|
||||
public Island() {}
|
||||
|
||||
@ -801,4 +807,18 @@ public class Island implements DataObject {
|
||||
public void setHistory(List<LogEntry> history) {
|
||||
this.history = history;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the doNotLoad
|
||||
*/
|
||||
public boolean isDoNotLoad() {
|
||||
return doNotLoad;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param doNotLoad the doNotLoad to set
|
||||
*/
|
||||
public void setDoNotLoad(boolean doNotLoad) {
|
||||
this.doNotLoad = doNotLoad;
|
||||
}
|
||||
}
|
@ -1,7 +1,9 @@
|
||||
package world.bentobox.bentobox.managers;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
@ -22,9 +24,9 @@ import org.bukkit.entity.Monster;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import org.eclipse.jdt.annotation.NonNull;
|
||||
import org.eclipse.jdt.annotation.Nullable;
|
||||
|
||||
import world.bentobox.bentobox.BentoBox;
|
||||
import world.bentobox.bentobox.api.events.IslandBaseEvent;
|
||||
import world.bentobox.bentobox.api.events.island.IslandEvent;
|
||||
@ -32,8 +34,8 @@ import world.bentobox.bentobox.api.events.island.IslandEvent.Reason;
|
||||
import world.bentobox.bentobox.api.localization.TextVariables;
|
||||
import world.bentobox.bentobox.api.user.User;
|
||||
import world.bentobox.bentobox.database.Database;
|
||||
import world.bentobox.bentobox.database.objects.IslandDeletion;
|
||||
import world.bentobox.bentobox.database.objects.Island;
|
||||
import world.bentobox.bentobox.database.objects.IslandDeletion;
|
||||
import world.bentobox.bentobox.lists.Flags;
|
||||
import world.bentobox.bentobox.managers.island.IslandCache;
|
||||
import world.bentobox.bentobox.util.DeleteIslandChunks;
|
||||
@ -696,7 +698,22 @@ public class IslandsManager {
|
||||
*/
|
||||
public void load(){
|
||||
islandCache.clear();
|
||||
handler.loadObjects().forEach(islandCache::addIsland);
|
||||
List<Island> toQuarantine = new ArrayList<>();
|
||||
// Only load non-quarantined island
|
||||
// TODO: write a purge admin command to delete these records
|
||||
handler.loadObjects().stream().filter(i -> !i.isDoNotLoad()).forEach(island -> {
|
||||
if (!islandCache.addIsland(island)) {
|
||||
// Quarantine the offending island
|
||||
toQuarantine.add(island);
|
||||
}
|
||||
});
|
||||
if (!toQuarantine.isEmpty()) {
|
||||
plugin.logError(toQuarantine.size() + " islands could not be loaded successfully; quarantining.");
|
||||
toQuarantine.forEach(i -> {
|
||||
i.setDoNotLoad(true);
|
||||
handler.saveObject(i);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -45,15 +45,18 @@ public class IslandCache {
|
||||
if (island.getCenter() == null || island.getWorld() == null) {
|
||||
return false;
|
||||
}
|
||||
islandsByLocation.put(island.getCenter(), island);
|
||||
// Make world
|
||||
islandsByUUID.putIfAbsent(island.getWorld(), new HashMap<>());
|
||||
// Only add islands to this map if they are owned
|
||||
if (island.getOwner() != null) {
|
||||
islandsByUUID.get(island.getWorld()).put(island.getOwner(), island);
|
||||
island.getMemberSet().forEach(member -> islandsByUUID.get(island.getWorld()).put(member, island));
|
||||
if (addToGrid(island)) {
|
||||
islandsByLocation.put(island.getCenter(), island);
|
||||
// Make world
|
||||
islandsByUUID.putIfAbsent(island.getWorld(), new HashMap<>());
|
||||
// Only add islands to this map if they are owned
|
||||
if (island.getOwner() != null) {
|
||||
islandsByUUID.get(island.getWorld()).put(island.getOwner(), island);
|
||||
island.getMemberSet().forEach(member -> islandsByUUID.get(island.getWorld()).put(member, island));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return addToGrid(island);
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -6,10 +6,10 @@ api-version: 1.13
|
||||
authors: [tastybento, Poslovitch]
|
||||
website: https://bentobox.world
|
||||
|
||||
softdepend: [Vault, PlaceholderAPI, MVdWPlaceholderAPI]
|
||||
|
||||
loadbefore: [Multiverse-Core]
|
||||
|
||||
softdepend: [Vault, PlaceholderAPI, MVdWPlaceholderAPI]
|
||||
|
||||
permissions:
|
||||
bentobox.admin:
|
||||
description: Allow bentobox command usage
|
||||
|
Loading…
Reference in New Issue
Block a user