mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2025-07-04 06:34:42 +02:00
Compare commits
7 Commits
sponge
...
refactor/v
Author | SHA1 | Date | |
---|---|---|---|
12463dbb1c | |||
6a5859ee0f | |||
59e0b4b67a | |||
5fc153d896 | |||
a003836dbc | |||
42bf413528 | |||
827f46566c |
2
.github/workflows/release-drafter.yml
vendored
2
.github/workflows/release-drafter.yml
vendored
@ -13,6 +13,6 @@ jobs:
|
|||||||
update_release_draft:
|
update_release_draft:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: release-drafter/release-drafter@v5.17.5
|
- uses: release-drafter/release-drafter@v5.17.6
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
4
.lift.toml
Normal file
4
.lift.toml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
jdkVersion = "17"
|
||||||
|
build = "gradle clean build -x test"
|
||||||
|
tools = ["findsecbugs", "ErrorProne", "Semgrep", "Detekt", "Infer"]
|
||||||
|
ignoreRules = ["CatchAndPrintStackTrace", "ReferenceEquality", "FallThrough", "FutureReturnValueIgnored", "MixedMutabilityReturnType", "EmptyCatch", "MissingCasesInEnumSwitch", "OperatorPrecedence", "StaticAssignmentInConstructor", "ReferenceEquality", "EqualsHashCode", "EqualsGetClass", "TypeParameterUnusedInFormals", "StringSplitter", "InlineMeSuggester", "NULL_DEREFERENCE"]
|
@ -218,6 +218,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
private PlatformWorldManager<World> worldManager;
|
private PlatformWorldManager<World> worldManager;
|
||||||
private Locale serverLocale;
|
private Locale serverLocale;
|
||||||
|
|
||||||
|
@SuppressWarnings("StringSplitter")
|
||||||
@Override
|
@Override
|
||||||
public int @NonNull [] serverVersion() {
|
public int @NonNull [] serverVersion() {
|
||||||
if (this.version == null) {
|
if (this.version == null) {
|
||||||
@ -323,8 +324,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
// Comments
|
// Comments
|
||||||
CommentManager.registerDefaultInboxes();
|
CommentManager.registerDefaultInboxes();
|
||||||
|
|
||||||
plotSquared.startExpiryTasks();
|
|
||||||
|
|
||||||
// Do stuff that was previously done in PlotSquared
|
// Do stuff that was previously done in PlotSquared
|
||||||
// Kill entities
|
// Kill entities
|
||||||
if (Settings.Enabled_Components.KILL_ROAD_MOBS || Settings.Enabled_Components.KILL_ROAD_VEHICLES) {
|
if (Settings.Enabled_Components.KILL_ROAD_MOBS || Settings.Enabled_Components.KILL_ROAD_VEHICLES) {
|
||||||
@ -421,6 +420,8 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
}, TaskTime.ticks(1L));
|
}, TaskTime.ticks(1L));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
plotSquared.startExpiryTasks();
|
||||||
|
|
||||||
// Once the server has loaded force updating all generators known to P2
|
// Once the server has loaded force updating all generators known to P2
|
||||||
TaskManager.runTaskLater(() -> PlotSquared.platform().setupUtils().updateGenerators(true), TaskTime.ticks(1L));
|
TaskManager.runTaskLater(() -> PlotSquared.platform().setupUtils().updateGenerators(true), TaskTime.ticks(1L));
|
||||||
|
|
||||||
@ -970,7 +971,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
}
|
}
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
entity.remove();
|
entity.remove();
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -982,7 +982,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
}
|
}
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
entity.remove();
|
entity.remove();
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1223,7 +1222,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@NonNull
|
@NonNull
|
||||||
@SuppressWarnings("ALL")
|
@SuppressWarnings("unchecked")
|
||||||
public PlayerManager<? extends PlotPlayer<Player>, ? extends Player> playerManager() {
|
public PlayerManager<? extends PlotPlayer<Player>, ? extends Player> playerManager() {
|
||||||
return (PlayerManager<BukkitPlayer, Player>) injector().getInstance(PlayerManager.class);
|
return (PlayerManager<BukkitPlayer, Player>) injector().getInstance(PlayerManager.class);
|
||||||
}
|
}
|
||||||
|
@ -461,6 +461,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
this.tamed.tamed = tamed.isTamed();
|
this.tamed.tamed = tamed.isTamed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // Paper deprecation
|
||||||
@Override
|
@Override
|
||||||
public Entity spawn(World world, int xOffset, int zOffset) {
|
public Entity spawn(World world, int xOffset, int zOffset) {
|
||||||
Location location = new Location(world, this.getX() + xOffset, this.getY(), this.z + zOffset);
|
Location location = new Location(world, this.getX() + xOffset, this.getY(), this.z + zOffset);
|
||||||
|
@ -36,6 +36,7 @@ import org.bukkit.World;
|
|||||||
|
|
||||||
public class WorldManagerModule extends AbstractModule {
|
public class WorldManagerModule extends AbstractModule {
|
||||||
|
|
||||||
|
@SuppressWarnings("removal") // Internal use only
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
PlatformWorldManager<World> provideWorldManager() {
|
PlatformWorldManager<World> provideWorldManager() {
|
||||||
|
@ -60,7 +60,7 @@ import java.util.List;
|
|||||||
|
|
||||||
public class EntitySpawnListener implements Listener {
|
public class EntitySpawnListener implements Listener {
|
||||||
|
|
||||||
private final static String KEY = "P2";
|
private static final String KEY = "P2";
|
||||||
private static boolean ignoreTP = false;
|
private static boolean ignoreTP = false;
|
||||||
private static boolean hasPlotArea = false;
|
private static boolean hasPlotArea = false;
|
||||||
private static String areaName = null;
|
private static String areaName = null;
|
||||||
|
@ -36,7 +36,6 @@ import com.plotsquared.core.plot.world.PlotAreaManager;
|
|||||||
import net.kyori.adventure.text.minimessage.Template;
|
import net.kyori.adventure.text.minimessage.Template;
|
||||||
import org.bukkit.block.Banner;
|
import org.bukkit.block.Banner;
|
||||||
import org.bukkit.block.Beacon;
|
import org.bukkit.block.Beacon;
|
||||||
import org.bukkit.block.Bed;
|
|
||||||
import org.bukkit.block.BlockState;
|
import org.bukkit.block.BlockState;
|
||||||
import org.bukkit.block.CommandBlock;
|
import org.bukkit.block.CommandBlock;
|
||||||
import org.bukkit.block.Comparator;
|
import org.bukkit.block.Comparator;
|
||||||
@ -51,6 +50,7 @@ import org.bukkit.block.Jukebox;
|
|||||||
import org.bukkit.block.Sign;
|
import org.bukkit.block.Sign;
|
||||||
import org.bukkit.block.Skull;
|
import org.bukkit.block.Skull;
|
||||||
import org.bukkit.block.Structure;
|
import org.bukkit.block.Structure;
|
||||||
|
import org.bukkit.block.data.type.Bed;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.block.BlockPlaceEvent;
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
@ -154,7 +154,6 @@ import org.checkerframework.checker.nullness.qual.NonNull;
|
|||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
@ -224,6 +223,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("StringSplitter")
|
||||||
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
|
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
|
||||||
public void playerCommand(PlayerCommandPreprocessEvent event) {
|
public void playerCommand(PlayerCommandPreprocessEvent event) {
|
||||||
String msg = event.getMessage().toLowerCase().replaceAll("/", "").trim();
|
String msg = event.getMessage().toLowerCase().replaceAll("/", "").trim();
|
||||||
@ -379,6 +379,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
|
|||||||
this.eventDispatcher.doRespawnTask(pp);
|
this.eventDispatcher.doRespawnTask(pp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // We explicitly want #getHomeSynchronous here
|
||||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
public void onTeleport(PlayerTeleportEvent event) {
|
public void onTeleport(PlayerTeleportEvent event) {
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
@ -1063,9 +1064,13 @@ public class PlayerEventListener extends PlotListener implements Listener {
|
|||||||
if (area == null) {
|
if (area == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
PlayerBlockEventType eventType = null;
|
PlayerBlockEventType eventType;
|
||||||
BlockType blocktype1;
|
BlockType blocktype1;
|
||||||
Block block = event.getClickedBlock();
|
Block block = event.getClickedBlock();
|
||||||
|
if (block == null) {
|
||||||
|
// We do not care in this case, the player is likely interacting with air ("nothing").
|
||||||
|
return;
|
||||||
|
}
|
||||||
Location location = BukkitUtil.adapt(block.getLocation());
|
Location location = BukkitUtil.adapt(block.getLocation());
|
||||||
Action action = event.getAction();
|
Action action = event.getAction();
|
||||||
switch (action) {
|
switch (action) {
|
||||||
@ -1667,6 +1672,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // #getLocate is needed for Spigot compatibility
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onLocaleChange(final PlayerLocaleChangeEvent event) {
|
public void onLocaleChange(final PlayerLocaleChangeEvent event) {
|
||||||
// The event is fired before the player is deemed online upon login
|
// The event is fired before the player is deemed online upon login
|
||||||
|
@ -43,7 +43,6 @@ import java.lang.reflect.Method;
|
|||||||
|
|
||||||
import static com.plotsquared.core.util.ReflectionUtils.getRefClass;
|
import static com.plotsquared.core.util.ReflectionUtils.getRefClass;
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public class SingleWorldListener implements Listener {
|
public class SingleWorldListener implements Listener {
|
||||||
|
|
||||||
private final Method methodGetHandleChunk;
|
private final Method methodGetHandleChunk;
|
||||||
|
@ -162,6 +162,7 @@ public class BukkitPlayer extends PlotPlayer<Player> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("StringSplitter")
|
||||||
@Override
|
@Override
|
||||||
@NonNegative
|
@NonNegative
|
||||||
public int hasPermissionRange(
|
public int hasPermissionRange(
|
||||||
@ -319,7 +320,7 @@ public class BukkitPlayer extends PlotPlayer<Player> {
|
|||||||
if (id == ItemTypes.AIR) {
|
if (id == ItemTypes.AIR) {
|
||||||
// Let's just stop all the discs because why not?
|
// Let's just stop all the discs because why not?
|
||||||
for (final Sound sound : Arrays.stream(Sound.values())
|
for (final Sound sound : Arrays.stream(Sound.values())
|
||||||
.filter(sound -> sound.name().contains("DISC")).collect(Collectors.toList())) {
|
.filter(sound -> sound.name().contains("DISC")).toList()) {
|
||||||
player.stopSound(sound);
|
player.stopSound(sound);
|
||||||
}
|
}
|
||||||
// this.player.playEffect(BukkitUtil.getLocation(location), Effect.RECORD_PLAY, Material.AIR);
|
// this.player.playEffect(BukkitUtil.getLocation(location), Effect.RECORD_PLAY, Material.AIR);
|
||||||
@ -331,6 +332,7 @@ public class BukkitPlayer extends PlotPlayer<Player> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // Needed for Spigot compatibility
|
||||||
@Override
|
@Override
|
||||||
public void kick(final String message) {
|
public void kick(final String message) {
|
||||||
this.player.kickPlayer(message);
|
this.player.kickPlayer(message);
|
||||||
|
@ -51,7 +51,6 @@ import com.sk89q.worldedit.world.biome.BiomeType;
|
|||||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||||
import com.sk89q.worldedit.world.block.BlockState;
|
import com.sk89q.worldedit.world.block.BlockState;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Chunk;
|
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.Container;
|
import org.bukkit.block.Container;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
@ -199,7 +198,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (localChunk.getTiles().size() > 0) {
|
if (localChunk.getTiles().size() > 0) {
|
||||||
localChunk.getTiles().forEach(((blockVector3, tag) -> {
|
localChunk.getTiles().forEach((blockVector3, tag) -> {
|
||||||
try {
|
try {
|
||||||
BaseBlock block = getWorld().getBlock(blockVector3).toBaseBlock(tag);
|
BaseBlock block = getWorld().getBlock(blockVector3).toBaseBlock(tag);
|
||||||
getWorld().setBlock(blockVector3, block, noSideEffectSet);
|
getWorld().setBlock(blockVector3, block, noSideEffectSet);
|
||||||
@ -207,7 +206,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
|
|||||||
StateWrapper sw = new StateWrapper(tag);
|
StateWrapper sw = new StateWrapper(tag);
|
||||||
sw.restoreTag(getWorld().getName(), blockVector3.getX(), blockVector3.getY(), blockVector3.getZ());
|
sw.restoreTag(getWorld().getName(), blockVector3.getX(), blockVector3.getY(), blockVector3.getZ());
|
||||||
}
|
}
|
||||||
}));
|
});
|
||||||
}
|
}
|
||||||
if (localChunk.getEntities().size() > 0) {
|
if (localChunk.getEntities().size() > 0) {
|
||||||
localChunk.getEntities().forEach((location, entity) -> getWorld().createEntity(location, entity));
|
localChunk.getEntities().forEach((location, entity) -> getWorld().createEntity(location, entity));
|
||||||
@ -238,6 +237,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
|
|||||||
/**
|
/**
|
||||||
* Set a block to the world. First tries WNA but defaults to normal block setting methods if that fails
|
* Set a block to the world. First tries WNA but defaults to normal block setting methods if that fails
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("unused")
|
||||||
private void setWorldBlock(int x, int y, int z, @NonNull BaseBlock block, @NonNull BlockVector2 blockVector2, boolean edge) {
|
private void setWorldBlock(int x, int y, int z, @NonNull BaseBlock block, @NonNull BlockVector2 blockVector2, boolean edge) {
|
||||||
try {
|
try {
|
||||||
BlockVector3 loc = BlockVector3.at(x, y, z);
|
BlockVector3 loc = BlockVector3.at(x, y, z);
|
||||||
@ -266,9 +266,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
|
|||||||
} catch (WorldEditException ignored) {
|
} catch (WorldEditException ignored) {
|
||||||
// Fallback to not so nice method
|
// Fallback to not so nice method
|
||||||
BlockData blockData = BukkitAdapter.adapt(block);
|
BlockData blockData = BukkitAdapter.adapt(block);
|
||||||
Chunk chunk = getBukkitWorld().getChunkAt(blockVector2.getX(), blockVector2.getZ());
|
Block existing = getBukkitWorld().getBlockAt(x, y, z);
|
||||||
|
|
||||||
Block existing = chunk.getBlock(x, y, z);
|
|
||||||
final BlockState existingBaseBlock = BukkitAdapter.adapt(existing.getBlockData());
|
final BlockState existingBaseBlock = BukkitAdapter.adapt(existing.getBlockData());
|
||||||
if (BukkitBlockUtil.get(existing).equals(existingBaseBlock) && existing.getBlockData().matches(blockData)) {
|
if (BukkitBlockUtil.get(existing).equals(existingBaseBlock) && existing.getBlockData().matches(blockData)) {
|
||||||
return;
|
return;
|
||||||
|
@ -166,6 +166,7 @@ public class StateWrapper {
|
|||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // #setLine is needed for Spigot compatibility
|
||||||
public boolean restoreTag(String worldName, int x, int y, int z) {
|
public boolean restoreTag(String worldName, int x, int y, int z) {
|
||||||
if (this.tag == null) {
|
if (this.tag == null) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -77,6 +77,7 @@ public class BukkitInventoryUtil extends InventoryUtil {
|
|||||||
return stack;
|
return stack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // Paper deprecation
|
||||||
@Override
|
@Override
|
||||||
public void open(PlotInventory inv) {
|
public void open(PlotInventory inv) {
|
||||||
BukkitPlayer bp = (BukkitPlayer) inv.getPlayer();
|
BukkitPlayer bp = (BukkitPlayer) inv.getPlayer();
|
||||||
@ -113,6 +114,7 @@ public class BukkitInventoryUtil extends InventoryUtil {
|
|||||||
bp.player.updateInventory();
|
bp.player.updateInventory();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // Paper deprecation
|
||||||
public PlotItemStack getItem(ItemStack item) {
|
public PlotItemStack getItem(ItemStack item) {
|
||||||
if (item == null) {
|
if (item == null) {
|
||||||
return null;
|
return null;
|
||||||
@ -145,6 +147,7 @@ public class BukkitInventoryUtil extends InventoryUtil {
|
|||||||
.toArray(PlotItemStack[]::new);
|
.toArray(PlotItemStack[]::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // #getTitle is needed for Spigot compatibility
|
||||||
@Override
|
@Override
|
||||||
public boolean isOpen(PlotInventory plotInventory) {
|
public boolean isOpen(PlotInventory plotInventory) {
|
||||||
if (!plotInventory.isOpen()) {
|
if (!plotInventory.isOpen()) {
|
||||||
|
@ -61,6 +61,7 @@ public class UpdateUtility implements Listener {
|
|||||||
internalVersion = PlotSquared.get().getVersion();
|
internalVersion = PlotSquared.get().getVersion();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({"deprecation", "DefaultCharset"}) // Suppress Json deprecation, we can't use features from gson 2.8.1 and newer yet
|
||||||
public void updateChecker() {
|
public void updateChecker() {
|
||||||
task = Bukkit.getScheduler().runTaskTimerAsynchronously(this.javaPlugin, () -> {
|
task = Bukkit.getScheduler().runTaskTimerAsynchronously(this.javaPlugin, () -> {
|
||||||
try {
|
try {
|
||||||
@ -68,7 +69,7 @@ public class UpdateUtility implements Listener {
|
|||||||
"https://api.spigotmc.org/simple/0.1/index.php?action=getResource&id=77506")
|
"https://api.spigotmc.org/simple/0.1/index.php?action=getResource&id=77506")
|
||||||
.openConnection();
|
.openConnection();
|
||||||
connection.setRequestMethod("GET");
|
connection.setRequestMethod("GET");
|
||||||
JsonObject result = (new JsonParser())
|
JsonObject result = new JsonParser()
|
||||||
.parse(new JsonReader(new InputStreamReader(connection.getInputStream())))
|
.parse(new JsonReader(new InputStreamReader(connection.getInputStream())))
|
||||||
.getAsJsonObject();
|
.getAsJsonObject();
|
||||||
spigotVersion = result.get("current_version").getAsString();
|
spigotVersion = result.get("current_version").getAsString();
|
||||||
@ -91,7 +92,7 @@ public class UpdateUtility implements Listener {
|
|||||||
notify = false;
|
notify = false;
|
||||||
LOGGER.info("Congratulations! You are running the latest PlotSquared version");
|
LOGGER.info("Congratulations! You are running the latest PlotSquared version");
|
||||||
}
|
}
|
||||||
}, 0L, Settings.UpdateChecker.POLL_RATE * 60 * 20);
|
}, 0L, (long) Settings.UpdateChecker.POLL_RATE * 60 * 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void cancelTask() {
|
private void cancelTask() {
|
||||||
|
@ -75,6 +75,7 @@ public class FaweSchematicHandler extends SchematicHandler {
|
|||||||
return delegate.save(tag, path);
|
return delegate.save(tag, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("removal") // Just the override
|
||||||
@Override
|
@Override
|
||||||
public void upload(final CompoundTag tag, final UUID uuid, final String file, final RunnableVal<URL> whenDone) {
|
public void upload(final CompoundTag tag, final UUID uuid, final String file, final RunnableVal<URL> whenDone) {
|
||||||
delegate.upload(tag, uuid, file, whenDone);
|
delegate.upload(tag, uuid, file, whenDone);
|
||||||
|
@ -342,6 +342,7 @@ public class PlotSquared {
|
|||||||
* @param plotArea the {@link PlotArea} to add.
|
* @param plotArea the {@link PlotArea} to add.
|
||||||
* @see #removePlotArea(PlotArea) To remove the reference
|
* @see #removePlotArea(PlotArea) To remove the reference
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public void addPlotArea(final @NonNull PlotArea plotArea) {
|
public void addPlotArea(final @NonNull PlotArea plotArea) {
|
||||||
HashMap<PlotId, Plot> plots;
|
HashMap<PlotId, Plot> plots;
|
||||||
if (plots_tmp == null || (plots = plots_tmp.remove(plotArea.toString())) == null) {
|
if (plots_tmp == null || (plots = plots_tmp.remove(plotArea.toString())) == null) {
|
||||||
@ -556,6 +557,7 @@ public class PlotSquared {
|
|||||||
*
|
*
|
||||||
* @param input an array of plots to sort
|
* @param input an array of plots to sort
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
private void sortPlotsByHash(final @NonNull Plot @NonNull [] input) {
|
private void sortPlotsByHash(final @NonNull Plot @NonNull [] input) {
|
||||||
List<Plot>[] bucket = new ArrayList[32];
|
List<Plot>[] bucket = new ArrayList[32];
|
||||||
Arrays.fill(bucket, new ArrayList<>());
|
Arrays.fill(bucket, new ArrayList<>());
|
||||||
@ -696,20 +698,12 @@ public class PlotSquared {
|
|||||||
ArrayList<Plot> toReturn = new ArrayList<>(plots.size());
|
ArrayList<Plot> toReturn = new ArrayList<>(plots.size());
|
||||||
for (PlotArea area : areas) {
|
for (PlotArea area : areas) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case CREATION_DATE:
|
case CREATION_DATE -> toReturn.addAll(sortPlotsByTemp(map.get(area)));
|
||||||
toReturn.addAll(sortPlotsByTemp(map.get(area)));
|
case CREATION_DATE_TIMESTAMP -> toReturn.addAll(sortPlotsByTimestamp(map.get(area)));
|
||||||
break;
|
case DISTANCE_FROM_ORIGIN -> toReturn.addAll(sortPlotsByHash(map.get(area)));
|
||||||
case CREATION_DATE_TIMESTAMP:
|
case LAST_MODIFIED -> toReturn.addAll(sortPlotsByModified(map.get(area)));
|
||||||
toReturn.addAll(sortPlotsByTimestamp(map.get(area)));
|
default -> {
|
||||||
break;
|
}
|
||||||
case DISTANCE_FROM_ORIGIN:
|
|
||||||
toReturn.addAll(sortPlotsByHash(map.get(area)));
|
|
||||||
break;
|
|
||||||
case LAST_MODIFIED:
|
|
||||||
toReturn.addAll(sortPlotsByModified(map.get(area)));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return toReturn;
|
return toReturn;
|
||||||
@ -1540,7 +1534,7 @@ public class PlotSquared {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register a caption map. The namespace needs be equal to the namespace used for
|
* Register a caption map. The namespace needs to be equal to the namespace used for
|
||||||
* the {@link TranslatableCaption}s inside the map.
|
* the {@link TranslatableCaption}s inside the map.
|
||||||
*
|
*
|
||||||
* @param namespace Namespace
|
* @param namespace Namespace
|
||||||
|
@ -29,7 +29,8 @@ import java.util.Arrays;
|
|||||||
|
|
||||||
public class ArrayUtil {
|
public class ArrayUtil {
|
||||||
|
|
||||||
public static final <T> T[] concatAll(T[] first, T[]... rest) {
|
@SuppressWarnings("unchecked")
|
||||||
|
public static <T> T[] concatAll(T[] first, T[]... rest) {
|
||||||
int totalLength = first.length;
|
int totalLength = first.length;
|
||||||
for (T[] array : rest) {
|
for (T[] array : rest) {
|
||||||
totalLength += array.length;
|
totalLength += array.length;
|
||||||
|
@ -35,6 +35,7 @@ public class FlatRandomCollection<T> extends RandomCollection<T> {
|
|||||||
|
|
||||||
private final T[] values;
|
private final T[] values;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public FlatRandomCollection(Map<T, Double> weights, Random random) {
|
public FlatRandomCollection(Map<T, Double> weights, Random random) {
|
||||||
super(weights, random);
|
super(weights, random);
|
||||||
int max = 0;
|
int max = 0;
|
||||||
|
@ -241,6 +241,7 @@ public class QuadMap<T> {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public void recalculateSkip() {
|
public void recalculateSkip() {
|
||||||
QuadMap<T> map = null;
|
QuadMap<T> map = null;
|
||||||
for (QuadMap<T> current : new QuadMap[]{this.one, this.two, this.three, this.four}) {
|
for (QuadMap<T> current : new QuadMap[]{this.one, this.two, this.three, this.four}) {
|
||||||
|
@ -58,6 +58,7 @@ import java.util.concurrent.CompletableFuture;
|
|||||||
public class Clear extends Command {
|
public class Clear extends Command {
|
||||||
|
|
||||||
private final EventDispatcher eventDispatcher;
|
private final EventDispatcher eventDispatcher;
|
||||||
|
@SuppressWarnings({"unused", "FieldCanBeLocal"})
|
||||||
private final GlobalBlockQueue blockQueue;
|
private final GlobalBlockQueue blockQueue;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
|
@ -375,7 +375,6 @@ public abstract class Command {
|
|||||||
boolean failed = args.length < reqArgs.length;
|
boolean failed = args.length < reqArgs.length;
|
||||||
String[] baseSplit = getCommandString().split(" ");
|
String[] baseSplit = getCommandString().split(" ");
|
||||||
String[] fullSplit = getUsage().split(" ");
|
String[] fullSplit = getUsage().split(" ");
|
||||||
String base = getCommandString();
|
|
||||||
if (fullSplit.length - baseSplit.length < reqArgs.length) {
|
if (fullSplit.length - baseSplit.length < reqArgs.length) {
|
||||||
String[] tmp = new String[baseSplit.length + reqArgs.length];
|
String[] tmp = new String[baseSplit.length + reqArgs.length];
|
||||||
System.arraycopy(fullSplit, 0, tmp, 0, fullSplit.length);
|
System.arraycopy(fullSplit, 0, tmp, 0, fullSplit.length);
|
||||||
|
@ -69,6 +69,7 @@ public class Condense extends SubCommand {
|
|||||||
this.worldUtil = worldUtil;
|
this.worldUtil = worldUtil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
public boolean onCommand(final PlotPlayer<?> player, String[] args) {
|
public boolean onCommand(final PlotPlayer<?> player, String[] args) {
|
||||||
if (args.length != 2 && args.length != 3) {
|
if (args.length != 2 && args.length != 3) {
|
||||||
|
@ -255,7 +255,7 @@ public class DatabaseCommand extends SubCommand {
|
|||||||
player.sendMessage(TranslatableCaption.of("database.failed_to_save_plots"));
|
player.sendMessage(TranslatableCaption.of("database.failed_to_save_plots"));
|
||||||
player.sendMessage(TranslatableCaption.of("errors.stacktrace_begin"));
|
player.sendMessage(TranslatableCaption.of("errors.stacktrace_begin"));
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
player.sendMessage(TranslatableCaption.of(("errors.stacktrace_end")));
|
player.sendMessage(TranslatableCaption.of("errors.stacktrace_end"));
|
||||||
player.sendMessage(TranslatableCaption.of("database.invalid_args"));
|
player.sendMessage(TranslatableCaption.of("database.invalid_args"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -94,12 +94,12 @@ public class Download extends SubCommand {
|
|||||||
player.sendMessage(TranslatableCaption.of("info.plot_unowned"));
|
player.sendMessage(TranslatableCaption.of("info.plot_unowned"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ((Settings.Done.REQUIRED_FOR_DOWNLOAD && (!DoneFlag.isDone(plot))) && !Permissions
|
if ((Settings.Done.REQUIRED_FOR_DOWNLOAD && !DoneFlag.isDone(plot)) && !Permissions
|
||||||
.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_DOWNLOAD)) {
|
.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_DOWNLOAD)) {
|
||||||
player.sendMessage(TranslatableCaption.of("done.done_not_done"));
|
player.sendMessage(TranslatableCaption.of("done.done_not_done"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ((!plot.isOwner(player.getUUID())) && !Permissions
|
if (!plot.isOwner(player.getUUID()) && !Permissions
|
||||||
.hasPermission(player, Permission.PERMISSION_ADMIN.toString())) {
|
.hasPermission(player, Permission.PERMISSION_ADMIN.toString())) {
|
||||||
player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
|
player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
|
||||||
return false;
|
return false;
|
||||||
|
@ -367,6 +367,7 @@ public final class FlagCommand extends Command {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||||
@CommandDeclaration(command = "add",
|
@CommandDeclaration(command = "add",
|
||||||
aliases = {"a", "add"},
|
aliases = {"a", "add"},
|
||||||
usage = "/plot flag add <flag> <value>",
|
usage = "/plot flag add <flag> <value>",
|
||||||
@ -435,6 +436,7 @@ public final class FlagCommand extends Command {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||||
@CommandDeclaration(command = "remove",
|
@CommandDeclaration(command = "remove",
|
||||||
aliases = {"r", "remove", "delete"},
|
aliases = {"r", "remove", "delete"},
|
||||||
usage = "/plot flag remove <flag> [values]",
|
usage = "/plot flag remove <flag> [values]",
|
||||||
|
@ -112,7 +112,7 @@ public class Like extends SubCommand {
|
|||||||
});
|
});
|
||||||
for (final Plot plot : plots) {
|
for (final Plot plot : plots) {
|
||||||
if ((!Settings.Done.REQUIRED_FOR_RATINGS || DoneFlag.isDone(plot)) && plot
|
if ((!Settings.Done.REQUIRED_FOR_RATINGS || DoneFlag.isDone(plot)) && plot
|
||||||
.isBasePlot() && (!plot.getLikes().containsKey(uuid))) {
|
.isBasePlot() && !plot.getLikes().containsKey(uuid)) {
|
||||||
plot.teleportPlayer(player, TeleportCause.COMMAND_LIKE, result -> {
|
plot.teleportPlayer(player, TeleportCause.COMMAND_LIKE, result -> {
|
||||||
});
|
});
|
||||||
player.sendMessage(TranslatableCaption.of("tutorial.rate_this"));
|
player.sendMessage(TranslatableCaption.of("tutorial.rate_this"));
|
||||||
|
@ -104,7 +104,7 @@ public class Rate extends SubCommand {
|
|||||||
UUID uuid = player.getUUID();
|
UUID uuid = player.getUUID();
|
||||||
for (Plot p : plots) {
|
for (Plot p : plots) {
|
||||||
if ((!Settings.Done.REQUIRED_FOR_RATINGS || DoneFlag.isDone(p)) && p
|
if ((!Settings.Done.REQUIRED_FOR_RATINGS || DoneFlag.isDone(p)) && p
|
||||||
.isBasePlot() && (!p.getRatings().containsKey(uuid)) && !p
|
.isBasePlot() && !p.getRatings().containsKey(uuid) && !p
|
||||||
.isAdded(uuid)) {
|
.isAdded(uuid)) {
|
||||||
p.teleportPlayer(player, TeleportCause.COMMAND_RATE, result -> {
|
p.teleportPlayer(player, TeleportCause.COMMAND_RATE, result -> {
|
||||||
});
|
});
|
||||||
|
@ -88,7 +88,6 @@ public class RegenAllRoads extends SubCommand {
|
|||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
String name = args[0];
|
|
||||||
PlotManager manager = area.getPlotManager();
|
PlotManager manager = area.getPlotManager();
|
||||||
if (!(manager instanceof HybridPlotManager)) {
|
if (!(manager instanceof HybridPlotManager)) {
|
||||||
player.sendMessage(TranslatableCaption.of("errors.invalid_plot_world"));
|
player.sendMessage(TranslatableCaption.of("errors.invalid_plot_world"));
|
||||||
|
@ -181,8 +181,6 @@ public class SchematicCmd extends SubCommand {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
case "saveall", "exportall" -> {
|
case "saveall", "exportall" -> {
|
||||||
Location loc = player.getLocation();
|
|
||||||
final Plot plot = loc.getPlotAbs();
|
|
||||||
if (!(player instanceof ConsolePlayer)) {
|
if (!(player instanceof ConsolePlayer)) {
|
||||||
player.sendMessage(TranslatableCaption.of("console.not_console"));
|
player.sendMessage(TranslatableCaption.of("console.not_console"));
|
||||||
return false;
|
return false;
|
||||||
|
@ -100,7 +100,7 @@ public class Set extends SubCommand {
|
|||||||
|
|
||||||
if (Settings.Enabled_Components.CHUNK_PROCESSOR) {
|
if (Settings.Enabled_Components.CHUNK_PROCESSOR) {
|
||||||
forbiddenTypes.addAll(worldUtil.getTileEntityTypes().stream().map(
|
forbiddenTypes.addAll(worldUtil.getTileEntityTypes().stream().map(
|
||||||
BlockType::getName).collect(Collectors.toList()));
|
BlockType::getName).toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_ALLOW_UNSAFE) &&
|
if (!Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_ALLOW_UNSAFE) &&
|
||||||
|
@ -361,30 +361,4 @@ public class Visit extends Command {
|
|||||||
return completions;
|
return completions;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void completeNumbers(final List<Command> commands, final String arg, final int start) {
|
|
||||||
for (int i = 0; i < 100; i++) {
|
|
||||||
final String command = Integer.toString(start + 1);
|
|
||||||
if (!command.toLowerCase().startsWith(arg.toLowerCase())) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
commands.add(new Command(this, false, command, "",
|
|
||||||
RequiredType.NONE, CommandCategory.TELEPORT
|
|
||||||
) {
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void completeAreas(final List<Command> commands, final String arg) {
|
|
||||||
for (final PlotArea area : this.plotAreaManager.getAllPlotAreas()) {
|
|
||||||
final String areaName = area.getWorldName() + ";" + area.getId();
|
|
||||||
if (!areaName.toLowerCase().startsWith(arg.toLowerCase())) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
commands.add(new Command(this, false, area.getWorldName() + ";" + area.getId(), "",
|
|
||||||
RequiredType.NONE, CommandCategory.TELEPORT
|
|
||||||
) {
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,7 @@ public class ComponentPreset implements ConfigurationSerializable {
|
|||||||
this.icon = icon;
|
this.icon = icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public static ComponentPreset deserialize(final @NonNull Map<String, Object> map) {
|
public static ComponentPreset deserialize(final @NonNull Map<String, Object> map) {
|
||||||
final ClassicPlotManagerComponent classicPlotManagerComponent = ClassicPlotManagerComponent
|
final ClassicPlotManagerComponent classicPlotManagerComponent = ClassicPlotManagerComponent
|
||||||
.fromString(map.getOrDefault("component", "").toString()).orElseThrow(() ->
|
.fromString(map.getOrDefault("component", "").toString()).orElseThrow(() ->
|
||||||
|
@ -75,6 +75,7 @@ public class ComponentPresetManager {
|
|||||||
private final InventoryUtil inventoryUtil;
|
private final InventoryUtil inventoryUtil;
|
||||||
private File componentsFile;
|
private File componentsFile;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
@Inject
|
@Inject
|
||||||
public ComponentPresetManager(final @NonNull EconHandler econHandler, final @NonNull InventoryUtil inventoryUtil) throws
|
public ComponentPresetManager(final @NonNull EconHandler econHandler, final @NonNull InventoryUtil inventoryUtil) throws
|
||||||
IOException {
|
IOException {
|
||||||
|
@ -58,6 +58,7 @@ public class Config {
|
|||||||
* @param <T> value type
|
* @param <T> value type
|
||||||
* @return value
|
* @return value
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public static <T> T get(String key, Class<?> root) {
|
public static <T> T get(String key, Class<?> root) {
|
||||||
String[] split = key.split("\\.");
|
String[] split = key.split("\\.");
|
||||||
Object instance = getInstance(split, root);
|
Object instance = getInstance(split, root);
|
||||||
@ -183,6 +184,7 @@ public class Config {
|
|||||||
return value != null ? value.toString() : "null";
|
return value != null ? value.toString() : "null";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||||
private static void save(PrintWriter writer, Class<?> clazz, Object instance, int indent) {
|
private static void save(PrintWriter writer, Class<?> clazz, Object instance, int indent) {
|
||||||
try {
|
try {
|
||||||
String lineSeparator = System.lineSeparator();
|
String lineSeparator = System.lineSeparator();
|
||||||
@ -258,21 +260,6 @@ public class Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the field for a specific config node.
|
|
||||||
*
|
|
||||||
* @param split the node (split by period)
|
|
||||||
* @param root
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private static Field getField(String[] split, Class<?> root) {
|
|
||||||
Object instance = getInstance(split, root);
|
|
||||||
if (instance == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return getField(split, instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the field for a specific config node and instance<br>
|
* Get the field for a specific config node and instance<br>
|
||||||
* Note: As expiry can have multiple blocks there will be multiple instances
|
* Note: As expiry can have multiple blocks there will be multiple instances
|
||||||
@ -305,6 +292,7 @@ public class Config {
|
|||||||
* @param root
|
* @param root
|
||||||
* @return The instance or null
|
* @return The instance or null
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||||
private static Object getInstance(String[] split, Class<?> root) {
|
private static Object getInstance(String[] split, Class<?> root) {
|
||||||
try {
|
try {
|
||||||
Class<?> clazz = root == null ? MethodHandles.lookup().lookupClass() : root;
|
Class<?> clazz = root == null ? MethodHandles.lookup().lookupClass() : root;
|
||||||
|
@ -196,6 +196,8 @@ public class Settings extends Config {
|
|||||||
public boolean CONFIRMATION = true;
|
public boolean CONFIRMATION = true;
|
||||||
public int DAYS = 90;
|
public int DAYS = 90;
|
||||||
public int SKIP_ACCOUNT_AGE_DAYS = -1;
|
public int SKIP_ACCOUNT_AGE_DAYS = -1;
|
||||||
|
@Comment("True, if a plot should be deleted if the plot owner is unknown to the server")
|
||||||
|
public boolean DELETE_IF_OWNER_IS_UNKNOWN = false;
|
||||||
public List<String> WORLDS = new ArrayList<>(Collections.singletonList("*"));
|
public List<String> WORLDS = new ArrayList<>(Collections.singletonList("*"));
|
||||||
|
|
||||||
|
|
||||||
|
@ -101,7 +101,9 @@ public class SQLManager implements AbstractDB {
|
|||||||
private final String prefix;
|
private final String prefix;
|
||||||
private final Database database;
|
private final Database database;
|
||||||
private final boolean mySQL;
|
private final boolean mySQL;
|
||||||
|
@SuppressWarnings({"unused", "FieldCanBeLocal"})
|
||||||
private final EventDispatcher eventDispatcher;
|
private final EventDispatcher eventDispatcher;
|
||||||
|
@SuppressWarnings({"unused", "FieldCanBeLocal"})
|
||||||
private final PlotListener plotListener;
|
private final PlotListener plotListener;
|
||||||
private final YamlConfiguration worldConfiguration;
|
private final YamlConfiguration worldConfiguration;
|
||||||
/**
|
/**
|
||||||
@ -408,7 +410,6 @@ public class SQLManager implements AbstractDB {
|
|||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
try {
|
try {
|
||||||
Entry<Plot, Queue<UniqueStatement>> entry = iterator.next();
|
Entry<Plot, Queue<UniqueStatement>> entry = iterator.next();
|
||||||
Plot plot = entry.getKey();
|
|
||||||
Queue<UniqueStatement> tasks = entry.getValue();
|
Queue<UniqueStatement> tasks = entry.getValue();
|
||||||
if (tasks.isEmpty()) {
|
if (tasks.isEmpty()) {
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
@ -2295,8 +2296,6 @@ public class SQLManager implements AbstractDB {
|
|||||||
int size = uniqueIdsList.size();
|
int size = uniqueIdsList.size();
|
||||||
int packet = 990;
|
int packet = 990;
|
||||||
int amount = size / packet;
|
int amount = size / packet;
|
||||||
int count = 0;
|
|
||||||
int last = -1;
|
|
||||||
for (int j = 0; j <= amount; j++) {
|
for (int j = 0; j <= amount; j++) {
|
||||||
List<Integer> subList =
|
List<Integer> subList =
|
||||||
uniqueIdsList.subList(j * packet, Math.min(size, (j + 1) * packet));
|
uniqueIdsList.subList(j * packet, Math.min(size, (j + 1) * packet));
|
||||||
@ -3200,6 +3199,7 @@ public class SQLManager implements AbstractDB {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({"unchecked", "unused"})
|
||||||
@Override
|
@Override
|
||||||
public void validateAllPlots(Set<Plot> toValidate) {
|
public void validateAllPlots(Set<Plot> toValidate) {
|
||||||
if (!isValid()) {
|
if (!isValid()) {
|
||||||
@ -3455,15 +3455,7 @@ public class SQLManager implements AbstractDB {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class UUIDPair {
|
private record UUIDPair(int id, UUID uuid) {
|
||||||
|
|
||||||
public final int id;
|
|
||||||
public final UUID uuid;
|
|
||||||
|
|
||||||
public UUIDPair(int id, UUID uuid) {
|
|
||||||
this.id = id;
|
|
||||||
this.uuid = uuid;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,8 +40,6 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public class PlayerAutoPlotsChosenEvent extends PlotPlayerEvent {
|
public class PlayerAutoPlotsChosenEvent extends PlotPlayerEvent {
|
||||||
|
|
||||||
private Result eventResult;
|
|
||||||
|
|
||||||
private List<Plot> plots;
|
private List<Plot> plots;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -97,8 +97,8 @@ public class HybridGen extends IndependentPlotGenerator {
|
|||||||
}
|
}
|
||||||
// Coords
|
// Coords
|
||||||
Location min = result.getMin();
|
Location min = result.getMin();
|
||||||
int bx = (min.getX()) - hybridPlotWorld.ROAD_OFFSET_X;
|
int bx = min.getX() - hybridPlotWorld.ROAD_OFFSET_X;
|
||||||
int bz = (min.getZ()) - hybridPlotWorld.ROAD_OFFSET_Z;
|
int bz = min.getZ() - hybridPlotWorld.ROAD_OFFSET_Z;
|
||||||
// The relative X-coordinate (within the plot) of the minimum X coordinate
|
// The relative X-coordinate (within the plot) of the minimum X coordinate
|
||||||
// contained in the scoped queue
|
// contained in the scoped queue
|
||||||
short relativeOffsetX;
|
short relativeOffsetX;
|
||||||
|
@ -148,12 +148,22 @@ public class HybridUtils {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ChunkQueueCoordinator chunk = new ChunkQueueCoordinator(bot, top, false);
|
ChunkQueueCoordinator chunk = new ChunkQueueCoordinator(worldUtil.getWeWorld(world), bot, top, false);
|
||||||
hpw.getGenerator().generateChunk(chunk, hpw);
|
hpw.getGenerator().generateChunk(chunk, hpw);
|
||||||
|
|
||||||
|
final BlockState airBlock = BlockTypes.AIR.getDefaultState();
|
||||||
final BlockState[][][] oldBlocks = chunk.getBlocks();
|
final BlockState[][][] oldBlocks = chunk.getBlocks();
|
||||||
final BlockState[][][] newBlocks = new BlockState[256][width][length];
|
final BlockState[][][] newBlocks = new BlockState[256][width][length];
|
||||||
final BlockState airBlock = BlockTypes.AIR.getDefaultState();
|
for (final BlockState[][] newBlock : newBlocks) {
|
||||||
|
for (final BlockState[] blockStates : newBlock) {
|
||||||
|
Arrays.fill(blockStates, airBlock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (final BlockState[][] oldBlock : oldBlocks) {
|
||||||
|
for (final BlockState[] blockStates : oldBlock) {
|
||||||
|
Arrays.fill(blockStates, airBlock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
System.gc();
|
System.gc();
|
||||||
System.gc();
|
System.gc();
|
||||||
@ -221,9 +231,6 @@ public class HybridUtils {
|
|||||||
for (int y = 0; y < 256; y++) {
|
for (int y = 0; y < 256; y++) {
|
||||||
BlockState old = oldBlocks[y][x][z];
|
BlockState old = oldBlocks[y][x][z];
|
||||||
try {
|
try {
|
||||||
if (old == null) {
|
|
||||||
old = airBlock;
|
|
||||||
}
|
|
||||||
BlockState now = newBlocks[y][x][z];
|
BlockState now = newBlocks[y][x][z];
|
||||||
if (!old.equals(now)) {
|
if (!old.equals(now)) {
|
||||||
changes[i]++;
|
changes[i]++;
|
||||||
|
@ -95,6 +95,7 @@ public abstract class IndependentPlotGenerator {
|
|||||||
* @param world ChunkGenerator Implementation
|
* @param world ChunkGenerator Implementation
|
||||||
* @return Chunk generator
|
* @return Chunk generator
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public <T> GeneratorWrapper<T> specify(final @NonNull String world) {
|
public <T> GeneratorWrapper<T> specify(final @NonNull String world) {
|
||||||
return (GeneratorWrapper<T>) PlotSquared.platform().wrapPlotGenerator(world, this);
|
return (GeneratorWrapper<T>) PlotSquared.platform().wrapPlotGenerator(world, this);
|
||||||
}
|
}
|
||||||
|
@ -42,8 +42,6 @@ import com.sk89q.worldedit.world.biome.BiomeType;
|
|||||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||||
import com.sk89q.worldedit.world.block.BlockState;
|
import com.sk89q.worldedit.world.block.BlockState;
|
||||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||||
import org.apache.logging.log4j.LogManager;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
@ -53,8 +51,6 @@ import java.util.Set;
|
|||||||
|
|
||||||
public class ProcessedWEExtent extends AbstractDelegateExtent {
|
public class ProcessedWEExtent extends AbstractDelegateExtent {
|
||||||
|
|
||||||
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + ProcessedWEExtent.class.getSimpleName());
|
|
||||||
|
|
||||||
private final Set<CuboidRegion> mask;
|
private final Set<CuboidRegion> mask;
|
||||||
private final String world;
|
private final String world;
|
||||||
private final int max;
|
private final int max;
|
||||||
@ -162,6 +158,7 @@ public class ProcessedWEExtent extends AbstractDelegateExtent {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
@Override
|
@Override
|
||||||
public boolean setBiome(BlockVector2 position, BiomeType biome) {
|
public boolean setBiome(BlockVector2 position, BiomeType biome) {
|
||||||
return WEManager.maskContains(this.mask, position.getX(), position.getZ()) && super
|
return WEManager.maskContains(this.mask, position.getX(), position.getZ()) && super
|
||||||
|
@ -54,6 +54,7 @@ public class WEExtent extends AbstractDelegateExtent {
|
|||||||
this.mask = mask;
|
this.mask = mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
public boolean setBlock(BlockVector3 location, BlockStateHolder block)
|
public boolean setBlock(BlockVector3 location, BlockStateHolder block)
|
||||||
throws WorldEditException {
|
throws WorldEditException {
|
||||||
|
@ -53,7 +53,7 @@ public abstract class MetaDataAccess<T> implements AutoCloseable {
|
|||||||
this.lockAccess = lockAccess;
|
this.lockAccess = lockAccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("ALL")
|
@SuppressWarnings("unchecked")
|
||||||
private static <E extends Throwable> void sneakyThrow(final Throwable e) throws E {
|
private static <E extends Throwable> void sneakyThrow(final Throwable e) throws E {
|
||||||
throw (E) e;
|
throw (E) e;
|
||||||
}
|
}
|
||||||
|
@ -62,6 +62,7 @@ public final class MetaDataKey<T> {
|
|||||||
* @param <T> Type
|
* @param <T> Type
|
||||||
* @return MetaData key instance
|
* @return MetaData key instance
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public static @NonNull <T> MetaDataKey<T> of(final @NonNull String key, final @NonNull TypeLiteral<T> type) {
|
public static @NonNull <T> MetaDataKey<T> of(final @NonNull String key, final @NonNull TypeLiteral<T> type) {
|
||||||
synchronized (keyMetaData) {
|
synchronized (keyMetaData) {
|
||||||
return (MetaDataKey<T>)
|
return (MetaDataKey<T>)
|
||||||
|
@ -47,6 +47,7 @@ final class PersistentMetaDataAccess<T> extends MetaDataAccess<T> {
|
|||||||
return this.getPlayer().hasPersistentMeta(getMetaDataKey().toString());
|
return this.getPlayer().hasPersistentMeta(getMetaDataKey().toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
public @Nullable T remove() {
|
public @Nullable T remove() {
|
||||||
this.checkClosed();
|
this.checkClosed();
|
||||||
|
@ -104,7 +104,8 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
|||||||
private static final Set<PlotPlayer<?>> debugModeEnabled =
|
private static final Set<PlotPlayer<?>> debugModeEnabled =
|
||||||
Collections.synchronizedSet(new HashSet<>());
|
Collections.synchronizedSet(new HashSet<>());
|
||||||
|
|
||||||
private static final Map<Class, PlotPlayerConverter> converters = new HashMap<>();
|
@SuppressWarnings("rawtypes")
|
||||||
|
private static final Map<Class<?>, PlotPlayerConverter> converters = new HashMap<>();
|
||||||
private final LockRepository lockRepository = new LockRepository();
|
private final LockRepository lockRepository = new LockRepository();
|
||||||
private final PlotAreaManager plotAreaManager;
|
private final PlotAreaManager plotAreaManager;
|
||||||
private final EventDispatcher eventDispatcher;
|
private final EventDispatcher eventDispatcher;
|
||||||
@ -128,6 +129,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
|||||||
this.permissionHandler = permissionHandler;
|
this.permissionHandler = permissionHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||||
public static <T> PlotPlayer<T> from(final @NonNull T object) {
|
public static <T> PlotPlayer<T> from(final @NonNull T object) {
|
||||||
// fast path
|
// fast path
|
||||||
if (converters.containsKey(object.getClass())) {
|
if (converters.containsKey(object.getClass())) {
|
||||||
@ -234,6 +236,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
|||||||
* @param <T> the object type to return
|
* @param <T> the object type to return
|
||||||
* @return the value assigned to the key or null if it does not exist
|
* @return the value assigned to the key or null if it does not exist
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
<T> T getMeta(String key) {
|
<T> T getMeta(String key) {
|
||||||
if (this.meta != null) {
|
if (this.meta != null) {
|
||||||
return (T) this.meta.get(key);
|
return (T) this.meta.get(key);
|
||||||
@ -361,7 +364,6 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int getClusterCount(String world) {
|
public int getClusterCount(String world) {
|
||||||
UUID uuid = getUUID();
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
for (PlotArea area : this.plotAreaManager.getPlotAreasSet(world)) {
|
for (PlotArea area : this.plotAreaManager.getPlotAreasSet(world)) {
|
||||||
for (PlotCluster cluster : area.getClusters()) {
|
for (PlotCluster cluster : area.getClusters()) {
|
||||||
@ -795,16 +797,16 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
|||||||
final @NonNull MetaDataKey<T> key,
|
final @NonNull MetaDataKey<T> key,
|
||||||
final @NonNull T value
|
final @NonNull T value
|
||||||
) {
|
) {
|
||||||
final Object rawValue = value;
|
|
||||||
if (key.getType().getRawType().equals(Integer.class)) {
|
if (key.getType().getRawType().equals(Integer.class)) {
|
||||||
this.setPersistentMeta(key.toString(), Ints.toByteArray((int) rawValue));
|
this.setPersistentMeta(key.toString(), Ints.toByteArray((int) (Object) value));
|
||||||
} else if (key.getType().getRawType().equals(Boolean.class)) {
|
} else if (key.getType().getRawType().equals(Boolean.class)) {
|
||||||
this.setPersistentMeta(key.toString(), ByteArrayUtilities.booleanToBytes((boolean) rawValue));
|
this.setPersistentMeta(key.toString(), ByteArrayUtilities.booleanToBytes((boolean) (Object) value));
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException(String.format("Unknown meta data type '%s'", key.getType()));
|
throw new IllegalArgumentException(String.format("Unknown meta data type '%s'", key.getType()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
@Nullable <T> T getPersistentMeta(final @NonNull MetaDataKey<T> key) {
|
@Nullable <T> T getPersistentMeta(final @NonNull MetaDataKey<T> key) {
|
||||||
final byte[] value = this.getPersistentMeta(key.toString());
|
final byte[] value = this.getPersistentMeta(key.toString());
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
|
@ -47,6 +47,7 @@ final class TemporaryMetaDataAccess<T> extends MetaDataAccess<T> {
|
|||||||
return this.getPlayer().getMeta(this.getMetaDataKey().toString()) != null;
|
return this.getPlayer().getMeta(this.getMetaDataKey().toString()) != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
public @Nullable T remove() {
|
public @Nullable T remove() {
|
||||||
this.checkClosed();
|
this.checkClosed();
|
||||||
|
@ -2834,7 +2834,7 @@ public class Plot {
|
|||||||
if (this.isOnline()) {
|
if (this.isOnline()) {
|
||||||
seen = TranslatableCaption.of("info.now").getComponent(player);
|
seen = TranslatableCaption.of("info.now").getComponent(player);
|
||||||
} else {
|
} else {
|
||||||
int time = (int) (ExpireManager.IMP.getAge(this) / 1000);
|
int time = (int) (ExpireManager.IMP.getAge(this, false) / 1000);
|
||||||
if (time != 0) {
|
if (time != 0) {
|
||||||
seen = TimeUtil.secToTime(time);
|
seen = TimeUtil.secToTime(time);
|
||||||
} else {
|
} else {
|
||||||
|
@ -439,38 +439,6 @@ public abstract class PlotArea {
|
|||||||
loadConfiguration(config);
|
loadConfiguration(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Component getFlagsComponent(Component flagsComponent, Collection<PlotFlag<?, ?>> flagCollection) {
|
|
||||||
if (flagCollection.isEmpty()) {
|
|
||||||
flagsComponent = MINI_MESSAGE.parse(TranslatableCaption.of("flag.no_flags").getComponent(LocaleHolder.console()));
|
|
||||||
} else {
|
|
||||||
String prefix = " ";
|
|
||||||
for (final PlotFlag<?, ?> flag : flagCollection) {
|
|
||||||
Object value;
|
|
||||||
if (flag instanceof DoubleFlag && !Settings.General.SCIENTIFIC) {
|
|
||||||
value = FLAG_DECIMAL_FORMAT.format(flag.getValue());
|
|
||||||
} else {
|
|
||||||
value = flag.toString();
|
|
||||||
}
|
|
||||||
Component snip = MINI_MESSAGE.parse(
|
|
||||||
prefix + CaptionUtility
|
|
||||||
.format(
|
|
||||||
ConsolePlayer.getConsole(),
|
|
||||||
TranslatableCaption.of("info.plot_flag_list").getComponent(LocaleHolder.console())
|
|
||||||
),
|
|
||||||
Template.of("flag", flag.getName()),
|
|
||||||
Template.of("value", CaptionUtility.formatRaw(ConsolePlayer.getConsole(), value.toString()))
|
|
||||||
);
|
|
||||||
if (flagsComponent != null) {
|
|
||||||
flagsComponent.append(snip);
|
|
||||||
} else {
|
|
||||||
flagsComponent = snip;
|
|
||||||
}
|
|
||||||
prefix = ", ";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return flagsComponent;
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract void loadConfiguration(ConfigurationSection config);
|
public abstract void loadConfiguration(ConfigurationSection config);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -216,24 +216,20 @@ public class ExpireManager {
|
|||||||
applicable.add(et);
|
applicable.add(et);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (applicable.isEmpty()) {
|
if (applicable.isEmpty()) {
|
||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Don't delete server plots
|
||||||
if (plot.getFlag(ServerPlotFlag.class)) {
|
if (plot.getFlag(ServerPlotFlag.class)) {
|
||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
long diff = getAge(plot);
|
|
||||||
if (diff == 0) {
|
|
||||||
return new ArrayList<>();
|
|
||||||
}
|
|
||||||
// Filter out non old plots
|
// Filter out non old plots
|
||||||
boolean shouldCheckAccountAge = false;
|
boolean shouldCheckAccountAge = false;
|
||||||
for (int i = 0; i < applicable.size(); i++) {
|
for (int i = 0; i < applicable.size(); i++) {
|
||||||
ExpiryTask et = applicable.poll();
|
ExpiryTask et = applicable.poll();
|
||||||
if (et.applies(diff)) {
|
if (et.applies(getAge(plot, et.shouldDeleteForUnknownOwner()))) {
|
||||||
applicable.add(et);
|
applicable.add(et);
|
||||||
shouldCheckAccountAge |= et.getSettings().SKIP_ACCOUNT_AGE_DAYS != -1;
|
shouldCheckAccountAge |= et.getSettings().SKIP_ACCOUNT_AGE_DAYS != -1;
|
||||||
}
|
}
|
||||||
@ -243,9 +239,9 @@ public class ExpireManager {
|
|||||||
}
|
}
|
||||||
// Check account age
|
// Check account age
|
||||||
if (shouldCheckAccountAge) {
|
if (shouldCheckAccountAge) {
|
||||||
long accountAge = getAge(plot);
|
|
||||||
for (int i = 0; i < applicable.size(); i++) {
|
for (int i = 0; i < applicable.size(); i++) {
|
||||||
ExpiryTask et = applicable.poll();
|
ExpiryTask et = applicable.poll();
|
||||||
|
long accountAge = getAge(plot, et.shouldDeleteForUnknownOwner());
|
||||||
if (et.appliesAccountAge(accountAge)) {
|
if (et.appliesAccountAge(accountAge)) {
|
||||||
applicable.add(et);
|
applicable.add(et);
|
||||||
}
|
}
|
||||||
@ -309,9 +305,8 @@ public class ExpireManager {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
this.running = 2;
|
this.running = 2;
|
||||||
final ConcurrentLinkedDeque<Plot> plots =
|
|
||||||
new ConcurrentLinkedDeque<>(PlotQuery.newQuery().allPlots().asList());
|
|
||||||
TaskManager.runTaskAsync(new Runnable() {
|
TaskManager.runTaskAsync(new Runnable() {
|
||||||
|
private ConcurrentLinkedDeque<Plot> plots = null;
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
final Runnable task = this;
|
final Runnable task = this;
|
||||||
@ -319,7 +314,9 @@ public class ExpireManager {
|
|||||||
ExpireManager.this.running = 0;
|
ExpireManager.this.running = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
long start = System.currentTimeMillis();
|
if (plots == null) {
|
||||||
|
plots = new ConcurrentLinkedDeque<>(PlotQuery.newQuery().allPlots().asList());
|
||||||
|
}
|
||||||
while (!plots.isEmpty()) {
|
while (!plots.isEmpty()) {
|
||||||
if (ExpireManager.this.running != 2) {
|
if (ExpireManager.this.running != 2) {
|
||||||
ExpireManager.this.running = 0;
|
ExpireManager.this.running = 0;
|
||||||
@ -454,7 +451,20 @@ public class ExpireManager {
|
|||||||
plot.getPlotModificationManager().deletePlot(null, whenDone);
|
plot.getPlotModificationManager().deletePlot(null, whenDone);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated(forRemoval = true, since = "TODO")
|
||||||
public long getAge(UUID uuid) {
|
public long getAge(UUID uuid) {
|
||||||
|
return getAge(uuid, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the age (last play time) of the passed player
|
||||||
|
*
|
||||||
|
* @param uuid the uuid of the owner to check against
|
||||||
|
* @param shouldDeleteUnknownOwner {@code true} if an unknown player should be counted as never online
|
||||||
|
* @return the millis since the player was last online, or {@link Long#MAX_VALUE} if player was never online
|
||||||
|
* @since TODO
|
||||||
|
*/
|
||||||
|
public long getAge(UUID uuid, final boolean shouldDeleteUnknownOwner) {
|
||||||
if (PlotSquared.platform().playerManager().getPlayerIfExists(uuid) != null) {
|
if (PlotSquared.platform().playerManager().getPlayerIfExists(uuid) != null) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -464,7 +474,7 @@ public class ExpireManager {
|
|||||||
if (opp != null && (last = opp.getLastPlayed()) != 0) {
|
if (opp != null && (last = opp.getLastPlayed()) != 0) {
|
||||||
this.dates_cache.put(uuid, last);
|
this.dates_cache.put(uuid, last);
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return shouldDeleteUnknownOwner ? Long.MAX_VALUE : 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (last == 0) {
|
if (last == 0) {
|
||||||
@ -473,7 +483,7 @@ public class ExpireManager {
|
|||||||
return System.currentTimeMillis() - last;
|
return System.currentTimeMillis() - last;
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getAge(Plot plot) {
|
public long getAge(Plot plot, final boolean shouldDeleteUnknownOwner) {
|
||||||
if (!plot.hasOwner() || Objects.equals(DBFunc.EVERYONE, plot.getOwner())
|
if (!plot.hasOwner() || Objects.equals(DBFunc.EVERYONE, plot.getOwner())
|
||||||
|| PlotSquared.platform().playerManager().getPlayerIfExists(plot.getOwner()) != null || plot.getRunning() > 0) {
|
|| PlotSquared.platform().playerManager().getPlayerIfExists(plot.getOwner()) != null || plot.getRunning() > 0) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -495,7 +505,7 @@ public class ExpireManager {
|
|||||||
}
|
}
|
||||||
long min = Long.MAX_VALUE;
|
long min = Long.MAX_VALUE;
|
||||||
for (UUID owner : plot.getOwners()) {
|
for (UUID owner : plot.getOwners()) {
|
||||||
long age = getAge(owner);
|
long age = getAge(owner, shouldDeleteUnknownOwner);
|
||||||
if (age < min) {
|
if (age < min) {
|
||||||
min = age;
|
min = age;
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,7 @@ public class ExpiryTask {
|
|||||||
diff = settings.REQUIRED_PLOTS - plots.size();
|
diff = settings.REQUIRED_PLOTS - plots.size();
|
||||||
}
|
}
|
||||||
List<Long> entireList =
|
List<Long> entireList =
|
||||||
plots.stream().map(plot -> ExpireManager.IMP.getAge(plot))
|
plots.stream().map(plot -> ExpireManager.IMP.getAge(plot, settings.DELETE_IF_OWNER_IS_UNKNOWN))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
List<Long> top = new ArrayList<>(diff + 1);
|
List<Long> top = new ArrayList<>(diff + 1);
|
||||||
if (diff > 1000) {
|
if (diff > 1000) {
|
||||||
@ -157,5 +157,13 @@ public class ExpiryTask {
|
|||||||
return settings.CONFIRMATION;
|
return settings.CONFIRMATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns {@code true} if this task respects unknown owners
|
||||||
|
* @return {@code true} if unknown owners should be counted as never online
|
||||||
|
* @since TODO
|
||||||
|
*/
|
||||||
|
public boolean shouldDeleteForUnknownOwner() {
|
||||||
|
return settings.DELETE_IF_OWNER_IS_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -558,6 +558,7 @@ public class PlotAnalysis {
|
|||||||
return ranks;
|
return ranks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public static void sort(int[] input) {
|
public static void sort(int[] input) {
|
||||||
int SIZE = 10;
|
int SIZE = 10;
|
||||||
List<Integer>[] bucket = new ArrayList[SIZE];
|
List<Integer>[] bucket = new ArrayList[SIZE];
|
||||||
|
@ -96,7 +96,7 @@ public class FlagContainer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast a plot flag with wildcard parameters into a parametrisized
|
* Cast a plot flag with wildcard parameters into a parametrized
|
||||||
* PlotFlag. This is an unsafe operation, and should only be performed
|
* PlotFlag. This is an unsafe operation, and should only be performed
|
||||||
* if the generic parameters are known beforehand.
|
* if the generic parameters are known beforehand.
|
||||||
*
|
*
|
||||||
@ -105,7 +105,7 @@ public class FlagContainer {
|
|||||||
* @param <T> Flag type
|
* @param <T> Flag type
|
||||||
* @return Casted flag
|
* @return Casted flag
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("ALL")
|
@SuppressWarnings("unchecked")
|
||||||
public static <V, T extends PlotFlag<V, ?>> T castUnsafe(
|
public static <V, T extends PlotFlag<V, ?>> T castUnsafe(
|
||||||
final PlotFlag<?, ?> flag
|
final PlotFlag<?, ?> flag
|
||||||
) {
|
) {
|
||||||
@ -181,6 +181,7 @@ public class FlagContainer {
|
|||||||
* @param <V> flag value type
|
* @param <V> flag value type
|
||||||
* @return value of flag removed
|
* @return value of flag removed
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public <V, T extends PlotFlag<V, ?>> V removeFlag(final T flag) {
|
public <V, T extends PlotFlag<V, ?>> V removeFlag(final T flag) {
|
||||||
final Object value = this.flagMap.remove(flag.getClass());
|
final Object value = this.flagMap.remove(flag.getClass());
|
||||||
if (this.plotFlagUpdateHandler != null) {
|
if (this.plotFlagUpdateHandler != null) {
|
||||||
|
@ -29,6 +29,7 @@ import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
|||||||
import com.plotsquared.core.plot.PlotTitle;
|
import com.plotsquared.core.plot.PlotTitle;
|
||||||
import com.plotsquared.core.plot.flag.FlagParseException;
|
import com.plotsquared.core.plot.flag.FlagParseException;
|
||||||
import com.plotsquared.core.plot.flag.PlotFlag;
|
import com.plotsquared.core.plot.flag.PlotFlag;
|
||||||
|
import com.plotsquared.core.util.StringMan;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
public class PlotTitleFlag extends PlotFlag<PlotTitle, PlotTitleFlag> {
|
public class PlotTitleFlag extends PlotFlag<PlotTitle, PlotTitleFlag> {
|
||||||
@ -56,17 +57,18 @@ public class PlotTitleFlag extends PlotFlag<PlotTitle, PlotTitleFlag> {
|
|||||||
if (!input.contains("\"")) {
|
if (!input.contains("\"")) {
|
||||||
return new PlotTitleFlag(new PlotTitle(input, ""));
|
return new PlotTitleFlag(new PlotTitle(input, ""));
|
||||||
}
|
}
|
||||||
input = input.substring(input.indexOf("\""));
|
|
||||||
input = input.substring(0, input.lastIndexOf("\"") + 1);
|
var split = StringMan.splitMessage(input);
|
||||||
String[] inputs = input.split("\"");
|
|
||||||
PlotTitle value;
|
if (split.isEmpty() || split.size() > 2) {
|
||||||
if (inputs.length == 2) {
|
|
||||||
value = new PlotTitle(inputs[1], "");
|
|
||||||
} else if (inputs.length > 3) {
|
|
||||||
value = new PlotTitle(inputs[1], inputs[3]);
|
|
||||||
} else {
|
|
||||||
throw new FlagParseException(this, input, TranslatableCaption.of("flags.flag_error_title"));
|
throw new FlagParseException(this, input, TranslatableCaption.of("flags.flag_error_title"));
|
||||||
}
|
}
|
||||||
|
PlotTitle value;
|
||||||
|
if (split.size() == 1) {
|
||||||
|
value = new PlotTitle(split.get(0), "");
|
||||||
|
} else {
|
||||||
|
value = new PlotTitle(split.get(0), split.get(1));
|
||||||
|
}
|
||||||
return new PlotTitleFlag(value);
|
return new PlotTitleFlag(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,7 +57,9 @@ import java.nio.file.Files;
|
|||||||
|
|
||||||
public class SinglePlotArea extends GridPlotWorld {
|
public class SinglePlotArea extends GridPlotWorld {
|
||||||
|
|
||||||
|
@SuppressWarnings({"unused", "FieldCanBeLocal"})
|
||||||
private final EventDispatcher eventDispatcher;
|
private final EventDispatcher eventDispatcher;
|
||||||
|
@SuppressWarnings({"unused", "FieldCanBeLocal"})
|
||||||
private final PlotListener plotListener;
|
private final PlotListener plotListener;
|
||||||
public boolean VOID = false;
|
public boolean VOID = false;
|
||||||
|
|
||||||
@ -273,6 +275,7 @@ public class SinglePlotArea extends GridPlotWorld {
|
|||||||
return false; // do not create signs for single plots
|
return false; // do not create signs for single plots
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
protected Plot adapt(Plot p) {
|
protected Plot adapt(Plot p) {
|
||||||
if (p instanceof SinglePlot) {
|
if (p instanceof SinglePlot) {
|
||||||
return p;
|
return p;
|
||||||
|
@ -57,7 +57,6 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator {
|
|||||||
private final ConcurrentHashMap<BlockVector2, LocalChunk> blockChunks = new ConcurrentHashMap<>();
|
private final ConcurrentHashMap<BlockVector2, LocalChunk> blockChunks = new ConcurrentHashMap<>();
|
||||||
private final List<BlockVector2> readRegion = new ArrayList<>();
|
private final List<BlockVector2> readRegion = new ArrayList<>();
|
||||||
private final List<ProgressSubscriber> progressSubscribers = new ArrayList<>();
|
private final List<ProgressSubscriber> progressSubscribers = new ArrayList<>();
|
||||||
private long modified;
|
|
||||||
private LocalChunk lastWrappedChunk;
|
private LocalChunk lastWrappedChunk;
|
||||||
private int lastX = Integer.MIN_VALUE;
|
private int lastX = Integer.MIN_VALUE;
|
||||||
private int lastZ = Integer.MIN_VALUE;
|
private int lastZ = Integer.MIN_VALUE;
|
||||||
@ -76,7 +75,6 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator {
|
|||||||
public BasicQueueCoordinator(@NonNull World world) {
|
public BasicQueueCoordinator(@NonNull World world) {
|
||||||
super(world);
|
super(world);
|
||||||
this.world = world;
|
this.world = world;
|
||||||
this.modified = System.currentTimeMillis();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -94,7 +92,6 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void setModified(long modified) {
|
public final void setModified(long modified) {
|
||||||
this.modified = modified;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -120,6 +117,7 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator {
|
|||||||
return setBlock(x, y, z, id.toBaseBlock());
|
return setBlock(x, y, z, id.toBaseBlock());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("removal")
|
||||||
@Override
|
@Override
|
||||||
public boolean setBiome(int x, int z, @NonNull BiomeType biomeType) {
|
public boolean setBiome(int x, int z, @NonNull BiomeType biomeType) {
|
||||||
LocalChunk chunk = getChunk(x >> 4, z >> 4);
|
LocalChunk chunk = getChunk(x >> 4, z >> 4);
|
||||||
|
@ -46,13 +46,20 @@ public class ChunkQueueCoordinator extends ScopedQueueCoordinator {
|
|||||||
private final int length;
|
private final int length;
|
||||||
private final BlockVector3 bot;
|
private final BlockVector3 bot;
|
||||||
private final BlockVector3 top;
|
private final BlockVector3 top;
|
||||||
|
private final World weWorld;
|
||||||
|
|
||||||
public ChunkQueueCoordinator(@NonNull BlockVector3 bot, @NonNull BlockVector3 top, boolean biomes) {
|
public ChunkQueueCoordinator(
|
||||||
|
final @NonNull World weWorld,
|
||||||
|
@NonNull BlockVector3 bot,
|
||||||
|
@NonNull BlockVector3 top,
|
||||||
|
boolean biomes
|
||||||
|
) {
|
||||||
super(null, Location.at("", 0, 0, 0), Location.at("", 15, 255, 15));
|
super(null, Location.at("", 0, 0, 0), Location.at("", 15, 255, 15));
|
||||||
|
this.weWorld = weWorld;
|
||||||
this.width = top.getX() - bot.getX() + 1;
|
this.width = top.getX() - bot.getX() + 1;
|
||||||
this.length = top.getZ() - bot.getZ() + 1;
|
this.length = top.getZ() - bot.getZ() + 1;
|
||||||
this.result = new BlockState[256][][];
|
this.result = new BlockState[256][width][length];
|
||||||
this.biomeResult = biomes ? new BiomeType[256][][] : null;
|
this.biomeResult = biomes ? new BiomeType[256][width][length] : null;
|
||||||
this.bot = bot;
|
this.bot = bot;
|
||||||
this.top = top;
|
this.top = top;
|
||||||
}
|
}
|
||||||
@ -137,7 +144,7 @@ public class ChunkQueueCoordinator extends ScopedQueueCoordinator {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable World getWorld() {
|
public @Nullable World getWorld() {
|
||||||
return super.getWorld();
|
return weWorld;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -56,6 +56,7 @@ public abstract class QueueCoordinator {
|
|||||||
private Object chunkObject;
|
private Object chunkObject;
|
||||||
private final AtomicBoolean enqueued = new AtomicBoolean();
|
private final AtomicBoolean enqueued = new AtomicBoolean();
|
||||||
|
|
||||||
|
@SuppressWarnings({"unused", "FieldCanBeLocal"})
|
||||||
@Inject
|
@Inject
|
||||||
private GlobalBlockQueue blockQueue;
|
private GlobalBlockQueue blockQueue;
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@ import java.util.function.Consumer;
|
|||||||
/**
|
/**
|
||||||
* A repository for keyed {@link java.util.concurrent.locks.Lock locks}
|
* A repository for keyed {@link java.util.concurrent.locks.Lock locks}
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("UnstableApiUsage")
|
||||||
public final class LockRepository {
|
public final class LockRepository {
|
||||||
|
|
||||||
private final Striped<Lock> striped;
|
private final Striped<Lock> striped;
|
||||||
|
@ -90,7 +90,7 @@ public final class BlockUtil {
|
|||||||
if (id.length() == 1 && id.charAt(0) == '*') {
|
if (id.length() == 1 && id.charAt(0) == '*') {
|
||||||
return FuzzyBlockState.builder().type(BlockTypes.AIR).build();
|
return FuzzyBlockState.builder().type(BlockTypes.AIR).build();
|
||||||
}
|
}
|
||||||
String mutableId = id;
|
String mutableId;
|
||||||
mutableId = id.toLowerCase();
|
mutableId = id.toLowerCase();
|
||||||
BlockType type = BlockTypes.get(mutableId);
|
BlockType type = BlockTypes.get(mutableId);
|
||||||
if (type != null) {
|
if (type != null) {
|
||||||
|
@ -73,6 +73,7 @@ public class EntityUtil {
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public static boolean checkEntity(Plot plot, PlotFlag<Integer, ?>... flags) {
|
public static boolean checkEntity(Plot plot, PlotFlag<Integer, ?>... flags) {
|
||||||
if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
|
if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -289,7 +289,7 @@ public abstract class RegionManager {
|
|||||||
true
|
true
|
||||||
);
|
);
|
||||||
|
|
||||||
toQueue2.setCompleteTask(whenDone::run);
|
toQueue2.setCompleteTask(whenDone);
|
||||||
if (actor != null && Settings.QUEUE.NOTIFY_PROGRESS) {
|
if (actor != null && Settings.QUEUE.NOTIFY_PROGRESS) {
|
||||||
toQueue2.addProgressSubscriber(subscriberFactory.createFull(
|
toQueue2.addProgressSubscriber(subscriberFactory.createFull(
|
||||||
actor,
|
actor,
|
||||||
|
@ -59,6 +59,7 @@ public class StringComparison<T> {
|
|||||||
this(input, objects, Object::toString);
|
this(input, objects, Object::toString);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public StringComparison(String input, Collection<T> objects, Function<T, String> toString) {
|
public StringComparison(String input, Collection<T> objects, Function<T, String> toString) {
|
||||||
this(input, (T[]) objects.toArray(), toString);
|
this(input, (T[]) objects.toArray(), toString);
|
||||||
}
|
}
|
||||||
|
@ -30,16 +30,21 @@ import com.plotsquared.core.configuration.caption.Caption;
|
|||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
import java.lang.reflect.Array;
|
import java.lang.reflect.Array;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
public class StringMan {
|
public class StringMan {
|
||||||
|
|
||||||
|
private static final Pattern STRING_SPLIT_PATTERN = Pattern.compile("(?<quoted>\"[\\w ]+\")|(?<single>\\w+)");
|
||||||
|
|
||||||
public static String replaceFromMap(String string, Map<String, String> replacements) {
|
public static String replaceFromMap(String string, Map<String, String> replacements) {
|
||||||
StringBuilder sb = new StringBuilder(string);
|
StringBuilder sb = new StringBuilder(string);
|
||||||
int size = string.length();
|
int size = string.length();
|
||||||
@ -286,7 +291,7 @@ public class StringMan {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isEqualIgnoreCase(String a, String b) {
|
public static boolean isEqualIgnoreCase(String a, String b) {
|
||||||
return (a.equals(b)) || ((a != null) && (b != null) && (a.length() == b.length()) && a
|
return a.equals(b) || ((a != null) && (b != null) && (a.length() == b.length()) && a
|
||||||
.equalsIgnoreCase(b));
|
.equalsIgnoreCase(b));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -320,4 +325,46 @@ public class StringMan {
|
|||||||
return col;
|
return col;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param message an input string
|
||||||
|
* @return a list of strings
|
||||||
|
* @since TODO
|
||||||
|
*
|
||||||
|
* <table border="1">
|
||||||
|
* <caption>Converts multiple quoted and single strings into a list of strings</caption>
|
||||||
|
* <thead>
|
||||||
|
* <tr>
|
||||||
|
* <th>Input</th>
|
||||||
|
* <th>Output</th>
|
||||||
|
* </tr>
|
||||||
|
* </thead>
|
||||||
|
* <tbody>
|
||||||
|
* <tr>
|
||||||
|
* <td>title "sub title"</td>
|
||||||
|
* <td>["title", "sub title"]</td>
|
||||||
|
* </tr>
|
||||||
|
* <tr>
|
||||||
|
* <td>"a title" subtitle</td>
|
||||||
|
* <td>["a title", "subtitle"]</td>
|
||||||
|
* </tr>
|
||||||
|
* <tr>
|
||||||
|
* <td>"title" "subtitle"</td>
|
||||||
|
* <td>["title", "subtitle"]</td>
|
||||||
|
* </tr>
|
||||||
|
* <tr>
|
||||||
|
* <td>"PlotSquared is going well" the authors "and many contributors"</td>
|
||||||
|
* <td>["PlotSquared is going well", "the", "authors", "and many contributors"]</td>
|
||||||
|
* </tr>
|
||||||
|
* </tbody>
|
||||||
|
* </table>
|
||||||
|
*/
|
||||||
|
public static @NonNull List<String> splitMessage(@NonNull String message) {
|
||||||
|
var matcher = StringMan.STRING_SPLIT_PATTERN.matcher(message);
|
||||||
|
List<String> splitMessages = new ArrayList<>();
|
||||||
|
while (matcher.find()) {
|
||||||
|
splitMessages.add(matcher.group(0).replaceAll("\"", ""));
|
||||||
|
}
|
||||||
|
return splitMessages;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -265,6 +265,7 @@ public final class TabCompletions {
|
|||||||
* @return List of completions
|
* @return List of completions
|
||||||
* @deprecated In favor {@link #completePlayers(String, PlotPlayer, String, List, Predicate)}
|
* @deprecated In favor {@link #completePlayers(String, PlotPlayer, String, List, Predicate)}
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("unused")
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(forRemoval = true)
|
||||||
private static List<Command> completePlayers(
|
private static List<Command> completePlayers(
|
||||||
final @NonNull String cacheIdentifier,
|
final @NonNull String cacheIdentifier,
|
||||||
|
@ -109,7 +109,7 @@ public class WEManager {
|
|||||||
plot = metaDataAccess.get().orElse(null);
|
plot = metaDataAccess.get().orElse(null);
|
||||||
}
|
}
|
||||||
if (plot != null && (!Settings.Done.RESTRICT_BUILDING || !DoneFlag.isDone(plot)) && (
|
if (plot != null && (!Settings.Done.RESTRICT_BUILDING || !DoneFlag.isDone(plot)) && (
|
||||||
(allowMember && plot.isAdded(uuid)) || (!allowMember && (plot.isOwner(uuid)) || plot
|
(allowMember && plot.isAdded(uuid)) || (!allowMember && plot.isOwner(uuid) || plot
|
||||||
.getTrusted().contains(uuid))) && !plot.getFlag(NoWorldeditFlag.class)) {
|
.getTrusted().contains(uuid))) && !plot.getFlag(NoWorldeditFlag.class)) {
|
||||||
for (CuboidRegion region : plot.getRegions()) {
|
for (CuboidRegion region : plot.getRegions()) {
|
||||||
BlockVector3 pos1 = region.getMinimumPoint().withY(area.getMinBuildHeight());
|
BlockVector3 pos1 = region.getMinimumPoint().withY(area.getMinBuildHeight());
|
||||||
|
@ -25,9 +25,12 @@
|
|||||||
*/
|
*/
|
||||||
package com.plotsquared.core.plot;
|
package com.plotsquared.core.plot;
|
||||||
|
|
||||||
|
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||||
import com.plotsquared.core.database.AbstractDBTest;
|
import com.plotsquared.core.database.AbstractDBTest;
|
||||||
import com.plotsquared.core.database.DBFunc;
|
import com.plotsquared.core.database.DBFunc;
|
||||||
|
import com.plotsquared.core.plot.flag.FlagParseException;
|
||||||
import com.plotsquared.core.plot.flag.PlotFlag;
|
import com.plotsquared.core.plot.flag.PlotFlag;
|
||||||
|
import com.plotsquared.core.plot.flag.implementations.PlotTitleFlag;
|
||||||
import com.plotsquared.core.plot.flag.implementations.UseFlag;
|
import com.plotsquared.core.plot.flag.implementations.UseFlag;
|
||||||
import com.sk89q.worldedit.world.item.ItemType;
|
import com.sk89q.worldedit.world.item.ItemType;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
@ -74,4 +77,62 @@ public class FlagTest {
|
|||||||
Assertions.assertEquals("use", flagName);
|
Assertions.assertEquals("use", flagName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldSuccessfullyParseTitleFlagWithTitleSingularAndSubTitleEmpty() {
|
||||||
|
Assertions.assertDoesNotThrow(() -> {
|
||||||
|
var title = PlotTitleFlag.TITLE_FLAG_DEFAULT.parse("\"test\" \"\"").getValue();
|
||||||
|
Assertions.assertEquals("test", title.title());
|
||||||
|
Assertions.assertEquals("", title.subtitle());
|
||||||
|
}, "Should not throw a FlagParseException");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldSuccessfullyParseTitleFlagWithTitleMultipleWordsAndSubTitleEmpty() {
|
||||||
|
Assertions.assertDoesNotThrow(() -> {
|
||||||
|
var title = PlotTitleFlag.TITLE_FLAG_DEFAULT.parse("\"test hello test\" \"\"").getValue();
|
||||||
|
Assertions.assertEquals("test hello test", title.title());
|
||||||
|
Assertions.assertEquals("", title.subtitle());
|
||||||
|
}, "Should not throw a FlagParseException");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldSuccessfullyParseTitleFlagWithTitleMultipleWordsAndSubTitleMultipleWords() {
|
||||||
|
Assertions.assertDoesNotThrow(() -> {
|
||||||
|
var title = PlotTitleFlag.TITLE_FLAG_DEFAULT.parse("\"test hello test\" \"a very long subtitle\"").getValue();
|
||||||
|
Assertions.assertEquals("test hello test", title.title());
|
||||||
|
Assertions.assertEquals("a very long subtitle", title.subtitle());
|
||||||
|
}, "Should not throw a FlagParseException");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldSuccessfullyParseTitleFlagWithTitleEmptyAndSubTitleSingleWord() {
|
||||||
|
Assertions.assertDoesNotThrow(() -> {
|
||||||
|
var title = PlotTitleFlag.TITLE_FLAG_DEFAULT.parse("\"\" \"single\"").getValue();
|
||||||
|
Assertions.assertEquals(" ", title.title());
|
||||||
|
Assertions.assertEquals("single", title.subtitle());
|
||||||
|
}, "Should not throw a FlagParseException");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldExtractTitleWhenASingleDoubleQuoteAtEndOfTitle() {
|
||||||
|
Assertions.assertDoesNotThrow(() -> {
|
||||||
|
var plotTitle = PlotTitleFlag.TITLE_FLAG_DEFAULT.parse("title\"").getValue();
|
||||||
|
Assertions.assertEquals("title", plotTitle.title());
|
||||||
|
Assertions.assertEquals("", plotTitle.subtitle());
|
||||||
|
}, "Should not throw a FlagParseException");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldThrowFlagParseExceptionWithQuotesGreater4() {
|
||||||
|
var exception = Assertions.assertThrows(
|
||||||
|
FlagParseException.class,
|
||||||
|
() -> PlotTitleFlag.TITLE_FLAG_DEFAULT.parse("\"title\" \"subtitle\" \"more\""),
|
||||||
|
"Needs to throw a FlagParseException"
|
||||||
|
);
|
||||||
|
Assertions.assertTrue(exception.getErrorMessage() instanceof TranslatableCaption);
|
||||||
|
Assertions.assertEquals(
|
||||||
|
"flags.flag_error_title",
|
||||||
|
((TranslatableCaption) exception.getErrorMessage()).getKey()
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* _____ _ _ _____ _
|
||||||
|
* | __ \| | | | / ____| | |
|
||||||
|
* | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| |
|
||||||
|
* | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` |
|
||||||
|
* | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| |
|
||||||
|
* |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_|
|
||||||
|
* | |
|
||||||
|
* |_|
|
||||||
|
* PlotSquared plot management system for Minecraft
|
||||||
|
* Copyright (C) 2014 - 2022 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.plotsquared.core.util;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Assertions;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class StringManTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void ensureThatAllVariationsHasTheExpectedOutcome() {
|
||||||
|
|
||||||
|
List<Message> messages = List.of(
|
||||||
|
new Message("title", List.of("title")),
|
||||||
|
new Message("title \"sub title\"", List.of("title", "sub title")),
|
||||||
|
new Message("\"a title\" subtitle", List.of("a title", "subtitle")),
|
||||||
|
new Message("\"title\" \"subtitle\"", List.of("title", "subtitle"))
|
||||||
|
);
|
||||||
|
|
||||||
|
for (Message message : messages) {
|
||||||
|
var messageList = StringMan.splitMessage(message.input);
|
||||||
|
|
||||||
|
Assertions.assertEquals(message.expected.size(), messageList.size());
|
||||||
|
if (message.expected.size() > 0) {
|
||||||
|
Assertions.assertEquals(message.expected.get(0), messageList.get(0));
|
||||||
|
}
|
||||||
|
if (message.expected.size() > 1) {
|
||||||
|
Assertions.assertEquals(message.expected.get(1), messageList.get(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private record Message(String input, List<String> expected) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -1,81 +0,0 @@
|
|||||||
import org.spongepowered.gradle.plugin.config.PluginLoaders
|
|
||||||
import org.spongepowered.plugin.metadata.model.PluginDependency
|
|
||||||
|
|
||||||
plugins {
|
|
||||||
id("org.spongepowered.gradle.plugin") version "2.0.0"
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
api(projects.plotSquaredCore)
|
|
||||||
|
|
||||||
compileOnly(libs.worldeditSponge)
|
|
||||||
}
|
|
||||||
|
|
||||||
sponge {
|
|
||||||
apiVersion("8.0.0")
|
|
||||||
license("All Rights Reserved")
|
|
||||||
loader {
|
|
||||||
name(PluginLoaders.JAVA_PLAIN)
|
|
||||||
version("1.0")
|
|
||||||
}
|
|
||||||
plugin("sponge") {
|
|
||||||
displayName("PlotSquared")
|
|
||||||
entrypoint("com.plotsquared.sponge.SpongePlatform")
|
|
||||||
description("Easy, yet powerful Plot World generation and management.")
|
|
||||||
links {
|
|
||||||
// homepage("https://spongepowered.org")
|
|
||||||
// source("https://spongepowered.org/source")
|
|
||||||
// issues("https://spongepowered.org/issues")
|
|
||||||
}
|
|
||||||
contributor("Citymonstret") {
|
|
||||||
description("Author")
|
|
||||||
}
|
|
||||||
contributor("Empire92") {
|
|
||||||
description("Author")
|
|
||||||
}
|
|
||||||
contributor("MattBDev") {
|
|
||||||
description("Author")
|
|
||||||
}
|
|
||||||
contributor("dordsor21") {
|
|
||||||
description("Author")
|
|
||||||
}
|
|
||||||
contributor("NotMyFault") {
|
|
||||||
description("Author")
|
|
||||||
}
|
|
||||||
contributor("SirYwell") {
|
|
||||||
description("Author")
|
|
||||||
}
|
|
||||||
dependency("spongeapi") {
|
|
||||||
loadOrder(PluginDependency.LoadOrder.AFTER)
|
|
||||||
optional(false)
|
|
||||||
}
|
|
||||||
// dependency("${DEPEDENCY}") {
|
|
||||||
// loadOrder(PluginDependency.LoadOrder.AFTER)
|
|
||||||
// optional(false)
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val javaTarget = 16
|
|
||||||
java {
|
|
||||||
sourceCompatibility = JavaVersion.toVersion(javaTarget)
|
|
||||||
targetCompatibility = JavaVersion.toVersion(javaTarget)
|
|
||||||
if (JavaVersion.current() < JavaVersion.toVersion(javaTarget)) {
|
|
||||||
toolchain.languageVersion.set(JavaLanguageVersion.of(javaTarget))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.withType(JavaCompile::class).configureEach {
|
|
||||||
options.apply {
|
|
||||||
encoding = "utf-8" // Consistent source file encoding
|
|
||||||
if (JavaVersion.current().isJava10Compatible) {
|
|
||||||
release.set(javaTarget)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure all tasks which produce archives (jar, sources jar, javadoc jar, etc) produce more consistent output
|
|
||||||
tasks.withType(AbstractArchiveTask::class).configureEach {
|
|
||||||
isReproducibleFileOrder = true
|
|
||||||
isPreserveFileTimestamps = false
|
|
||||||
}
|
|
@ -1,174 +0,0 @@
|
|||||||
package com.plotsquared.sponge;
|
|
||||||
|
|
||||||
import com.google.inject.Guice;
|
|
||||||
import com.google.inject.Inject;
|
|
||||||
import com.google.inject.Injector;
|
|
||||||
import com.google.inject.Stage;
|
|
||||||
import com.plotsquared.core.PlotPlatform;
|
|
||||||
import com.plotsquared.core.PlotSquared;
|
|
||||||
import com.plotsquared.core.configuration.Settings;
|
|
||||||
import com.plotsquared.core.inject.modules.PlotSquaredModule;
|
|
||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
|
|
||||||
import com.plotsquared.core.util.task.TaskManager;
|
|
||||||
import com.plotsquared.core.util.task.TaskTime;
|
|
||||||
import com.plotsquared.sponge.inject.SpongeModule;
|
|
||||||
import com.plotsquared.sponge.util.task.SpongeTaskManager;
|
|
||||||
import com.plotsquared.sponge.util.task.SpongeTimeConverter;
|
|
||||||
import net.kyori.adventure.identity.Identity;
|
|
||||||
import net.kyori.adventure.text.Component;
|
|
||||||
import net.kyori.adventure.text.LinearComponents;
|
|
||||||
import net.kyori.adventure.text.format.NamedTextColor;
|
|
||||||
import net.kyori.adventure.text.format.Style;
|
|
||||||
import net.kyori.adventure.text.format.TextDecoration;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
|
||||||
import org.spongepowered.api.Game;
|
|
||||||
import org.spongepowered.api.Server;
|
|
||||||
import org.spongepowered.api.Sponge;
|
|
||||||
import org.spongepowered.api.command.Command;
|
|
||||||
import org.spongepowered.api.command.CommandResult;
|
|
||||||
import org.spongepowered.api.command.parameter.Parameter;
|
|
||||||
import org.spongepowered.api.config.ConfigDir;
|
|
||||||
import org.spongepowered.api.entity.living.player.Player;
|
|
||||||
import org.spongepowered.api.entity.living.player.server.ServerPlayer;
|
|
||||||
import org.spongepowered.api.event.Listener;
|
|
||||||
import org.spongepowered.api.event.lifecycle.ConstructPluginEvent;
|
|
||||||
import org.spongepowered.api.event.lifecycle.RegisterCommandEvent;
|
|
||||||
import org.spongepowered.api.event.lifecycle.StartingEngineEvent;
|
|
||||||
import org.spongepowered.api.event.lifecycle.StoppingEngineEvent;
|
|
||||||
import org.spongepowered.plugin.PluginContainer;
|
|
||||||
import org.spongepowered.plugin.builtin.jvm.Plugin;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The main class of your Sponge plugin.
|
|
||||||
*
|
|
||||||
* <p>All methods are optional -- some common event registrations are included as a jumping-off point.</p>
|
|
||||||
*/
|
|
||||||
@Plugin("sponge")
|
|
||||||
public class SpongePlatform implements PlotPlatform<ServerPlayer> {
|
|
||||||
|
|
||||||
public final PluginContainer container;
|
|
||||||
private final Logger logger;
|
|
||||||
private final Game game;
|
|
||||||
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
private PlotAreaManager plotAreaManager;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
@ConfigDir(sharedRoot = false)
|
|
||||||
private Path configDir;
|
|
||||||
|
|
||||||
private int[] version;
|
|
||||||
private Injector injector;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
SpongePlatform(final PluginContainer container, final Logger logger, final Game game) {
|
|
||||||
this.container = container;
|
|
||||||
this.logger = logger;
|
|
||||||
this.game = game;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Listener
|
|
||||||
public void onConstructPlugin(final ConstructPluginEvent event) {
|
|
||||||
// Perform any one-time setup
|
|
||||||
this.logger.info("Constructing sponge");
|
|
||||||
final TaskTime.TimeConverter timeConverter = new SpongeTimeConverter();
|
|
||||||
TaskManager.setPlatformImplementation(new SpongeTaskManager(this, timeConverter));
|
|
||||||
|
|
||||||
final PlotSquared plotSquared = new PlotSquared(this, "Sponge");
|
|
||||||
|
|
||||||
if (Settings.FAWE_Components.FAWE_HOOK) {
|
|
||||||
this.logger.info("FAWE Hooks do not work on Sponge. 😞");
|
|
||||||
}
|
|
||||||
|
|
||||||
// We create the injector after PlotSquared has been initialized, so that we have access
|
|
||||||
// to generated instances and settings
|
|
||||||
this.injector = Guice
|
|
||||||
.createInjector(
|
|
||||||
Stage.PRODUCTION,
|
|
||||||
new PermissionModule(),
|
|
||||||
new WorldManagerModule(),
|
|
||||||
new PlotSquaredModule(),
|
|
||||||
new SpongeModule(this),
|
|
||||||
new BackupModule()
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Listener
|
|
||||||
public void onServerStarting(final StartingEngineEvent<Server> event) {
|
|
||||||
// Any setup per-game instance. This can run multiple times when
|
|
||||||
// using the integrated (single-player) server.
|
|
||||||
}
|
|
||||||
|
|
||||||
@Listener
|
|
||||||
public void onServerStopping(final StoppingEngineEvent<Server> event) {
|
|
||||||
// Any tear down per-game instance. This can run multiple times when
|
|
||||||
// using the integrated (single-player) server.
|
|
||||||
}
|
|
||||||
|
|
||||||
@Listener
|
|
||||||
public void onRegisterCommands(final RegisterCommandEvent<Command.Parameterized> event) {
|
|
||||||
// Register a simple command
|
|
||||||
// When possible, all commands should be registered within a command register event
|
|
||||||
final Parameter.Value<String> nameParam = Parameter.string().key("name").build();
|
|
||||||
event.register(this.container, Command.builder()
|
|
||||||
.addParameter(nameParam)
|
|
||||||
.permission("sponge.command.greet")
|
|
||||||
.executor(ctx -> {
|
|
||||||
final String name = ctx.requireOne(nameParam);
|
|
||||||
ctx.sendMessage(Identity.nil(), LinearComponents.linear(
|
|
||||||
NamedTextColor.AQUA,
|
|
||||||
Component.text("Hello "),
|
|
||||||
Component.text(name, Style.style(TextDecoration.BOLD)),
|
|
||||||
Component.text("!")
|
|
||||||
));
|
|
||||||
|
|
||||||
return CommandResult.success();
|
|
||||||
})
|
|
||||||
.build(), "greet", "wave");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int[] serverVersion() {
|
|
||||||
if (this.version == null) {
|
|
||||||
try {
|
|
||||||
this.version = new int[3];
|
|
||||||
String[] split = Sponge.platform().minecraftVersion().name().split("\\.");
|
|
||||||
this.version[0] = Integer.parseInt(split[0]);
|
|
||||||
this.version[1] = Integer.parseInt(split[1]);
|
|
||||||
if (split.length == 3) {
|
|
||||||
this.version[2] = Integer.parseInt(split[2]);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return new int[]{1, 16, 5};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return this.version;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NonNull String serverImplementation() {
|
|
||||||
return "Sponge"; //TODO Possibly revaluate the this method name
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NonNull File getDirectory() {
|
|
||||||
return configDir.toFile();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NonNull File worldContainer() {
|
|
||||||
return game.gameDirectory().toFile(); //TODO This may be incorrect. Behavior needs verification.
|
|
||||||
}
|
|
||||||
|
|
||||||
public Logger getLogger() {
|
|
||||||
return logger;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,106 +0,0 @@
|
|||||||
package com.plotsquared.sponge.inject;
|
|
||||||
|
|
||||||
import com.google.inject.AbstractModule;
|
|
||||||
import com.google.inject.Provides;
|
|
||||||
import com.google.inject.Singleton;
|
|
||||||
import com.google.inject.assistedinject.FactoryModuleBuilder;
|
|
||||||
import com.plotsquared.core.PlotPlatform;
|
|
||||||
import com.plotsquared.core.PlotSquared;
|
|
||||||
import com.plotsquared.core.configuration.Settings;
|
|
||||||
import com.plotsquared.core.generator.HybridGen;
|
|
||||||
import com.plotsquared.core.generator.IndependentPlotGenerator;
|
|
||||||
import com.plotsquared.core.inject.annotations.ConsoleActor;
|
|
||||||
import com.plotsquared.core.inject.annotations.DefaultGenerator;
|
|
||||||
import com.plotsquared.core.inject.factory.ChunkCoordinatorBuilderFactory;
|
|
||||||
import com.plotsquared.core.inject.factory.ChunkCoordinatorFactory;
|
|
||||||
import com.plotsquared.core.inject.factory.HybridPlotWorldFactory;
|
|
||||||
import com.plotsquared.core.inject.factory.ProgressSubscriberFactory;
|
|
||||||
import com.plotsquared.core.plot.world.DefaultPlotAreaManager;
|
|
||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
|
|
||||||
import com.plotsquared.core.plot.world.SinglePlotAreaManager;
|
|
||||||
import com.plotsquared.core.queue.ChunkCoordinator;
|
|
||||||
import com.plotsquared.core.queue.GlobalBlockQueue;
|
|
||||||
import com.plotsquared.core.queue.QueueProvider;
|
|
||||||
import com.plotsquared.core.queue.subscriber.DefaultProgressSubscriber;
|
|
||||||
import com.plotsquared.core.queue.subscriber.ProgressSubscriber;
|
|
||||||
import com.plotsquared.core.util.ChunkManager;
|
|
||||||
import com.plotsquared.core.util.EconHandler;
|
|
||||||
import com.plotsquared.core.util.InventoryUtil;
|
|
||||||
import com.plotsquared.core.util.PlayerManager;
|
|
||||||
import com.plotsquared.core.util.RegionManager;
|
|
||||||
import com.plotsquared.core.util.SchematicHandler;
|
|
||||||
import com.plotsquared.core.util.SetupUtils;
|
|
||||||
import com.plotsquared.core.util.WorldUtil;
|
|
||||||
import com.plotsquared.sponge.SpongePlatform;
|
|
||||||
import com.plotsquared.sponge.player.SpongePlayerManager;
|
|
||||||
import com.plotsquared.sponge.util.SpongeEconHandler;
|
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
|
||||||
import org.spongepowered.api.Sponge;
|
|
||||||
import org.spongepowered.api.service.economy.EconomyService;
|
|
||||||
|
|
||||||
public class SpongeModule extends AbstractModule {
|
|
||||||
|
|
||||||
private final SpongePlatform spongePlatform;
|
|
||||||
|
|
||||||
public SpongeModule(SpongePlatform spongePlatform) {
|
|
||||||
this.spongePlatform = spongePlatform;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void configure() {
|
|
||||||
bind(PlayerManager.class).to(SpongePlayerManager.class);
|
|
||||||
bind(PlotPlatform.class).toInstance(spongePlatform);
|
|
||||||
bind(SpongePlatform.class).toInstance(spongePlatform);
|
|
||||||
bind(IndependentPlotGenerator.class).annotatedWith(DefaultGenerator.class).to(HybridGen.class);
|
|
||||||
// Console actor
|
|
||||||
@NonNull ConsoleCommandSender console = Sponge.server().getServer().getConsoleSender();
|
|
||||||
WorldEditPlugin wePlugin = ((WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit"));
|
|
||||||
bind(Actor.class).annotatedWith(ConsoleActor.class).toInstance(wePlugin.wrapCommandSender(console));
|
|
||||||
bind(InventoryUtil.class).to(BukkitInventoryUtil.class);
|
|
||||||
bind(SetupUtils.class).to(BukkitSetupUtils.class);
|
|
||||||
bind(WorldUtil.class).to(BukkitUtil.class);
|
|
||||||
install(new FactoryModuleBuilder()
|
|
||||||
.implement(ProgressSubscriber.class, DefaultProgressSubscriber.class)
|
|
||||||
.build(ProgressSubscriberFactory.class));
|
|
||||||
bind(ChunkManager.class).to(BukkitChunkManager.class);
|
|
||||||
if (PlotSquared.platform().isFaweHooking()) {
|
|
||||||
bind(SchematicHandler.class).to(FaweSchematicHandler.class);
|
|
||||||
bind(RegionManager.class).to(FaweRegionManager.class);
|
|
||||||
} else {
|
|
||||||
bind(SchematicHandler.class).to(BukkitSchematicHandler.class);
|
|
||||||
bind(RegionManager.class).to(BukkitRegionManager.class);
|
|
||||||
}
|
|
||||||
bind(GlobalBlockQueue.class).toInstance(new GlobalBlockQueue(QueueProvider.of(BukkitQueueCoordinator.class)));
|
|
||||||
if (Settings.Enabled_Components.WORLDS) {
|
|
||||||
bind(PlotAreaManager.class).to(SinglePlotAreaManager.class);
|
|
||||||
try {
|
|
||||||
bind(SingleWorldListener.class).toInstance(new SingleWorldListener());
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
bind(PlotAreaManager.class).to(DefaultPlotAreaManager.class);
|
|
||||||
}
|
|
||||||
install(new FactoryModuleBuilder().build(HybridPlotWorldFactory.class));
|
|
||||||
install(new FactoryModuleBuilder()
|
|
||||||
.implement(ChunkCoordinator.class, BukkitChunkCoordinator.class)
|
|
||||||
.build(ChunkCoordinatorFactory.class));
|
|
||||||
install(new FactoryModuleBuilder().build(ChunkCoordinatorBuilderFactory.class));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Singleton
|
|
||||||
@NonNull EconHandler provideEconHandler() {
|
|
||||||
if (!Settings.Enabled_Components.ECONOMY) {
|
|
||||||
return EconHandler.nullEconHandler();
|
|
||||||
}
|
|
||||||
SpongeEconHandler economyService = new SpongeEconHandler();
|
|
||||||
|
|
||||||
if (!economyService.isSupported()) {
|
|
||||||
spongePlatform.getLogger().warn("Economy is enabled but no plugin is providing an economy service.");
|
|
||||||
}
|
|
||||||
|
|
||||||
return economyService;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
package com.plotsquared.sponge.player;
|
|
||||||
|
|
||||||
import com.plotsquared.core.player.OfflinePlotPlayer;
|
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
|
||||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
//TODO Implement
|
|
||||||
public class SpongeOfflinePlayer implements @Nullable
|
|
||||||
OfflinePlotPlayer {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasPermission(@Nullable final String world, @NonNull final String permission) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasKeyedPermission(@Nullable final String world, @NonNull final String permission, @NonNull final String key) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public UUID getUUID() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getLastPlayed() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,243 +0,0 @@
|
|||||||
/*
|
|
||||||
* _____ _ _ _____ _
|
|
||||||
* | __ \| | | | / ____| | |
|
|
||||||
* | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| |
|
|
||||||
* | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` |
|
|
||||||
* | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| |
|
|
||||||
* |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_|
|
|
||||||
* | |
|
|
||||||
* |_|
|
|
||||||
* PlotSquared plot management system for Minecraft
|
|
||||||
* Copyright (C) 2014 - 2022 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 <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package com.plotsquared.sponge.player;
|
|
||||||
|
|
||||||
import com.plotsquared.core.events.TeleportCause;
|
|
||||||
import com.plotsquared.core.location.Location;
|
|
||||||
import com.plotsquared.core.permissions.PermissionHandler;
|
|
||||||
import com.plotsquared.core.player.ConsolePlayer;
|
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
|
||||||
import com.plotsquared.core.plot.PlotWeather;
|
|
||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
|
|
||||||
import com.plotsquared.core.util.EventDispatcher;
|
|
||||||
import com.plotsquared.sponge.util.SpongeUtil;
|
|
||||||
import com.sk89q.worldedit.extension.platform.Actor;
|
|
||||||
import com.sk89q.worldedit.world.gamemode.GameModes;
|
|
||||||
import com.sk89q.worldedit.world.item.ItemType;
|
|
||||||
import net.kyori.adventure.audience.Audience;
|
|
||||||
import net.kyori.adventure.text.Component;
|
|
||||||
import org.checkerframework.checker.index.qual.NonNegative;
|
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
|
||||||
import org.spongepowered.api.ResourceKey;
|
|
||||||
import org.spongepowered.api.Server;
|
|
||||||
import org.spongepowered.api.Sponge;
|
|
||||||
import org.spongepowered.api.entity.living.player.Player;
|
|
||||||
import org.spongepowered.api.entity.living.player.server.ServerPlayer;
|
|
||||||
import org.spongepowered.api.registry.RegistryTypes;
|
|
||||||
import org.spongepowered.api.world.server.ServerLocation;
|
|
||||||
import org.spongepowered.math.vector.Vector3d;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import static com.sk89q.worldedit.world.gamemode.GameModes.SPECTATOR;
|
|
||||||
|
|
||||||
public class SpongePlayer extends PlotPlayer<ServerPlayer> {
|
|
||||||
|
|
||||||
private static boolean CHECK_EFFECTIVE = true;
|
|
||||||
public final ServerPlayer player;
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>Please do not use this method. Instead use
|
|
||||||
* BukkitUtil.getPlayer(Player), as it caches player objects.</p>
|
|
||||||
*
|
|
||||||
* @param plotAreaManager PlotAreaManager instance
|
|
||||||
* @param eventDispatcher EventDispatcher instance
|
|
||||||
* @param player Bukkit player instance
|
|
||||||
* @param permissionHandler PermissionHandler instance
|
|
||||||
*/
|
|
||||||
public SpongePlayer(
|
|
||||||
final @NonNull PlotAreaManager plotAreaManager,
|
|
||||||
final @NonNull EventDispatcher eventDispatcher,
|
|
||||||
final @NonNull ServerPlayer player,
|
|
||||||
final @NonNull PermissionHandler permissionHandler
|
|
||||||
) {
|
|
||||||
this(plotAreaManager, eventDispatcher, player, false, permissionHandler);
|
|
||||||
}
|
|
||||||
|
|
||||||
public SpongePlayer(
|
|
||||||
final @NonNull PlotAreaManager plotAreaManager,
|
|
||||||
final @NonNull EventDispatcher eventDispatcher,
|
|
||||||
final @NonNull ServerPlayer player,
|
|
||||||
final boolean realPlayer,
|
|
||||||
final @NonNull PermissionHandler permissionHandler
|
|
||||||
) {
|
|
||||||
super(plotAreaManager, eventDispatcher, permissionHandler);
|
|
||||||
this.player = player;
|
|
||||||
this.setupPermissionProfile();
|
|
||||||
if (realPlayer) {
|
|
||||||
super.populatePersistentMetaMap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Actor toActor() {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ServerPlayer getPlatformPlayer() {
|
|
||||||
return this.player;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public UUID getUUID() {
|
|
||||||
/*
|
|
||||||
TODO Fix me
|
|
||||||
|
|
||||||
if (Settings.UUID.OFFLINE) {
|
|
||||||
if (Settings.UUID.FORCE_LOWERCASE) {
|
|
||||||
return UUID.nameUUIDFromBytes(("OfflinePlayer:" +
|
|
||||||
getName().toLowerCase()).getBytes(Charsets.UTF_8));
|
|
||||||
} else {
|
|
||||||
return UUID.nameUUIDFromBytes(("OfflinePlayer:" +
|
|
||||||
getName()).getBytes(Charsets.UTF_8));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
return player.uniqueId();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@NonNegative
|
|
||||||
public long getLastPlayed() {
|
|
||||||
throw new UnsupportedOperationException("TODO");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canTeleport(final @NonNull Location location) {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@NonNegative
|
|
||||||
public int hasPermissionRange(
|
|
||||||
final @NonNull String stub, @NonNegative final int range
|
|
||||||
) {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void teleport(final @NonNull Location location, final @NonNull TeleportCause cause) {
|
|
||||||
if (Math.abs(location.getX()) >= 30000000 || Math.abs(location.getZ()) >= 30000000) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final ServerLocation spongeLocation = ServerLocation.of(
|
|
||||||
ResourceKey.resolve(location.getWorldName()),
|
|
||||||
location.getX() + 0.5,
|
|
||||||
location.getY(),
|
|
||||||
location.getZ() + 0.5
|
|
||||||
);
|
|
||||||
//TODO has not been tested.
|
|
||||||
player.setLocationAndRotation(spongeLocation, Vector3d.from(location.getPitch(), location.getYaw(), 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
if (this.name == null) {
|
|
||||||
this.name = this.player.name();
|
|
||||||
}
|
|
||||||
return this.player.name();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setCompassTarget(Location location) {
|
|
||||||
//Setting compass targets changed since the last Sponge API.
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Location getLocationFull() {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setWeather(final @NonNull PlotWeather weather) {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public com.sk89q.worldedit.world.gamemode.GameMode getGameMode() {
|
|
||||||
return GameModes.get(player.gameMode().get().key(RegistryTypes.GAME_MODE).asString());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setGameMode(final com.sk89q.worldedit.world.gamemode.GameMode gameMode) {
|
|
||||||
player.gameMode().set(Sponge.game().registry(RegistryTypes.GAME_MODE).value(ResourceKey.resolve(gameMode.getId())));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setTime(final long time) {
|
|
||||||
throw new UnsupportedOperationException("Sponge still doesn't support this after more than 4 years of work on API 8.");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean getFlight() {
|
|
||||||
return player.canFly().get();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFlight(boolean fly) {
|
|
||||||
this.player.canFly().set(fly);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void playMusic(final @NonNull Location location, final @NonNull ItemType id) {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void kick(final String message) {
|
|
||||||
this.player.kick(Component.text(message));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stopSpectating() {
|
|
||||||
if (getGameMode() == SPECTATOR) {
|
|
||||||
this.player.spectatorTarget().set(null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isBanned() {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NonNull Audience getAudience() {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canSee(final PlotPlayer<?> other) {
|
|
||||||
if (other instanceof ConsolePlayer) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return this.player.canSee(null); //TODO Fix Me?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,86 +0,0 @@
|
|||||||
/*
|
|
||||||
* _____ _ _ _____ _
|
|
||||||
* | __ \| | | | / ____| | |
|
|
||||||
* | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| |
|
|
||||||
* | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` |
|
|
||||||
* | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| |
|
|
||||||
* |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_|
|
|
||||||
* | |
|
|
||||||
* |_|
|
|
||||||
* PlotSquared plot management system for Minecraft
|
|
||||||
* Copyright (C) 2014 - 2022 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 <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package com.plotsquared.sponge.player;
|
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
|
||||||
import com.google.inject.Singleton;
|
|
||||||
import com.plotsquared.core.permissions.PermissionHandler;
|
|
||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
|
|
||||||
import com.plotsquared.core.util.EventDispatcher;
|
|
||||||
import com.plotsquared.core.util.PlayerManager;
|
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
|
||||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
|
||||||
import org.spongepowered.api.Server;
|
|
||||||
import org.spongepowered.api.Sponge;
|
|
||||||
import org.spongepowered.api.entity.living.player.server.ServerPlayer;
|
|
||||||
import org.spongepowered.api.user.UserManager;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
@Singleton
|
|
||||||
public class SpongePlayerManager extends PlayerManager<SpongePlayer, ServerPlayer> {
|
|
||||||
|
|
||||||
private final PlotAreaManager plotAreaManager;
|
|
||||||
private final EventDispatcher eventDispatcher;
|
|
||||||
private final PermissionHandler permissionHandler;
|
|
||||||
private final UserManager userManager;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
public SpongePlayerManager(
|
|
||||||
final @NonNull PlotAreaManager plotAreaManager,
|
|
||||||
final @NonNull EventDispatcher eventDispatcher,
|
|
||||||
final @NonNull PermissionHandler permissionHandler
|
|
||||||
) {
|
|
||||||
this.plotAreaManager = plotAreaManager;
|
|
||||||
this.eventDispatcher = eventDispatcher;
|
|
||||||
this.permissionHandler = permissionHandler;
|
|
||||||
userManager = Sponge.game().server().userManager();
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public SpongePlayer getPlayer(final @NonNull ServerPlayer object) {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NonNull SpongePlayer createPlayer(final @NonNull UUID uuid) {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public SpongeOfflinePlayer getOfflinePlayer(final @Nullable UUID uuid) {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public SpongeOfflinePlayer getOfflinePlayer(final @NonNull String username) {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,71 +0,0 @@
|
|||||||
package com.plotsquared.sponge.util;
|
|
||||||
|
|
||||||
import com.google.inject.Singleton;
|
|
||||||
import com.plotsquared.core.player.OfflinePlotPlayer;
|
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
|
||||||
import com.plotsquared.core.plot.PlotArea;
|
|
||||||
import com.plotsquared.core.util.EconHandler;
|
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
|
||||||
import org.spongepowered.api.Sponge;
|
|
||||||
import org.spongepowered.api.service.economy.Currency;
|
|
||||||
import org.spongepowered.api.service.economy.EconomyService;
|
|
||||||
import org.spongepowered.api.service.economy.account.UniqueAccount;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
|
|
||||||
@Singleton
|
|
||||||
public class SpongeEconHandler extends EconHandler {
|
|
||||||
|
|
||||||
private final Optional<EconomyService> economyService; //TODO maybe don't store an optional?
|
|
||||||
|
|
||||||
public SpongeEconHandler() {
|
|
||||||
economyService = Sponge.serviceProvider().provide(EconomyService.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean init() {
|
|
||||||
return Sponge.serviceProvider().provide(EconomyService.class).isPresent();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getBalance(final PlotPlayer<?> player) {
|
|
||||||
if(economyService.isPresent()) {
|
|
||||||
final Optional<UniqueAccount> account = economyService.get().findOrCreateAccount(player.getUUID());
|
|
||||||
return account
|
|
||||||
.map(uniqueAccount -> uniqueAccount.balance(economyService.get().defaultCurrency()).doubleValue())
|
|
||||||
.orElse(0.0);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void withdrawMoney(final PlotPlayer<?> player, final double amount) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void depositMoney(final PlotPlayer<?> player, final double amount) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void depositMoney(final OfflinePlotPlayer player, final double amount) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(final PlotArea plotArea) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NonNull String format(final double balance) {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSupported() {
|
|
||||||
return Sponge.serviceProvider().provide(EconomyService.class).isPresent();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
package com.plotsquared.sponge.util;
|
|
||||||
|
|
||||||
import com.plotsquared.core.location.Location;
|
|
||||||
import com.plotsquared.core.util.WorldUtil;
|
|
||||||
|
|
||||||
public class SpongeUtil extends WorldUtil {
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
package com.plotsquared.sponge.util;
|
|
||||||
|
|
||||||
import com.plotsquared.core.location.World;
|
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
|
||||||
import org.spongepowered.api.world.server.ServerWorld;
|
|
||||||
|
|
||||||
public class SpongeWorld implements World<ServerWorld> {
|
|
||||||
|
|
||||||
private final ServerWorld world;
|
|
||||||
|
|
||||||
private SpongeWorld(final ServerWorld world) {
|
|
||||||
this.world = world;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NonNull ServerWorld getPlatformWorld() {
|
|
||||||
return this.world;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NonNull String getName() {
|
|
||||||
return this.world.key().asString();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,69 +0,0 @@
|
|||||||
package com.plotsquared.sponge.util.task;
|
|
||||||
|
|
||||||
import com.plotsquared.core.util.task.PlotSquaredTask;
|
|
||||||
import com.plotsquared.core.util.task.TaskManager;
|
|
||||||
import com.plotsquared.core.util.task.TaskTime;
|
|
||||||
import com.plotsquared.sponge.SpongePlatform;
|
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
|
||||||
import org.spongepowered.api.Sponge;
|
|
||||||
import org.spongepowered.api.scheduler.Task;
|
|
||||||
import org.spongepowered.api.util.Ticks;
|
|
||||||
|
|
||||||
import java.util.concurrent.Callable;
|
|
||||||
import java.util.concurrent.Future;
|
|
||||||
|
|
||||||
public class SpongeTaskManager extends TaskManager {
|
|
||||||
|
|
||||||
private final SpongePlatform spongeMain;
|
|
||||||
private final TaskTime.TimeConverter timeConverter;
|
|
||||||
|
|
||||||
public SpongeTaskManager(SpongePlatform spongeMain, TaskTime.TimeConverter timeConverter) {
|
|
||||||
this.spongeMain = spongeMain;
|
|
||||||
this.timeConverter = timeConverter;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public <T> T sync(final @NonNull Callable<T> function, final int timeout) throws Exception {
|
|
||||||
return null; //TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public <T> Future<T> callMethodSync(final @NonNull Callable<T> method) {
|
|
||||||
return null; //TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PlotSquaredTask taskRepeat(@NonNull final Runnable runnable, @NonNull final TaskTime taskTime) {
|
|
||||||
return null; //TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PlotSquaredTask taskRepeatAsync(@NonNull final Runnable runnable, @NonNull final TaskTime taskTime) {
|
|
||||||
//TODO input the current tick delay and interval using the Sponge Tick API.
|
|
||||||
Task task =
|
|
||||||
Task.builder().delay(Ticks.zero()).interval(Ticks.zero()).plugin(spongeMain.container).execute(runnable).build();
|
|
||||||
Sponge.asyncScheduler().submit(task);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void taskAsync(@NonNull final Runnable runnable) {
|
|
||||||
//TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void task(@NonNull final Runnable runnable) {
|
|
||||||
Task.builder().execute(runnable).plugin(spongeMain.container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void taskLater(@NonNull final Runnable runnable, @NonNull final TaskTime taskTime) {
|
|
||||||
//TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void taskLaterAsync(@NonNull final Runnable runnable, @NonNull final TaskTime taskTime) {
|
|
||||||
//TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
package com.plotsquared.sponge.util.task;
|
|
||||||
|
|
||||||
import com.plotsquared.core.util.task.TaskTime;
|
|
||||||
import org.checkerframework.checker.index.qual.NonNegative;
|
|
||||||
import org.spongepowered.api.Sponge;
|
|
||||||
import org.spongepowered.api.util.Ticks;
|
|
||||||
|
|
||||||
public class SpongeTimeConverter implements TaskTime.TimeConverter {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NonNegative long msToTicks(@NonNegative final long ms) {
|
|
||||||
return 0; // TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NonNegative long ticksToMs(@NonNegative final long ticks) {
|
|
||||||
return 0; // TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -26,7 +26,6 @@ allprojects {
|
|||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
mavenLocal()
|
|
||||||
|
|
||||||
maven {
|
maven {
|
||||||
name = "Sonatype OSS"
|
name = "Sonatype OSS"
|
||||||
@ -78,7 +77,7 @@ allprojects {
|
|||||||
}
|
}
|
||||||
|
|
||||||
tasks.compileJava.configure {
|
tasks.compileJava.configure {
|
||||||
options.release.set(16)
|
options.release.set(17)
|
||||||
}
|
}
|
||||||
|
|
||||||
configurations.all {
|
configurations.all {
|
||||||
|
@ -17,7 +17,7 @@ adventure-text-minimessage = "4.1.0-SNAPSHOT"
|
|||||||
adventure-platform-bukkit = "4.0.1"
|
adventure-platform-bukkit = "4.0.1"
|
||||||
|
|
||||||
# Plugins
|
# Plugins
|
||||||
worldedit = "7.2.9-SNAPSHOT"
|
worldedit = "7.2.8"
|
||||||
fawe = "2.0.0"
|
fawe = "2.0.0"
|
||||||
vault = "1.7.1"
|
vault = "1.7.1"
|
||||||
placeholderapi = "2.11.1"
|
placeholderapi = "2.11.1"
|
||||||
@ -66,7 +66,6 @@ adventurePlatformBukkit = { group = "net.kyori", name = "adventure-platform-bukk
|
|||||||
# Plugins
|
# Plugins
|
||||||
worldeditCore = { group = "com.sk89q.worldedit", name = "worldedit-core", version.ref = "worldedit" }
|
worldeditCore = { group = "com.sk89q.worldedit", name = "worldedit-core", version.ref = "worldedit" }
|
||||||
worldeditBukkit = { group = "com.sk89q.worldedit", name = "worldedit-bukkit", version.ref = "worldedit" }
|
worldeditBukkit = { group = "com.sk89q.worldedit", name = "worldedit-bukkit", version.ref = "worldedit" }
|
||||||
worldeditSponge = { group = "com.sk89q.worldedit", name = "worldedit-sponge", version.ref = "worldedit" }
|
|
||||||
fastasyncworldeditBukkit = { group = "com.fastasyncworldedit", name = "FastAsyncWorldEdit-Bukkit", version.ref = "fawe" }
|
fastasyncworldeditBukkit = { group = "com.fastasyncworldedit", name = "FastAsyncWorldEdit-Bukkit", version.ref = "fawe" }
|
||||||
fastasyncworldeditCore = { group = "com.fastasyncworldedit", name = "FastAsyncWorldEdit-Core", version.ref = "fawe" }
|
fastasyncworldeditCore = { group = "com.fastasyncworldedit", name = "FastAsyncWorldEdit-Core", version.ref = "fawe" }
|
||||||
vault = { group = "com.github.MilkBowl", name = "VaultAPI", version.ref = "vault" }
|
vault = { group = "com.github.MilkBowl", name = "VaultAPI", version.ref = "vault" }
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
rootProject.name = "PlotSquared"
|
rootProject.name = "PlotSquared"
|
||||||
|
|
||||||
include("Core", "Bukkit", "Sponge")
|
include("Core", "Bukkit")
|
||||||
|
|
||||||
project(":Core").name = "PlotSquared-Core"
|
project(":Core").name = "PlotSquared-Core"
|
||||||
project(":Bukkit").name = "PlotSquared-Bukkit"
|
project(":Bukkit").name = "PlotSquared-Bukkit"
|
||||||
project(":Sponge").name = "PlotSquared-Sponge"
|
|
||||||
|
|
||||||
enableFeaturePreview("VERSION_CATALOGS")
|
enableFeaturePreview("VERSION_CATALOGS")
|
||||||
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
|
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
|
||||||
|
Reference in New Issue
Block a user