mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2025-06-25 18:24:43 +02:00
Split ChunkManager to Chunk and Region Managers
- Having not chunk-specific code in ChunkManager felt wrong. - Also allow FAWE to replace setbiome code - Also improve performance (proper usage of chunk loading) for setbiome
This commit is contained in:
@ -35,6 +35,7 @@ import com.plotsquared.core.util.ChatManager;
|
||||
import com.plotsquared.core.util.ChunkManager;
|
||||
import com.plotsquared.core.util.EconHandler;
|
||||
import com.plotsquared.core.util.InventoryUtil;
|
||||
import com.plotsquared.core.util.RegionManager;
|
||||
import com.plotsquared.core.util.SchematicHandler;
|
||||
import com.plotsquared.core.util.SetupUtils;
|
||||
import com.plotsquared.core.util.WorldUtil;
|
||||
@ -189,6 +190,13 @@ public interface IPlotMain extends ILogger {
|
||||
*/
|
||||
ChunkManager initChunkManager();
|
||||
|
||||
/**
|
||||
* Gets the region manager.
|
||||
*
|
||||
* @return the PlotSquared region manager
|
||||
*/
|
||||
RegionManager initRegionManager();
|
||||
|
||||
/**
|
||||
* Gets the {@link SetupUtils} class.
|
||||
*/
|
||||
|
@ -74,6 +74,7 @@ import com.plotsquared.core.util.LegacyConverter;
|
||||
import com.plotsquared.core.util.MainUtil;
|
||||
import com.plotsquared.core.util.MathMan;
|
||||
import com.plotsquared.core.util.ReflectionUtils;
|
||||
import com.plotsquared.core.util.RegionManager;
|
||||
import com.plotsquared.core.util.SchematicHandler;
|
||||
import com.plotsquared.core.util.SetupUtils;
|
||||
import com.plotsquared.core.util.StringMan;
|
||||
@ -273,6 +274,7 @@ public class PlotSquared {
|
||||
GlobalBlockQueue.IMP.runTask();
|
||||
// Set chunk
|
||||
ChunkManager.manager = this.IMP.initChunkManager();
|
||||
RegionManager.manager = this.IMP.initRegionManager();
|
||||
// Schematic handler
|
||||
SchematicHandler.manager = this.IMP.initSchematicHandler();
|
||||
// Chat
|
||||
|
@ -40,10 +40,10 @@ import com.plotsquared.core.plot.PlotAreaType;
|
||||
import com.plotsquared.core.plot.PlotId;
|
||||
import com.plotsquared.core.plot.SetupObject;
|
||||
import com.plotsquared.core.plot.message.PlotMessage;
|
||||
import com.plotsquared.core.util.ChunkManager;
|
||||
import com.plotsquared.core.util.MainUtil;
|
||||
import com.plotsquared.core.util.MathMan;
|
||||
import com.plotsquared.core.util.Permissions;
|
||||
import com.plotsquared.core.util.RegionManager;
|
||||
import com.plotsquared.core.util.RegionUtil;
|
||||
import com.plotsquared.core.util.SetupUtils;
|
||||
import com.plotsquared.core.util.StringMan;
|
||||
@ -167,7 +167,7 @@ public class Area extends SubCommand {
|
||||
player.teleport(WorldUtil.IMP.getSpawn(world),
|
||||
TeleportCause.COMMAND);
|
||||
if (area.getTerrain() != PlotAreaTerrainType.ALL) {
|
||||
ChunkManager.largeRegionTask(world, region,
|
||||
RegionManager.largeRegionTask(world, region,
|
||||
new RunnableVal<BlockVector2>() {
|
||||
@Override public void run(BlockVector2 value) {
|
||||
AugmentedUtils
|
||||
@ -474,7 +474,7 @@ public class Area extends SubCommand {
|
||||
"$4Stop the server and delete: " + area.getWorldName() + "/region");
|
||||
return false;
|
||||
}
|
||||
ChunkManager.largeRegionTask(area.getWorldName(), area.getRegion(),
|
||||
RegionManager.largeRegionTask(area.getWorldName(), area.getRegion(),
|
||||
new RunnableVal<BlockVector2>() {
|
||||
@Override public void run(BlockVector2 value) {
|
||||
AugmentedUtils
|
||||
|
@ -53,11 +53,11 @@ import java.util.stream.IntStream;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@CommandDeclaration(command = "backup",
|
||||
usage = "/plot backup <save|list|load>",
|
||||
description = "Manage plot backups",
|
||||
category = CommandCategory.SETTINGS,
|
||||
requiredType = RequiredType.PLAYER,
|
||||
permission = "plots.backup")
|
||||
usage = "/plot backup <save|list|load>",
|
||||
description = "Manage plot backups",
|
||||
category = CommandCategory.SETTINGS,
|
||||
requiredType = RequiredType.PLAYER,
|
||||
permission = "plots.backup")
|
||||
public final class Backup extends Command {
|
||||
|
||||
public Backup() {
|
||||
@ -69,7 +69,8 @@ public final class Backup extends Command {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override public CompletableFuture<Boolean> execute(PlotPlayer player, String[] args,
|
||||
@Override
|
||||
public CompletableFuture<Boolean> execute(PlotPlayer player, String[] args,
|
||||
RunnableVal3<Command, Runnable, Runnable> confirm,
|
||||
RunnableVal2<Command, CommandResult> whenDone) throws CommandException {
|
||||
if (args.length == 0 || !Arrays.asList("save", "list", "load")
|
||||
@ -82,23 +83,28 @@ public final class Backup extends Command {
|
||||
@Override public Collection<Command> tab(PlotPlayer player, String[] args, boolean space) {
|
||||
if (args.length == 1) {
|
||||
return Stream.of("save", "list", "load")
|
||||
.filter(value -> value.startsWith(args[0].toLowerCase(Locale.ENGLISH)))
|
||||
.map(value -> new Command(null, false, value, "", RequiredType.NONE, null) {})
|
||||
.collect(Collectors.toList());
|
||||
.filter(value -> value.startsWith(args[0].toLowerCase(Locale.ENGLISH)))
|
||||
.map(value -> new Command(null, false, value, "", RequiredType.NONE, null) {
|
||||
}).collect(Collectors.toList());
|
||||
} else if (args[0].equalsIgnoreCase("load")) {
|
||||
|
||||
final Plot plot = player.getCurrentPlot();
|
||||
if (plot != null) {
|
||||
final BackupProfile backupProfile = Objects.requireNonNull(PlotSquared.imp()).getBackupManager().getProfile(plot);
|
||||
final BackupProfile backupProfile =
|
||||
Objects.requireNonNull(PlotSquared.imp()).getBackupManager().getProfile(plot);
|
||||
if (backupProfile instanceof PlayerBackupProfile) {
|
||||
final CompletableFuture<List<com.plotsquared.core.backup.Backup>> backupList = backupProfile.listBackups();
|
||||
final CompletableFuture<List<com.plotsquared.core.backup.Backup>> backupList =
|
||||
backupProfile.listBackups();
|
||||
if (backupList.isDone()) {
|
||||
final List<com.plotsquared.core.backup.Backup> backups = backupList.getNow(new ArrayList<>());
|
||||
final List<com.plotsquared.core.backup.Backup> backups =
|
||||
backupList.getNow(new ArrayList<>());
|
||||
if (backups.isEmpty()) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
return IntStream.range(1, 1 + backups.size()).mapToObj(i -> new Command(null, false, Integer.toString(i),
|
||||
"", RequiredType.NONE, null) {}).collect(Collectors.toList());
|
||||
return IntStream.range(1, 1 + backups.size()).mapToObj(
|
||||
i -> new Command(null, false, Integer.toString(i), "",
|
||||
RequiredType.NONE, null) {
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
}
|
||||
}
|
||||
@ -108,11 +114,11 @@ public final class Backup extends Command {
|
||||
}
|
||||
|
||||
@CommandDeclaration(command = "save",
|
||||
usage = "/plot backup save",
|
||||
description = "Create a plot backup",
|
||||
category = CommandCategory.SETTINGS,
|
||||
requiredType = RequiredType.PLAYER,
|
||||
permission = "plots.backup.save")
|
||||
usage = "/plot backup save",
|
||||
description = "Create a plot backup",
|
||||
category = CommandCategory.SETTINGS,
|
||||
requiredType = RequiredType.PLAYER,
|
||||
permission = "plots.backup.save")
|
||||
public void save(final Command command, final PlotPlayer player, final String[] args,
|
||||
final RunnableVal3<Command, Runnable, Runnable> confirm,
|
||||
final RunnableVal2<Command, CommandResult> whenDone) {
|
||||
@ -120,15 +126,20 @@ public final class Backup extends Command {
|
||||
if (plot == null) {
|
||||
sendMessage(player, Captions.NOT_IN_PLOT);
|
||||
} else if (!plot.hasOwner()) {
|
||||
sendMessage(player, Captions.BACKUP_IMPOSSIBLE, Captions.GENERIC_UNOWNED.getTranslated());
|
||||
sendMessage(player, Captions.BACKUP_IMPOSSIBLE,
|
||||
Captions.GENERIC_UNOWNED.getTranslated());
|
||||
} else if (plot.isMerged()) {
|
||||
sendMessage(player, Captions.BACKUP_IMPOSSIBLE, Captions.GENERIC_MERGED.getTranslated());
|
||||
} else if (!plot.isOwner(player.getUUID()) && !Permissions.hasPermission(player, Captions.PERMISSION_ADMIN_BACKUP_OTHER)) {
|
||||
sendMessage(player, Captions.BACKUP_IMPOSSIBLE,
|
||||
Captions.GENERIC_MERGED.getTranslated());
|
||||
} else if (!plot.isOwner(player.getUUID()) && !Permissions
|
||||
.hasPermission(player, Captions.PERMISSION_ADMIN_BACKUP_OTHER)) {
|
||||
sendMessage(player, Captions.NO_PERMISSION, Captions.PERMISSION_ADMIN_BACKUP_OTHER);
|
||||
} else {
|
||||
final BackupProfile backupProfile = Objects.requireNonNull(PlotSquared.imp()).getBackupManager().getProfile(plot);
|
||||
final BackupProfile backupProfile =
|
||||
Objects.requireNonNull(PlotSquared.imp()).getBackupManager().getProfile(plot);
|
||||
if (backupProfile instanceof NullBackupProfile) {
|
||||
sendMessage(player, Captions.BACKUP_IMPOSSIBLE, Captions.GENERIC_OTHER.getTranslated());
|
||||
sendMessage(player, Captions.BACKUP_IMPOSSIBLE,
|
||||
Captions.GENERIC_OTHER.getTranslated());
|
||||
} else {
|
||||
backupProfile.createBackup().whenComplete((backup, throwable) -> {
|
||||
if (throwable != null) {
|
||||
@ -151,40 +162,47 @@ public final class Backup extends Command {
|
||||
public void list(final Command command, final PlotPlayer player, final String[] args,
|
||||
final RunnableVal3<Command, Runnable, Runnable> confirm,
|
||||
final RunnableVal2<Command, CommandResult> whenDone) {
|
||||
final Plot plot = player.getCurrentPlot();
|
||||
if (plot == null) {
|
||||
sendMessage(player, Captions.NOT_IN_PLOT);
|
||||
} else if (!plot.hasOwner()) {
|
||||
sendMessage(player, Captions.BACKUP_IMPOSSIBLE, Captions.GENERIC_UNOWNED.getTranslated());
|
||||
} else if (plot.isMerged()) {
|
||||
sendMessage(player, Captions.BACKUP_IMPOSSIBLE, Captions.GENERIC_MERGED.getTranslated());
|
||||
} else if (!plot.isOwner(player.getUUID()) && !Permissions.hasPermission(player, Captions.PERMISSION_ADMIN_BACKUP_OTHER)) {
|
||||
sendMessage(player, Captions.NO_PERMISSION, Captions.PERMISSION_ADMIN_BACKUP_OTHER);
|
||||
final Plot plot = player.getCurrentPlot();
|
||||
if (plot == null) {
|
||||
sendMessage(player, Captions.NOT_IN_PLOT);
|
||||
} else if (!plot.hasOwner()) {
|
||||
sendMessage(player, Captions.BACKUP_IMPOSSIBLE,
|
||||
Captions.GENERIC_UNOWNED.getTranslated());
|
||||
} else if (plot.isMerged()) {
|
||||
sendMessage(player, Captions.BACKUP_IMPOSSIBLE,
|
||||
Captions.GENERIC_MERGED.getTranslated());
|
||||
} else if (!plot.isOwner(player.getUUID()) && !Permissions
|
||||
.hasPermission(player, Captions.PERMISSION_ADMIN_BACKUP_OTHER)) {
|
||||
sendMessage(player, Captions.NO_PERMISSION, Captions.PERMISSION_ADMIN_BACKUP_OTHER);
|
||||
} else {
|
||||
final BackupProfile backupProfile =
|
||||
Objects.requireNonNull(PlotSquared.imp()).getBackupManager().getProfile(plot);
|
||||
if (backupProfile instanceof NullBackupProfile) {
|
||||
sendMessage(player, Captions.BACKUP_IMPOSSIBLE,
|
||||
Captions.GENERIC_OTHER.getTranslated());
|
||||
} else {
|
||||
final BackupProfile backupProfile = Objects.requireNonNull(PlotSquared.imp()).getBackupManager().getProfile(plot);
|
||||
if (backupProfile instanceof NullBackupProfile) {
|
||||
sendMessage(player, Captions.BACKUP_IMPOSSIBLE, Captions.GENERIC_OTHER.getTranslated());
|
||||
} else {
|
||||
backupProfile.listBackups().whenComplete((backups, throwable) -> {
|
||||
if (throwable != null) {
|
||||
sendMessage(player, Captions.BACKUP_LIST_FAILED, throwable.getMessage());
|
||||
throwable.printStackTrace();
|
||||
} else {
|
||||
sendMessage(player, Captions.BACKUP_LIST_HEADER, plot.getId().toCommaSeparatedString());
|
||||
try {
|
||||
for (int i = 0; i < backups.size(); i++) {
|
||||
sendMessage(player, Captions.BACKUP_LIST_ENTRY, Integer.toString(i + 1),
|
||||
DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime
|
||||
.ofInstant(Instant.ofEpochMilli(backups.get(i).getCreationTime()), ZoneId
|
||||
.systemDefault())));
|
||||
}
|
||||
} catch (final Exception e) {
|
||||
e.printStackTrace();
|
||||
backupProfile.listBackups().whenComplete((backups, throwable) -> {
|
||||
if (throwable != null) {
|
||||
sendMessage(player, Captions.BACKUP_LIST_FAILED, throwable.getMessage());
|
||||
throwable.printStackTrace();
|
||||
} else {
|
||||
sendMessage(player, Captions.BACKUP_LIST_HEADER,
|
||||
plot.getId().toCommaSeparatedString());
|
||||
try {
|
||||
for (int i = 0; i < backups.size(); i++) {
|
||||
sendMessage(player, Captions.BACKUP_LIST_ENTRY,
|
||||
Integer.toString(i + 1), DateTimeFormatter.RFC_1123_DATE_TIME
|
||||
.format(ZonedDateTime.ofInstant(
|
||||
Instant.ofEpochMilli(backups.get(i).getCreationTime()),
|
||||
ZoneId.systemDefault())));
|
||||
}
|
||||
} catch (final Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@CommandDeclaration(command = "load",
|
||||
@ -200,11 +218,14 @@ public final class Backup extends Command {
|
||||
if (plot == null) {
|
||||
sendMessage(player, Captions.NOT_IN_PLOT);
|
||||
} else if (!plot.hasOwner()) {
|
||||
sendMessage(player, Captions.BACKUP_IMPOSSIBLE, Captions.GENERIC_UNOWNED.getTranslated());
|
||||
sendMessage(player, Captions.BACKUP_IMPOSSIBLE,
|
||||
Captions.GENERIC_UNOWNED.getTranslated());
|
||||
} else if (plot.isMerged()) {
|
||||
sendMessage(player, Captions.BACKUP_IMPOSSIBLE, Captions.GENERIC_MERGED.getTranslated());
|
||||
sendMessage(player, Captions.BACKUP_IMPOSSIBLE,
|
||||
Captions.GENERIC_MERGED.getTranslated());
|
||||
sendMessage(player, Captions.BACKUP_IMPOSSIBLE, "merged");
|
||||
} else if (!plot.isOwner(player.getUUID()) && !Permissions.hasPermission(player, Captions.PERMISSION_ADMIN_BACKUP_OTHER)) {
|
||||
} else if (!plot.isOwner(player.getUUID()) && !Permissions
|
||||
.hasPermission(player, Captions.PERMISSION_ADMIN_BACKUP_OTHER)) {
|
||||
sendMessage(player, Captions.NO_PERMISSION, Captions.PERMISSION_ADMIN_BACKUP_OTHER);
|
||||
} else if (args.length == 0) {
|
||||
sendMessage(player, Captions.BACKUP_LOAD_USAGE);
|
||||
@ -216,9 +237,11 @@ public final class Backup extends Command {
|
||||
sendMessage(player, Captions.NOT_A_NUMBER, args[0]);
|
||||
return;
|
||||
}
|
||||
final BackupProfile backupProfile = Objects.requireNonNull(PlotSquared.imp()).getBackupManager().getProfile(plot);
|
||||
final BackupProfile backupProfile =
|
||||
Objects.requireNonNull(PlotSquared.imp()).getBackupManager().getProfile(plot);
|
||||
if (backupProfile instanceof NullBackupProfile) {
|
||||
sendMessage(player, Captions.BACKUP_IMPOSSIBLE, Captions.GENERIC_OTHER.getTranslated());
|
||||
sendMessage(player, Captions.BACKUP_IMPOSSIBLE,
|
||||
Captions.GENERIC_OTHER.getTranslated());
|
||||
} else {
|
||||
backupProfile.listBackups().whenComplete((backups, throwable) -> {
|
||||
if (throwable != null) {
|
||||
@ -226,20 +249,26 @@ public final class Backup extends Command {
|
||||
throwable.printStackTrace();
|
||||
} else {
|
||||
if (number < 1 || number > backups.size()) {
|
||||
sendMessage(player, Captions.BACKUP_LOAD_FAILURE, Captions.GENERIC_INVALID_CHOICE.getTranslated());
|
||||
sendMessage(player, Captions.BACKUP_LOAD_FAILURE,
|
||||
Captions.GENERIC_INVALID_CHOICE.getTranslated());
|
||||
} else {
|
||||
final com.plotsquared.core.backup.Backup backup = backups.get(number - 1);
|
||||
if (backup == null || backup.getFile() == null || !Files.exists(backup.getFile())) {
|
||||
sendMessage(player, Captions.BACKUP_LOAD_FAILURE, Captions.GENERIC_INVALID_CHOICE.getTranslated());
|
||||
final com.plotsquared.core.backup.Backup backup =
|
||||
backups.get(number - 1);
|
||||
if (backup == null || backup.getFile() == null || !Files
|
||||
.exists(backup.getFile())) {
|
||||
sendMessage(player, Captions.BACKUP_LOAD_FAILURE,
|
||||
Captions.GENERIC_INVALID_CHOICE.getTranslated());
|
||||
} else {
|
||||
CmdConfirm.addPending(player, "/plot backup load " + number, () ->
|
||||
backupProfile.restoreBackup(backup).whenComplete((n, error) -> {
|
||||
if (error != null) {
|
||||
sendMessage(player, Captions.BACKUP_LOAD_FAILURE, error.getMessage());
|
||||
} else {
|
||||
sendMessage(player, Captions.BACKUP_LOAD_SUCCESS);
|
||||
}
|
||||
}));
|
||||
CmdConfirm.addPending(player, "/plot backup load " + number,
|
||||
() -> backupProfile.restoreBackup(backup)
|
||||
.whenComplete((n, error) -> {
|
||||
if (error != null) {
|
||||
sendMessage(player, Captions.BACKUP_LOAD_FAILURE,
|
||||
error.getMessage());
|
||||
} else {
|
||||
sendMessage(player, Captions.BACKUP_LOAD_SUCCESS);
|
||||
}
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -74,12 +74,14 @@ public class Biome extends SetCommand {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override public Collection<Command> tab(final PlotPlayer player, final String[] args, final boolean space) {
|
||||
@Override
|
||||
public Collection<Command> tab(final PlotPlayer player, final String[] args,
|
||||
final boolean space) {
|
||||
return SuggestionHelper.getNamespacedRegistrySuggestions(BiomeType.REGISTRY, args[0])
|
||||
.map(value -> value.toLowerCase(Locale.ENGLISH).replace("minecraft:", ""))
|
||||
.filter(value -> value.startsWith(args[0].toLowerCase(Locale.ENGLISH)))
|
||||
.map(value -> new Command(null, false, value, "", RequiredType.NONE, null) {})
|
||||
.collect(Collectors.toList());
|
||||
.map(value -> new Command(null, false, value, "", RequiredType.NONE, null) {
|
||||
}).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -91,9 +91,10 @@ public class Clear extends Command {
|
||||
plot.removeRunning();
|
||||
// If the state changes, then mark it as no longer done
|
||||
if (DoneFlag.isDone(plot)) {
|
||||
PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(DoneFlag.class);
|
||||
PlotFlagRemoveEvent event =
|
||||
PlotSquared.get().getEventDispatcher().callFlagRemove(plotFlag, plot);
|
||||
PlotFlag<?, ?> plotFlag =
|
||||
plot.getFlagContainer().getFlag(DoneFlag.class);
|
||||
PlotFlagRemoveEvent event = PlotSquared.get().getEventDispatcher()
|
||||
.callFlagRemove(plotFlag, plot);
|
||||
if (event.getEventResult() != Result.DENY) {
|
||||
plot.removeFlag(event.getFlag());
|
||||
}
|
||||
@ -101,8 +102,8 @@ public class Clear extends Command {
|
||||
if (!plot.getFlag(AnalysisFlag.class).isEmpty()) {
|
||||
PlotFlag<?, ?> plotFlag =
|
||||
plot.getFlagContainer().getFlag(AnalysisFlag.class);
|
||||
PlotFlagRemoveEvent event =
|
||||
PlotSquared.get().getEventDispatcher().callFlagRemove(plotFlag, plot);
|
||||
PlotFlagRemoveEvent event = PlotSquared.get().getEventDispatcher()
|
||||
.callFlagRemove(plotFlag, plot);
|
||||
if (event.getEventResult() != Result.DENY) {
|
||||
plot.removeFlag(event.getFlag());
|
||||
}
|
||||
|
@ -28,8 +28,8 @@ package com.plotsquared.core.command;
|
||||
import com.plotsquared.core.PlotSquared;
|
||||
import com.plotsquared.core.configuration.Captions;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import com.plotsquared.core.util.ChunkManager;
|
||||
import com.plotsquared.core.util.MainUtil;
|
||||
import com.plotsquared.core.util.RegionManager;
|
||||
import com.plotsquared.core.util.StringMan;
|
||||
import com.plotsquared.core.util.entity.EntityCategories;
|
||||
import com.plotsquared.core.util.entity.EntityCategory;
|
||||
@ -59,7 +59,7 @@ public class Debug extends SubCommand {
|
||||
final long start = System.currentTimeMillis();
|
||||
MainUtil.sendMessage(player, "Fetching loaded chunks...");
|
||||
TaskManager.runTaskAsync(() -> MainUtil.sendMessage(player,
|
||||
"Loaded chunks: " + ChunkManager.manager
|
||||
"Loaded chunks: " + RegionManager.manager
|
||||
.getChunkChunks(player.getLocation().getWorld()).size() + "(" + (
|
||||
System.currentTimeMillis() - start) + "ms) using thread: " + Thread
|
||||
.currentThread().getName()));
|
||||
|
@ -31,7 +31,6 @@ import com.plotsquared.core.PlotSquared;
|
||||
import com.plotsquared.core.configuration.Captions;
|
||||
import com.plotsquared.core.configuration.Settings;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import com.plotsquared.core.plot.Plot;
|
||||
import com.plotsquared.core.util.MainUtil;
|
||||
import com.plotsquared.core.util.PremiumVerification;
|
||||
import com.plotsquared.core.util.net.IncendoPaster;
|
||||
@ -82,7 +81,8 @@ public class DebugPaste extends SubCommand {
|
||||
"# Welcome to this paste\n# It is meant to provide us at IntellectualSites with better information about your "
|
||||
+ "problem\n\n");
|
||||
b.append("# PlotSquared Information\n");
|
||||
b.append("PlotSquared Version: ").append(PlotSquared.get().getVersion()).append("\n");
|
||||
b.append("PlotSquared Version: ").append(PlotSquared.get().getVersion())
|
||||
.append("\n");
|
||||
b.append("Resource ID: ").append(PremiumVerification.getResourceID()).append("\n");
|
||||
b.append("Download ID: ").append(PremiumVerification.getDownloadID()).append("\n");
|
||||
b.append("This PlotSquared version is licensed to the spigot user ")
|
||||
|
@ -81,8 +81,8 @@ public class Set extends SubCommand {
|
||||
StringMan.join(Arrays.copyOfRange(args, 1, args.length), ",").trim();
|
||||
|
||||
final List<String> forbiddenTypes = Settings.General.INVALID_BLOCKS;
|
||||
if (!Permissions.hasPermission(player, Captions.PERMISSION_ADMIN_ALLOW_UNSAFE) &&
|
||||
!forbiddenTypes.isEmpty()) {
|
||||
if (!Permissions.hasPermission(player, Captions.PERMISSION_ADMIN_ALLOW_UNSAFE)
|
||||
&& !forbiddenTypes.isEmpty()) {
|
||||
for (String forbiddenType : forbiddenTypes) {
|
||||
forbiddenType = forbiddenType.toLowerCase(Locale.ENGLISH);
|
||||
if (forbiddenType.startsWith("minecraft:")) {
|
||||
@ -96,11 +96,14 @@ public class Set extends SubCommand {
|
||||
|
||||
if (blockType.startsWith("##")) {
|
||||
try {
|
||||
final BlockCategory category = BlockCategory.REGISTRY.get(blockType.substring(2).toLowerCase(Locale.ENGLISH));
|
||||
if (category == null || !category.contains(BlockTypes.get(forbiddenType))) {
|
||||
final BlockCategory category = BlockCategory.REGISTRY
|
||||
.get(blockType.substring(2).toLowerCase(Locale.ENGLISH));
|
||||
if (category == null || !category
|
||||
.contains(BlockTypes.get(forbiddenType))) {
|
||||
continue;
|
||||
}
|
||||
} catch (final Throwable ignored) {}
|
||||
} catch (final Throwable ignored) {
|
||||
}
|
||||
} else if (!blockType.contains(forbiddenType)) {
|
||||
continue;
|
||||
}
|
||||
@ -147,13 +150,13 @@ public class Set extends SubCommand {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Command> tab(final PlotPlayer player, final String[] args, final boolean space) {
|
||||
return PatternUtil.getSuggestions(player, StringMan.join(args, ",").trim())
|
||||
.stream()
|
||||
public Collection<Command> tab(final PlotPlayer player, final String[] args,
|
||||
final boolean space) {
|
||||
return PatternUtil.getSuggestions(player, StringMan.join(args, ",").trim()).stream()
|
||||
.map(value -> value.toLowerCase(Locale.ENGLISH).replace("minecraft:", ""))
|
||||
.filter(value -> value.startsWith(args[0].toLowerCase(Locale.ENGLISH)))
|
||||
.map(value -> new Command(null, false, value, "", RequiredType.NONE, null) {})
|
||||
.collect(Collectors.toList());
|
||||
.map(value -> new Command(null, false, value, "", RequiredType.NONE, null) {
|
||||
}).collect(Collectors.toList());
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -197,13 +200,16 @@ public class Set extends SubCommand {
|
||||
return noArgs(player);
|
||||
}
|
||||
|
||||
@Override public Collection<Command> tab(final PlotPlayer player, final String[] args, final boolean space) {
|
||||
@Override
|
||||
public Collection<Command> tab(final PlotPlayer player, final String[] args,
|
||||
final boolean space) {
|
||||
if (args.length == 1) {
|
||||
return Stream
|
||||
.of("biome", "alias", "home", "main", "floor", "air", "all", "border", "wall", "outline", "middle")
|
||||
.of("biome", "alias", "home", "main", "floor", "air", "all", "border", "wall",
|
||||
"outline", "middle")
|
||||
.filter(value -> value.startsWith(args[0].toLowerCase(Locale.ENGLISH)))
|
||||
.map(value -> new Command(null, false, value, "", RequiredType.NONE, null) {})
|
||||
.collect(Collectors.toList());
|
||||
.map(value -> new Command(null, false, value, "", RequiredType.NONE, null) {
|
||||
}).collect(Collectors.toList());
|
||||
} else if (args.length > 1) {
|
||||
// Additional checks
|
||||
Plot plot = player.getCurrentPlot();
|
||||
@ -223,7 +229,8 @@ public class Set extends SubCommand {
|
||||
}
|
||||
|
||||
// components
|
||||
HashSet<String> components = new HashSet<>(Arrays.asList(plot.getManager().getPlotComponents(plot.getId())));
|
||||
HashSet<String> components =
|
||||
new HashSet<>(Arrays.asList(plot.getManager().getPlotComponents(plot.getId())));
|
||||
if (components.contains(args[0].toLowerCase())) {
|
||||
return this.component.tab(player, newArgs, space);
|
||||
}
|
||||
|
@ -125,7 +125,8 @@ public class Setup extends SubCommand {
|
||||
case 0: // choose generator
|
||||
if (args.length != 1 || !SetupUtils.generators.containsKey(args[0])) {
|
||||
String prefix = "\n&8 - &7";
|
||||
MainUtil.sendMessage(player, Captions.SETUP_WORLD_GENERATOR_ERROR + prefix + StringMan
|
||||
MainUtil.sendMessage(player,
|
||||
Captions.SETUP_WORLD_GENERATOR_ERROR + prefix + StringMan
|
||||
.join(SetupUtils.generators.keySet(), prefix)
|
||||
.replaceAll(PlotSquared.imp().getPluginName(),
|
||||
"&2" + PlotSquared.imp().getPluginName()));
|
||||
@ -247,8 +248,7 @@ public class Setup extends SubCommand {
|
||||
return false;
|
||||
}
|
||||
if (id.x <= object.min.x || id.y <= object.min.y) {
|
||||
MainUtil
|
||||
.sendMessage(player, Captions.SETUP_AREA_PLOT_ID_GREATER_THAN_MINIMUM);
|
||||
MainUtil.sendMessage(player, Captions.SETUP_AREA_PLOT_ID_GREATER_THAN_MINIMUM);
|
||||
return false;
|
||||
}
|
||||
object.max = id;
|
||||
@ -259,7 +259,8 @@ public class Setup extends SubCommand {
|
||||
Optional<PlotAreaTerrainType> optTerrain;
|
||||
if (args.length != 1 || !(optTerrain = PlotAreaTerrainType.fromString(args[0]))
|
||||
.isPresent()) {
|
||||
MainUtil.sendMessage(player, Captions.SETUP_PARTIAL_AREA_ERROR, Captions.SETUP_PARTIAL_AREA);
|
||||
MainUtil.sendMessage(player, Captions.SETUP_PARTIAL_AREA_ERROR,
|
||||
Captions.SETUP_PARTIAL_AREA);
|
||||
return false;
|
||||
}
|
||||
object.terrain = optTerrain.get();
|
||||
|
@ -33,8 +33,8 @@ import com.plotsquared.core.plot.Plot;
|
||||
import com.plotsquared.core.plot.expiration.ExpireManager;
|
||||
import com.plotsquared.core.queue.GlobalBlockQueue;
|
||||
import com.plotsquared.core.queue.LocalBlockQueue;
|
||||
import com.plotsquared.core.util.ChunkManager;
|
||||
import com.plotsquared.core.util.MainUtil;
|
||||
import com.plotsquared.core.util.RegionManager;
|
||||
import com.plotsquared.core.util.RegionUtil;
|
||||
import com.plotsquared.core.util.WorldUtil;
|
||||
import com.plotsquared.core.util.task.RunnableVal;
|
||||
@ -133,7 +133,7 @@ public class Trim extends SubCommand {
|
||||
if (ExpireManager.IMP != null) {
|
||||
plots.removeAll(ExpireManager.IMP.getPendingExpired());
|
||||
}
|
||||
result.value1 = new HashSet<>(ChunkManager.manager.getChunkChunks(world));
|
||||
result.value1 = new HashSet<>(RegionManager.manager.getChunkChunks(world));
|
||||
result.value2 = new HashSet<>();
|
||||
MainUtil.sendMessage(null, " - MCA #: " + result.value1.size());
|
||||
MainUtil.sendMessage(null, " - CHUNKS: " + (result.value1.size() * 1024) + " (max)");
|
||||
@ -238,7 +238,7 @@ public class Trim extends SubCommand {
|
||||
player.sendMessage("Trim done!");
|
||||
};
|
||||
}
|
||||
ChunkManager.manager.deleteRegionFiles(world, viable, regenTask);
|
||||
RegionManager.manager.deleteRegionFiles(world, viable, regenTask);
|
||||
|
||||
}
|
||||
});
|
||||
|
@ -256,7 +256,8 @@ public class Settings extends Config {
|
||||
"birch_trapdoor", "birch_sapling", "birch_sign", "birch_wall_sign", "birch_leaves",
|
||||
// Dark Oak Stuff
|
||||
"dark_oak_button", "dark_oak_fence_gate", "dark_oak_door", "dark_oak_pressure_plate",
|
||||
"dark_oak_trapdoor", "dark_oak_sapling", "dark_oak_sign", "dark_oak_wall_sign", "dark_oak_leaves",
|
||||
"dark_oak_trapdoor", "dark_oak_sapling", "dark_oak_sign", "dark_oak_wall_sign",
|
||||
"dark_oak_leaves",
|
||||
// Jungle Stuff
|
||||
"jungle_button", "jungle_fence_gate", "jungle_door", "jungle_pressure_plate",
|
||||
"jungle_trapdoor", "jungle_sapling", "jungle_sign", "jungle_wall_sign", "jungle_leaves",
|
||||
@ -430,8 +431,8 @@ public class Settings extends Config {
|
||||
|
||||
|
||||
public static final class Confirmation {
|
||||
@Comment("Timeout before a confirmation prompt expires") public static int CONFIRMATION_TIMEOUT_SECONDS =
|
||||
20;
|
||||
@Comment("Timeout before a confirmation prompt expires") public static int
|
||||
CONFIRMATION_TIMEOUT_SECONDS = 20;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1963,7 +1963,8 @@ public class SQLManager implements AbstractDB {
|
||||
|
||||
try (final ResultSet resultSet = statement
|
||||
.executeQuery("SELECT * FROM `" + this.prefix + "plot_flags`")) {
|
||||
BlockTypeListFlag.skipCategoryVerification = true; // allow invalid tags, as initialized lazily
|
||||
BlockTypeListFlag.skipCategoryVerification =
|
||||
true; // allow invalid tags, as initialized lazily
|
||||
final ArrayList<Integer> toDelete = new ArrayList<>();
|
||||
final Map<Plot, Collection<PlotFlag<?, ?>>> invalidFlags = new HashMap<>();
|
||||
while (resultSet.next()) {
|
||||
@ -2001,7 +2002,8 @@ public class SQLManager implements AbstractDB {
|
||||
+ " in `plot_flags` does not exist. Create this plot or set `database-purger: true` in the settings.yml.");
|
||||
}
|
||||
}
|
||||
BlockTypeListFlag.skipCategoryVerification = false; // don't allow invalid tags anymore
|
||||
BlockTypeListFlag.skipCategoryVerification =
|
||||
false; // don't allow invalid tags anymore
|
||||
if (Settings.Enabled_Components.DATABASE_PURGER) {
|
||||
for (final Map.Entry<Plot, Collection<PlotFlag<?, ?>>> plotFlagEntry : invalidFlags
|
||||
.entrySet()) {
|
||||
|
@ -25,19 +25,14 @@
|
||||
*/
|
||||
package com.plotsquared.core.generator;
|
||||
|
||||
import com.plotsquared.core.PlotSquared;
|
||||
import com.plotsquared.core.configuration.ConfigurationNode;
|
||||
import com.plotsquared.core.configuration.ConfigurationSection;
|
||||
import com.plotsquared.core.configuration.ConfigurationUtil;
|
||||
import com.plotsquared.core.configuration.Settings;
|
||||
import com.plotsquared.core.plot.BlockBucket;
|
||||
import com.plotsquared.core.plot.PlotId;
|
||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Locale;
|
||||
|
||||
@SuppressWarnings("WeakerAccess")
|
||||
public abstract class ClassicPlotWorld extends SquarePlotWorld {
|
||||
|
||||
|
@ -46,6 +46,7 @@ import com.plotsquared.core.queue.LocalBlockQueue;
|
||||
import com.plotsquared.core.util.ChunkManager;
|
||||
import com.plotsquared.core.util.MainUtil;
|
||||
import com.plotsquared.core.util.MathMan;
|
||||
import com.plotsquared.core.util.RegionManager;
|
||||
import com.plotsquared.core.util.RegionUtil;
|
||||
import com.plotsquared.core.util.SchematicHandler;
|
||||
import com.plotsquared.core.util.WorldUtil;
|
||||
@ -378,7 +379,7 @@ public abstract class HybridUtils {
|
||||
return false;
|
||||
}
|
||||
HybridUtils.UPDATE = true;
|
||||
Set<BlockVector2> regions = ChunkManager.manager.getChunkChunks(area.getWorldName());
|
||||
Set<BlockVector2> regions = RegionManager.manager.getChunkChunks(area.getWorldName());
|
||||
return scheduleRoadUpdate(area, regions, extend, new HashSet<>());
|
||||
}
|
||||
|
||||
@ -388,7 +389,7 @@ public abstract class HybridUtils {
|
||||
}
|
||||
HybridUtils.UPDATE = true;
|
||||
Set<BlockVector2> regions = new HashSet<>();
|
||||
regions.add(ChunkManager.getRegion(plot.getCenterSynchronous()));
|
||||
regions.add(RegionManager.getRegion(plot.getCenterSynchronous()));
|
||||
return scheduleRoadUpdate(plot.getArea(), regions, extend, new HashSet<>());
|
||||
}
|
||||
|
||||
|
@ -31,8 +31,8 @@ import com.plotsquared.core.location.Location;
|
||||
import com.plotsquared.core.plot.Plot;
|
||||
import com.plotsquared.core.plot.PlotArea;
|
||||
import com.plotsquared.core.plot.PlotId;
|
||||
import com.plotsquared.core.util.ChunkManager;
|
||||
import com.plotsquared.core.util.MainUtil;
|
||||
import com.plotsquared.core.util.RegionManager;
|
||||
import com.sk89q.worldedit.regions.CuboidRegion;
|
||||
|
||||
import java.util.Arrays;
|
||||
@ -66,7 +66,7 @@ public abstract class SquarePlotManager extends GridPlotManager {
|
||||
region.getMinimumPoint().getY(), region.getMinimumPoint().getZ());
|
||||
Location pos2 = new Location(plot.getWorldName(), region.getMaximumPoint().getX(),
|
||||
region.getMaximumPoint().getY(), region.getMaximumPoint().getZ());
|
||||
ChunkManager.manager.regenerateRegion(pos1, pos2, false, this);
|
||||
RegionManager.manager.regenerateRegion(pos1, pos2, false, this);
|
||||
}
|
||||
};
|
||||
run.run();
|
||||
|
@ -60,6 +60,7 @@ import com.plotsquared.core.util.ChunkManager;
|
||||
import com.plotsquared.core.util.MainUtil;
|
||||
import com.plotsquared.core.util.MathMan;
|
||||
import com.plotsquared.core.util.Permissions;
|
||||
import com.plotsquared.core.util.RegionManager;
|
||||
import com.plotsquared.core.util.SchematicHandler;
|
||||
import com.plotsquared.core.util.StringWrapper;
|
||||
import com.plotsquared.core.util.WorldUtil;
|
||||
@ -98,7 +99,6 @@ import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.stream.Collectors;
|
||||
@ -944,7 +944,7 @@ public class Plot {
|
||||
Runnable run = () -> {
|
||||
for (CuboidRegion region : regions) {
|
||||
Location[] corners = MainUtil.getCorners(getWorldName(), region);
|
||||
ChunkManager.manager.clearAllEntities(corners[0], corners[1]);
|
||||
RegionManager.manager.clearAllEntities(corners[0], corners[1]);
|
||||
}
|
||||
TaskManager.runTask(whenDone);
|
||||
};
|
||||
@ -961,7 +961,7 @@ public class Plot {
|
||||
Plot current = queue.poll();
|
||||
if (Plot.this.area.getTerrain() != PlotAreaTerrainType.NONE) {
|
||||
try {
|
||||
ChunkManager.manager
|
||||
RegionManager.manager
|
||||
.regenerateRegion(current.getBottomAbs(), current.getTopAbs(), false,
|
||||
this);
|
||||
} catch (UnsupportedOperationException exception) {
|
||||
@ -995,39 +995,10 @@ public class Plot {
|
||||
Runnable run = new Runnable() {
|
||||
@Override public void run() {
|
||||
if (regions.isEmpty()) {
|
||||
Plot.this.refreshChunks();
|
||||
TaskManager.runTask(whenDone);
|
||||
return;
|
||||
}
|
||||
CuboidRegion region = regions.poll();
|
||||
Location pos1 =
|
||||
new Location(getWorldName(), region.getMinimumPoint().getX() - extendBiome,
|
||||
region.getMinimumPoint().getY(),
|
||||
region.getMinimumPoint().getZ() - extendBiome);
|
||||
Location pos2 =
|
||||
new Location(getWorldName(), region.getMaximumPoint().getX() + extendBiome,
|
||||
region.getMaximumPoint().getY(),
|
||||
region.getMaximumPoint().getZ() + extendBiome);
|
||||
ChunkManager.chunkTask(pos1, pos2, new RunnableVal<int[]>() {
|
||||
@Override public void run(int[] value) {
|
||||
BlockVector2 loc = BlockVector2.at(value[0], value[1]);
|
||||
long start = System.currentTimeMillis();
|
||||
ChunkManager.manager.loadChunk(getWorldName(), loc, false);
|
||||
long end = System.currentTimeMillis();
|
||||
PlotSquared.debug(
|
||||
"[Biome Operation] Loading chunk took: " + TimeUnit.MILLISECONDS
|
||||
.toSeconds(end - start));
|
||||
MainUtil.setBiome(getWorldName(), value[2], value[3], value[4], value[5],
|
||||
biome);
|
||||
start = System.currentTimeMillis();
|
||||
ChunkManager.manager.unloadChunk(getWorldName(), loc, true);
|
||||
end = System.currentTimeMillis();
|
||||
PlotSquared.debug(
|
||||
"[Biome Operation] Unloading chunk took: " + TimeUnit.MILLISECONDS
|
||||
.toSeconds(end - start));
|
||||
}
|
||||
}, this, 5);
|
||||
|
||||
RegionManager.manager.setBiome(region, extendBiome, biome, getWorldName(), this);
|
||||
}
|
||||
};
|
||||
run.run();
|
||||
@ -1279,7 +1250,7 @@ public class Plot {
|
||||
* Count the entities in a plot
|
||||
*
|
||||
* @return array of entity counts
|
||||
* @see ChunkManager#countEntities(Plot)
|
||||
* @see RegionManager#countEntities(Plot)
|
||||
* 0 = Entity
|
||||
* 1 = Animal
|
||||
* 2 = Monster
|
||||
@ -1290,7 +1261,7 @@ public class Plot {
|
||||
public int[] countEntities() {
|
||||
int[] count = new int[6];
|
||||
for (Plot current : this.getConnectedPlots()) {
|
||||
int[] result = ChunkManager.manager.countEntities(current);
|
||||
int[] result = RegionManager.manager.countEntities(current);
|
||||
count[CAP_ENTITY] += result[CAP_ENTITY];
|
||||
count[CAP_ANIMAL] += result[CAP_ANIMAL];
|
||||
count[CAP_MONSTER] += result[CAP_MONSTER];
|
||||
@ -1362,7 +1333,8 @@ public class Plot {
|
||||
|
||||
if (Settings.Backup.DELETE_ON_UNCLAIM) {
|
||||
// Destroy all backups when the plot is unclaimed
|
||||
Objects.requireNonNull(PlotSquared.imp()).getBackupManager().getProfile(current).destroy();
|
||||
Objects.requireNonNull(PlotSquared.imp()).getBackupManager().getProfile(current)
|
||||
.destroy();
|
||||
}
|
||||
|
||||
getArea().removePlot(getId());
|
||||
@ -2055,7 +2027,7 @@ public class Plot {
|
||||
Location top = this.getTopAbs();
|
||||
Location pos1 = new Location(this.getWorldName(), top.getX(), 0, bot.getZ());
|
||||
Location pos2 = new Location(this.getWorldName(), bot.getX(), MAX_HEIGHT, top.getZ());
|
||||
ChunkManager.manager.regenerateRegion(pos1, pos2, true, null);
|
||||
RegionManager.manager.regenerateRegion(pos1, pos2, true, null);
|
||||
} else if (this.area.getTerrain()
|
||||
!= PlotAreaTerrainType.ALL) { // no road generated => no road to remove
|
||||
this.area.getPlotManager().removeRoadEast(this);
|
||||
@ -2497,7 +2469,7 @@ public class Plot {
|
||||
Location top = this.getTopAbs();
|
||||
Location pos1 = new Location(this.getWorldName(), bot.getX(), 0, top.getZ());
|
||||
Location pos2 = new Location(this.getWorldName(), top.getX(), MAX_HEIGHT, bot.getZ());
|
||||
ChunkManager.manager.regenerateRegion(pos1, pos2, true, null);
|
||||
RegionManager.manager.regenerateRegion(pos1, pos2, true, null);
|
||||
} else if (this.area.getTerrain()
|
||||
!= PlotAreaTerrainType.ALL) { // no road generated => no road to remove
|
||||
this.getManager().removeRoadSouth(this);
|
||||
@ -2675,7 +2647,7 @@ public class Plot {
|
||||
Location pos2 = other.getBottomAbs().subtract(1, 0, 1);
|
||||
pos1.setY(0);
|
||||
pos2.setY(MAX_HEIGHT);
|
||||
ChunkManager.manager.regenerateRegion(pos1, pos2, true, null);
|
||||
RegionManager.manager.regenerateRegion(pos1, pos2, true, null);
|
||||
} else if (this.area.getTerrain()
|
||||
!= PlotAreaTerrainType.ALL) { // no road generated => no road to remove
|
||||
this.area.getPlotManager().removeRoadSouthEast(this);
|
||||
@ -3319,7 +3291,7 @@ public class Plot {
|
||||
Location pos4 = pos2.clone().add(offsetX, 0, offsetZ);
|
||||
pos3.setWorld(destination.getWorldName());
|
||||
pos4.setWorld(destination.getWorldName());
|
||||
ChunkManager.manager.swap(pos1, pos2, pos3, pos4, this);
|
||||
RegionManager.manager.swap(pos1, pos2, pos3, pos4, this);
|
||||
}
|
||||
}
|
||||
}.run();
|
||||
@ -3351,7 +3323,7 @@ public class Plot {
|
||||
final Location pos2 = corners[1];
|
||||
Location newPos = pos1.clone().add(offsetX, 0, offsetZ);
|
||||
newPos.setWorld(destination.getWorldName());
|
||||
ChunkManager.manager.copyRegion(pos1, pos2, newPos, task);
|
||||
RegionManager.manager.copyRegion(pos1, pos2, newPos, task);
|
||||
}
|
||||
}.run();
|
||||
}
|
||||
@ -3446,7 +3418,7 @@ public class Plot {
|
||||
Location pos2 = corners[1];
|
||||
Location newPos = pos1.clone().add(offsetX, 0, offsetZ);
|
||||
newPos.setWorld(destination.getWorldName());
|
||||
ChunkManager.manager.copyRegion(pos1, pos2, newPos, this);
|
||||
RegionManager.manager.copyRegion(pos1, pos2, newPos, this);
|
||||
}
|
||||
};
|
||||
run.run();
|
||||
|
@ -146,9 +146,11 @@ public class FlagContainer {
|
||||
this.updateSubscribers
|
||||
.forEach(subscriber -> subscriber.handle(flag, plotFlagUpdateType));
|
||||
} catch (IllegalStateException e) {
|
||||
PlotSquared.log(String.format("Flag '%s' (class: '%s') could not be added to the container"
|
||||
+ " because the flag name exceeded the allowed limit of 64 characters."
|
||||
+ " Please tell the developer of that flag to fix this.", flag.getName(), flag.getClass().getName()));
|
||||
PlotSquared.log(String.format(
|
||||
"Flag '%s' (class: '%s') could not be added to the container"
|
||||
+ " because the flag name exceeded the allowed limit of 64 characters."
|
||||
+ " Please tell the developer of that flag to fix this.", flag.getName(),
|
||||
flag.getClass().getName()));
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
@ -31,7 +31,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class KeepInventoryFlag extends BooleanFlag<KeepInventoryFlag> {
|
||||
|
||||
public static final KeepInventoryFlag KEEP_INVENTORY_TRUE = new KeepInventoryFlag(true);
|
||||
public static final KeepInventoryFlag KEEP_INVENTORY_TRUE = new KeepInventoryFlag(true);
|
||||
public static final KeepInventoryFlag KEEP_INVENTORY_FALSE = new KeepInventoryFlag(false);
|
||||
|
||||
private KeepInventoryFlag(final boolean value) {
|
||||
|
@ -31,8 +31,10 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class PreventCreativeCopyFlag extends BooleanFlag<PreventCreativeCopyFlag> {
|
||||
|
||||
public static final PreventCreativeCopyFlag PREVENT_CREATIVE_COPY_TRUE = new PreventCreativeCopyFlag(true);
|
||||
public static final PreventCreativeCopyFlag PREVENT_CREATIVE_COPY_FALSE = new PreventCreativeCopyFlag(false);
|
||||
public static final PreventCreativeCopyFlag PREVENT_CREATIVE_COPY_TRUE =
|
||||
new PreventCreativeCopyFlag(true);
|
||||
public static final PreventCreativeCopyFlag PREVENT_CREATIVE_COPY_FALSE =
|
||||
new PreventCreativeCopyFlag(false);
|
||||
|
||||
private PreventCreativeCopyFlag(@NotNull final Boolean value) {
|
||||
super(value, Captions.FLAG_DESCRIPTION_PREVENT_CREATIVE_COPY);
|
||||
|
@ -87,8 +87,7 @@ public abstract class BlockTypeListFlag<F extends ListFlag<BlockTypeWrapper, F>>
|
||||
|
||||
private BlockTypeWrapper getCategory(final String blockString) throws FlagParseException {
|
||||
if (!blockString.startsWith("#")) {
|
||||
throw new FlagParseException(this, blockString,
|
||||
Captions.FLAG_ERROR_INVALID_BLOCK);
|
||||
throw new FlagParseException(this, blockString, Captions.FLAG_ERROR_INVALID_BLOCK);
|
||||
}
|
||||
String categoryId = blockString.substring(1);
|
||||
BlockTypeWrapper blockTypeWrapper;
|
||||
@ -97,8 +96,7 @@ public abstract class BlockTypeListFlag<F extends ListFlag<BlockTypeWrapper, F>>
|
||||
} else {
|
||||
BlockCategory blockCategory = BlockCategory.REGISTRY.get(categoryId);
|
||||
if (blockCategory == null) {
|
||||
throw new FlagParseException(this, blockString,
|
||||
Captions.FLAG_ERROR_INVALID_BLOCK);
|
||||
throw new FlagParseException(this, blockString, Captions.FLAG_ERROR_INVALID_BLOCK);
|
||||
}
|
||||
blockTypeWrapper = BlockTypeWrapper.get(blockCategory);
|
||||
}
|
||||
|
@ -109,9 +109,9 @@ public class BlockTypeWrapper {
|
||||
*
|
||||
* @return the block category represented by this wrapper.
|
||||
*/
|
||||
@Nullable
|
||||
public BlockCategory getBlockCategory() {
|
||||
if (this.blockCategory == null && this.blockCategoryId != null) { // only if name is available
|
||||
@Nullable public BlockCategory getBlockCategory() {
|
||||
if (this.blockCategory == null
|
||||
&& this.blockCategoryId != null) { // only if name is available
|
||||
this.blockCategory = BlockCategory.REGISTRY.get(this.blockCategoryId);
|
||||
if (this.blockCategory == null && !BlockCategory.REGISTRY.values().isEmpty()) {
|
||||
PlotSquared.debug("- Block category #" + this.blockCategoryId + " does not exist");
|
||||
@ -121,17 +121,17 @@ public class BlockTypeWrapper {
|
||||
return this.blockCategory;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
@Override public boolean equals(final Object o) {
|
||||
if (this == o)
|
||||
return true;
|
||||
if (o == null || getClass() != o.getClass())
|
||||
return false;
|
||||
BlockTypeWrapper that = (BlockTypeWrapper) o;
|
||||
return Objects.equal(this.blockType, that.blockType) &&
|
||||
Objects.equal(this.blockCategoryId, that.blockCategoryId);
|
||||
return Objects.equal(this.blockType, that.blockType) && Objects
|
||||
.equal(this.blockCategoryId, that.blockCategoryId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
@Override public int hashCode() {
|
||||
return Objects.hashCode(this.blockType, this.blockCategoryId);
|
||||
}
|
||||
|
||||
@ -143,7 +143,8 @@ public class BlockTypeWrapper {
|
||||
}
|
||||
|
||||
public static BlockTypeWrapper get(final BlockCategory blockCategory) {
|
||||
return blockCategories.computeIfAbsent(blockCategory.getId(), id -> new BlockTypeWrapper(blockCategory));
|
||||
return blockCategories
|
||||
.computeIfAbsent(blockCategory.getId(), id -> new BlockTypeWrapper(blockCategory));
|
||||
}
|
||||
|
||||
public static BlockTypeWrapper get(final String blockCategoryId) {
|
||||
@ -159,8 +160,7 @@ public class BlockTypeWrapper {
|
||||
super(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <B extends BlockStateHolder<B>> boolean contains(B blockStateHolder) {
|
||||
@Override public <B extends BlockStateHolder<B>> boolean contains(B blockStateHolder) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -36,12 +36,8 @@ import com.plotsquared.core.util.task.TaskManager;
|
||||
import com.sk89q.worldedit.math.BlockVector2;
|
||||
import com.sk89q.worldedit.regions.CuboidRegion;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
@ -53,12 +49,6 @@ public abstract class ChunkManager {
|
||||
new ConcurrentHashMap<>();
|
||||
public static ChunkManager manager = null;
|
||||
|
||||
public static BlockVector2 getRegion(Location location) {
|
||||
int x = location.getX() >> 9;
|
||||
int z = location.getZ() >> 9;
|
||||
return BlockVector2.at(x, z);
|
||||
}
|
||||
|
||||
public static void setChunkInPlotArea(RunnableVal<ScopedLocalBlockQueue> force,
|
||||
RunnableVal<ScopedLocalBlockQueue> add, String world, BlockVector2 loc) {
|
||||
LocalBlockQueue queue = GlobalBlockQueue.IMP.getNewQueue(world, false);
|
||||
@ -108,45 +98,6 @@ public abstract class ChunkManager {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void largeRegionTask(final String world, final CuboidRegion region,
|
||||
final RunnableVal<BlockVector2> task, final Runnable whenDone) {
|
||||
TaskManager.runTaskAsync(() -> {
|
||||
HashSet<BlockVector2> chunks = new HashSet<>();
|
||||
Set<BlockVector2> mcrs = manager.getChunkChunks(world);
|
||||
for (BlockVector2 mcr : mcrs) {
|
||||
int bx = mcr.getX() << 9;
|
||||
int bz = mcr.getZ() << 9;
|
||||
int tx = bx + 511;
|
||||
int tz = bz + 511;
|
||||
if (bx <= region.getMaximumPoint().getX() && tx >= region.getMinimumPoint().getX()
|
||||
&& bz <= region.getMaximumPoint().getZ() && tz >= region.getMinimumPoint()
|
||||
.getZ()) {
|
||||
for (int x = bx >> 4; x <= (tx >> 4); x++) {
|
||||
int cbx = x << 4;
|
||||
int ctx = cbx + 15;
|
||||
if (cbx <= region.getMaximumPoint().getX() && ctx >= region
|
||||
.getMinimumPoint().getX()) {
|
||||
for (int z = bz >> 4; z <= (tz >> 4); z++) {
|
||||
int cbz = z << 4;
|
||||
int ctz = cbz + 15;
|
||||
if (cbz <= region.getMaximumPoint().getZ() && ctz >= region
|
||||
.getMinimumPoint().getZ()) {
|
||||
chunks.add(BlockVector2.at(x, z));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
TaskManager.objectTask(chunks, new RunnableVal<BlockVector2>() {
|
||||
|
||||
@Override public void run(BlockVector2 value) {
|
||||
manager.loadChunk(world, value, false).thenRun(() -> task.run(value));
|
||||
}
|
||||
}, whenDone);
|
||||
});
|
||||
}
|
||||
|
||||
public static void chunkTask(final Plot plot, final RunnableVal<int[]> task,
|
||||
final Runnable whenDone, final int allocate) {
|
||||
final ArrayList<CuboidRegion> regions = new ArrayList<>(plot.getRegions());
|
||||
@ -231,69 +182,10 @@ public abstract class ChunkManager {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 0 = Entity
|
||||
* 1 = Animal
|
||||
* 2 = Monster
|
||||
* 3 = Mob
|
||||
* 4 = Boat
|
||||
* 5 = Misc
|
||||
*
|
||||
* @param plot
|
||||
* @return
|
||||
*/
|
||||
public abstract int[] countEntities(Plot plot);
|
||||
|
||||
public abstract CompletableFuture loadChunk(String world, BlockVector2 loc, boolean force);
|
||||
|
||||
public abstract void unloadChunk(String world, BlockVector2 loc, boolean save);
|
||||
|
||||
public Set<BlockVector2> getChunkChunks(String world) {
|
||||
File folder =
|
||||
new File(PlotSquared.get().IMP.getWorldContainer(), world + File.separator + "region");
|
||||
File[] regionFiles = folder.listFiles();
|
||||
if (regionFiles == null) {
|
||||
throw new RuntimeException(
|
||||
"Could not find worlds folder: " + folder + " ? (no read access?)");
|
||||
}
|
||||
HashSet<BlockVector2> chunks = new HashSet<>();
|
||||
for (File file : regionFiles) {
|
||||
String name = file.getName();
|
||||
if (name.endsWith("mca")) {
|
||||
String[] split = name.split("\\.");
|
||||
try {
|
||||
int x = Integer.parseInt(split[1]);
|
||||
int z = Integer.parseInt(split[2]);
|
||||
BlockVector2 loc = BlockVector2.at(x, z);
|
||||
chunks.add(loc);
|
||||
} catch (NumberFormatException ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
return chunks;
|
||||
}
|
||||
|
||||
public void deleteRegionFiles(String world, Collection<BlockVector2> chunks) {
|
||||
deleteRegionFiles(world, chunks, null);
|
||||
}
|
||||
|
||||
public void deleteRegionFiles(final String world, final Collection<BlockVector2> chunks,
|
||||
final Runnable whenDone) {
|
||||
TaskManager.runTaskAsync(() -> {
|
||||
for (BlockVector2 loc : chunks) {
|
||||
String directory =
|
||||
world + File.separator + "region" + File.separator + "r." + loc.getX() + "."
|
||||
+ loc.getZ() + ".mca";
|
||||
File file = new File(PlotSquared.get().IMP.getWorldContainer(), directory);
|
||||
PlotSquared.log("&6 - Deleting file: " + file.getName() + " (max 1024 chunks)");
|
||||
if (file.exists()) {
|
||||
file.delete();
|
||||
}
|
||||
}
|
||||
TaskManager.runTask(whenDone);
|
||||
});
|
||||
}
|
||||
|
||||
public Plot hasPlot(String world, BlockVector2 chunk) {
|
||||
int x1 = chunk.getX() << 4;
|
||||
int z1 = chunk.getZ() << 4;
|
||||
@ -309,27 +201,4 @@ public abstract class ChunkManager {
|
||||
return plot;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy a region to a new location (in the same world)
|
||||
*/
|
||||
public abstract boolean copyRegion(Location pos1, Location pos2, Location newPos,
|
||||
Runnable whenDone);
|
||||
|
||||
/**
|
||||
* Assumptions:<br>
|
||||
* - pos1 and pos2 are in the same plot<br>
|
||||
* It can be harmful to the world if parameters outside this scope are provided
|
||||
*
|
||||
* @param pos1
|
||||
* @param pos2
|
||||
* @param whenDone
|
||||
* @return
|
||||
*/
|
||||
public abstract boolean regenerateRegion(Location pos1, Location pos2, boolean ignoreAugment,
|
||||
Runnable whenDone);
|
||||
|
||||
public abstract void clearAllEntities(Location pos1, Location pos2);
|
||||
|
||||
public abstract void swap(Location bot1, Location top1, Location bot2, Location top2,
|
||||
Runnable whenDone);
|
||||
}
|
||||
|
176
Core/src/main/java/com/plotsquared/core/util/RegionManager.java
Normal file
176
Core/src/main/java/com/plotsquared/core/util/RegionManager.java
Normal file
@ -0,0 +1,176 @@
|
||||
/*
|
||||
* _____ _ _ _____ _
|
||||
* | __ \| | | | / ____| | |
|
||||
* | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| |
|
||||
* | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` |
|
||||
* | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| |
|
||||
* |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_|
|
||||
* | |
|
||||
* |_|
|
||||
* PlotSquared plot management system for Minecraft
|
||||
* Copyright (C) 2020 IntellectualSites
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.plotsquared.core.util;
|
||||
|
||||
import com.plotsquared.core.PlotSquared;
|
||||
import com.plotsquared.core.location.Location;
|
||||
import com.plotsquared.core.plot.Plot;
|
||||
import com.plotsquared.core.util.task.RunnableVal;
|
||||
import com.plotsquared.core.util.task.TaskManager;
|
||||
import com.sk89q.worldedit.math.BlockVector2;
|
||||
import com.sk89q.worldedit.regions.CuboidRegion;
|
||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public abstract class RegionManager {
|
||||
|
||||
public static RegionManager manager = null;
|
||||
|
||||
public static BlockVector2 getRegion(Location location) {
|
||||
int x = location.getX() >> 9;
|
||||
int z = location.getZ() >> 9;
|
||||
return BlockVector2.at(x, z);
|
||||
}
|
||||
|
||||
public static void largeRegionTask(final String world, final CuboidRegion region,
|
||||
final RunnableVal<BlockVector2> task, final Runnable whenDone) {
|
||||
TaskManager.runTaskAsync(() -> {
|
||||
HashSet<BlockVector2> chunks = new HashSet<>();
|
||||
Set<BlockVector2> mcrs = manager.getChunkChunks(world);
|
||||
for (BlockVector2 mcr : mcrs) {
|
||||
int bx = mcr.getX() << 9;
|
||||
int bz = mcr.getZ() << 9;
|
||||
int tx = bx + 511;
|
||||
int tz = bz + 511;
|
||||
if (bx <= region.getMaximumPoint().getX() && tx >= region.getMinimumPoint().getX()
|
||||
&& bz <= region.getMaximumPoint().getZ() && tz >= region.getMinimumPoint()
|
||||
.getZ()) {
|
||||
for (int x = bx >> 4; x <= (tx >> 4); x++) {
|
||||
int cbx = x << 4;
|
||||
int ctx = cbx + 15;
|
||||
if (cbx <= region.getMaximumPoint().getX() && ctx >= region
|
||||
.getMinimumPoint().getX()) {
|
||||
for (int z = bz >> 4; z <= (tz >> 4); z++) {
|
||||
int cbz = z << 4;
|
||||
int ctz = cbz + 15;
|
||||
if (cbz <= region.getMaximumPoint().getZ() && ctz >= region
|
||||
.getMinimumPoint().getZ()) {
|
||||
chunks.add(BlockVector2.at(x, z));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
TaskManager.objectTask(chunks, new RunnableVal<BlockVector2>() {
|
||||
@Override public void run(BlockVector2 value) {
|
||||
ChunkManager.manager.loadChunk(world, value, false)
|
||||
.thenRun(() -> task.run(value));
|
||||
}
|
||||
}, whenDone);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 0 = Entity
|
||||
* 1 = Animal
|
||||
* 2 = Monster
|
||||
* 3 = Mob
|
||||
* 4 = Boat
|
||||
* 5 = Misc
|
||||
*
|
||||
* @param plot
|
||||
* @return
|
||||
*/
|
||||
public abstract int[] countEntities(Plot plot);
|
||||
|
||||
public Set<BlockVector2> getChunkChunks(String world) {
|
||||
File folder =
|
||||
new File(PlotSquared.get().IMP.getWorldContainer(), world + File.separator + "region");
|
||||
File[] regionFiles = folder.listFiles();
|
||||
if (regionFiles == null) {
|
||||
throw new RuntimeException(
|
||||
"Could not find worlds folder: " + folder + " ? (no read access?)");
|
||||
}
|
||||
HashSet<BlockVector2> chunks = new HashSet<>();
|
||||
for (File file : regionFiles) {
|
||||
String name = file.getName();
|
||||
if (name.endsWith("mca")) {
|
||||
String[] split = name.split("\\.");
|
||||
try {
|
||||
int x = Integer.parseInt(split[1]);
|
||||
int z = Integer.parseInt(split[2]);
|
||||
BlockVector2 loc = BlockVector2.at(x, z);
|
||||
chunks.add(loc);
|
||||
} catch (NumberFormatException ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
return chunks;
|
||||
}
|
||||
|
||||
public void deleteRegionFiles(String world, Collection<BlockVector2> chunks) {
|
||||
deleteRegionFiles(world, chunks, null);
|
||||
}
|
||||
|
||||
public void deleteRegionFiles(final String world, final Collection<BlockVector2> chunks,
|
||||
final Runnable whenDone) {
|
||||
TaskManager.runTaskAsync(() -> {
|
||||
for (BlockVector2 loc : chunks) {
|
||||
String directory =
|
||||
world + File.separator + "region" + File.separator + "r." + loc.getX() + "."
|
||||
+ loc.getZ() + ".mca";
|
||||
File file = new File(PlotSquared.get().IMP.getWorldContainer(), directory);
|
||||
PlotSquared.log("&6 - Deleting file: " + file.getName() + " (max 1024 chunks)");
|
||||
if (file.exists()) {
|
||||
file.delete();
|
||||
}
|
||||
}
|
||||
TaskManager.runTask(whenDone);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy a region to a new location (in the same world)
|
||||
*/
|
||||
public abstract boolean copyRegion(Location pos1, Location pos2, Location newPos,
|
||||
Runnable whenDone);
|
||||
|
||||
/**
|
||||
* Assumptions:<br>
|
||||
* - pos1 and pos2 are in the same plot<br>
|
||||
* It can be harmful to the world if parameters outside this scope are provided
|
||||
*
|
||||
* @param pos1
|
||||
* @param pos2
|
||||
* @param whenDone
|
||||
* @return
|
||||
*/
|
||||
public abstract boolean regenerateRegion(Location pos1, Location pos2, boolean ignoreAugment,
|
||||
Runnable whenDone);
|
||||
|
||||
public abstract void clearAllEntities(Location pos1, Location pos2);
|
||||
|
||||
public abstract void swap(Location bot1, Location top1, Location bot2, Location top2,
|
||||
Runnable whenDone);
|
||||
|
||||
public abstract void setBiome(CuboidRegion region, int extendBiome, BiomeType biome,
|
||||
String world, Runnable whenDone);
|
||||
}
|
@ -149,7 +149,7 @@ public abstract class WorldUtil {
|
||||
int trx = top.getX() >> 9;
|
||||
int trz = top.getZ() >> 9;
|
||||
Set<BlockVector2> files =
|
||||
ChunkManager.manager.getChunkChunks(bot.getWorld());
|
||||
RegionManager.manager.getChunkChunks(bot.getWorld());
|
||||
for (BlockVector2 mca : files) {
|
||||
if (mca.getX() >= brx && mca.getX() <= trx && mca.getZ() >= brz
|
||||
&& mca.getZ() <= trz) {
|
||||
|
@ -28,7 +28,6 @@ package com.plotsquared.core.util.task;
|
||||
import com.plotsquared.core.PlotSquared;
|
||||
import com.plotsquared.core.command.Auto;
|
||||
import com.plotsquared.core.configuration.Captions;
|
||||
import com.plotsquared.core.database.DBFunc;
|
||||
import com.plotsquared.core.events.PlotMergeEvent;
|
||||
import com.plotsquared.core.events.Result;
|
||||
import com.plotsquared.core.location.Direction;
|
||||
|
Reference in New Issue
Block a user