mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2025-07-03 06:04:43 +02:00
Compare commits
70 Commits
fix/v6/nul
...
6.6.2
Author | SHA1 | Date | |
---|---|---|---|
c28177d6af | |||
8a80f252cf | |||
93571c72d1 | |||
6fd7379221 | |||
dc5c80d812 | |||
96e9a61e7c | |||
b9bd9b81e6 | |||
ec77812879 | |||
efc2083798 | |||
3a6f845c01 | |||
7efd42ae45 | |||
f43f4cbf5d | |||
104cc4b7a4 | |||
218be43143 | |||
308dba5601 | |||
5f233bb5d1 | |||
5e188d114f | |||
660e05d27f | |||
4c0ad148bf | |||
5c7bfb988c | |||
b46f486680 | |||
05797d0c78 | |||
36ef2cf9ba | |||
26ec31a012 | |||
fd4a542062 | |||
dc13f2565f | |||
9f632af0ae | |||
d698c6a1e5 | |||
40e1bd9897 | |||
75f31c5bf6 | |||
954c813cef | |||
05e055e9cf | |||
2ea21c150f | |||
c2fd4edad5 | |||
78b8696778 | |||
e653961385 | |||
b21d12fd52 | |||
7557df96c7 | |||
61797c3aff | |||
78125ff1e2 | |||
d7c8715b25 | |||
34f005c244 | |||
6fbd1376ca | |||
951767dc64 | |||
16928b05f1 | |||
fff14b05cb | |||
e619c867e9 | |||
543284e016 | |||
0d78ba5f35 | |||
9ba2b62fc2 | |||
f10ee27fdd | |||
3278ce1fe9 | |||
fefb0334bd | |||
d06a827e31 | |||
10bb520f3a | |||
126aa53b61 | |||
ac71046feb | |||
7c290e6bd0 | |||
4d297cc829 | |||
5ab410a5c5 | |||
1f28bac955 | |||
92c54de5e9 | |||
ff5d79699d | |||
a0594c19ee | |||
da41c136fe | |||
6a5859ee0f | |||
59e0b4b67a | |||
5fc153d896 | |||
a003836dbc | |||
42bf413528 |
3
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
3
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@ -7,7 +7,7 @@ body:
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for taking the time to fill out this bug report for PlotSquared! Fill out the following form to your best ability to help us fix the problem.
|
||||
Only use this if you're absolutely sure that you found a bug and can reproduce it. For anything else, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://github.com/IntellectualSites/PlotSquared-Documentation/wiki).
|
||||
Only use this if you're absolutely sure that you found a bug and can reproduce it. For anything else, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://intellectualsites.github.io/plotsquared-documentation/).
|
||||
Do NOT use the public issue tracker to report security vulnerabilities! They are disclosed using [this](https://forms.gle/btgdRn9yhGtzEiGW8) form!
|
||||
|
||||
- type: dropdown
|
||||
@ -27,6 +27,7 @@ body:
|
||||
description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first.
|
||||
multiple: false
|
||||
options:
|
||||
- '1.18.2'
|
||||
- '1.18.1'
|
||||
- '1.18'
|
||||
- '1.17.1'
|
||||
|
2
.github/ISSUE_TEMPLATE/config.yml
vendored
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@ -4,5 +4,5 @@ contact_links:
|
||||
url: https://discord.gg/intellectualsites
|
||||
about: Our support Discord, please ask questions and seek support here.
|
||||
- name: PlotSquared Wiki
|
||||
url: https://github.com/IntellectualSites/PlotSquared-Documentation/wiki
|
||||
url: https://intellectualsites.github.io/plotsquared-documentation/
|
||||
about: Take a look at the wiki page for instructions how to setup PlotSquared and use its commands.
|
||||
|
2
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
2
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@ -7,7 +7,7 @@ body:
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for taking the time to fill out this feature request for PlotSquared! Fill out the following form to your best ability to help us understand your feature request and greately improve the change of it getting added.
|
||||
For anything else than a feature request, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://github.com/IntellectualSites/PlotSquared-Documentation/wiki).
|
||||
For anything else than a feature request, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://intellectualsites.github.io/plotsquared-documentation/).
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
|
5
.github/workflows/build.yml
vendored
5
.github/workflows/build.yml
vendored
@ -4,14 +4,15 @@ on: [ pull_request, push ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v2.4.0
|
||||
uses: actions/checkout@v3.0.0
|
||||
- name: Validate Gradle Wrapper"
|
||||
uses: gradle/wrapper-validation-action@v1.0.4
|
||||
- name: Setup Java
|
||||
uses: actions/setup-java@v2.5.0
|
||||
uses: actions/setup-java@v3.0.0
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: 17
|
||||
|
37
.github/workflows/codeql.yml
vendored
Normal file
37
.github/workflows/codeql.yml
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ v6 ]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [ v6 ]
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'java' ]
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
20
.github/workflows/rebase.yml
vendored
20
.github/workflows/rebase.yml
vendored
@ -1,20 +0,0 @@
|
||||
name: Rebase Pull Request
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
|
||||
jobs:
|
||||
rebase:
|
||||
name: Rebase
|
||||
if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/rebase') && github.event.comment.author_association == 'MEMBER'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v2.4.0
|
||||
with:
|
||||
token: ${{ secrets.REBASE_TOKEN }}
|
||||
fetch-depth: 0
|
||||
- name: Automatic Rebase
|
||||
uses: cirrus-actions/rebase@1.5
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.REBASE_TOKEN }}
|
3
.github/workflows/release-drafter.yml
vendored
3
.github/workflows/release-drafter.yml
vendored
@ -11,8 +11,9 @@ on:
|
||||
|
||||
jobs:
|
||||
update_release_draft:
|
||||
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: release-drafter/release-drafter@v5.17.5
|
||||
- uses: release-drafter/release-drafter@v5.19.0
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
@ -1,4 +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"]
|
||||
ignoreRules = ["CatchAndPrintStackTrace", "ReferenceEquality", "FallThrough", "FutureReturnValueIgnored", "MixedMutabilityReturnType", "EmptyCatch", "MissingCasesInEnumSwitch", "OperatorPrecedence", "StaticAssignmentInConstructor", "ReferenceEquality", "EqualsHashCode", "EqualsGetClass", "TypeParameterUnusedInFormals", "StringSplitter", "InlineMeSuggester", "NULL_DEREFERENCE"]
|
||||
|
13
.whitesource
13
.whitesource
@ -1,13 +0,0 @@
|
||||
{
|
||||
"scanSettings": {
|
||||
"baseBranches": ["v6"]
|
||||
},
|
||||
"checkRunSettings": {
|
||||
"vulnerableCheckRunConclusionLevel": "success",
|
||||
"displayMode": "diff"
|
||||
},
|
||||
"issueSettings": {
|
||||
"minSeverityLevel": "LOW"
|
||||
},
|
||||
"enableRenovate": "true"
|
||||
}
|
@ -95,11 +95,11 @@ tasks.named<ShadowJar>("shadowJar") {
|
||||
tasks {
|
||||
withType<Javadoc> {
|
||||
val opt = options as StandardJavadocDocletOptions
|
||||
opt.links("https://papermc.io/javadocs/paper/1.17/")
|
||||
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-core/7.2.7/")
|
||||
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/7.2.7/")
|
||||
opt.links("https://jd.adventure.kyori.net/api/4.9.3/")
|
||||
opt.links("https://google.github.io/guice/api-docs/5.0.1/javadoc/")
|
||||
opt.links("https://papermc.io/javadocs/paper/1.18/")
|
||||
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString())
|
||||
opt.links("https://javadoc.io/doc/com.plotsquared/PlotSquared-Core/latest/")
|
||||
opt.links("https://jd.adventure.kyori.net/api/" + libs.adventure.get().versionConstraint.toString())
|
||||
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
|
||||
opt.links("https://checkerframework.org/api/")
|
||||
}
|
||||
}
|
||||
|
@ -238,6 +238,16 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
||||
return this.version;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int versionMinHeight() {
|
||||
return serverVersion()[1] >= 18 ? -64 : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int versionMaxHeight() {
|
||||
return serverVersion()[1] >= 18 ? 319 : 255;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull String serverImplementation() {
|
||||
return Bukkit.getVersion();
|
||||
@ -324,8 +334,6 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
||||
// Comments
|
||||
CommentManager.registerDefaultInboxes();
|
||||
|
||||
plotSquared.startExpiryTasks();
|
||||
|
||||
// Do stuff that was previously done in PlotSquared
|
||||
// Kill entities
|
||||
if (Settings.Enabled_Components.KILL_ROAD_MOBS || Settings.Enabled_Components.KILL_ROAD_VEHICLES) {
|
||||
@ -422,6 +430,8 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
||||
}, TaskTime.ticks(1L));
|
||||
}
|
||||
|
||||
plotSquared.startExpiryTasks();
|
||||
|
||||
// Once the server has loaded force updating all generators known to P2
|
||||
TaskManager.runTaskLater(() -> PlotSquared.platform().setupUtils().updateGenerators(true), TaskTime.ticks(1L));
|
||||
|
||||
|
@ -65,7 +65,10 @@ final class BlockStatePopulator extends BlockPopulator {
|
||||
return;
|
||||
}
|
||||
final ChunkWrapper wrap = new ChunkWrapper(area.getWorldName(), source.getX(), source.getZ());
|
||||
final ScopedQueueCoordinator chunk = this.queue.getForChunk(wrap.x, wrap.z);
|
||||
final ScopedQueueCoordinator chunk = this.queue.getForChunk(wrap.x, wrap.z,
|
||||
com.plotsquared.bukkit.util.BukkitWorld.getMinWorldHeight(world),
|
||||
com.plotsquared.bukkit.util.BukkitWorld.getMaxWorldHeight(world) - 1
|
||||
);
|
||||
if (this.plotGenerator.populateChunk(chunk, area)) {
|
||||
this.queue.enqueue();
|
||||
}
|
||||
|
@ -27,6 +27,7 @@ package com.plotsquared.bukkit.generator;
|
||||
|
||||
import com.plotsquared.bukkit.queue.GenChunk;
|
||||
import com.plotsquared.bukkit.util.BukkitUtil;
|
||||
import com.plotsquared.bukkit.util.BukkitWorld;
|
||||
import com.plotsquared.core.PlotSquared;
|
||||
import com.plotsquared.core.generator.GeneratorWrapper;
|
||||
import com.plotsquared.core.generator.IndependentPlotGenerator;
|
||||
@ -159,12 +160,14 @@ public class BukkitPlotGenerator extends ChunkGenerator
|
||||
@NonNull BiomeGrid biome
|
||||
) {
|
||||
|
||||
GenChunk result = new GenChunk();
|
||||
int minY = BukkitWorld.getMinWorldHeight(world);
|
||||
int maxY = BukkitWorld.getMaxWorldHeight(world);
|
||||
GenChunk result = new GenChunk(minY, maxY);
|
||||
if (this.getPlotGenerator() instanceof SingleWorldGenerator) {
|
||||
if (result.getChunkData() != null) {
|
||||
for (int chunkX = 0; chunkX < 16; chunkX++) {
|
||||
for (int chunkZ = 0; chunkZ < 16; chunkZ++) {
|
||||
for (int y = 0; y < world.getMaxHeight(); y++) {
|
||||
for (int y = minY; y < maxY; y++) {
|
||||
biome.setBiome(chunkX, y, chunkZ, Biome.PLAINS);
|
||||
|
||||
}
|
||||
|
@ -74,6 +74,7 @@ import org.bukkit.GameMode;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Fireball;
|
||||
@ -92,6 +93,7 @@ import org.bukkit.event.block.BlockFormEvent;
|
||||
import org.bukkit.event.block.BlockFromToEvent;
|
||||
import org.bukkit.event.block.BlockGrowEvent;
|
||||
import org.bukkit.event.block.BlockIgniteEvent;
|
||||
import org.bukkit.event.block.BlockMultiPlaceEvent;
|
||||
import org.bukkit.event.block.BlockPhysicsEvent;
|
||||
import org.bukkit.event.block.BlockPistonExtendEvent;
|
||||
import org.bukkit.event.block.BlockPistonRetractEvent;
|
||||
@ -166,7 +168,7 @@ public class BlockEventListener implements Listener {
|
||||
}
|
||||
if (Settings.Redstone.DISABLE_OFFLINE) {
|
||||
boolean disable = false;
|
||||
if (!plot.getOwner().equals(DBFunc.SERVER)) {
|
||||
if (!DBFunc.SERVER.equals(plot.getOwner())) {
|
||||
if (plot.isMerged()) {
|
||||
disable = true;
|
||||
for (UUID owner : plot.getOwners()) {
|
||||
@ -277,7 +279,7 @@ public class BlockEventListener implements Listener {
|
||||
BukkitPlayer pp = BukkitUtil.adapt(player);
|
||||
Plot plot = area.getPlot(location);
|
||||
if (plot != null) {
|
||||
if ((location.getY() > area.getMaxBuildHeight() || location.getY() < area
|
||||
if ((location.getY() >= area.getMaxBuildHeight() || location.getY() < area
|
||||
.getMinBuildHeight()) && !Permissions
|
||||
.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {
|
||||
event.setCancelled(true);
|
||||
@ -352,7 +354,8 @@ public class BlockEventListener implements Listener {
|
||||
Plot plot = area.getPlot(location);
|
||||
if (plot != null) {
|
||||
BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
|
||||
if (event.getBlock().getY() == 0) {
|
||||
// == rather than <= as we only care about the "ground level" not being destroyed
|
||||
if (event.getBlock().getY() == area.getMinGenHeight()) {
|
||||
if (!Permissions
|
||||
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_DESTROY_GROUNDLEVEL)) {
|
||||
plotPlayer.sendMessage(
|
||||
@ -362,7 +365,7 @@ public class BlockEventListener implements Listener {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
} else if ((location.getY() > area.getMaxBuildHeight() || location.getY() < area
|
||||
} else if ((location.getY() >= area.getMaxBuildHeight() || location.getY() < area
|
||||
.getMinBuildHeight()) && !Permissions
|
||||
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {
|
||||
event.setCancelled(true);
|
||||
@ -647,7 +650,8 @@ public class BlockEventListener implements Listener {
|
||||
event.getBlock().breakNaturally();
|
||||
}
|
||||
}
|
||||
if (location.getY() == 0) {
|
||||
// == rather than <= as we only care about the "ground level" not being destroyed
|
||||
if (location.getY() == area.getMinGenHeight()) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
@ -1208,4 +1212,51 @@ public class BlockEventListener implements Listener {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* BlockMultiPlaceEvent is called unrelated to the BlockPlaceEvent itself and therefore doesn't respect the cancellation.
|
||||
*/
|
||||
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
|
||||
public void onBlockMultiPlace(BlockMultiPlaceEvent event) {
|
||||
// Check if the generic block place event would be cancelled
|
||||
blockCreate(event);
|
||||
if (event.isCancelled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
BukkitPlayer pp = BukkitUtil.adapt(event.getPlayer());
|
||||
Location placedLocation = BukkitUtil.adapt(event.getBlockReplacedState().getLocation());
|
||||
PlotArea area = placedLocation.getPlotArea();
|
||||
if (area == null) {
|
||||
return;
|
||||
}
|
||||
Plot plot = placedLocation.getPlot();
|
||||
|
||||
for (final BlockState state : event.getReplacedBlockStates()) {
|
||||
Location currentLocation = BukkitUtil.adapt(state.getLocation());
|
||||
if (!Permissions.hasPermission(
|
||||
pp,
|
||||
Permission.PERMISSION_ADMIN_BUILD_ROAD
|
||||
) && !(Objects.equals(currentLocation.getPlot(), plot))) {
|
||||
pp.sendMessage(
|
||||
TranslatableCaption.of("permission.no_permission_event"),
|
||||
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD))
|
||||
);
|
||||
event.setCancelled(true);
|
||||
break;
|
||||
}
|
||||
if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {
|
||||
continue;
|
||||
}
|
||||
if (currentLocation.getY() >= area.getMaxBuildHeight() || currentLocation.getY() < area.getMinBuildHeight()) {
|
||||
pp.sendMessage(
|
||||
TranslatableCaption.of("height.height_limit"),
|
||||
Template.of("minHeight", String.valueOf(area.getMinBuildHeight())),
|
||||
Template.of("maxHeight", String.valueOf(area.getMaxBuildHeight()))
|
||||
);
|
||||
event.setCancelled(true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -36,6 +36,7 @@ import com.plotsquared.core.plot.flag.implementations.DoneFlag;
|
||||
import io.papermc.lib.PaperLib;
|
||||
import org.bukkit.Chunk;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.ArmorStand;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
@ -60,7 +61,7 @@ import java.util.List;
|
||||
|
||||
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 hasPlotArea = false;
|
||||
private static String areaName = null;
|
||||
@ -191,8 +192,32 @@ public class EntitySpawnListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onTeleport(EntityTeleportEvent event) {
|
||||
Entity ent = event.getEntity();
|
||||
if (ent instanceof Vehicle || ent instanceof ArmorStand) {
|
||||
Entity entity = event.getEntity();
|
||||
Entity fromLocation = event.getEntity();
|
||||
Block toLocation = event.getTo().getBlock();
|
||||
final Location fromLocLocation = BukkitUtil.adapt(fromLocation.getLocation());
|
||||
final PlotArea fromArea = fromLocLocation.getPlotArea();
|
||||
Location toLocLocation = BukkitUtil.adapt(toLocation.getLocation());
|
||||
PlotArea toArea = toLocLocation.getPlotArea();
|
||||
|
||||
if (toArea == null) {
|
||||
if (fromLocation.getType() == EntityType.SHULKER && fromArea != null) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
Plot toPlot = toArea.getOwnedPlot(toLocLocation);
|
||||
if (fromLocation.getType() == EntityType.SHULKER && fromArea != null) {
|
||||
final Plot fromPlot = fromArea.getOwnedPlot(fromLocLocation);
|
||||
|
||||
if (fromPlot != null || toPlot != null) {
|
||||
if ((fromPlot == null || !fromPlot.equals(toPlot)) && (toPlot == null || !toPlot.equals(fromPlot))) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (entity instanceof Vehicle || entity instanceof ArmorStand) {
|
||||
testNether(event.getEntity());
|
||||
}
|
||||
}
|
||||
|
@ -76,7 +76,6 @@ import com.plotsquared.core.util.EventDispatcher;
|
||||
import com.plotsquared.core.util.MathMan;
|
||||
import com.plotsquared.core.util.Permissions;
|
||||
import com.plotsquared.core.util.PremiumVerification;
|
||||
import com.plotsquared.core.util.RegExUtil;
|
||||
import com.plotsquared.core.util.entity.EntityCategories;
|
||||
import com.plotsquared.core.util.task.TaskManager;
|
||||
import com.plotsquared.core.util.task.TaskTime;
|
||||
@ -223,10 +222,9 @@ public class PlayerEventListener extends PlotListener implements Listener {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("StringSplitter")
|
||||
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
|
||||
public void playerCommand(PlayerCommandPreprocessEvent event) {
|
||||
String msg = event.getMessage().toLowerCase().replaceAll("/", "").trim();
|
||||
String msg = event.getMessage().replace("/", "").toLowerCase(Locale.ROOT).trim();
|
||||
if (msg.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
@ -240,11 +238,9 @@ public class PlayerEventListener extends PlotListener implements Listener {
|
||||
String[] parts = msg.split(" ");
|
||||
Plot plot = plotPlayer.getCurrentPlot();
|
||||
// Check WorldEdit
|
||||
switch (parts[0].toLowerCase()) {
|
||||
switch (parts[0]) {
|
||||
case "up":
|
||||
case "/up":
|
||||
case "worldedit:up":
|
||||
case "worldedit:/up":
|
||||
if (plot == null || (!plot.isAdded(plotPlayer.getUUID()) && !Permissions
|
||||
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER, true))) {
|
||||
event.setCancelled(true);
|
||||
@ -258,63 +254,67 @@ public class PlayerEventListener extends PlotListener implements Listener {
|
||||
List<String> blockedCommands = plot != null ?
|
||||
plot.getFlag(BlockedCmdsFlag.class) :
|
||||
area.getFlag(BlockedCmdsFlag.class);
|
||||
if (!blockedCommands.isEmpty() && !Permissions
|
||||
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_INTERACT_BLOCKED_CMDS)) {
|
||||
String part = parts[0];
|
||||
if (parts[0].contains(":")) {
|
||||
part = parts[0].split(":")[1];
|
||||
msg = msg.replace(parts[0].split(":")[0] + ':', "");
|
||||
}
|
||||
String s1 = part;
|
||||
List<String> aliases = new ArrayList<>();
|
||||
for (HelpTopic cmdLabel : Bukkit.getServer().getHelpMap().getHelpTopics()) {
|
||||
if (part.equals(cmdLabel.getName())) {
|
||||
break;
|
||||
}
|
||||
String label = cmdLabel.getName().replaceFirst("/", "");
|
||||
if (aliases.contains(label)) {
|
||||
continue;
|
||||
}
|
||||
PluginCommand p;
|
||||
if ((p = Bukkit.getPluginCommand(label)) != null) {
|
||||
for (String a : p.getAliases()) {
|
||||
if (aliases.contains(a)) {
|
||||
continue;
|
||||
}
|
||||
aliases.add(a);
|
||||
a = a.replaceFirst("/", "");
|
||||
if (!a.equals(label) && a.equals(part)) {
|
||||
part = label;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!s1.equals(part)) {
|
||||
msg = msg.replace(s1, part);
|
||||
}
|
||||
for (String s : blockedCommands) {
|
||||
Pattern pattern;
|
||||
if (!RegExUtil.compiledPatterns.containsKey(s)) {
|
||||
RegExUtil.compiledPatterns.put(s, pattern = Pattern.compile(s));
|
||||
if (blockedCommands.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
if (Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_INTERACT_BLOCKED_CMDS)) {
|
||||
return;
|
||||
}
|
||||
// When using namespaced commands, we're not interested in the namespace
|
||||
String part = parts[0];
|
||||
if (part.contains(":")) {
|
||||
String[] namespaced = part.split(":");
|
||||
part = namespaced[1];
|
||||
msg = msg.substring(namespaced[0].length() + 1);
|
||||
}
|
||||
msg = replaceAliases(msg, part);
|
||||
for (String blocked : blockedCommands) {
|
||||
if (blocked.equalsIgnoreCase(msg)) {
|
||||
String perm;
|
||||
if (plot != null && plot.isAdded(plotPlayer.getUUID())) {
|
||||
perm = "plots.admin.command.blocked-cmds.shared";
|
||||
} else {
|
||||
pattern = RegExUtil.compiledPatterns.get(s);
|
||||
perm = "plots.admin.command.blocked-cmds.road";
|
||||
}
|
||||
if (pattern.matcher(msg).matches()) {
|
||||
String perm;
|
||||
if (plot != null && plot.isAdded(plotPlayer.getUUID())) {
|
||||
perm = "plots.admin.command.blocked-cmds.shared";
|
||||
} else {
|
||||
perm = "plots.admin.command.blocked-cmds.road";
|
||||
if (!Permissions.hasPermission(plotPlayer, perm)) {
|
||||
plotPlayer.sendMessage(TranslatableCaption.of("blockedcmds.command_blocked"));
|
||||
event.setCancelled(true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private String replaceAliases(String msg, String part) {
|
||||
String s1 = part;
|
||||
Set<String> aliases = new HashSet<>();
|
||||
for (HelpTopic cmdLabel : Bukkit.getServer().getHelpMap().getHelpTopics()) {
|
||||
if (part.equals(cmdLabel.getName())) {
|
||||
break;
|
||||
}
|
||||
String label = cmdLabel.getName().replaceFirst("/", "");
|
||||
if (aliases.contains(label)) {
|
||||
continue;
|
||||
}
|
||||
PluginCommand p = Bukkit.getPluginCommand(label);
|
||||
if (p != null) {
|
||||
for (String a : p.getAliases()) {
|
||||
if (aliases.contains(a)) {
|
||||
continue;
|
||||
}
|
||||
if (!Permissions.hasPermission(plotPlayer, perm)) {
|
||||
plotPlayer.sendMessage(TranslatableCaption.of("blockedcmds.command_blocked"));
|
||||
event.setCancelled(true);
|
||||
aliases.add(a);
|
||||
a = a.replaceFirst("/", "");
|
||||
if (!a.equals(label) && a.equals(part)) {
|
||||
part = label;
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!s1.equals(part)) {
|
||||
msg = msg.replace(s1, part);
|
||||
}
|
||||
return msg;
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
|
@ -46,7 +46,7 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass;
|
||||
public class SingleWorldListener implements Listener {
|
||||
|
||||
private final Method methodGetHandleChunk;
|
||||
private Field shouldSave;
|
||||
private Field shouldSave = null;
|
||||
|
||||
public SingleWorldListener() throws Exception {
|
||||
ReflectionUtils.RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
|
||||
@ -59,9 +59,12 @@ public class SingleWorldListener implements Listener {
|
||||
} else {
|
||||
this.shouldSave = classChunk.getField("s").getRealField();
|
||||
}
|
||||
} else {
|
||||
} else if (PlotSquared.platform().serverVersion()[1] == 17) {
|
||||
ReflectionUtils.RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk");
|
||||
this.shouldSave = classChunk.getField("r").getRealField();
|
||||
} else if (PlotSquared.platform().serverVersion()[1] == 18) {
|
||||
ReflectionUtils.RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.IChunkAccess");
|
||||
this.shouldSave = classChunk.getField("b").getRealField();
|
||||
}
|
||||
} catch (NoSuchFieldException e) {
|
||||
e.printStackTrace();
|
||||
|
@ -38,7 +38,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
* @deprecated Deprecated and scheduled for removal without replacement
|
||||
* in favor of the build in setup wizard.
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
@Deprecated(forRemoval = true, since = "6.0.0")
|
||||
@Singleton
|
||||
public class MultiverseWorldManager extends BukkitWorldManager {
|
||||
|
||||
|
@ -74,8 +74,9 @@ public final class BukkitChunkCoordinator extends ChunkCoordinator {
|
||||
private final Consumer<Throwable> throwableConsumer;
|
||||
private final boolean unloadAfter;
|
||||
private final int totalSize;
|
||||
|
||||
private final AtomicInteger expectedSize;
|
||||
private final AtomicInteger loadingChunks = new AtomicInteger();
|
||||
|
||||
private int batchSize;
|
||||
private PlotSquaredTask task;
|
||||
private boolean shouldCancel;
|
||||
@ -150,6 +151,13 @@ public final class BukkitChunkCoordinator extends ChunkCoordinator {
|
||||
|
||||
Chunk chunk = this.availableChunks.poll();
|
||||
if (chunk == null) {
|
||||
if (this.availableChunks.isEmpty()) {
|
||||
if (this.requestedChunks.isEmpty() && loadingChunks.get() == 0) {
|
||||
finish();
|
||||
} else {
|
||||
requestBatch();
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
long[] iterationTime = new long[2];
|
||||
@ -197,9 +205,11 @@ public final class BukkitChunkCoordinator extends ChunkCoordinator {
|
||||
BlockVector2 chunk;
|
||||
for (int i = 0; i < this.batchSize && (chunk = this.requestedChunks.poll()) != null; i++) {
|
||||
// This required PaperLib to be bumped to version 1.0.4 to mark the request as urgent
|
||||
loadingChunks.incrementAndGet();
|
||||
PaperLib
|
||||
.getChunkAtAsync(this.bukkitWorld, chunk.getX(), chunk.getZ(), true, true)
|
||||
.whenComplete((chunkObject, throwable) -> {
|
||||
loadingChunks.decrementAndGet();
|
||||
if (throwable != null) {
|
||||
throwable.printStackTrace();
|
||||
// We want one less because this couldn't be processed
|
||||
|
@ -51,7 +51,6 @@ import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Chunk;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.Container;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
@ -112,8 +111,8 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
|
||||
public boolean enqueue() {
|
||||
final Clipboard regenClipboard;
|
||||
if (isRegen()) {
|
||||
BlockVector3 start = BlockVector3.at(getRegenStart()[0] << 4, 0, getRegenStart()[1] << 4);
|
||||
BlockVector3 end = BlockVector3.at((getRegenEnd()[0] << 4) + 15, 255, (getRegenEnd()[1] << 4) + 15);
|
||||
BlockVector3 start = BlockVector3.at(getRegenStart()[0] << 4, getMinY(), getRegenStart()[1] << 4);
|
||||
BlockVector3 end = BlockVector3.at((getRegenEnd()[0] << 4) + 15, getMaxY(), (getRegenEnd()[1] << 4) + 15);
|
||||
Region region = new CuboidRegion(start, end);
|
||||
regenClipboard = new BlockArrayClipboard(region);
|
||||
regenClipboard.setOrigin(start);
|
||||
@ -135,7 +134,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
|
||||
int sx = blockVector2.getX() << 4;
|
||||
int sz = blockVector2.getZ() << 4;
|
||||
if (isRegenChunk) {
|
||||
for (int layer = 0; layer < 16; layer++) {
|
||||
for (int layer = getMinLayer(); layer <= getMaxLayer(); layer++) {
|
||||
for (int y = 0; y < 16; y++) {
|
||||
for (int x = 0; x < 16; x++) {
|
||||
for (int z = 0; z < 16; z++) {
|
||||
@ -171,7 +170,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
|
||||
int lx = ChunkUtil.getX(j);
|
||||
int lz = ChunkUtil.getZ(j);
|
||||
int x = sx + lx;
|
||||
int y = ChunkUtil.getY(layer, j);
|
||||
int y = ChunkUtil.getY(layer + localChunk.getMinSection(), j);
|
||||
int z = sz + lz;
|
||||
boolean edge = Settings.QUEUE.UPDATE_EDGES && isEdge(y >> 4, lx, y & 15, lz, blockVector2,
|
||||
localChunk
|
||||
@ -180,7 +179,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int layer = 0; layer < localChunk.getBaseblocks().length; layer++) {
|
||||
for (int layer = 0; layer < localChunk.getBiomes().length; layer++) {
|
||||
BiomeType[] biomesLayer = localChunk.getBiomes()[layer];
|
||||
if (biomesLayer == null) {
|
||||
continue;
|
||||
@ -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
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private void setWorldBlock(int x, int y, int z, @NonNull BaseBlock block, @NonNull BlockVector2 blockVector2, boolean edge) {
|
||||
try {
|
||||
BlockVector3 loc = BlockVector3.at(x, y, z);
|
||||
@ -266,9 +266,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
|
||||
} catch (WorldEditException ignored) {
|
||||
// Fallback to not so nice method
|
||||
BlockData blockData = BukkitAdapter.adapt(block);
|
||||
Chunk chunk = getBukkitWorld().getChunkAt(blockVector2.getX(), blockVector2.getZ());
|
||||
|
||||
Block existing = chunk.getBlock(x, y, z);
|
||||
Block existing = getBukkitWorld().getBlockAt(x, y, z);
|
||||
final BlockState existingBaseBlock = BukkitAdapter.adapt(existing.getBlockData());
|
||||
if (BukkitBlockUtil.get(existing).equals(existingBaseBlock) && existing.getBlockData().matches(blockData)) {
|
||||
return;
|
||||
@ -297,47 +295,48 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
|
||||
}
|
||||
|
||||
private boolean isEdge(int layer, int x, int y, int z, BlockVector2 blockVector2, LocalChunk localChunk) {
|
||||
if (layer == 0 || layer == localChunk.getBaseblocks().length - 1) {
|
||||
int layerIndex = (layer - localChunk.getMinSection());
|
||||
if (layer == localChunk.getMinSection() || layerIndex == localChunk.getBaseblocks().length - 1) {
|
||||
return false;
|
||||
}
|
||||
if (x == 0) {
|
||||
LocalChunk localChunkX = getBlockChunks().get(blockVector2.withX(blockVector2.getX() - 1));
|
||||
if (localChunkX == null || localChunkX.getBaseblocks()[layer] == null ||
|
||||
localChunkX.getBaseblocks()[layer][ChunkUtil.getJ(15, y, z)] != null) {
|
||||
if (localChunkX == null || localChunkX.getBaseblocks()[layerIndex] == null ||
|
||||
localChunkX.getBaseblocks()[layerIndex][ChunkUtil.getJ(15, y, z)] != null) {
|
||||
return true;
|
||||
}
|
||||
} else if (x == 15) {
|
||||
LocalChunk localChunkX = getBlockChunks().get(blockVector2.withX(blockVector2.getX() + 1));
|
||||
if (localChunkX == null || localChunkX.getBaseblocks()[layer] == null ||
|
||||
localChunkX.getBaseblocks()[layer][ChunkUtil.getJ(0, y, z)] != null) {
|
||||
if (localChunkX == null || localChunkX.getBaseblocks()[layerIndex] == null ||
|
||||
localChunkX.getBaseblocks()[layerIndex][ChunkUtil.getJ(0, y, z)] != null) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (z == 0) {
|
||||
LocalChunk localChunkZ = getBlockChunks().get(blockVector2.withZ(blockVector2.getZ() - 1));
|
||||
if (localChunkZ == null || localChunkZ.getBaseblocks()[layer] == null ||
|
||||
localChunkZ.getBaseblocks()[layer][ChunkUtil.getJ(x, y, 15)] != null) {
|
||||
if (localChunkZ == null || localChunkZ.getBaseblocks()[layerIndex] == null ||
|
||||
localChunkZ.getBaseblocks()[layerIndex][ChunkUtil.getJ(x, y, 15)] != null) {
|
||||
return true;
|
||||
}
|
||||
} else if (z == 15) {
|
||||
LocalChunk localChunkZ = getBlockChunks().get(blockVector2.withZ(blockVector2.getZ() + 1));
|
||||
if (localChunkZ == null || localChunkZ.getBaseblocks()[layer] == null ||
|
||||
localChunkZ.getBaseblocks()[layer][ChunkUtil.getJ(x, y, 0)] != null) {
|
||||
if (localChunkZ == null || localChunkZ.getBaseblocks()[layerIndex] == null ||
|
||||
localChunkZ.getBaseblocks()[layerIndex][ChunkUtil.getJ(x, y, 0)] != null) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (y == 0) {
|
||||
if (localChunk.getBaseblocks()[layer - 1] == null ||
|
||||
localChunk.getBaseblocks()[layer][ChunkUtil.getJ(x, 15, z)] != null) {
|
||||
if (localChunk.getBaseblocks()[layerIndex - 1] == null ||
|
||||
localChunk.getBaseblocks()[layerIndex][ChunkUtil.getJ(x, 15, z)] != null) {
|
||||
return true;
|
||||
}
|
||||
} else if (y == 15) {
|
||||
if (localChunk.getBaseblocks()[layer + 1] == null ||
|
||||
localChunk.getBaseblocks()[layer][ChunkUtil.getJ(x, 0, z)] != null) {
|
||||
if (localChunk.getBaseblocks()[layerIndex + 1] == null ||
|
||||
localChunk.getBaseblocks()[layerIndex][ChunkUtil.getJ(x, 0, z)] != null) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
BaseBlock[] baseBlocks = localChunk.getBaseblocks()[layer];
|
||||
BaseBlock[] baseBlocks = localChunk.getBaseblocks()[layerIndex];
|
||||
if (x > 0 && baseBlocks[ChunkUtil.getJ(x - 1, y, z)] == null) {
|
||||
return true;
|
||||
}
|
||||
|
@ -31,6 +31,7 @@ import com.plotsquared.bukkit.util.BukkitUtil;
|
||||
import com.plotsquared.core.location.ChunkWrapper;
|
||||
import com.plotsquared.core.location.Location;
|
||||
import com.plotsquared.core.queue.ScopedQueueCoordinator;
|
||||
import com.plotsquared.core.util.AnnotationHelper;
|
||||
import com.plotsquared.core.util.ChunkUtil;
|
||||
import com.plotsquared.core.util.PatternUtil;
|
||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||
@ -50,6 +51,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
@AnnotationHelper.ApiDescription(info = "Internal use only. Subject to changes at any time.")
|
||||
public class GenChunk extends ScopedQueueCoordinator {
|
||||
|
||||
public final Biome[] biomes;
|
||||
@ -61,8 +63,14 @@ public class GenChunk extends ScopedQueueCoordinator {
|
||||
public int chunkZ;
|
||||
private ChunkData chunkData = null;
|
||||
|
||||
public GenChunk() {
|
||||
super(null, Location.at("", 0, 0, 0), Location.at("", 15, 255, 15));
|
||||
/**
|
||||
* @param minY minimum world Y, inclusive
|
||||
* @param maxY maximum world Y, inclusive
|
||||
*
|
||||
* @since 6.6.0
|
||||
*/
|
||||
public GenChunk(int minY, int maxY) {
|
||||
super(null, Location.at("", 0, minY, 0), Location.at("", 15, maxY, 15));
|
||||
this.biomes = Biome.values();
|
||||
}
|
||||
|
||||
@ -117,7 +125,7 @@ public class GenChunk extends ScopedQueueCoordinator {
|
||||
return;
|
||||
}
|
||||
Biome biome = BukkitAdapter.adapt(biomeType);
|
||||
for (int y = 0; y < 256; y++) {
|
||||
for (int y = getMin().getY(); y <= getMax().getY(); y++) {
|
||||
for (int x = 0; x < 16; x++) {
|
||||
for (int z = 0; z < 16; z++) {
|
||||
this.biomeGrid.setBiome(x, y, z, biome);
|
||||
@ -130,7 +138,7 @@ public class GenChunk extends ScopedQueueCoordinator {
|
||||
public void setCuboid(@NonNull Location pos1, @NonNull Location pos2, @NonNull BlockState block) {
|
||||
if (result != null && pos1.getX() == 0 && pos1.getZ() == 0 && pos2.getX() == 15 && pos2.getZ() == 15) {
|
||||
for (int y = pos1.getY(); y <= pos2.getY(); y++) {
|
||||
int layer = y >> 4;
|
||||
int layer = getLayerIndex(y);
|
||||
BlockState[] data = result[layer];
|
||||
if (data == null) {
|
||||
result[layer] = data = new BlockState[4096];
|
||||
@ -164,7 +172,7 @@ public class GenChunk extends ScopedQueueCoordinator {
|
||||
*/
|
||||
public boolean setBiome(int x, int z, @NonNull Biome biome) {
|
||||
if (this.biomeGrid != null) {
|
||||
for (int y = 0; y < 256; y++) {
|
||||
for (int y = getMin().getY(); y <= getMax().getY(); y++) {
|
||||
this.setBiome(x, y, z, biome);
|
||||
}
|
||||
return true;
|
||||
@ -197,7 +205,7 @@ public class GenChunk extends ScopedQueueCoordinator {
|
||||
}
|
||||
|
||||
private void storeCache(final int x, final int y, final int z, final @NonNull BlockState id) {
|
||||
int i = y >> 4;
|
||||
int i = getLayerIndex(y);
|
||||
BlockState[] v = this.result[i];
|
||||
if (v == null) {
|
||||
this.result[i] = v = new BlockState[4096];
|
||||
@ -219,7 +227,7 @@ public class GenChunk extends ScopedQueueCoordinator {
|
||||
|
||||
@Override
|
||||
public @Nullable BlockState getBlock(int x, int y, int z) {
|
||||
int i = y >> 4;
|
||||
int i = getLayerIndex(y);
|
||||
if (result == null) {
|
||||
return BukkitBlockUtil.get(chunkData.getType(x, y, z));
|
||||
}
|
||||
@ -246,16 +254,16 @@ public class GenChunk extends ScopedQueueCoordinator {
|
||||
|
||||
@Override
|
||||
public @NonNull Location getMax() {
|
||||
return Location.at(getWorld().getName(), 15 + (getX() << 4), 255, 15 + (getZ() << 4));
|
||||
return Location.at(getWorld().getName(), 15 + (getX() << 4), super.getMax().getY(), 15 + (getZ() << 4));
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull Location getMin() {
|
||||
return Location.at(getWorld().getName(), getX() << 4, 0, getZ() << 4);
|
||||
return Location.at(getWorld().getName(), getX() << 4, super.getMin().getY(), getZ() << 4);
|
||||
}
|
||||
|
||||
public @NonNull GenChunk clone() {
|
||||
GenChunk toReturn = new GenChunk();
|
||||
GenChunk toReturn = new GenChunk(getMin().getY(), getMax().getY());
|
||||
if (this.result != null) {
|
||||
for (int i = 0; i < this.result.length; i++) {
|
||||
BlockState[] matrix = this.result[i];
|
||||
@ -269,4 +277,8 @@ public class GenChunk extends ScopedQueueCoordinator {
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
private int getLayerIndex(int y) {
|
||||
return (y - getMin().getY()) >> 4;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -42,6 +42,7 @@ import org.bukkit.inventory.InventoryView;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.PlayerInventory;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@ -50,11 +51,15 @@ import java.util.stream.IntStream;
|
||||
@Singleton
|
||||
public class BukkitInventoryUtil extends InventoryUtil {
|
||||
|
||||
private static ItemStack getItem(PlotItemStack item) {
|
||||
private static @Nullable ItemStack getItem(PlotItemStack item) {
|
||||
if (item == null) {
|
||||
return null;
|
||||
}
|
||||
ItemStack stack = new ItemStack(BukkitAdapter.adapt(item.getType()), item.getAmount());
|
||||
Material material = BukkitAdapter.adapt(item.getType());
|
||||
if (material == null) {
|
||||
return null;
|
||||
}
|
||||
ItemStack stack = new ItemStack(material, item.getAmount());
|
||||
ItemMeta meta = null;
|
||||
if (item.getName() != null) {
|
||||
meta = stack.getItemMeta();
|
||||
@ -104,14 +109,19 @@ public class BukkitInventoryUtil extends InventoryUtil {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setItem(PlotInventory inv, int index, PlotItemStack item) {
|
||||
public boolean setItemChecked(PlotInventory inv, int index, PlotItemStack item) {
|
||||
BukkitPlayer bp = (BukkitPlayer) inv.getPlayer();
|
||||
InventoryView opened = bp.player.getOpenInventory();
|
||||
if (!inv.isOpen()) {
|
||||
return;
|
||||
ItemStack stack = getItem(item);
|
||||
if (stack == null) {
|
||||
return false;
|
||||
}
|
||||
opened.setItem(index, getItem(item));
|
||||
if (!inv.isOpen()) {
|
||||
return true;
|
||||
}
|
||||
opened.setItem(index, stack);
|
||||
bp.player.updateInventory();
|
||||
return true;
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation") // Paper deprecation
|
||||
|
@ -40,7 +40,6 @@ import com.plotsquared.core.queue.QueueCoordinator;
|
||||
import com.plotsquared.core.queue.ScopedQueueCoordinator;
|
||||
import com.plotsquared.core.util.ChunkManager;
|
||||
import com.plotsquared.core.util.RegionManager;
|
||||
import com.plotsquared.core.util.RegionUtil;
|
||||
import com.plotsquared.core.util.WorldUtil;
|
||||
import com.plotsquared.core.util.entity.EntityCategories;
|
||||
import com.plotsquared.core.util.task.RunnableVal;
|
||||
@ -261,7 +260,7 @@ public class BukkitRegionManager extends RegionManager {
|
||||
if (checkX2 && checkZ2) {
|
||||
map.saveRegion(world, xxt2, xxt, zzt2, zzt); //
|
||||
}
|
||||
CuboidRegion currentPlotClear = RegionUtil.createRegion(pos1.getX(), pos2.getX(), pos1.getZ(), pos2.getZ());
|
||||
CuboidRegion currentPlotClear = new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3());
|
||||
map.saveEntitiesOut(Bukkit.getWorld(world.getName()).getChunkAt(x, z), currentPlotClear);
|
||||
AugmentedUtils.bypass(
|
||||
ignoreAugment,
|
||||
@ -276,7 +275,9 @@ public class BukkitRegionManager extends RegionManager {
|
||||
PlotLoc plotLoc = new PlotLoc(bx + x1, bz + z1);
|
||||
BaseBlock[] ids = map.allBlocks.get(plotLoc);
|
||||
if (ids != null) {
|
||||
for (int y = 0; y < Math.min(128, ids.length); y++) {
|
||||
int minY = value.getMin().getY();
|
||||
for (int yIndex = 0; yIndex < ids.length; yIndex++) {
|
||||
int y = yIndex + minY;
|
||||
BaseBlock id = ids[y];
|
||||
if (id != null) {
|
||||
value.setBlock(x1, y, z1, id);
|
||||
@ -284,12 +285,6 @@ public class BukkitRegionManager extends RegionManager {
|
||||
value.setBlock(x1, y, z1, BlockTypes.AIR.getDefaultState());
|
||||
}
|
||||
}
|
||||
for (int y = Math.min(128, ids.length); y < ids.length; y++) {
|
||||
BaseBlock id = ids[y];
|
||||
if (id != null) {
|
||||
value.setBlock(x1, y, z1, id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -297,7 +292,7 @@ public class BukkitRegionManager extends RegionManager {
|
||||
}, world.getName(), chunk)
|
||||
);
|
||||
//map.restoreBlocks(worldObj, 0, 0);
|
||||
map.restoreEntities(Bukkit.getWorld(world.getName()), 0, 0);
|
||||
map.restoreEntities(Bukkit.getWorld(world.getName()));
|
||||
});
|
||||
regenQueue.setCompleteTask(whenDone);
|
||||
queue.setCompleteTask(regenQueue::enqueue);
|
||||
|
@ -44,7 +44,6 @@ import com.plotsquared.core.util.task.TaskManager;
|
||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||
import com.sk89q.worldedit.bukkit.BukkitWorld;
|
||||
import com.sk89q.worldedit.math.BlockVector2;
|
||||
import com.sk89q.worldedit.regions.CuboidRegion;
|
||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
import com.sk89q.worldedit.world.block.BlockCategories;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
@ -61,7 +60,6 @@ import org.bukkit.Bukkit;
|
||||
import org.bukkit.Chunk;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Biome;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.block.Sign;
|
||||
@ -246,7 +244,9 @@ public class BukkitUtil extends WorldUtil {
|
||||
final World bukkitWorld = Objects.requireNonNull(getWorld(world));
|
||||
// Skip top and bottom block
|
||||
int air = 1;
|
||||
for (int y = bukkitWorld.getMaxHeight() - 1; y >= 0; y--) {
|
||||
int maxY = com.plotsquared.bukkit.util.BukkitWorld.getMaxWorldHeight(bukkitWorld);
|
||||
int minY = com.plotsquared.bukkit.util.BukkitWorld.getMinWorldHeight(bukkitWorld);
|
||||
for (int y = maxY - 1; y >= minY; y--) {
|
||||
Block block = bukkitWorld.getBlockAt(x, y, z);
|
||||
Material type = block.getType();
|
||||
if (type.isSolid()) {
|
||||
@ -273,7 +273,9 @@ public class BukkitUtil extends WorldUtil {
|
||||
final World bukkitWorld = Objects.requireNonNull(getWorld(world));
|
||||
// Skip top and bottom block
|
||||
int air = 1;
|
||||
for (int y = bukkitWorld.getMaxHeight() - 1; y >= 0; y--) {
|
||||
int maxY = com.plotsquared.bukkit.util.BukkitWorld.getMaxWorldHeight(bukkitWorld);
|
||||
int minY = com.plotsquared.bukkit.util.BukkitWorld.getMinWorldHeight(bukkitWorld);
|
||||
for (int y = maxY - 1; y >= minY; y--) {
|
||||
Block block = bukkitWorld.getBlockAt(x, y, z);
|
||||
Material type = block.getType();
|
||||
if (type.isSolid()) {
|
||||
@ -345,13 +347,15 @@ public class BukkitUtil extends WorldUtil {
|
||||
final Block block = world.getBlockAt(location.getX(), location.getY(), location.getZ());
|
||||
final Material type = block.getType();
|
||||
if (type != Material.LEGACY_SIGN && type != Material.LEGACY_WALL_SIGN) {
|
||||
BlockFace facing = BlockFace.EAST;
|
||||
if (world.getBlockAt(location.getX(), location.getY(), location.getZ() + 1).getType().isSolid()) {
|
||||
facing = BlockFace.NORTH;
|
||||
} else if (world.getBlockAt(location.getX() + 1, location.getY(), location.getZ()).getType().isSolid()) {
|
||||
facing = BlockFace.WEST;
|
||||
} else if (world.getBlockAt(location.getX(), location.getY(), location.getZ() - 1).getType().isSolid()) {
|
||||
facing = BlockFace.SOUTH;
|
||||
BlockFace facing = BlockFace.NORTH;
|
||||
if (!world.getBlockAt(location.getX(), location.getY(), location.getZ() + 1).getType().isSolid()) {
|
||||
if (world.getBlockAt(location.getX() - 1, location.getY(), location.getZ()).getType().isSolid()) {
|
||||
facing = BlockFace.EAST;
|
||||
} else if (world.getBlockAt(location.getX() + 1, location.getY(), location.getZ()).getType().isSolid()) {
|
||||
facing = BlockFace.WEST;
|
||||
} else if (world.getBlockAt(location.getX(), location.getY(), location.getZ() - 1).getType().isSolid()) {
|
||||
facing = BlockFace.SOUTH;
|
||||
}
|
||||
}
|
||||
if (PlotSquared.platform().serverVersion()[1] == 13) {
|
||||
block.setType(Material.valueOf(area.legacySignMaterial()), false);
|
||||
@ -371,7 +375,7 @@ public class BukkitUtil extends WorldUtil {
|
||||
sign.setLine(i, LEGACY_COMPONENT_SERIALIZER
|
||||
.serialize(MINI_MESSAGE.parse(lines[i].getComponent(LocaleHolder.console()), replacements)));
|
||||
}
|
||||
sign.update(true);
|
||||
sign.update(true, false);
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -382,27 +386,6 @@ public class BukkitUtil extends WorldUtil {
|
||||
return new StringComparison<BlockState>().new ComparisonResult(1, state);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBiomes(
|
||||
final @NonNull String worldName,
|
||||
final @NonNull CuboidRegion region,
|
||||
final @NonNull BiomeType biomeType
|
||||
) {
|
||||
final World world = getWorld(worldName);
|
||||
if (world == null) {
|
||||
LOGGER.warn("An error occurred while setting the biome because the world was null", new RuntimeException());
|
||||
return;
|
||||
}
|
||||
final Biome biome = BukkitAdapter.adapt(biomeType);
|
||||
for (int x = region.getMinimumPoint().getX(); x <= region.getMaximumPoint().getX(); x++) {
|
||||
for (int z = region.getMinimumPoint().getZ(); z <= region.getMaximumPoint().getZ(); z++) {
|
||||
if (world.getBiome(x, z) != biome) {
|
||||
world.setBiome(x, z, biome);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public com.sk89q.worldedit.world.@NonNull World getWeWorld(final @NonNull String world) {
|
||||
return new BukkitWorld(Bukkit.getWorld(world));
|
||||
|
@ -36,6 +36,18 @@ import java.util.Objects;
|
||||
public class BukkitWorld implements World<org.bukkit.World> {
|
||||
|
||||
private static final Map<String, BukkitWorld> worldMap = Maps.newHashMap();
|
||||
private static final boolean HAS_MIN_Y;
|
||||
|
||||
static {
|
||||
boolean temp;
|
||||
try {
|
||||
org.bukkit.World.class.getMethod("getMinHeight");
|
||||
temp = true;
|
||||
} catch (NoSuchMethodException e) {
|
||||
temp = false;
|
||||
}
|
||||
HAS_MIN_Y = temp;
|
||||
}
|
||||
|
||||
private final org.bukkit.World world;
|
||||
|
||||
@ -73,6 +85,24 @@ public class BukkitWorld implements World<org.bukkit.World> {
|
||||
return bukkitWorld;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the min world height from a Bukkit {@link org.bukkit.World}. Inclusive
|
||||
*
|
||||
* @since 6.6.0
|
||||
*/
|
||||
public static int getMinWorldHeight(org.bukkit.World world) {
|
||||
return HAS_MIN_Y ? world.getMinHeight() : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the max world height from a Bukkit {@link org.bukkit.World}. Exclusive
|
||||
*
|
||||
* @since 6.6.0
|
||||
*/
|
||||
public static int getMaxWorldHeight(org.bukkit.World world) {
|
||||
return HAS_MIN_Y ? world.getMaxHeight() : 256;
|
||||
}
|
||||
|
||||
@Override
|
||||
public org.bukkit.World getPlatformWorld() {
|
||||
return this.world;
|
||||
@ -83,34 +113,41 @@ public class BukkitWorld implements World<org.bukkit.World> {
|
||||
return this.world.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMinHeight() {
|
||||
return getMinWorldHeight(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxHeight() {
|
||||
return getMaxWorldHeight(world) - 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (o == this) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (!(o instanceof final BukkitWorld other)) {
|
||||
if (o == null || getClass() != o.getClass()) {
|
||||
return false;
|
||||
}
|
||||
if (!other.canEqual(this)) {
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(this.world, other.world)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
final BukkitWorld that = (BukkitWorld) o;
|
||||
return world.equals(that.world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return world.hashCode();
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated This method is not meant to be invoked or overridden, with no replacement.
|
||||
*/
|
||||
@Deprecated(forRemoval = true, since = "6.6.0")
|
||||
protected boolean canEqual(final Object other) {
|
||||
return other instanceof BukkitWorld;
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
final int PRIME = 59;
|
||||
int result = 1;
|
||||
final Object $world = this.world;
|
||||
result = result * PRIME + ($world == null ? 43 : $world.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "BukkitWorld(world=" + this.world + ")";
|
||||
}
|
||||
|
@ -70,7 +70,7 @@ public class ContentMap {
|
||||
}
|
||||
for (int x = x1; x <= x2; x++) {
|
||||
for (int z = z1; z <= z2; z++) {
|
||||
saveBlocks(world, 256, x, z, 0, 0);
|
||||
saveBlocks(world, x, z);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -92,14 +92,7 @@ public class ContentMap {
|
||||
}
|
||||
}
|
||||
|
||||
void saveEntitiesIn(Chunk chunk, CuboidRegion region) {
|
||||
saveEntitiesIn(chunk, region, 0, 0, false);
|
||||
}
|
||||
|
||||
void saveEntitiesIn(
|
||||
Chunk chunk, CuboidRegion region, int offsetX, int offsetZ,
|
||||
boolean delete
|
||||
) {
|
||||
void saveEntitiesIn(Chunk chunk, CuboidRegion region, boolean delete) {
|
||||
for (Entity entity : chunk.getEntities()) {
|
||||
Location location = BukkitUtil.adapt(entity.getLocation());
|
||||
int x = location.getX();
|
||||
@ -111,8 +104,6 @@ public class ContentMap {
|
||||
continue;
|
||||
}
|
||||
EntityWrapper wrap = new ReplicatingEntityWrapper(entity, (short) 2);
|
||||
wrap.x += offsetX;
|
||||
wrap.z += offsetZ;
|
||||
wrap.saveEntity();
|
||||
this.entities.add(wrap);
|
||||
if (delete) {
|
||||
@ -123,10 +114,10 @@ public class ContentMap {
|
||||
}
|
||||
}
|
||||
|
||||
void restoreEntities(World world, int xOffset, int zOffset) {
|
||||
void restoreEntities(World world) {
|
||||
for (EntityWrapper entity : this.entities) {
|
||||
try {
|
||||
entity.spawn(world, xOffset, zOffset);
|
||||
entity.spawn(world, 0, 0);
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("Failed to restore entity", e);
|
||||
}
|
||||
@ -134,15 +125,13 @@ public class ContentMap {
|
||||
this.entities.clear();
|
||||
}
|
||||
|
||||
//todo optimize maxY
|
||||
void saveBlocks(BukkitWorld world, int maxY, int x, int z, int offsetX, int offsetZ) {
|
||||
maxY = Math.min(255, maxY);
|
||||
BaseBlock[] ids = new BaseBlock[maxY + 1];
|
||||
for (short y = 0; y <= maxY; y++) {
|
||||
BaseBlock block = world.getFullBlock(BlockVector3.at(x, y, z));
|
||||
ids[y] = block;
|
||||
private void saveBlocks(BukkitWorld world, int x, int z) {
|
||||
BaseBlock[] ids = new BaseBlock[world.getMaxY() - world.getMinY() + 1];
|
||||
for (short yIndex = 0; yIndex <= world.getMaxY() - world.getMinY(); yIndex++) {
|
||||
BaseBlock block = world.getFullBlock(BlockVector3.at(x, yIndex + world.getMinY(), z));
|
||||
ids[yIndex] = block;
|
||||
}
|
||||
PlotLoc loc = new PlotLoc(x + offsetX, z + offsetZ);
|
||||
PlotLoc loc = new PlotLoc(x, z);
|
||||
this.allBlocks.put(loc, ids);
|
||||
}
|
||||
|
||||
|
@ -110,6 +110,11 @@ public class FaweRegionManager extends BukkitRegionManager {
|
||||
delegate.setBiome(region, extendBiome, biome, world, whenDone);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBiome(CuboidRegion region, int extendBiome, BiomeType biome, PlotArea area, Runnable whenDone) {
|
||||
delegate.setBiome(region, extendBiome, biome, area.getWorldName(), whenDone);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean copyRegion(
|
||||
final @NonNull Location pos1,
|
||||
|
@ -67,7 +67,7 @@ public class FaweSchematicHandler extends SchematicHandler {
|
||||
final PlotPlayer<?> actor,
|
||||
final RunnableVal<Boolean> whenDone
|
||||
) {
|
||||
delegate.paste(schematic, plot, xOffset, yOffset, zOffset, autoHeight, whenDone);
|
||||
delegate.paste(schematic, plot, xOffset, yOffset, zOffset, autoHeight, actor, whenDone);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -54,3 +54,13 @@ tasks.processResources {
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
tasks {
|
||||
withType<Javadoc> {
|
||||
val opt = options as StandardJavadocDocletOptions
|
||||
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-core/" + libs.worldeditCore.get().versionConstraint.toString())
|
||||
opt.links("https://jd.adventure.kyori.net/api/" + libs.adventure.get().versionConstraint.toString())
|
||||
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
|
||||
opt.links("https://checkerframework.org/api/")
|
||||
}
|
||||
}
|
||||
|
@ -98,6 +98,22 @@ public interface PlotPlatform<P> extends LocaleHolder {
|
||||
*/
|
||||
int[] serverVersion();
|
||||
|
||||
/**
|
||||
* Gets the default minimum world height for the version of Minecraft that the server is running.
|
||||
*
|
||||
* @return minimum world height
|
||||
* @since 6.6.0
|
||||
*/
|
||||
int versionMinHeight();
|
||||
|
||||
/**
|
||||
* Gets the default maximum world height for the version of Minecraft that the server is running.
|
||||
*
|
||||
* @return maximum world height (inclusive)
|
||||
* @since 6.6.0
|
||||
*/
|
||||
int versionMaxHeight();
|
||||
|
||||
/**
|
||||
* Gets the server implementation name and version
|
||||
*
|
||||
@ -274,6 +290,7 @@ public interface PlotPlatform<P> extends LocaleHolder {
|
||||
* Get the {@link PlotAreaManager} implementation.
|
||||
*
|
||||
* @return the PlotAreaManager
|
||||
* @since 6.1.4
|
||||
*/
|
||||
@NonNull PlotAreaManager plotAreaManager();
|
||||
|
||||
|
@ -306,7 +306,7 @@ public class PlotSquared {
|
||||
*
|
||||
* @param version First version
|
||||
* @param version2 Second version
|
||||
* @return true if `version` is >= `version2`
|
||||
* @return {@code true} if `version` is >= `version2`
|
||||
*/
|
||||
public boolean checkVersion(
|
||||
final int[] version,
|
||||
@ -338,10 +338,13 @@ public class PlotSquared {
|
||||
|
||||
/**
|
||||
* Add a global reference to a plot world.
|
||||
* <p>
|
||||
* You can remove the reference by calling {@link #removePlotArea(PlotArea)}
|
||||
* </p>
|
||||
*
|
||||
* @param plotArea the {@link PlotArea} to add.
|
||||
* @see #removePlotArea(PlotArea) To remove the reference
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public void addPlotArea(final @NonNull PlotArea plotArea) {
|
||||
HashMap<PlotId, Plot> plots;
|
||||
if (plots_tmp == null || (plots = plots_tmp.remove(plotArea.toString())) == null) {
|
||||
@ -556,6 +559,7 @@ public class PlotSquared {
|
||||
*
|
||||
* @param input an array of plots to sort
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
private void sortPlotsByHash(final @NonNull Plot @NonNull [] input) {
|
||||
List<Plot>[] bucket = new ArrayList[32];
|
||||
Arrays.fill(bucket, new ArrayList<>());
|
||||
@ -696,20 +700,12 @@ public class PlotSquared {
|
||||
ArrayList<Plot> toReturn = new ArrayList<>(plots.size());
|
||||
for (PlotArea area : areas) {
|
||||
switch (type) {
|
||||
case CREATION_DATE:
|
||||
toReturn.addAll(sortPlotsByTemp(map.get(area)));
|
||||
break;
|
||||
case CREATION_DATE_TIMESTAMP:
|
||||
toReturn.addAll(sortPlotsByTimestamp(map.get(area)));
|
||||
break;
|
||||
case DISTANCE_FROM_ORIGIN:
|
||||
toReturn.addAll(sortPlotsByHash(map.get(area)));
|
||||
break;
|
||||
case LAST_MODIFIED:
|
||||
toReturn.addAll(sortPlotsByModified(map.get(area)));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case CREATION_DATE -> toReturn.addAll(sortPlotsByTemp(map.get(area)));
|
||||
case CREATION_DATE_TIMESTAMP -> toReturn.addAll(sortPlotsByTimestamp(map.get(area)));
|
||||
case DISTANCE_FROM_ORIGIN -> toReturn.addAll(sortPlotsByHash(map.get(area)));
|
||||
case LAST_MODIFIED -> toReturn.addAll(sortPlotsByModified(map.get(area)));
|
||||
default -> {
|
||||
}
|
||||
}
|
||||
}
|
||||
return toReturn;
|
||||
@ -739,7 +735,7 @@ public class PlotSquared {
|
||||
*
|
||||
* @param plot the plot to remove
|
||||
* @param callEvent If to call an event about the plot being removed
|
||||
* @return true if plot existed | false if it didn't
|
||||
* @return {@code true} if plot existed | {@code false} if it didn't
|
||||
*/
|
||||
public boolean removePlot(
|
||||
final @NonNull Plot plot,
|
||||
@ -1024,8 +1020,8 @@ public class PlotSquared {
|
||||
// save configuration
|
||||
|
||||
final List<String> validArguments = Arrays
|
||||
.asList("s=", "size=", "g=", "gap=", "h=", "height=", "f=", "floor=", "m=", "main=",
|
||||
"w=", "wall=", "b=", "border="
|
||||
.asList("s=", "size=", "g=", "gap=", "h=", "height=", "minh=", "minheight=", "maxh=", "maxheight=",
|
||||
"f=", "floor=", "m=", "main=", "w=", "wall=", "b=", "border="
|
||||
);
|
||||
|
||||
// Calculate the number of expected arguments
|
||||
@ -1104,6 +1100,14 @@ public class PlotSquared {
|
||||
ConfigurationUtil.INTEGER.parseString(value).shortValue()
|
||||
);
|
||||
}
|
||||
case "minh", "minheight" -> this.worldConfiguration.set(
|
||||
base + "world.min_gen_height",
|
||||
ConfigurationUtil.INTEGER.parseString(value).shortValue()
|
||||
);
|
||||
case "maxh", "maxheight" -> this.worldConfiguration.set(
|
||||
base + "world.max_gen_height",
|
||||
ConfigurationUtil.INTEGER.parseString(value).shortValue()
|
||||
);
|
||||
case "f", "floor" -> this.worldConfiguration.set(
|
||||
base + "plot.floor",
|
||||
ConfigurationUtil.BLOCK_BUCKET.parseString(value).toString()
|
||||
@ -1482,7 +1486,7 @@ public class PlotSquared {
|
||||
*
|
||||
* @param world World name
|
||||
* @param chunkCoordinates Chunk coordinates
|
||||
* @return True if the chunk uses non-standard generation, false if not
|
||||
* @return {@code true} if the chunk uses non-standard generation, {@code false} if not
|
||||
*/
|
||||
public boolean isNonStandardGeneration(
|
||||
final @NonNull String world,
|
||||
@ -1527,10 +1531,12 @@ public class PlotSquared {
|
||||
/**
|
||||
* Get the caption map belonging to a namespace. If none exists, a dummy
|
||||
* caption map will be returned.
|
||||
* <p>
|
||||
* You can register a caption map by calling {@link #registerCaptionMap(String, CaptionMap)}
|
||||
* </p>
|
||||
*
|
||||
* @param namespace Namespace
|
||||
* @return Map instance
|
||||
* @see #registerCaptionMap(String, CaptionMap) To register a caption map
|
||||
*/
|
||||
public @NonNull CaptionMap getCaptionMap(final @NonNull String namespace) {
|
||||
return this.captionMaps.computeIfAbsent(
|
||||
@ -1540,7 +1546,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.
|
||||
*
|
||||
* @param namespace Namespace
|
||||
|
@ -122,7 +122,7 @@ public final class PlotVersion {
|
||||
* Compare a given version string with the one cached here.
|
||||
*
|
||||
* @param versionString the version to compare
|
||||
* @return true if the given version is a "later" version
|
||||
* @return {@code true} if the given version is a "later" version
|
||||
*/
|
||||
public boolean isLaterVersion(final @NonNull String versionString) {
|
||||
int dash = versionString.indexOf('-');
|
||||
@ -144,7 +144,7 @@ public final class PlotVersion {
|
||||
* Compare a given version with the one cached here.
|
||||
*
|
||||
* @param verArray the version to compare
|
||||
* @return true if the given version is a "later" version
|
||||
* @return {@code true} if the given version is a "later" version
|
||||
*/
|
||||
public boolean isLaterVersion(int[] verArray) {
|
||||
if (verArray[0] > version[0]) {
|
||||
|
@ -88,7 +88,7 @@ public interface BackupManager {
|
||||
* Returns true if (potentially) destructive actions should cause
|
||||
* PlotSquared to create automatic plot backups
|
||||
*
|
||||
* @return True if automatic backups are enabled
|
||||
* @return {@code true} if automatic backups are enabled
|
||||
*/
|
||||
boolean shouldAutomaticallyBackup();
|
||||
|
||||
|
@ -29,7 +29,8 @@ import java.util.Arrays;
|
||||
|
||||
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;
|
||||
for (T[] array : rest) {
|
||||
totalLength += array.length;
|
||||
|
@ -35,6 +35,7 @@ public class FlatRandomCollection<T> extends RandomCollection<T> {
|
||||
|
||||
private final T[] values;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public FlatRandomCollection(Map<T, Double> weights, Random random) {
|
||||
super(weights, random);
|
||||
int max = 0;
|
||||
|
@ -241,6 +241,7 @@ public class QuadMap<T> {
|
||||
return false;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void recalculateSkip() {
|
||||
QuadMap<T> map = null;
|
||||
for (QuadMap<T> current : new QuadMap[]{this.one, this.two, this.three, this.four}) {
|
||||
|
@ -75,6 +75,7 @@ import com.sk89q.worldedit.function.operation.Operations;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import com.sk89q.worldedit.regions.CuboidRegion;
|
||||
import com.sk89q.worldedit.regions.Region;
|
||||
import com.sk89q.worldedit.world.World;
|
||||
import net.kyori.adventure.text.minimessage.Template;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
|
||||
@ -191,11 +192,12 @@ public class Area extends SubCommand {
|
||||
final BlockVector3 playerSelectionMin = playerSelectedRegion.getMinimumPoint();
|
||||
final BlockVector3 playerSelectionMax = playerSelectedRegion.getMaximumPoint();
|
||||
// Create a new selection that spans the entire vertical range of the world
|
||||
World world = playerSelectedRegion.getWorld();
|
||||
final CuboidRegion selectedRegion =
|
||||
new CuboidRegion(
|
||||
playerSelectedRegion.getWorld(),
|
||||
BlockVector3.at(playerSelectionMin.getX(), 0, playerSelectionMin.getZ()),
|
||||
BlockVector3.at(playerSelectionMax.getX(), 255, playerSelectionMax.getZ())
|
||||
BlockVector3.at(playerSelectionMin.getX(), world.getMinY(), playerSelectionMin.getZ()),
|
||||
BlockVector3.at(playerSelectionMax.getX(), world.getMaxY(), playerSelectionMax.getZ())
|
||||
);
|
||||
// There's only one plot in the area...
|
||||
final PlotId plotId = PlotId.of(1, 1);
|
||||
@ -278,9 +280,9 @@ public class Area extends SubCommand {
|
||||
if (offsetZ != 0) {
|
||||
this.worldConfiguration.set(path + ".road.offset.z", offsetZ);
|
||||
}
|
||||
final String world = this.setupUtils.setupWorld(singleBuilder);
|
||||
if (this.worldUtil.isWorld(world)) {
|
||||
PlotSquared.get().loadWorld(world, null);
|
||||
final String worldName = this.setupUtils.setupWorld(singleBuilder);
|
||||
if (this.worldUtil.isWorld(worldName)) {
|
||||
PlotSquared.get().loadWorld(worldName, null);
|
||||
player.sendMessage(TranslatableCaption.of("single.single_area_created"));
|
||||
} else {
|
||||
player.sendMessage(
|
||||
@ -369,7 +371,8 @@ public class Area extends SubCommand {
|
||||
int lower = (area.ROAD_WIDTH & 1) == 0 ? area.ROAD_WIDTH / 2 - 1 : area.ROAD_WIDTH / 2;
|
||||
final int offsetX = bx - (area.ROAD_WIDTH == 0 ? 0 : lower);
|
||||
final int offsetZ = bz - (area.ROAD_WIDTH == 0 ? 0 : lower);
|
||||
final CuboidRegion region = RegionUtil.createRegion(bx, tx, bz, tz);
|
||||
// Height doesn't matter for this region
|
||||
final CuboidRegion region = RegionUtil.createRegion(bx, tx, 0, 0, bz, tz);
|
||||
final Set<PlotArea> areas = this.plotAreaManager.getPlotAreasSet(area.getWorldName(), region);
|
||||
if (!areas.isEmpty()) {
|
||||
player.sendMessage(
|
||||
|
@ -34,7 +34,7 @@ import net.kyori.adventure.text.minimessage.Template;
|
||||
* @deprecated In favor of "/plot toggle chat" and
|
||||
* scheduled for removal within the next major release.
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
@Deprecated(forRemoval = true, since = "6.0.0")
|
||||
@CommandDeclaration(command = "chat",
|
||||
usage = "/plot chat",
|
||||
permission = "plots.chat",
|
||||
|
@ -58,6 +58,7 @@ import java.util.concurrent.CompletableFuture;
|
||||
public class Clear extends Command {
|
||||
|
||||
private final EventDispatcher eventDispatcher;
|
||||
@SuppressWarnings({"unused", "FieldCanBeLocal"})
|
||||
private final GlobalBlockQueue blockQueue;
|
||||
|
||||
@Inject
|
||||
|
@ -288,7 +288,7 @@ public abstract class Command {
|
||||
* @param args Arguments
|
||||
* @param confirm Instance, Success, Failure
|
||||
* @param whenDone task to run when done
|
||||
* @return CompletableFuture true if the command executed fully, false in
|
||||
* @return CompletableFuture {@code true} if the command executed fully, {@code false} in
|
||||
* any other case
|
||||
*/
|
||||
public CompletableFuture<Boolean> execute(
|
||||
@ -375,7 +375,6 @@ public abstract class Command {
|
||||
boolean failed = args.length < reqArgs.length;
|
||||
String[] baseSplit = getCommandString().split(" ");
|
||||
String[] fullSplit = getUsage().split(" ");
|
||||
String base = getCommandString();
|
||||
if (fullSplit.length - baseSplit.length < reqArgs.length) {
|
||||
String[] tmp = new String[baseSplit.length + reqArgs.length];
|
||||
System.arraycopy(fullSplit, 0, tmp, 0, fullSplit.length);
|
||||
|
@ -28,6 +28,7 @@ package com.plotsquared.core.command;
|
||||
import com.plotsquared.core.configuration.caption.Caption;
|
||||
import com.plotsquared.core.configuration.caption.LocaleHolder;
|
||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
|
||||
/**
|
||||
@ -95,4 +96,16 @@ public enum CommandCategory implements Caption {
|
||||
public String getComponent(@NonNull LocaleHolder localeHolder) {
|
||||
return this.caption.getComponent(localeHolder);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a player has access to this command category
|
||||
*
|
||||
* @param player The player to check against
|
||||
* @return {@code true} if at least one command of this category can be executed by the player, {@code false} otherwise
|
||||
* @since 6.5.0
|
||||
*/
|
||||
boolean canAccess(PlotPlayer<?> player) {
|
||||
return !MainCommand.getInstance().getCommands(this, player).isEmpty();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -69,6 +69,7 @@ public class Condense extends SubCommand {
|
||||
this.worldUtil = worldUtil;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer<?> player, String[] args) {
|
||||
if (args.length != 2 && args.length != 3) {
|
||||
|
@ -48,7 +48,7 @@ public class Confirm extends SubCommand {
|
||||
player.sendMessage(TranslatableCaption.of("confirm.expired_confirm"));
|
||||
return false;
|
||||
}
|
||||
TaskManager.runTaskAsync(command.command);
|
||||
TaskManager.runTask(command.command);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -255,7 +255,7 @@ public class DatabaseCommand extends SubCommand {
|
||||
player.sendMessage(TranslatableCaption.of("database.failed_to_save_plots"));
|
||||
player.sendMessage(TranslatableCaption.of("errors.stacktrace_begin"));
|
||||
e.printStackTrace();
|
||||
player.sendMessage(TranslatableCaption.of(("errors.stacktrace_end")));
|
||||
player.sendMessage(TranslatableCaption.of("errors.stacktrace_end"));
|
||||
player.sendMessage(TranslatableCaption.of("database.invalid_args"));
|
||||
return false;
|
||||
}
|
||||
|
@ -49,6 +49,7 @@ import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.stream.Collectors;
|
||||
@ -207,7 +208,7 @@ public class DebugExec extends SubCommand {
|
||||
}
|
||||
boolean result;
|
||||
if (HybridUtils.regions != null) {
|
||||
result = this.hybridUtils.scheduleRoadUpdate(area, HybridUtils.regions, 0, new HashSet<>());
|
||||
result = this.hybridUtils.scheduleRoadUpdate(area, HybridUtils.regions, 0, new LinkedHashSet<>());
|
||||
} else {
|
||||
result = this.hybridUtils.scheduleRoadUpdate(area, 0);
|
||||
}
|
||||
|
@ -126,7 +126,7 @@ public class Done extends SubCommand {
|
||||
long flagValue = System.currentTimeMillis() / 1000;
|
||||
PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(DoneFlag.class)
|
||||
.createFlagInstance(Long.toString(flagValue));
|
||||
PlotFlagAddEvent event = new PlotFlagAddEvent(plotFlag, plot);
|
||||
PlotFlagAddEvent event = eventDispatcher.callFlagAdd(plotFlag, plot);
|
||||
if (event.getEventResult() == Result.DENY) {
|
||||
player.sendMessage(TranslatableCaption.of("events.event_denied"));
|
||||
return;
|
||||
|
@ -94,12 +94,12 @@ public class Download extends SubCommand {
|
||||
player.sendMessage(TranslatableCaption.of("info.plot_unowned"));
|
||||
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)) {
|
||||
player.sendMessage(TranslatableCaption.of("done.done_not_done"));
|
||||
return false;
|
||||
}
|
||||
if ((!plot.isOwner(player.getUUID())) && !Permissions
|
||||
if (!plot.isOwner(player.getUUID()) && !Permissions
|
||||
.hasPermission(player, Permission.PERMISSION_ADMIN.toString())) {
|
||||
player.sendMessage(TranslatableCaption.of("permission.no_plot_perms"));
|
||||
return false;
|
||||
|
@ -25,6 +25,7 @@
|
||||
*/
|
||||
package com.plotsquared.core.command;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.plotsquared.core.PlotSquared;
|
||||
import com.plotsquared.core.configuration.Settings;
|
||||
import com.plotsquared.core.configuration.caption.CaptionUtility;
|
||||
@ -44,6 +45,7 @@ import com.plotsquared.core.plot.flag.InternalFlag;
|
||||
import com.plotsquared.core.plot.flag.PlotFlag;
|
||||
import com.plotsquared.core.plot.flag.types.IntegerFlag;
|
||||
import com.plotsquared.core.plot.flag.types.ListFlag;
|
||||
import com.plotsquared.core.util.EventDispatcher;
|
||||
import com.plotsquared.core.util.MathMan;
|
||||
import com.plotsquared.core.util.Permissions;
|
||||
import com.plotsquared.core.util.StringComparison;
|
||||
@ -79,8 +81,12 @@ import java.util.stream.Stream;
|
||||
@SuppressWarnings("unused")
|
||||
public final class FlagCommand extends Command {
|
||||
|
||||
public FlagCommand() {
|
||||
private final EventDispatcher eventDispatcher;
|
||||
|
||||
@Inject
|
||||
public FlagCommand(final @NonNull EventDispatcher eventDispatcher) {
|
||||
super(MainCommand.getInstance(), true);
|
||||
this.eventDispatcher = eventDispatcher;
|
||||
}
|
||||
|
||||
private static boolean sendMessage(PlotPlayer<?> player) {
|
||||
@ -114,7 +120,7 @@ public final class FlagCommand extends Command {
|
||||
TranslatableCaption.of("permission.no_permission"),
|
||||
Template.of(
|
||||
"node",
|
||||
perm
|
||||
perm + "." + numeric
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -165,7 +171,7 @@ public final class FlagCommand extends Command {
|
||||
/**
|
||||
* Checks if the player is allowed to modify the flags at their current location
|
||||
*
|
||||
* @return true if the player is allowed to modify the flags at their current location
|
||||
* @return {@code true} if the player is allowed to modify the flags at their current location
|
||||
*/
|
||||
private static boolean checkRequirements(final @NonNull PlotPlayer<?> player) {
|
||||
final Location location = player.getLocation();
|
||||
@ -335,7 +341,7 @@ public final class FlagCommand extends Command {
|
||||
return;
|
||||
}
|
||||
Plot plot = player.getLocation().getPlotAbs();
|
||||
PlotFlagAddEvent event = new PlotFlagAddEvent(plotFlag, plot);
|
||||
PlotFlagAddEvent event = eventDispatcher.callFlagAdd(plotFlag, plot);
|
||||
if (event.getEventResult() == Result.DENY) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("events.event_denied"),
|
||||
@ -367,6 +373,7 @@ public final class FlagCommand extends Command {
|
||||
);
|
||||
}
|
||||
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
@CommandDeclaration(command = "add",
|
||||
aliases = {"a", "add"},
|
||||
usage = "/plot flag add <flag> <value>",
|
||||
@ -393,7 +400,7 @@ public final class FlagCommand extends Command {
|
||||
return;
|
||||
}
|
||||
Plot plot = player.getLocation().getPlotAbs();
|
||||
PlotFlagAddEvent event = new PlotFlagAddEvent(plotFlag, plot);
|
||||
PlotFlagAddEvent event = eventDispatcher.callFlagAdd(plotFlag, plot);
|
||||
if (event.getEventResult() == Result.DENY) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("events.event_denied"),
|
||||
@ -435,6 +442,7 @@ public final class FlagCommand extends Command {
|
||||
);
|
||||
}
|
||||
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
@CommandDeclaration(command = "remove",
|
||||
aliases = {"r", "remove", "delete"},
|
||||
usage = "/plot flag remove <flag> [values]",
|
||||
@ -461,7 +469,7 @@ public final class FlagCommand extends Command {
|
||||
return;
|
||||
}
|
||||
final Plot plot = player.getLocation().getPlotAbs();
|
||||
PlotFlagRemoveEvent event = new PlotFlagRemoveEvent(flag, plot);
|
||||
PlotFlagRemoveEvent event = eventDispatcher.callFlagRemove(flag, plot);
|
||||
if (event.getEventResult() == Result.DENY) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("events.event_denied"),
|
||||
@ -514,7 +522,7 @@ public final class FlagCommand extends Command {
|
||||
}
|
||||
} else {
|
||||
PlotFlag<?, ?> plotFlag = parsedFlag.createFlagInstance(list);
|
||||
PlotFlagAddEvent addEvent = new PlotFlagAddEvent(plotFlag, plot);
|
||||
PlotFlagAddEvent addEvent = eventDispatcher.callFlagAdd(plotFlag, plot);
|
||||
if (addEvent.getEventResult() == Result.DENY) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("events.event_denied"),
|
||||
|
@ -37,11 +37,11 @@ import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
import net.kyori.adventure.text.minimessage.Template;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@CommandDeclaration(command = "help",
|
||||
aliases = "?",
|
||||
@ -119,6 +119,9 @@ public class Help extends Command {
|
||||
TextComponent.Builder builder = Component.text();
|
||||
builder.append(MINI_MESSAGE.parse(TranslatableCaption.of("help.help_header").getComponent(player)));
|
||||
for (CommandCategory c : CommandCategory.values()) {
|
||||
if (!c.canAccess(player)) {
|
||||
continue;
|
||||
}
|
||||
builder.append(Component.newline()).append(MINI_MESSAGE
|
||||
.parse(
|
||||
TranslatableCaption.of("help.help_info_item").getComponent(player),
|
||||
@ -152,12 +155,26 @@ public class Help extends Command {
|
||||
|
||||
@Override
|
||||
public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) {
|
||||
return Stream.of("claiming", "teleport", "settings", "chat", "schematic", "appearance", "info", "debug",
|
||||
"administration", "all"
|
||||
)
|
||||
.filter(value -> value.startsWith(args[0].toLowerCase(Locale.ENGLISH)))
|
||||
.map(value -> new Command(null, false, value, "", RequiredType.NONE, null) {
|
||||
}).collect(Collectors.toList());
|
||||
final String argument = args[0].toLowerCase(Locale.ENGLISH);
|
||||
List<Command> result = new ArrayList<>();
|
||||
|
||||
for (final CommandCategory category : CommandCategory.values()) {
|
||||
if (!category.canAccess(player)) {
|
||||
continue;
|
||||
}
|
||||
String name = category.name().toLowerCase();
|
||||
if (!name.startsWith(argument)) {
|
||||
continue;
|
||||
}
|
||||
result.add(new Command(null, false, name, "", RequiredType.NONE, null) {
|
||||
});
|
||||
}
|
||||
// add the category "all"
|
||||
if ("all".startsWith(argument)) {
|
||||
result.add(new Command(null, false, "all", "", RequiredType.NONE, null) {
|
||||
});
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -112,7 +112,7 @@ public class Like extends SubCommand {
|
||||
});
|
||||
for (final Plot plot : plots) {
|
||||
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 -> {
|
||||
});
|
||||
player.sendMessage(TranslatableCaption.of("tutorial.rate_this"));
|
||||
|
@ -40,6 +40,7 @@ import com.plotsquared.core.plot.schematic.Schematic;
|
||||
import com.plotsquared.core.plot.world.PlotAreaManager;
|
||||
import com.plotsquared.core.util.Permissions;
|
||||
import com.plotsquared.core.util.SchematicHandler;
|
||||
import com.plotsquared.core.util.TimeUtil;
|
||||
import com.plotsquared.core.util.task.RunnableVal;
|
||||
import com.plotsquared.core.util.task.TaskManager;
|
||||
import net.kyori.adventure.text.minimessage.Template;
|
||||
@ -205,7 +206,7 @@ public class Load extends SubCommand {
|
||||
if (split.length < 5) {
|
||||
continue;
|
||||
}
|
||||
String time = secToTime((System.currentTimeMillis() / 1000) - Long.parseLong(split[0]));
|
||||
String time = TimeUtil.secToTime((System.currentTimeMillis() / 1000) - Long.parseLong(split[0]));
|
||||
String world = split[1];
|
||||
PlotId id = PlotId.fromString(split[2] + ';' + split[3]);
|
||||
String size = split[4];
|
||||
@ -223,6 +224,10 @@ public class Load extends SubCommand {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use {@link TimeUtil#secToTime(long)}
|
||||
*/
|
||||
@Deprecated(forRemoval = true, since = "6.6.2")
|
||||
public String secToTime(long time) {
|
||||
StringBuilder toreturn = new StringBuilder();
|
||||
if (time >= 33868800) {
|
||||
|
@ -38,10 +38,13 @@ import com.plotsquared.core.plot.PlotInventory;
|
||||
import com.plotsquared.core.plot.PlotItemStack;
|
||||
import com.plotsquared.core.plot.flag.PlotFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.MusicFlag;
|
||||
import com.plotsquared.core.util.EventDispatcher;
|
||||
import com.plotsquared.core.util.InventoryUtil;
|
||||
import com.plotsquared.core.util.Permissions;
|
||||
import com.sk89q.worldedit.world.item.ItemType;
|
||||
import com.sk89q.worldedit.world.item.ItemTypes;
|
||||
import net.kyori.adventure.text.minimessage.Template;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.Arrays;
|
||||
@ -63,10 +66,12 @@ public class Music extends SubCommand {
|
||||
);
|
||||
|
||||
private final InventoryUtil inventoryUtil;
|
||||
private final EventDispatcher eventDispatcher;
|
||||
|
||||
@Inject
|
||||
public Music(final @Nullable InventoryUtil inventoryUtil) {
|
||||
public Music(final @Nullable InventoryUtil inventoryUtil, final @NonNull EventDispatcher eventDispatcher) {
|
||||
this.inventoryUtil = inventoryUtil;
|
||||
this.eventDispatcher = eventDispatcher;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -104,7 +109,7 @@ public class Music extends SubCommand {
|
||||
if (item.getType() == ItemTypes.BEDROCK) {
|
||||
PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(MusicFlag.class)
|
||||
.createFlagInstance(item.getType());
|
||||
PlotFlagRemoveEvent event = new PlotFlagRemoveEvent(plotFlag, plot);
|
||||
PlotFlagRemoveEvent event = eventDispatcher.callFlagRemove(plotFlag, plot);
|
||||
if (event.getEventResult() == Result.DENY) {
|
||||
getPlayer().sendMessage(
|
||||
TranslatableCaption.of("events.event_denied"),
|
||||
@ -121,7 +126,7 @@ public class Music extends SubCommand {
|
||||
} else if (item.getName().toLowerCase(Locale.ENGLISH).contains("disc")) {
|
||||
PlotFlag<?, ?> plotFlag = plot.getFlagContainer().getFlag(MusicFlag.class)
|
||||
.createFlagInstance(item.getType());
|
||||
PlotFlagAddEvent event = new PlotFlagAddEvent(plotFlag, plot);
|
||||
PlotFlagAddEvent event = eventDispatcher.callFlagAdd(plotFlag, plot);
|
||||
if (event.getEventResult() == Result.DENY) {
|
||||
getPlayer().sendMessage(
|
||||
TranslatableCaption.of("events.event_denied"),
|
||||
@ -144,8 +149,14 @@ public class Music extends SubCommand {
|
||||
for (final String disc : DISCS) {
|
||||
final String name = String.format("<gold>%s</gold>", disc);
|
||||
final String[] lore = {TranslatableCaption.of("plotjukebox.click_to_play").getComponent(player)};
|
||||
final PlotItemStack item = new PlotItemStack(disc, 1, name, lore);
|
||||
inv.setItem(index++, item);
|
||||
ItemType type = ItemTypes.get(disc);
|
||||
if (type == null) {
|
||||
continue;
|
||||
}
|
||||
final PlotItemStack item = new PlotItemStack(type, 1, name, lore);
|
||||
if (inv.setItemChecked(index, item)) {
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
||||
// Always add the cancel button
|
||||
|
@ -51,7 +51,7 @@ public class PluginCmd extends SubCommand {
|
||||
player.sendMessage(StaticCaption.of(
|
||||
"<gray>>> </gray><gold><bold>Authors<reset><gray>: </gray><gold>Citymonstret </gold><gray>& </gray><gold>Empire92 </gold><gray>& </gray><gold>MattBDev </gold><gray>& </gray><gold>dordsor21 </gold><gray>& </gray><gold>NotMyFault </gold><gray>& </gray><gold>SirYwell</gold>"));
|
||||
player.sendMessage(StaticCaption.of(
|
||||
"<gray>>> </gray><gold><bold>Wiki<reset><gray>: </gray><gold><click:open_url:https://github.com/IntellectualSites/PlotSquared-Documentation/wiki>https://github.com/IntellectualSites/PlotSquared-Documentation/wiki</gold>"));
|
||||
"<gray>>> </gray><gold><bold>Wiki<reset><gray>: </gray><gold><click:open_url:https://intellectualsites.github.io/plotsquared-documentation/>https://intellectualsites.github.io/plotsquared-documentation/</gold>"));
|
||||
player.sendMessage(StaticCaption.of(
|
||||
"<gray>>> </gray><gold><bold>Discord<reset><gray>: </gray><gold><click:open_url:https://discord.gg/intellectualsites>https://discord.gg/intellectualsites</gold>"));
|
||||
player.sendMessage(
|
||||
|
@ -104,7 +104,7 @@ public class Rate extends SubCommand {
|
||||
UUID uuid = player.getUUID();
|
||||
for (Plot p : plots) {
|
||||
if ((!Settings.Done.REQUIRED_FOR_RATINGS || DoneFlag.isDone(p)) && p
|
||||
.isBasePlot() && (!p.getRatings().containsKey(uuid)) && !p
|
||||
.isBasePlot() && !p.getRatings().containsKey(uuid) && !p
|
||||
.isAdded(uuid)) {
|
||||
p.teleportPlayer(player, TeleportCause.COMMAND_RATE, result -> {
|
||||
});
|
||||
|
@ -88,7 +88,6 @@ public class RegenAllRoads extends SubCommand {
|
||||
);
|
||||
return false;
|
||||
}
|
||||
String name = args[0];
|
||||
PlotManager manager = area.getPlotManager();
|
||||
if (!(manager instanceof HybridPlotManager)) {
|
||||
player.sendMessage(TranslatableCaption.of("errors.invalid_plot_world"));
|
||||
|
@ -50,7 +50,7 @@ import java.util.UUID;
|
||||
* @deprecated In favor of "/plot download" (Arkitektonika) and scheduled
|
||||
* for removal within the next major release.
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
@Deprecated(forRemoval = true, since = "6.0.9")
|
||||
@CommandDeclaration(command = "save",
|
||||
category = CommandCategory.SCHEMATIC,
|
||||
requiredType = RequiredType.NONE,
|
||||
@ -104,8 +104,8 @@ public class Save extends SubCommand {
|
||||
TaskManager.runTaskAsync(() -> {
|
||||
String time = (System.currentTimeMillis() / 1000) + "";
|
||||
Location[] corners = plot.getCorners();
|
||||
corners[0] = corners[0].withY(0);
|
||||
corners[1] = corners[1].withY(255);
|
||||
corners[0] = corners[0].withY(plot.getArea().getMinBuildHeight());
|
||||
corners[1] = corners[1].withY(plot.getArea().getMaxBuildHeight());
|
||||
int size = (corners[1].getX() - corners[0].getX()) + 1;
|
||||
PlotId id = plot.getId();
|
||||
String world1 = plot.getArea().toString().replaceAll(";", "-")
|
||||
|
@ -181,8 +181,6 @@ public class SchematicCmd extends SubCommand {
|
||||
});
|
||||
}
|
||||
case "saveall", "exportall" -> {
|
||||
Location loc = player.getLocation();
|
||||
final Plot plot = loc.getPlotAbs();
|
||||
if (!(player instanceof ConsolePlayer)) {
|
||||
player.sendMessage(TranslatableCaption.of("console.not_console"));
|
||||
return false;
|
||||
|
@ -100,7 +100,7 @@ public class Set extends SubCommand {
|
||||
|
||||
if (Settings.Enabled_Components.CHUNK_PROCESSOR) {
|
||||
forbiddenTypes.addAll(worldUtil.getTileEntityTypes().stream().map(
|
||||
BlockType::getName).collect(Collectors.toList()));
|
||||
BlockType::getName).toList());
|
||||
}
|
||||
|
||||
if (!Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_ALLOW_UNSAFE) &&
|
||||
|
@ -180,12 +180,12 @@ public class Trim extends SubCommand {
|
||||
int bx = cbx << 4;
|
||||
int bz = cbz << 4;
|
||||
CuboidRegion region =
|
||||
RegionUtil.createRegion(bx, bx + 511, bz, bz + 511);
|
||||
RegionUtil.createRegion(bx, bx + 511, 0, 0, bz, bz + 511);
|
||||
for (Plot plot : PlotQuery.newQuery().inWorld(world)) {
|
||||
Location bot = plot.getBottomAbs();
|
||||
Location top = plot.getExtendedTopAbs();
|
||||
CuboidRegion plotReg = RegionUtil
|
||||
.createRegion(bot.getX(), top.getX(), bot.getZ(), top.getZ());
|
||||
.createRegion(bot.getX(), top.getX(), 0, 0, bot.getZ(), top.getZ());
|
||||
if (!RegionUtil.intersects(region, plotReg)) {
|
||||
continue;
|
||||
}
|
||||
|
@ -361,30 +361,4 @@ public class Visit extends Command {
|
||||
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;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static ComponentPreset deserialize(final @NonNull Map<String, Object> map) {
|
||||
final ClassicPlotManagerComponent classicPlotManagerComponent = ClassicPlotManagerComponent
|
||||
.fromString(map.getOrDefault("component", "").toString()).orElseThrow(() ->
|
||||
|
@ -75,6 +75,7 @@ public class ComponentPresetManager {
|
||||
private final InventoryUtil inventoryUtil;
|
||||
private File componentsFile;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Inject
|
||||
public ComponentPresetManager(final @NonNull EconHandler econHandler, final @NonNull InventoryUtil inventoryUtil) throws
|
||||
IOException {
|
||||
@ -127,7 +128,7 @@ public class ComponentPresetManager {
|
||||
0,
|
||||
"",
|
||||
"<rainbow:2>Disco Floor</rainbow>",
|
||||
Arrays.asList("<gold>Spice up your plot floor</gold>"),
|
||||
List.of("<gold>Spice up your plot floor</gold>"),
|
||||
ItemTypes.YELLOW_WOOL
|
||||
));
|
||||
yamlConfiguration.set("presets", defaultPreset.stream().map(ComponentPreset::serialize).collect(Collectors.toList()));
|
||||
@ -180,6 +181,10 @@ public class ComponentPresetManager {
|
||||
}
|
||||
allowedPresets.add(componentPreset);
|
||||
}
|
||||
if (allowedPresets.isEmpty()) {
|
||||
player.sendMessage(TranslatableCaption.of("preset.empty"));
|
||||
return null;
|
||||
}
|
||||
final int size = (int) Math.ceil((double) allowedPresets.size() / 9.0D);
|
||||
final PlotInventory plotInventory = new PlotInventory(this.inventoryUtil, player, size,
|
||||
TranslatableCaption.of("preset.title").getComponent(player)) {
|
||||
@ -209,7 +214,13 @@ public class ComponentPresetManager {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (componentPreset.getCost() > 0.0D && econHandler.isEnabled(plot.getArea())) {
|
||||
if (componentPreset.getCost() > 0.0D) {
|
||||
if (!econHandler.isEnabled(plot.getArea())) {
|
||||
getPlayer().sendMessage(
|
||||
TranslatableCaption.of("preset.economy_disabled"),
|
||||
Template.of("preset", componentPreset.getDisplayName()));
|
||||
return false;
|
||||
}
|
||||
if (econHandler.getMoney(getPlayer()) < componentPreset.getCost()) {
|
||||
getPlayer().sendMessage(TranslatableCaption.of("preset.preset_cannot_afford"));
|
||||
return false;
|
||||
@ -245,11 +256,16 @@ public class ComponentPresetManager {
|
||||
for (int i = 0; i < allowedPresets.size(); i++) {
|
||||
final ComponentPreset preset = allowedPresets.get(i);
|
||||
final List<String> lore = new ArrayList<>();
|
||||
if (preset.getCost() > 0 && this.econHandler.isEnabled(plot.getArea())) {
|
||||
lore.add(MINI_MESSAGE.serialize(MINI_MESSAGE.parse(
|
||||
TranslatableCaption.of("preset.preset_lore_cost").getComponent(player),
|
||||
Template.of("cost", String.format("%.2f", preset.getCost()))
|
||||
)));
|
||||
if (preset.getCost() > 0) {
|
||||
if (!this.econHandler.isEnabled(plot.getArea())) {
|
||||
lore.add(MINI_MESSAGE.serialize(MINI_MESSAGE.parse(
|
||||
TranslatableCaption.of("preset.preset_lore_economy_disabled").getComponent(player))));
|
||||
} else {
|
||||
lore.add(MINI_MESSAGE.serialize(MINI_MESSAGE.parse(
|
||||
TranslatableCaption.of("preset.preset_lore_cost").getComponent(player),
|
||||
Template.of("cost", String.format("%.2f", preset.getCost()))
|
||||
)));
|
||||
}
|
||||
}
|
||||
lore.add(MINI_MESSAGE.serialize(MINI_MESSAGE.parse(
|
||||
TranslatableCaption.of("preset.preset_lore_component").getComponent(player),
|
||||
|
@ -58,6 +58,7 @@ public class Config {
|
||||
* @param <T> value type
|
||||
* @return value
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T> T get(String key, Class<?> root) {
|
||||
String[] split = key.split("\\.");
|
||||
Object instance = getInstance(split, root);
|
||||
@ -183,6 +184,7 @@ public class Config {
|
||||
return value != null ? value.toString() : "null";
|
||||
}
|
||||
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
private static void save(PrintWriter writer, Class<?> clazz, Object instance, int indent) {
|
||||
try {
|
||||
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>
|
||||
* Note: As expiry can have multiple blocks there will be multiple instances
|
||||
@ -305,6 +292,7 @@ public class Config {
|
||||
* @param root
|
||||
* @return The instance or null
|
||||
*/
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
private static Object getInstance(String[] split, Class<?> root) {
|
||||
try {
|
||||
Class<?> clazz = root == null ? MethodHandles.lookup().lookupClass() : root;
|
||||
|
@ -73,7 +73,7 @@ public interface ConfigurationSection {
|
||||
* has been specified, this will return true.
|
||||
*
|
||||
* @param path Path to check for existence.
|
||||
* @return True if this section contains the requested path, either via
|
||||
* @return {@code true} if this section contains the requested path, either via
|
||||
* default or being set.
|
||||
* @throws IllegalArgumentException Thrown when path is {@code null}.
|
||||
*/
|
||||
@ -87,7 +87,7 @@ public interface ConfigurationSection {
|
||||
* has been specified, this will still return false.
|
||||
*
|
||||
* @param path Path to check for existence.
|
||||
* @return True if this section contains the requested path, regardless of
|
||||
* @return {@code true} if this section contains the requested path, regardless of
|
||||
* having a default.
|
||||
* @throws IllegalArgumentException Thrown when path is {@code null}.
|
||||
*/
|
||||
|
@ -196,10 +196,12 @@ public class Settings extends Config {
|
||||
public boolean CONFIRMATION = true;
|
||||
public int DAYS = 90;
|
||||
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("*"));
|
||||
|
||||
|
||||
@Comment("See: https://github.com/IntellectualSites/PlotSquared-Documentation/wiki/Plot-analysis for a description of each value.")
|
||||
@Comment("See: https://intellectualsites.github.io/plotsquared-documentation/optimization/plot-analysis for a description of each value.")
|
||||
public static final class CALIBRATION {
|
||||
|
||||
public int VARIETY = 0;
|
||||
@ -219,7 +221,7 @@ public class Settings extends Config {
|
||||
|
||||
|
||||
@Comment({"Chunk processor related settings",
|
||||
"See https://github.com/IntellectualSites/PlotSquared-Documentation/wiki/Chunk-processor for more information."})
|
||||
"See https://intellectualsites.github.io/plotsquared-documentation/optimization/chunk-processor for more information."})
|
||||
public static class Chunk_Processor {
|
||||
|
||||
@Comment("Auto trim will not save chunks which aren't claimed")
|
||||
@ -282,7 +284,7 @@ public class Settings extends Config {
|
||||
@Comment("Always show explosion Particles, even if explosion flag is set to false")
|
||||
public static boolean ALWAYS_SHOW_EXPLOSIONS = false;
|
||||
@Comment({"Blocks that may not be used in plot components",
|
||||
"Checkout the wiki article regarding plot components before modifying: https://github.com/IntellectualSites/PlotSquared-Documentation/wiki/Plot-Components"})
|
||||
"Checkout the wiki article regarding plot components before modifying: https://intellectualsites.github.io/plotsquared-documentation/customization/plot-components"})
|
||||
public static List<String>
|
||||
INVALID_BLOCKS = Arrays.asList(
|
||||
// Acacia Stuff
|
||||
@ -404,7 +406,7 @@ public class Settings extends Config {
|
||||
|
||||
|
||||
@Comment({"Schematic Settings",
|
||||
"See https://github.com/IntellectualSites/PlotSquared-Documentation/wiki/Schematic-on-Claim for more information."})
|
||||
"See https://intellectualsites.github.io/plotsquared-documentation/schematics/schematic-on-claim for more information."})
|
||||
public static final class Schematics {
|
||||
|
||||
@Comment(
|
||||
@ -436,7 +438,7 @@ public class Settings extends Config {
|
||||
}
|
||||
|
||||
|
||||
@Deprecated(forRemoval = true)
|
||||
@Deprecated(forRemoval = true, since = "6.0.0")
|
||||
@Comment("Schematic interface related settings")
|
||||
public static class Web {
|
||||
|
||||
@ -533,7 +535,7 @@ public class Settings extends Config {
|
||||
|
||||
|
||||
@Comment({"Backup related settings",
|
||||
"See https://github.com/IntellectualSites/PlotSquared-Documentation/wiki/Backups for more information."})
|
||||
"See https://intellectualsites.github.io/plotsquared-documentation/plot-backups for more information."})
|
||||
public static final class Backup {
|
||||
|
||||
@Comment("Automatically backup plots when destructive commands are performed, e.g. /plot clear")
|
||||
@ -782,7 +784,7 @@ public class Settings extends Config {
|
||||
public static boolean
|
||||
PERSISTENT_ROAD_REGEN = true;
|
||||
@Comment({"Enable the `/plot component` preset GUI",
|
||||
"Read more about components here: https://github.com/IntellectualSites/PlotSquared-Documentation/wiki/Plot-Components"})
|
||||
"Read more about components here: https://intellectualsites.github.io/plotsquared-documentation/customization/plot-components"})
|
||||
public static boolean COMPONENT_PRESETS = true;
|
||||
@Comment("Enable per user locale")
|
||||
public static boolean PER_USER_LOCALE = false;
|
||||
|
@ -60,7 +60,7 @@ public interface CaptionMap {
|
||||
* Check if the map supports a given locale
|
||||
*
|
||||
* @param locale Locale
|
||||
* @return True if the map supports the locale
|
||||
* @return {@code true} if the map supports the locale
|
||||
*/
|
||||
boolean supportsLocale(final @NonNull Locale locale);
|
||||
|
||||
|
@ -103,6 +103,7 @@ public class CaptionUtility {
|
||||
* @param miniMessageString the message from which the specified click events should be removed from.
|
||||
* @return the string without the click events that are configured to be removed.
|
||||
* @see Settings.Chat#CLICK_EVENT_ACTIONS_TO_REMOVE
|
||||
* @since 6.0.10
|
||||
*/
|
||||
public static String stripClickEvents(final @NonNull String miniMessageString) {
|
||||
// parse, transform and serialize again
|
||||
@ -122,6 +123,7 @@ public class CaptionUtility {
|
||||
* @return the string without the click events that are configured to be removed.
|
||||
* @see Settings.Chat#CLICK_EVENT_ACTIONS_TO_REMOVE
|
||||
* @see #stripClickEvents(String)
|
||||
* @since 6.0.10
|
||||
*/
|
||||
public static String stripClickEvents(
|
||||
final @NonNull PlotFlag<?, ?> flag,
|
||||
|
@ -99,7 +99,7 @@ public interface ChatFormatter {
|
||||
* Whether or not the output should escape
|
||||
* any formatting keys
|
||||
*
|
||||
* @return True if raw output is to be used
|
||||
* @return {@code true} if raw output is to be used
|
||||
*/
|
||||
public boolean isRawOutput() {
|
||||
return this.rawOutput;
|
||||
|
@ -39,6 +39,7 @@ public interface ComponentTransform {
|
||||
*
|
||||
* @param transform the transform to apply.
|
||||
* @return a new transform which is applied on all child components and the component itself.
|
||||
* @since 6.0.10
|
||||
*/
|
||||
static ComponentTransform nested(ComponentTransform transform) {
|
||||
return new NestedComponentTransform(transform);
|
||||
@ -51,6 +52,7 @@ public interface ComponentTransform {
|
||||
*
|
||||
* @param actionsToRemove the actions used to filter which click events should be removed.
|
||||
* @return a new transform that removes click events from a component.
|
||||
* @since 6.0.10
|
||||
*/
|
||||
static ComponentTransform stripClicks(ClickEvent.Action... actionsToRemove) {
|
||||
return new ClickStripTransform(Set.of(actionsToRemove));
|
||||
@ -61,6 +63,7 @@ public interface ComponentTransform {
|
||||
*
|
||||
* @param original the component to transform.
|
||||
* @return the transformed component.
|
||||
* @since 6.0.10
|
||||
*/
|
||||
@NonNull Component transform(@NonNull Component original);
|
||||
|
||||
|
@ -36,10 +36,12 @@ import java.util.Locale;
|
||||
public interface LocaleHolder {
|
||||
|
||||
/**
|
||||
* Get the console locale holder
|
||||
* Get the console locale holder.
|
||||
* <p>
|
||||
* You can use {@link ConsolePlayer#getConsole()} for direct access to the {@link ConsolePlayer}
|
||||
* </p>
|
||||
*
|
||||
* @return Console locale holder
|
||||
* @see ConsolePlayer#getConsole() for direct access to the {@link ConsolePlayer}
|
||||
*/
|
||||
@NonNull
|
||||
static LocaleHolder console() {
|
||||
|
@ -371,7 +371,7 @@ public interface AbstractDB {
|
||||
/**
|
||||
* Don't use this method unless you want to ruin someone's server.
|
||||
*
|
||||
* @return true if the tables were deleted, false when an error is encountered
|
||||
* @return {@code true} if the tables were deleted, {@code false} when an error is encountered
|
||||
*/
|
||||
boolean deleteTables();
|
||||
|
||||
|
@ -52,7 +52,7 @@ public abstract class Database {
|
||||
/**
|
||||
* Checks if a connection is open with the database.
|
||||
*
|
||||
* @return true if the connection is open
|
||||
* @return {@code true} if the connection is open
|
||||
* @throws SQLException if the connection cannot be checked
|
||||
*/
|
||||
public abstract boolean checkConnection() throws SQLException;
|
||||
@ -67,7 +67,7 @@ public abstract class Database {
|
||||
/**
|
||||
* Closes the connection with the database.
|
||||
*
|
||||
* @return true if successful
|
||||
* @return {@code true} if successful
|
||||
* @throws SQLException if the connection cannot be closed
|
||||
*/
|
||||
public abstract boolean closeConnection() throws SQLException;
|
||||
|
@ -101,7 +101,9 @@ public class SQLManager implements AbstractDB {
|
||||
private final String prefix;
|
||||
private final Database database;
|
||||
private final boolean mySQL;
|
||||
@SuppressWarnings({"unused", "FieldCanBeLocal"})
|
||||
private final EventDispatcher eventDispatcher;
|
||||
@SuppressWarnings({"unused", "FieldCanBeLocal"})
|
||||
private final PlotListener plotListener;
|
||||
private final YamlConfiguration worldConfiguration;
|
||||
/**
|
||||
@ -408,7 +410,6 @@ public class SQLManager implements AbstractDB {
|
||||
while (iterator.hasNext()) {
|
||||
try {
|
||||
Entry<Plot, Queue<UniqueStatement>> entry = iterator.next();
|
||||
Plot plot = entry.getKey();
|
||||
Queue<UniqueStatement> tasks = entry.getValue();
|
||||
if (tasks.isEmpty()) {
|
||||
iterator.remove();
|
||||
@ -2295,8 +2296,6 @@ public class SQLManager implements AbstractDB {
|
||||
int size = uniqueIdsList.size();
|
||||
int packet = 990;
|
||||
int amount = size / packet;
|
||||
int count = 0;
|
||||
int last = -1;
|
||||
for (int j = 0; j <= amount; j++) {
|
||||
List<Integer> subList =
|
||||
uniqueIdsList.subList(j * packet, Math.min(size, (j + 1) * packet));
|
||||
@ -3200,6 +3199,7 @@ public class SQLManager implements AbstractDB {
|
||||
return true;
|
||||
}
|
||||
|
||||
@SuppressWarnings({"unchecked", "unused"})
|
||||
@Override
|
||||
public void validateAllPlots(Set<Plot> toValidate) {
|
||||
if (!isValid()) {
|
||||
@ -3455,15 +3455,7 @@ public class SQLManager implements AbstractDB {
|
||||
|
||||
}
|
||||
|
||||
private static class UUIDPair {
|
||||
|
||||
public final int id;
|
||||
public final UUID uuid;
|
||||
|
||||
public UUIDPair(int id, UUID uuid) {
|
||||
this.id = id;
|
||||
this.uuid = uuid;
|
||||
}
|
||||
private record UUIDPair(int id, UUID uuid) {
|
||||
|
||||
}
|
||||
|
||||
|
@ -115,7 +115,7 @@ public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEve
|
||||
/**
|
||||
* @deprecated for removal. Use {@link PlayerAutoPlotEvent#getSizeX()}
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
@Deprecated(forRemoval = true, since = "6.1.0")
|
||||
public int getSize_x() {
|
||||
return getSizeX();
|
||||
}
|
||||
@ -123,7 +123,7 @@ public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEve
|
||||
/**
|
||||
* @deprecated for removal. Use {@link PlayerAutoPlotEvent#setSizeX(int)} )}
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
@Deprecated(forRemoval = true, since = "6.1.0")
|
||||
public void setSize_x(int sizeX) {
|
||||
setSizeX(sizeX);
|
||||
}
|
||||
@ -131,7 +131,7 @@ public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEve
|
||||
/**
|
||||
* @deprecated for removal. Use {@link PlayerAutoPlotEvent#getSizeZ()}
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
@Deprecated(forRemoval = true, since = "6.1.0")
|
||||
public int getSize_z() {
|
||||
return getSizeZ();
|
||||
}
|
||||
@ -139,7 +139,7 @@ public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEve
|
||||
/**
|
||||
* @deprecated for removal. Use {@link PlayerAutoPlotEvent#setSizeZ(int)} )}
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
@Deprecated(forRemoval = true, since = "6.1.0")
|
||||
public void setSize_z(int sizeZ) {
|
||||
setSizeZ(sizeZ);
|
||||
}
|
||||
@ -148,6 +148,7 @@ public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEve
|
||||
* Get the x size of the auto-area
|
||||
*
|
||||
* @return x size
|
||||
* @since 6.1.0
|
||||
*/
|
||||
public int getSizeX() {
|
||||
return this.sizeX;
|
||||
@ -157,6 +158,7 @@ public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEve
|
||||
* Set the x size of the auto-area
|
||||
*
|
||||
* @param sizeX x size
|
||||
* @since 6.1.0
|
||||
*/
|
||||
public void setSizeX(int sizeX) {
|
||||
this.sizeX = sizeX;
|
||||
@ -166,6 +168,7 @@ public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEve
|
||||
* Get the z size of the auto-area
|
||||
*
|
||||
* @return z size
|
||||
* @since 6.1.0
|
||||
*/
|
||||
public int getSizeZ() {
|
||||
return this.sizeZ;
|
||||
@ -175,6 +178,7 @@ public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEve
|
||||
* Set the z size of the auto-area
|
||||
*
|
||||
* @param sizeZ z size
|
||||
* @since 6.1.0
|
||||
*/
|
||||
public void setSizeZ(int sizeZ) {
|
||||
this.sizeZ = sizeZ;
|
||||
|
@ -40,8 +40,6 @@ import java.util.List;
|
||||
*/
|
||||
public class PlayerAutoPlotsChosenEvent extends PlotPlayerEvent {
|
||||
|
||||
private Result eventResult;
|
||||
|
||||
private List<Plot> plots;
|
||||
|
||||
/**
|
||||
@ -49,6 +47,7 @@ public class PlayerAutoPlotsChosenEvent extends PlotPlayerEvent {
|
||||
*
|
||||
* @param player Player that executed the auto
|
||||
* @param plots Plots that have been chosen to be set to the player
|
||||
* @since 6.1.0
|
||||
*/
|
||||
public PlayerAutoPlotsChosenEvent(PlotPlayer<?> player, List<Plot> plots) {
|
||||
super(player, plots.size() > 0 ? plots.get(0) : null);
|
||||
@ -69,6 +68,7 @@ public class PlayerAutoPlotsChosenEvent extends PlotPlayerEvent {
|
||||
* Get the immutable list of plots selected to be claimed by the player. May be of length 0.
|
||||
*
|
||||
* @return immutable list.
|
||||
* @since 6.1.0
|
||||
*/
|
||||
public @NonNull List<Plot> getPlots() {
|
||||
return plots;
|
||||
@ -78,6 +78,7 @@ public class PlayerAutoPlotsChosenEvent extends PlotPlayerEvent {
|
||||
* Set the plots to be claimed by the player.
|
||||
*
|
||||
* @param plots list of plots.
|
||||
* @since 6.1.0
|
||||
*/
|
||||
public void setPlots(final @NonNull List<Plot> plots) {
|
||||
this.plots = List.copyOf(plots);
|
||||
|
@ -42,7 +42,7 @@ public class PlayerPlotDeniedEvent extends PlotEvent {
|
||||
* @param initiator Player that initiated the event
|
||||
* @param plot Plot in which the event occurred
|
||||
* @param player Player that was denied/un-denied
|
||||
* @param added true of add to deny list, false if removed
|
||||
* @param added {@code true} of add to deny list, {@code false} if removed
|
||||
*/
|
||||
public PlayerPlotDeniedEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added) {
|
||||
super(plot);
|
||||
|
@ -45,7 +45,7 @@ public class PlayerPlotHelperEvent extends PlotEvent {
|
||||
* @param initiator Player that initiated the event
|
||||
* @param plot Plot in which the event occurred
|
||||
* @param player Player that was added/removed from the helper list
|
||||
* @param added true of the player was added, false if the player was removed
|
||||
* @param added {@code true} if the player was added, {@code false} if the player was removed
|
||||
*/
|
||||
public PlayerPlotHelperEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added) {
|
||||
super(plot);
|
||||
|
@ -42,7 +42,7 @@ public class PlayerPlotTrustedEvent extends PlotEvent {
|
||||
* @param initiator Player that initiated the event
|
||||
* @param plot Plot in which the event occurred
|
||||
* @param player Player that was added/removed from the trusted list
|
||||
* @param added true of the player was added, false if the player was removed
|
||||
* @param added {@code true} if the player was added, {@code false} if the player was removed
|
||||
*/
|
||||
public PlayerPlotTrustedEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added) {
|
||||
super(plot);
|
||||
|
@ -42,7 +42,7 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel
|
||||
* @deprecated use {@link PlayerTeleportToPlotEvent#PlayerTeleportToPlotEvent(PlotPlayer, Location, Plot, TeleportCause)}.
|
||||
* You should not be creating events in the first place.
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
@Deprecated(forRemoval = true, since = "6.1.0")
|
||||
public PlayerTeleportToPlotEvent(PlotPlayer<?> player, Location from, Plot plot) {
|
||||
this(player, from, plot, TeleportCause.UNKNOWN);
|
||||
}
|
||||
@ -54,6 +54,7 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel
|
||||
* @param from Start location
|
||||
* @param plot Plot to which the player was teleported
|
||||
* @param cause Why the teleport is being completed
|
||||
* @since 6.1.0
|
||||
*/
|
||||
public PlayerTeleportToPlotEvent(PlotPlayer<?> player, Location from, Plot plot, TeleportCause cause) {
|
||||
super(player, plot);
|
||||
@ -65,6 +66,7 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel
|
||||
* Get the teleport cause
|
||||
*
|
||||
* @return TeleportCause
|
||||
* @since 6.1.0
|
||||
*/
|
||||
public TeleportCause getCause() {
|
||||
return cause;
|
||||
|
@ -39,6 +39,7 @@ public class PlotClaimedNotifyEvent extends PlotEvent {
|
||||
*
|
||||
* @param plot Plot that was claimed
|
||||
* @param auto If the plot was claimed using /plot auto
|
||||
* @since 6.1.0
|
||||
*/
|
||||
public PlotClaimedNotifyEvent(Plot plot, boolean auto) {
|
||||
super(plot);
|
||||
@ -49,7 +50,9 @@ public class PlotClaimedNotifyEvent extends PlotEvent {
|
||||
* If the plot was claimed using /plot auto
|
||||
*
|
||||
* @return if claimed with auto
|
||||
* @since 6.1.0
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public boolean wasAuto() {
|
||||
return auto;
|
||||
}
|
||||
|
@ -57,12 +57,16 @@ public enum TeleportCause {
|
||||
PLUGIN,
|
||||
UNKNOWN;
|
||||
|
||||
/**
|
||||
* @since 6.1.0
|
||||
*/
|
||||
public static final class CauseSets {
|
||||
|
||||
public static final Set<TeleportCause> COMMAND = Sets.immutableEnumSet(EnumSet.range(
|
||||
TeleportCause.COMMAND,
|
||||
TeleportCause.COMMAND_VISIT
|
||||
));
|
||||
@SuppressWarnings("unused")
|
||||
public static final Set<TeleportCause> PLUGIN = Sets.immutableEnumSet(EnumSet.range(
|
||||
TeleportCause.DEATH,
|
||||
TeleportCause.PLUGIN
|
||||
|
@ -70,7 +70,7 @@ public class AugmentedUtils {
|
||||
final int blockZ = chunkZ << 4;
|
||||
// Create a region that contains the
|
||||
// entire chunk
|
||||
CuboidRegion region = RegionUtil.createRegion(blockX, blockX + 15, blockZ, blockZ + 15);
|
||||
CuboidRegion region = RegionUtil.createRegion(blockX, blockX + 15, 0, 0, blockZ, blockZ + 15);
|
||||
// Query for plot areas in the chunk
|
||||
final Set<PlotArea> areas = PlotSquared.get().getPlotAreaManager().getPlotAreasSet(world, region);
|
||||
if (areas.isEmpty()) {
|
||||
@ -122,6 +122,7 @@ public class AugmentedUtils {
|
||||
}
|
||||
QueueCoordinator secondaryMask;
|
||||
BlockState air = BlockTypes.AIR.getDefaultState();
|
||||
int startYOffset = !(area instanceof ClassicPlotWorld) || ((ClassicPlotWorld) area).PLOT_BEDROCK ? 1 : 0;
|
||||
if (area.getTerrain() == PlotAreaTerrainType.ROAD) {
|
||||
PlotManager manager = area.getPlotManager();
|
||||
final boolean[][] canPlace = new boolean[16][16];
|
||||
@ -132,7 +133,7 @@ public class AugmentedUtils {
|
||||
int worldZ = z + blockZ;
|
||||
boolean can = manager.getPlotId(worldX, 0, worldZ) == null;
|
||||
if (can) {
|
||||
for (int y = 1; y < 128; y++) {
|
||||
for (int y = area.getMinGenHeight() + startYOffset; y <= area.getMaxGenHeight(); y++) {
|
||||
queue.setBlock(worldX, y, worldZ, air);
|
||||
}
|
||||
canPlace[x][z] = true;
|
||||
@ -149,7 +150,7 @@ public class AugmentedUtils {
|
||||
secondaryMask = primaryMask;
|
||||
for (int x = relativeBottomX; x <= relativeTopX; x++) {
|
||||
for (int z = relativeBottomZ; z <= relativeTopZ; z++) {
|
||||
for (int y = 1; y < 128; y++) {
|
||||
for (int y = area.getMinGenHeight() + startYOffset; y <= area.getMaxGenHeight(); y++) {
|
||||
queue.setBlock(blockX + x, y, blockZ + z, air);
|
||||
}
|
||||
}
|
||||
@ -166,8 +167,8 @@ public class AugmentedUtils {
|
||||
ScopedQueueCoordinator scoped =
|
||||
new ScopedQueueCoordinator(
|
||||
secondaryMask,
|
||||
Location.at(world, blockX, 0, blockZ),
|
||||
Location.at(world, blockX + 15, 255, blockZ + 15)
|
||||
Location.at(world, blockX, area.getMinGenHeight(), blockZ),
|
||||
Location.at(world, blockX + 15, area.getMaxGenHeight(), blockZ + 15)
|
||||
);
|
||||
generator.generateChunk(scoped, area);
|
||||
generator.populateChunk(scoped, area);
|
||||
|
@ -37,7 +37,6 @@ import com.plotsquared.core.plot.Plot;
|
||||
import com.plotsquared.core.plot.PlotAreaTerrainType;
|
||||
import com.plotsquared.core.plot.PlotId;
|
||||
import com.plotsquared.core.queue.QueueCoordinator;
|
||||
import com.plotsquared.core.util.BlockUtil;
|
||||
import com.plotsquared.core.util.MathMan;
|
||||
import com.plotsquared.core.util.RegionManager;
|
||||
import com.plotsquared.core.util.task.TaskManager;
|
||||
@ -147,7 +146,15 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
) {
|
||||
Plot plot = classicPlotWorld.getPlotAbs(plotId);
|
||||
if (plot != null && plot.isBasePlot()) {
|
||||
return this.regionManager.setCuboids(classicPlotWorld, plot.getRegions(), blocks, 1, getWorldHeight(), actor, queue);
|
||||
return this.regionManager.setCuboids(
|
||||
classicPlotWorld,
|
||||
plot.getRegions(),
|
||||
blocks,
|
||||
classicPlotWorld.getMinBuildHeight(),
|
||||
classicPlotWorld.getMaxBuildHeight(),
|
||||
actor,
|
||||
queue
|
||||
);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@ -175,7 +182,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
plot.getRegions(),
|
||||
blocks,
|
||||
classicPlotWorld.PLOT_HEIGHT + 1,
|
||||
getWorldHeight(),
|
||||
classicPlotWorld.getMaxBuildHeight(),
|
||||
actor,
|
||||
queue
|
||||
);
|
||||
@ -204,7 +211,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
classicPlotWorld,
|
||||
plot.getRegions(),
|
||||
blocks,
|
||||
1,
|
||||
classicPlotWorld.getMinBuildHeight(),
|
||||
classicPlotWorld.PLOT_HEIGHT - 1,
|
||||
actor,
|
||||
queue
|
||||
@ -281,7 +288,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
}
|
||||
}
|
||||
|
||||
int maxY = classicPlotWorld.getPlotManager().getWorldHeight();
|
||||
int maxY = classicPlotWorld.getMaxBuildHeight();
|
||||
if (!plot.isMerged(Direction.NORTH)) {
|
||||
int z = bottom.getZ();
|
||||
for (int x = bottom.getX(); x <= top.getX(); x++) {
|
||||
@ -382,7 +389,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
if (!plot.isMerged(Direction.NORTH)) {
|
||||
int z = bot.getZ();
|
||||
for (int x = bot.getX(); x < top.getX(); x++) {
|
||||
for (int y = 1; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
for (int y = classicPlotWorld.getMaxBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
queue.setBlock(x, y, z, blocks);
|
||||
}
|
||||
}
|
||||
@ -390,7 +397,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
if (!plot.isMerged(Direction.WEST)) {
|
||||
int x = bot.getX();
|
||||
for (int z = bot.getZ(); z < top.getZ(); z++) {
|
||||
for (int y = 1; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
for (int y = classicPlotWorld.getMinBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
queue.setBlock(x, y, z, blocks);
|
||||
}
|
||||
}
|
||||
@ -398,7 +405,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
if (!plot.isMerged(Direction.SOUTH)) {
|
||||
int z = top.getZ();
|
||||
for (int x = bot.getX(); x < top.getX() + (plot.isMerged(Direction.EAST) ? 0 : 1); x++) {
|
||||
for (int y = 1; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
for (int y = classicPlotWorld.getMinBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
queue.setBlock(x, y, z, blocks);
|
||||
}
|
||||
}
|
||||
@ -406,7 +413,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
if (!plot.isMerged(Direction.EAST)) {
|
||||
int x = top.getX();
|
||||
for (int z = bot.getZ(); z < top.getZ() + (plot.isMerged(Direction.SOUTH) ? 0 : 1); z++) {
|
||||
for (int y = 1; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
for (int y = classicPlotWorld.getMinBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
queue.setBlock(x, y, z, blocks);
|
||||
}
|
||||
}
|
||||
@ -501,7 +508,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
enqueue = true;
|
||||
}
|
||||
|
||||
int maxY = getWorldHeight();
|
||||
int maxY = classicPlotWorld.getMaxGenHeight();
|
||||
queue.setCuboid(
|
||||
Location.at(
|
||||
classicPlotWorld.getWorldName(),
|
||||
@ -513,27 +520,27 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
);
|
||||
if (classicPlotWorld.PLOT_BEDROCK) {
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx, 0, sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex, 0, ez - 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.getMinGenHeight(), sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getMinGenHeight(), ez - 1),
|
||||
BlockTypes.BEDROCK.getDefaultState()
|
||||
);
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx, 1, sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.WALL_HEIGHT, ez - 1),
|
||||
classicPlotWorld.WALL_FILLING.toPattern()
|
||||
);
|
||||
} else {
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx, 0, sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.WALL_HEIGHT, ez - 1),
|
||||
classicPlotWorld.WALL_FILLING.toPattern()
|
||||
);
|
||||
}
|
||||
int startYOffset = classicPlotWorld.PLOT_BEDROCK ? 1 : 0;
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx, 1, sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getMinGenHeight() + startYOffset, sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.WALL_HEIGHT, ez - 1),
|
||||
classicPlotWorld.WALL_FILLING.toPattern()
|
||||
);
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.getMinGenHeight() + startYOffset, sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.WALL_HEIGHT, ez - 1),
|
||||
classicPlotWorld.WALL_FILLING.toPattern()
|
||||
);
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.getMinGenHeight() + startYOffset, sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.ROAD_HEIGHT, ez - 1),
|
||||
classicPlotWorld.ROAD_BLOCK.toPattern()
|
||||
);
|
||||
|
||||
if (classicPlotWorld.PLACE_TOP_BLOCK) {
|
||||
queue.setCuboid(
|
||||
@ -541,24 +548,12 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.WALL_HEIGHT + 1, ez - 1),
|
||||
classicPlotWorld.WALL_BLOCK.toPattern()
|
||||
);
|
||||
}
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), ex, 1, sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.WALL_HEIGHT, ez - 1),
|
||||
classicPlotWorld.WALL_FILLING.toPattern()
|
||||
);
|
||||
if (classicPlotWorld.PLACE_TOP_BLOCK) {
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.WALL_HEIGHT + 1, sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.WALL_HEIGHT + 1, ez - 1),
|
||||
classicPlotWorld.WALL_BLOCK.toPattern()
|
||||
);
|
||||
}
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, 1, sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.ROAD_HEIGHT, ez - 1),
|
||||
classicPlotWorld.ROAD_BLOCK.toPattern()
|
||||
);
|
||||
return !enqueue || queue.enqueue();
|
||||
}
|
||||
|
||||
@ -584,19 +579,32 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
classicPlotWorld.schematicStartHeight() + 1,
|
||||
sz
|
||||
),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.getPlotManager().getWorldHeight(), ez),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.getMaxGenHeight(), ez),
|
||||
BlockTypes.AIR.getDefaultState()
|
||||
);
|
||||
if (classicPlotWorld.PLOT_BEDROCK) {
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.getMinGenHeight(), sz),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.getMinGenHeight(), ez),
|
||||
BlockTypes.BEDROCK.getDefaultState()
|
||||
);
|
||||
}
|
||||
int startYOffset = classicPlotWorld.PLOT_BEDROCK ? 1 : 0;
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, 0, sz),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, 0, ez),
|
||||
BlockUtil.get((short) 7, (byte) 0)
|
||||
);
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, 1, sz),
|
||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.getMinGenHeight() + startYOffset, sz),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.WALL_HEIGHT, sz),
|
||||
classicPlotWorld.WALL_FILLING.toPattern()
|
||||
);
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.getMinGenHeight() + startYOffset, ez),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.WALL_HEIGHT, ez),
|
||||
classicPlotWorld.WALL_FILLING.toPattern()
|
||||
);
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.getMinGenHeight() + startYOffset, sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.ROAD_HEIGHT, ez - 1),
|
||||
classicPlotWorld.ROAD_BLOCK.toPattern()
|
||||
);
|
||||
|
||||
if (classicPlotWorld.PLACE_TOP_BLOCK) {
|
||||
queue.setCuboid(
|
||||
@ -604,24 +612,12 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.WALL_HEIGHT + 1, sz),
|
||||
classicPlotWorld.WALL_BLOCK.toPattern()
|
||||
);
|
||||
}
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, 1, ez),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.WALL_HEIGHT, ez),
|
||||
classicPlotWorld.WALL_FILLING.toPattern()
|
||||
);
|
||||
if (classicPlotWorld.PLACE_TOP_BLOCK) {
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.WALL_HEIGHT + 1, ez),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.WALL_HEIGHT + 1, ez),
|
||||
classicPlotWorld.WALL_BLOCK.toPattern()
|
||||
);
|
||||
}
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, 1, sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.ROAD_HEIGHT, ez - 1),
|
||||
classicPlotWorld.ROAD_BLOCK.toPattern()
|
||||
);
|
||||
return !enqueue || queue.enqueue();
|
||||
}
|
||||
|
||||
@ -642,14 +638,19 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.ROAD_HEIGHT + 1, sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.getPlotManager().getWorldHeight(), ez - 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.getMaxGenHeight(), ez - 1),
|
||||
BlockTypes.AIR.getDefaultState()
|
||||
);
|
||||
queue.setCuboid(Location.at(classicPlotWorld.getWorldName(), sx + 1, 0, sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, 0, ez - 1), BlockUtil.get((short) 7, (byte) 0)
|
||||
);
|
||||
if (classicPlotWorld.PLOT_BEDROCK) {
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.getMinGenHeight(), sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.getMinGenHeight(), ez - 1),
|
||||
BlockTypes.BEDROCK.getDefaultState()
|
||||
);
|
||||
}
|
||||
int startYOffset = classicPlotWorld.PLOT_BEDROCK ? 1 : 0;
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, 1, sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.getMinGenHeight() + startYOffset, sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.ROAD_HEIGHT, ez - 1),
|
||||
classicPlotWorld.ROAD_BLOCK.toPattern()
|
||||
);
|
||||
@ -679,11 +680,12 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
classicPlotWorld.schematicStartHeight() + 1,
|
||||
sz
|
||||
),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getPlotManager().getWorldHeight(), ez),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getMaxGenHeight(), ez),
|
||||
BlockTypes.AIR.getDefaultState()
|
||||
);
|
||||
int startYOffset = classicPlotWorld.PLOT_BEDROCK ? 1 : 0;
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx, 1, sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.getMinGenHeight() + startYOffset, sz + 1),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.PLOT_HEIGHT - 1, ez - 1),
|
||||
classicPlotWorld.MAIN_BLOCK.toPattern()
|
||||
);
|
||||
@ -719,11 +721,12 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
classicPlotWorld.schematicStartHeight() + 1,
|
||||
sz
|
||||
),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getPlotManager().getWorldHeight(), ez),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getMaxGenHeight(), ez),
|
||||
BlockTypes.AIR.getDefaultState()
|
||||
);
|
||||
int startYOffset = classicPlotWorld.PLOT_BEDROCK ? 1 : 0;
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, 1, sz),
|
||||
Location.at(classicPlotWorld.getWorldName(), sx + 1, classicPlotWorld.getMinGenHeight() + startYOffset, sz),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.PLOT_HEIGHT - 1, ez),
|
||||
classicPlotWorld.MAIN_BLOCK.toPattern()
|
||||
);
|
||||
@ -758,11 +761,12 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
classicPlotWorld.schematicStartHeight() + 1,
|
||||
sz
|
||||
),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getPlotManager().getWorldHeight(), ez),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getMaxGenHeight(), ez),
|
||||
BlockTypes.AIR.getDefaultState()
|
||||
);
|
||||
int startYOffset = classicPlotWorld.PLOT_BEDROCK ? 1 : 0;
|
||||
queue.setCuboid(
|
||||
Location.at(classicPlotWorld.getWorldName(), sx, 1, sz),
|
||||
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.getMinGenHeight() + startYOffset, sz),
|
||||
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.PLOT_HEIGHT - 1, ez),
|
||||
classicPlotWorld.MAIN_BLOCK.toPattern()
|
||||
);
|
||||
|
@ -127,16 +127,16 @@ public abstract class ClassicPlotWorld extends SquarePlotWorld {
|
||||
public void loadConfiguration(ConfigurationSection config) {
|
||||
super.loadConfiguration(config);
|
||||
this.PLOT_BEDROCK = config.getBoolean("plot.bedrock");
|
||||
this.PLOT_HEIGHT = Math.min(255, config.getInt("plot.height"));
|
||||
this.PLOT_HEIGHT = Math.min(getMaxGenHeight(), config.getInt("plot.height"));
|
||||
this.MAIN_BLOCK = new BlockBucket(config.getString("plot.filling"));
|
||||
this.TOP_BLOCK = new BlockBucket(config.getString("plot.floor"));
|
||||
this.WALL_BLOCK = new BlockBucket(config.getString("wall.block"));
|
||||
this.ROAD_HEIGHT = Math.min(255, config.getInt("road.height"));
|
||||
this.ROAD_HEIGHT = Math.min(getMaxGenHeight(), config.getInt("road.height"));
|
||||
this.ROAD_BLOCK = new BlockBucket(config.getString("road.block"));
|
||||
this.WALL_FILLING = new BlockBucket(config.getString("wall.filling"));
|
||||
this.WALL_HEIGHT = Math.min(254, config.getInt("wall.height"));
|
||||
this.CLAIMED_WALL_BLOCK = new BlockBucket(config.getString("wall.block_claimed"));
|
||||
this.PLACE_TOP_BLOCK = config.getBoolean("wall.place_top_block");
|
||||
this.WALL_HEIGHT = Math.min(getMaxGenHeight() - (PLACE_TOP_BLOCK ? 1 : 0), config.getInt("wall.height"));
|
||||
this.CLAIMED_WALL_BLOCK = new BlockBucket(config.getString("wall.block_claimed"));
|
||||
}
|
||||
|
||||
int schematicStartHeight() {
|
||||
|
@ -91,14 +91,14 @@ public class HybridGen extends IndependentPlotGenerator {
|
||||
if (hybridPlotWorld.PLOT_BEDROCK) {
|
||||
for (short x = 0; x < 16; x++) {
|
||||
for (short z = 0; z < 16; z++) {
|
||||
result.setBlock(x, 0, z, BlockTypes.BEDROCK.getDefaultState());
|
||||
result.setBlock(x, hybridPlotWorld.getMinGenHeight(), z, BlockTypes.BEDROCK.getDefaultState());
|
||||
}
|
||||
}
|
||||
}
|
||||
// Coords
|
||||
Location min = result.getMin();
|
||||
int bx = (min.getX()) - hybridPlotWorld.ROAD_OFFSET_X;
|
||||
int bz = (min.getZ()) - hybridPlotWorld.ROAD_OFFSET_Z;
|
||||
int bx = min.getX() - hybridPlotWorld.ROAD_OFFSET_X;
|
||||
int bz = min.getZ() - hybridPlotWorld.ROAD_OFFSET_Z;
|
||||
// The relative X-coordinate (within the plot) of the minimum X coordinate
|
||||
// contained in the scoped queue
|
||||
short relativeOffsetX;
|
||||
@ -156,7 +156,7 @@ public class HybridGen extends IndependentPlotGenerator {
|
||||
}
|
||||
}
|
||||
// generation
|
||||
int startY = hybridPlotWorld.PLOT_BEDROCK ? 1 : 0;
|
||||
int startY = hybridPlotWorld.getMinGenHeight() + (hybridPlotWorld.PLOT_BEDROCK ? 1: 0);
|
||||
for (short x = 0; x < 16; x++) {
|
||||
if (insideRoadX[x]) {
|
||||
for (short z = 0; z < 16; z++) {
|
||||
|
@ -46,7 +46,6 @@ import com.sk89q.worldedit.function.pattern.Pattern;
|
||||
import com.sk89q.worldedit.regions.CuboidRegion;
|
||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
@ -107,22 +106,32 @@ public class HybridPlotManager extends ClassicPlotManager {
|
||||
|
||||
@Override
|
||||
public boolean createRoadEast(final @NonNull Plot plot, @Nullable QueueCoordinator queue) {
|
||||
boolean enqueue = false;
|
||||
if (queue == null) {
|
||||
queue = hybridPlotWorld.getQueue();
|
||||
enqueue = true;
|
||||
}
|
||||
super.createRoadEast(plot, queue);
|
||||
PlotId id = plot.getId();
|
||||
PlotId id2 = PlotId.of(id.getX() + 1, id.getY());
|
||||
Location bot = getPlotBottomLocAbs(id2);
|
||||
Location top = getPlotTopLocAbs(id);
|
||||
Location pos1 = Location.at(hybridPlotWorld.getWorldName(), top.getX() + 1, 0, bot.getZ() - 1);
|
||||
Location pos2 = Location.at(hybridPlotWorld.getWorldName(), bot.getX(), Math.min(getWorldHeight(), 255), top.getZ() + 1);
|
||||
Location pos1 = Location.at(
|
||||
hybridPlotWorld.getWorldName(),
|
||||
top.getX() + 1,
|
||||
hybridPlotWorld.getMinGenHeight(),
|
||||
bot.getZ() - 1
|
||||
);
|
||||
Location pos2 = Location.at(
|
||||
hybridPlotWorld.getWorldName(),
|
||||
bot.getX(),
|
||||
hybridPlotWorld.getMaxGenHeight(),
|
||||
top.getZ() + 1
|
||||
);
|
||||
this.resetBiome(hybridPlotWorld, pos1, pos2);
|
||||
if (!hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) {
|
||||
return true;
|
||||
}
|
||||
boolean enqueue = false;
|
||||
if (queue == null) {
|
||||
queue = hybridPlotWorld.getQueue();
|
||||
enqueue = true;
|
||||
}
|
||||
createSchemAbs(queue, pos1, pos2, true);
|
||||
return !enqueue || queue.enqueue();
|
||||
}
|
||||
@ -139,7 +148,7 @@ public class HybridPlotManager extends ClassicPlotManager {
|
||||
(pos1.getX() + pos2.getX()) / 2,
|
||||
(pos1.getZ() + pos2.getZ()) / 2
|
||||
), biome)) {
|
||||
WorldUtil.setBiome(hybridPlotWorld.getWorldName(), pos1.getX(), pos1.getZ(), pos2.getX(), pos2.getZ(), biome);
|
||||
WorldUtil.setBiome(hybridPlotWorld.getWorldName(), new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3()), biome);
|
||||
}
|
||||
}
|
||||
|
||||
@ -190,38 +199,38 @@ public class HybridPlotManager extends ClassicPlotManager {
|
||||
|
||||
@Override
|
||||
public boolean createRoadSouth(final @NonNull Plot plot, @Nullable QueueCoordinator queue) {
|
||||
boolean enqueue = false;
|
||||
if (queue == null) {
|
||||
enqueue = true;
|
||||
queue = hybridPlotWorld.getQueue();
|
||||
}
|
||||
super.createRoadSouth(plot, queue);
|
||||
PlotId id = plot.getId();
|
||||
PlotId id2 = PlotId.of(id.getX(), id.getY() + 1);
|
||||
Location bot = getPlotBottomLocAbs(id2);
|
||||
Location top = getPlotTopLocAbs(id);
|
||||
Location pos1 = Location.at(hybridPlotWorld.getWorldName(), bot.getX() - 1, 0, top.getZ() + 1);
|
||||
Location pos2 = Location.at(hybridPlotWorld.getWorldName(), top.getX() + 1, Math.min(getWorldHeight(), 255), bot.getZ());
|
||||
Location pos1 = Location.at(hybridPlotWorld.getWorldName(), bot.getX() - 1, hybridPlotWorld.getMinGenHeight(), top.getZ() + 1);
|
||||
Location pos2 = Location.at(hybridPlotWorld.getWorldName(), top.getX() + 1, hybridPlotWorld.getMaxGenHeight(), bot.getZ());
|
||||
this.resetBiome(hybridPlotWorld, pos1, pos2);
|
||||
if (!hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) {
|
||||
return true;
|
||||
}
|
||||
boolean enqueue = false;
|
||||
if (queue == null) {
|
||||
enqueue = true;
|
||||
queue = hybridPlotWorld.getQueue();
|
||||
}
|
||||
createSchemAbs(queue, pos1, pos2, true);
|
||||
return !enqueue || queue.enqueue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean createRoadSouthEast(final @NonNull Plot plot, @Nullable QueueCoordinator queue) {
|
||||
super.createRoadSouthEast(plot, queue);
|
||||
PlotId id = plot.getId();
|
||||
PlotId id2 = PlotId.of(id.getX() + 1, id.getY() + 1);
|
||||
Location pos1 = getPlotTopLocAbs(id).add(1, 0, 1).withY(0);
|
||||
Location pos2 = getPlotBottomLocAbs(id2).withY(Math.min(getWorldHeight(), 255));
|
||||
boolean enqueue = false;
|
||||
if (queue == null) {
|
||||
enqueue = true;
|
||||
queue = hybridPlotWorld.getQueue();
|
||||
}
|
||||
super.createRoadSouthEast(plot, queue);
|
||||
PlotId id = plot.getId();
|
||||
PlotId id2 = PlotId.of(id.getX() + 1, id.getY() + 1);
|
||||
Location pos1 = getPlotTopLocAbs(id).add(1, 0, 1);
|
||||
Location pos2 = getPlotBottomLocAbs(id2);
|
||||
createSchemAbs(queue, pos1, pos2, true);
|
||||
if (hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) {
|
||||
createSchemAbs(queue, pos1, pos2, true);
|
||||
@ -271,11 +280,23 @@ public class HybridPlotManager extends ClassicPlotManager {
|
||||
queue.setCompleteTask(whenDone);
|
||||
}
|
||||
if (!canRegen) {
|
||||
queue.setCuboid(pos1.withY(0), pos2.withY(0), bedrock);
|
||||
queue.setCuboid(
|
||||
pos1.withY(hybridPlotWorld.getMinGenHeight()),
|
||||
pos2.withY(hybridPlotWorld.getMinGenHeight()),
|
||||
hybridPlotWorld.PLOT_BEDROCK ? bedrock : filling
|
||||
);
|
||||
// Each component has a different layer
|
||||
queue.setCuboid(pos1.withY(1), pos2.withY(hybridPlotWorld.PLOT_HEIGHT - 1), filling);
|
||||
queue.setCuboid(
|
||||
pos1.withY(hybridPlotWorld.getMinGenHeight() + 1),
|
||||
pos2.withY(hybridPlotWorld.PLOT_HEIGHT - 1),
|
||||
filling
|
||||
);
|
||||
queue.setCuboid(pos1.withY(hybridPlotWorld.PLOT_HEIGHT), pos2.withY(hybridPlotWorld.PLOT_HEIGHT), plotfloor);
|
||||
queue.setCuboid(pos1.withY(hybridPlotWorld.PLOT_HEIGHT + 1), pos2.withY(getWorldHeight()), BlockTypes.AIR.getDefaultState());
|
||||
queue.setCuboid(
|
||||
pos1.withY(hybridPlotWorld.PLOT_HEIGHT + 1),
|
||||
pos2.withY(hybridPlotWorld.getMaxGenHeight()),
|
||||
BlockTypes.AIR.getDefaultState()
|
||||
);
|
||||
queue.setBiomeCuboid(pos1, pos2, biome);
|
||||
} else {
|
||||
queue.setRegenRegion(new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3()));
|
||||
|
@ -79,6 +79,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
||||
public int SCHEM_Y;
|
||||
private Location SIGN_LOCATION;
|
||||
private File root = null;
|
||||
private int lastOverlayHeightError = Integer.MIN_VALUE;
|
||||
|
||||
@Inject
|
||||
private SchematicHandler schematicHandler;
|
||||
@ -171,9 +172,9 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
||||
public void loadConfiguration(ConfigurationSection config) {
|
||||
super.loadConfiguration(config);
|
||||
if ((this.ROAD_WIDTH & 1) == 0) {
|
||||
this.PATH_WIDTH_LOWER = (short) (Math.floor(this.ROAD_WIDTH / 2) - 1);
|
||||
this.PATH_WIDTH_LOWER = (short) (Math.floor(this.ROAD_WIDTH / 2f) - 1);
|
||||
} else {
|
||||
this.PATH_WIDTH_LOWER = (short) Math.floor(this.ROAD_WIDTH / 2);
|
||||
this.PATH_WIDTH_LOWER = (short) Math.floor(this.ROAD_WIDTH / 2f);
|
||||
}
|
||||
if (this.ROAD_WIDTH == 0) {
|
||||
this.PATH_WIDTH_UPPER = (short) (this.SIZE + 1);
|
||||
@ -251,31 +252,34 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
||||
Schematic schematic2 = this.schematicHandler.getSchematic(schematic2File);
|
||||
Schematic schematic3 = this.schematicHandler.getSchematic(schematic3File);
|
||||
int shift = this.ROAD_WIDTH / 2;
|
||||
int oddshift = (this.ROAD_WIDTH & 1) == 0 ? 0 : 1;
|
||||
int oddshift = (this.ROAD_WIDTH & 1);
|
||||
|
||||
SCHEM_Y = schematicStartHeight();
|
||||
int plotY = PLOT_HEIGHT - SCHEM_Y;
|
||||
int minRoadWall = Settings.Schematics.USE_WALL_IN_ROAD_SCHEM_HEIGHT ? Math.min(ROAD_HEIGHT, WALL_HEIGHT) : ROAD_HEIGHT;
|
||||
int roadY = minRoadWall - SCHEM_Y;
|
||||
|
||||
int worldHeight = getMaxGenHeight() - getMinGenHeight() + 1;
|
||||
|
||||
// SCHEM_Y should be normalised to the plot "start" height
|
||||
if (schematic3 != null) {
|
||||
if (schematic3.getClipboard().getDimensions().getY() == 256) {
|
||||
if (schematic3.getClipboard().getDimensions().getY() == worldHeight) {
|
||||
SCHEM_Y = plotY = 0;
|
||||
} else if (!Settings.Schematics.PASTE_ON_TOP) {
|
||||
SCHEM_Y = plotY = getMinBuildHeight();
|
||||
SCHEM_Y = plotY = getMinBuildHeight() - getMinGenHeight();
|
||||
}
|
||||
}
|
||||
|
||||
if (schematic1 != null) {
|
||||
if (schematic1.getClipboard().getDimensions().getY() == 256) {
|
||||
SCHEM_Y = roadY = 0;
|
||||
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != 256
|
||||
if (schematic1.getClipboard().getDimensions().getY() == worldHeight) {
|
||||
SCHEM_Y = roadY = getMinGenHeight();
|
||||
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldHeight
|
||||
&& !Settings.Schematics.PASTE_ON_TOP) {
|
||||
plotY = PLOT_HEIGHT;
|
||||
}
|
||||
} else if (!Settings.Schematics.PASTE_ROAD_ON_TOP) {
|
||||
SCHEM_Y = roadY = getMinBuildHeight();
|
||||
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != 256
|
||||
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldHeight
|
||||
&& !Settings.Schematics.PASTE_ON_TOP) {
|
||||
plotY = PLOT_HEIGHT;
|
||||
}
|
||||
@ -428,7 +432,10 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
||||
int pair = MathMan.pair(x, z);
|
||||
BaseBlock[] existing = this.G_SCH.computeIfAbsent(pair, k -> new BaseBlock[height]);
|
||||
if (y >= height) {
|
||||
LOGGER.error("Error adding overlay block. `y > height`");
|
||||
if (y != lastOverlayHeightError) {
|
||||
lastOverlayHeightError = y;
|
||||
LOGGER.error(String.format("Error adding overlay block. `y > height`. y=%s, height=%s", y, height));
|
||||
}
|
||||
return;
|
||||
}
|
||||
existing[y] = id;
|
||||
|
@ -45,6 +45,7 @@ import com.plotsquared.core.queue.ChunkQueueCoordinator;
|
||||
import com.plotsquared.core.queue.GlobalBlockQueue;
|
||||
import com.plotsquared.core.queue.QueueCoordinator;
|
||||
import com.plotsquared.core.util.ChunkManager;
|
||||
import com.plotsquared.core.util.EventDispatcher;
|
||||
import com.plotsquared.core.util.MathMan;
|
||||
import com.plotsquared.core.util.RegionManager;
|
||||
import com.plotsquared.core.util.RegionUtil;
|
||||
@ -64,6 +65,7 @@ import com.sk89q.worldedit.world.block.BlockTypes;
|
||||
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.Nullable;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayDeque;
|
||||
@ -72,6 +74,7 @@ import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
@ -84,7 +87,9 @@ public class HybridUtils {
|
||||
public static HybridUtils manager;
|
||||
public static Set<BlockVector2> regions;
|
||||
public static int height;
|
||||
public static Set<BlockVector2> chunks = new HashSet<>();
|
||||
// Use ordered for reasonable chunk loading order to reduce paper unloading neighbour chunks and then us attempting to load
|
||||
// them again, causing errors
|
||||
public static Set<BlockVector2> chunks = new LinkedHashSet<>();
|
||||
public static PlotArea area;
|
||||
public static boolean UPDATE = false;
|
||||
|
||||
@ -93,6 +98,7 @@ public class HybridUtils {
|
||||
private final GlobalBlockQueue blockQueue;
|
||||
private final WorldUtil worldUtil;
|
||||
private final SchematicHandler schematicHandler;
|
||||
private final EventDispatcher eventDispatcher;
|
||||
|
||||
@Inject
|
||||
public HybridUtils(
|
||||
@ -100,13 +106,15 @@ public class HybridUtils {
|
||||
final @NonNull ChunkManager chunkManager,
|
||||
final @NonNull GlobalBlockQueue blockQueue,
|
||||
final @NonNull WorldUtil worldUtil,
|
||||
final @NonNull SchematicHandler schematicHandler
|
||||
final @NonNull SchematicHandler schematicHandler,
|
||||
final @NonNull EventDispatcher eventDispatcher
|
||||
) {
|
||||
this.plotAreaManager = plotAreaManager;
|
||||
this.chunkManager = chunkManager;
|
||||
this.blockQueue = blockQueue;
|
||||
this.worldUtil = worldUtil;
|
||||
this.schematicHandler = schematicHandler;
|
||||
this.eventDispatcher = eventDispatcher;
|
||||
}
|
||||
|
||||
public void regeneratePlotWalls(final PlotArea area) {
|
||||
@ -141,6 +149,8 @@ public class HybridUtils {
|
||||
final int ctz = tz >> 4;
|
||||
final int width = tx - bx + 1;
|
||||
final int length = tz - bz + 1;
|
||||
final int height = area.getMaxGenHeight() - area.getMinGenHeight() + 1;
|
||||
final int minHeight = area.getMinGenHeight();
|
||||
|
||||
final PlotArea area = this.plotAreaManager.getPlotArea(world, null);
|
||||
|
||||
@ -148,12 +158,22 @@ public class HybridUtils {
|
||||
return;
|
||||
}
|
||||
|
||||
ChunkQueueCoordinator chunk = new ChunkQueueCoordinator(bot, top, false);
|
||||
ChunkQueueCoordinator chunk = new ChunkQueueCoordinator(worldUtil.getWeWorld(world), bot, top, false);
|
||||
hpw.getGenerator().generateChunk(chunk, hpw);
|
||||
|
||||
final BlockState[][][] oldBlocks = chunk.getBlocks();
|
||||
final BlockState[][][] newBlocks = new BlockState[256][width][length];
|
||||
final BlockState airBlock = BlockTypes.AIR.getDefaultState();
|
||||
final BlockState[][][] oldBlocks = chunk.getBlocks();
|
||||
final BlockState[][][] newBlocks = new BlockState[height][width][length];
|
||||
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();
|
||||
@ -197,11 +217,12 @@ public class HybridUtils {
|
||||
int xx = chunkBlockX + x;
|
||||
for (int z = minZ; z <= maxZ; z++) {
|
||||
int zz = chunkBlockZ + z;
|
||||
for (int y = 0; y < 256; y++) {
|
||||
for (int yIndex = 0; yIndex < height; yIndex++) {
|
||||
int y = yIndex + minHeight;
|
||||
BlockState block = queue.getBlock(xx, y, zz);
|
||||
int xr = xb + x;
|
||||
int zr = zb + z;
|
||||
newBlocks[y][xr][zr] = block;
|
||||
newBlocks[yIndex][xr][zr] = block;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -218,13 +239,10 @@ public class HybridUtils {
|
||||
for (int x = 0; x < width; x++) {
|
||||
for (int z = 0; z < length; z++) {
|
||||
Set<BlockType> types = new HashSet<>();
|
||||
for (int y = 0; y < 256; y++) {
|
||||
BlockState old = oldBlocks[y][x][z];
|
||||
for (int yIndex = 0; yIndex < height; yIndex++) {
|
||||
BlockState old = oldBlocks[yIndex][x][z];
|
||||
try {
|
||||
if (old == null) {
|
||||
old = airBlock;
|
||||
}
|
||||
BlockState now = newBlocks[y][x][z];
|
||||
BlockState now = newBlocks[yIndex][x][z];
|
||||
if (!old.equals(now)) {
|
||||
changes[i]++;
|
||||
}
|
||||
@ -233,23 +251,23 @@ public class HybridUtils {
|
||||
} else {
|
||||
// check vertices
|
||||
// modifications_adjacent
|
||||
if (x > 0 && z > 0 && y > 0 && x < width - 1 && z < length - 1 && y < 255) {
|
||||
if (newBlocks[y - 1][x][z].getBlockType().getMaterial().isAir()) {
|
||||
if (x > 0 && z > 0 && yIndex > 0 && x < width - 1 && z < length - 1 && yIndex < (height - 1)) {
|
||||
if (newBlocks[yIndex - 1][x][z].getBlockType().getMaterial().isAir()) {
|
||||
faces[i]++;
|
||||
}
|
||||
if (newBlocks[y][x - 1][z].getBlockType().getMaterial().isAir()) {
|
||||
if (newBlocks[yIndex][x - 1][z].getBlockType().getMaterial().isAir()) {
|
||||
faces[i]++;
|
||||
}
|
||||
if (newBlocks[y][x][z - 1].getBlockType().getMaterial().isAir()) {
|
||||
if (newBlocks[yIndex][x][z - 1].getBlockType().getMaterial().isAir()) {
|
||||
faces[i]++;
|
||||
}
|
||||
if (newBlocks[y + 1][x][z].getBlockType().getMaterial().isAir()) {
|
||||
if (newBlocks[yIndex + 1][x][z].getBlockType().getMaterial().isAir()) {
|
||||
faces[i]++;
|
||||
}
|
||||
if (newBlocks[y][x + 1][z].getBlockType().getMaterial().isAir()) {
|
||||
if (newBlocks[yIndex][x + 1][z].getBlockType().getMaterial().isAir()) {
|
||||
faces[i]++;
|
||||
}
|
||||
if (newBlocks[y][x][z + 1].getBlockType().getMaterial().isAir()) {
|
||||
if (newBlocks[yIndex][x][z + 1].getBlockType().getMaterial().isAir()) {
|
||||
faces[i]++;
|
||||
}
|
||||
}
|
||||
@ -341,7 +359,7 @@ public class HybridUtils {
|
||||
result.add(whenDone.value.variety_sd);
|
||||
PlotFlag<?, ?> plotFlag = GlobalFlagContainer.getInstance().getFlag(AnalysisFlag.class).createFlagInstance(
|
||||
result);
|
||||
PlotFlagAddEvent event = new PlotFlagAddEvent(plotFlag, origin);
|
||||
PlotFlagAddEvent event = eventDispatcher.callFlagAdd(plotFlag, origin);
|
||||
if (event.getEventResult() == Result.DENY) {
|
||||
return;
|
||||
}
|
||||
@ -397,7 +415,7 @@ public class HybridUtils {
|
||||
}
|
||||
HybridUtils.UPDATE = true;
|
||||
Set<BlockVector2> regions = this.worldUtil.getChunkChunks(area.getWorldName());
|
||||
return scheduleRoadUpdate(area, regions, extend, new HashSet<>());
|
||||
return scheduleRoadUpdate(area, regions, extend, new LinkedHashSet<>());
|
||||
}
|
||||
|
||||
public boolean scheduleSingleRegionRoadUpdate(Plot plot, int extend) {
|
||||
@ -407,7 +425,7 @@ public class HybridUtils {
|
||||
HybridUtils.UPDATE = true;
|
||||
Set<BlockVector2> regions = new HashSet<>();
|
||||
regions.add(RegionManager.getRegion(plot.getCenterSynchronous()));
|
||||
return scheduleRoadUpdate(plot.getArea(), regions, extend, new HashSet<>());
|
||||
return scheduleRoadUpdate(plot.getArea(), regions, extend, new LinkedHashSet<>());
|
||||
}
|
||||
|
||||
public boolean scheduleRoadUpdate(
|
||||
@ -420,26 +438,29 @@ public class HybridUtils {
|
||||
HybridUtils.area = area;
|
||||
HybridUtils.height = extend;
|
||||
HybridUtils.chunks = chunks;
|
||||
final int initial = 1024 * regions.size() + chunks.size();
|
||||
final AtomicInteger count = new AtomicInteger(0);
|
||||
TaskManager.runTask(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!UPDATE) {
|
||||
Iterator<BlockVector2> iter = chunks.iterator();
|
||||
QueueCoordinator queue = blockQueue.getNewQueue(worldUtil.getWeWorld(area.getWorldName()));
|
||||
while (iter.hasNext()) {
|
||||
BlockVector2 chunk = iter.next();
|
||||
iter.remove();
|
||||
boolean regenedRoad = regenerateRoad(area, chunk, extend);
|
||||
boolean regenedRoad = regenerateRoad(area, chunk, extend, queue);
|
||||
if (!regenedRoad) {
|
||||
LOGGER.info("Failed to regenerate roads");
|
||||
LOGGER.info("Failed to regenerate roads in chunk {}", chunk);
|
||||
}
|
||||
}
|
||||
queue.enqueue();
|
||||
LOGGER.info("Cancelled road task");
|
||||
return;
|
||||
}
|
||||
count.incrementAndGet();
|
||||
if (count.intValue() % 20 == 0) {
|
||||
LOGGER.info("Progress: {}%", 100 * (2048 - chunks.size()) / 2048);
|
||||
if (count.intValue() % 10 == 0) {
|
||||
LOGGER.info("Progress: {}%", 100 * (initial - (chunks.size() + 1024 * regions.size())) / initial);
|
||||
}
|
||||
if (HybridUtils.regions.isEmpty() && chunks.isEmpty()) {
|
||||
regeneratePlotWalls(area);
|
||||
@ -451,7 +472,7 @@ public class HybridUtils {
|
||||
final Runnable task = this;
|
||||
TaskManager.runTaskAsync(() -> {
|
||||
try {
|
||||
if (chunks.size() < 1024) {
|
||||
if (chunks.size() < 64) {
|
||||
if (!HybridUtils.regions.isEmpty()) {
|
||||
Iterator<BlockVector2> iterator = HybridUtils.regions.iterator();
|
||||
BlockVector2 loc = iterator.next();
|
||||
@ -464,18 +485,35 @@ public class HybridUtils {
|
||||
}
|
||||
if (!chunks.isEmpty()) {
|
||||
TaskManager.getPlatformImplementation().sync(() -> {
|
||||
long start = System.currentTimeMillis();
|
||||
Iterator<BlockVector2> iterator = chunks.iterator();
|
||||
while (System.currentTimeMillis() - start < 20 && !chunks.isEmpty()) {
|
||||
if (chunks.size() >= 32) {
|
||||
QueueCoordinator queue = blockQueue.getNewQueue(worldUtil.getWeWorld(area.getWorldName()));
|
||||
for (int i = 0; i < 32; i++) {
|
||||
final BlockVector2 chunk = iterator.next();
|
||||
iterator.remove();
|
||||
boolean regenedRoads = regenerateRoad(area, chunk, extend, queue);
|
||||
if (!regenedRoads) {
|
||||
LOGGER.info("Failed to regenerate the road in chunk {}", chunk);
|
||||
}
|
||||
}
|
||||
queue.setCompleteTask(task);
|
||||
queue.enqueue();
|
||||
return null;
|
||||
}
|
||||
QueueCoordinator queue = blockQueue.getNewQueue(worldUtil.getWeWorld(area.getWorldName()));
|
||||
while (!chunks.isEmpty()) {
|
||||
final BlockVector2 chunk = iterator.next();
|
||||
iterator.remove();
|
||||
boolean regenedRoads = regenerateRoad(area, chunk, extend);
|
||||
boolean regenedRoads = regenerateRoad(area, chunk, extend, queue);
|
||||
if (!regenedRoads) {
|
||||
LOGGER.info("Failed to regenerate road");
|
||||
LOGGER.info("Failed to regenerate road in chunk {}", chunk);
|
||||
}
|
||||
}
|
||||
queue.setCompleteTask(task);
|
||||
queue.enqueue();
|
||||
return null;
|
||||
});
|
||||
return;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
@ -503,7 +541,6 @@ public class HybridUtils {
|
||||
Location bot = plot.getBottomAbs().subtract(1, 0, 1);
|
||||
Location top = plot.getTopAbs();
|
||||
final HybridPlotWorld plotworld = (HybridPlotWorld) plot.getArea();
|
||||
PlotManager plotManager = plotworld.getPlotManager();
|
||||
// Do not use plotworld#schematicStartHeight() here as we want to restore the pre 6.1.4 way of doing it if
|
||||
// USE_WALL_IN_ROAD_SCHEM_HEIGHT is false
|
||||
int schemY = Settings.Schematics.USE_WALL_IN_ROAD_SCHEM_HEIGHT ?
|
||||
@ -513,10 +550,10 @@ public class HybridUtils {
|
||||
int sy = Settings.Schematics.PASTE_ROAD_ON_TOP ? schemY : plot.getArea().getMinBuildHeight();
|
||||
int ex = bot.getX();
|
||||
int ez = top.getZ();
|
||||
int ey = get_ey(plotManager, queue, sx, ex, sz, ez, sy);
|
||||
int ey = get_ey(plotworld, queue, sx, ex, sz, ez, sy);
|
||||
int bz = sz - plotworld.ROAD_WIDTH;
|
||||
int tz = sz - 1;
|
||||
int ty = get_ey(plotManager, queue, sx, ex, bz, tz, sy);
|
||||
int ty = get_ey(plotworld, queue, sx, ex, bz, tz, sy);
|
||||
|
||||
final Set<CuboidRegion> sideRoad = Collections.singleton(RegionUtil.createRegion(sx, ex, sy, ey, sz, ez));
|
||||
final Set<CuboidRegion> intersection = Collections.singleton(RegionUtil.createRegion(sx, ex, sy, ty, bz, tz));
|
||||
@ -542,11 +579,11 @@ public class HybridUtils {
|
||||
return true;
|
||||
}
|
||||
|
||||
public int get_ey(final PlotManager pm, QueueCoordinator queue, int sx, int ex, int sz, int ez, int sy) {
|
||||
private int get_ey(final HybridPlotWorld hpw, QueueCoordinator queue, int sx, int ex, int sz, int ez, int sy) {
|
||||
int ey = sy;
|
||||
for (int x = sx; x <= ex; x++) {
|
||||
for (int z = sz; z <= ez; z++) {
|
||||
for (int y = sy; y <= pm.getWorldHeight(); y++) {
|
||||
for (int y = sy; y <= hpw.getMaxGenHeight(); y++) {
|
||||
if (y > ey) {
|
||||
BlockState block = queue.getBlock(x, y, z);
|
||||
if (!block.getBlockType().getMaterial().isAir()) {
|
||||
@ -559,7 +596,36 @@ public class HybridUtils {
|
||||
return ey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Regenerate the road in a chunk in a plot area.
|
||||
*
|
||||
* @param area Plot area to regenerate road for
|
||||
* @param chunk Chunk location to regenerate
|
||||
* @param extend How far to extend setting air above the road
|
||||
* @return if successful
|
||||
* @deprecated use {@link HybridUtils#regenerateRoad(PlotArea, BlockVector2, int, QueueCoordinator)}
|
||||
*/
|
||||
@Deprecated(forRemoval = true, since = "6.6.0")
|
||||
public boolean regenerateRoad(final PlotArea area, final BlockVector2 chunk, int extend) {
|
||||
return regenerateRoad(area, chunk, extend, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Regenerate the road in a chunk in a plot area.
|
||||
*
|
||||
* @param area Plot area to regenerate road for
|
||||
* @param chunk Chunk location to regenerate
|
||||
* @param extend How far to extend setting air above the road
|
||||
* @param queueCoordinator {@link QueueCoordinator} to use to set the blocks. Null if one should be created and enqueued
|
||||
* @return if successful
|
||||
* @since 6.6.0
|
||||
*/
|
||||
public boolean regenerateRoad(
|
||||
final PlotArea area,
|
||||
final BlockVector2 chunk,
|
||||
int extend,
|
||||
@Nullable QueueCoordinator queueCoordinator
|
||||
) {
|
||||
int x = chunk.getX() << 4;
|
||||
int z = chunk.getZ() << 4;
|
||||
int ex = x + 15;
|
||||
@ -585,92 +651,100 @@ public class HybridUtils {
|
||||
z -= plotWorld.ROAD_OFFSET_Z;
|
||||
final int finalX = x;
|
||||
final int finalZ = z;
|
||||
QueueCoordinator queue = this.blockQueue.getNewQueue(worldUtil.getWeWorld(plotWorld.getWorldName()));
|
||||
final boolean enqueue;
|
||||
final QueueCoordinator queue;
|
||||
if (queueCoordinator == null) {
|
||||
queue = this.blockQueue.getNewQueue(worldUtil.getWeWorld(plotWorld.getWorldName()));
|
||||
enqueue = true;
|
||||
} else {
|
||||
queue = queueCoordinator;
|
||||
enqueue = false;
|
||||
}
|
||||
if (id1 == null || id2 == null || id1 != id2) {
|
||||
this.chunkManager.loadChunk(area.getWorldName(), chunk, false).thenRun(() -> {
|
||||
if (id1 != null) {
|
||||
Plot p1 = area.getPlotAbs(id1);
|
||||
if (p1 != null && p1.hasOwner() && p1.isMerged()) {
|
||||
toCheck.set(true);
|
||||
}
|
||||
if (id1 != null) {
|
||||
Plot p1 = area.getPlotAbs(id1);
|
||||
if (p1 != null && p1.hasOwner() && p1.isMerged()) {
|
||||
toCheck.set(true);
|
||||
}
|
||||
if (id2 != null && !toCheck.get()) {
|
||||
Plot p2 = area.getPlotAbs(id2);
|
||||
if (p2 != null && p2.hasOwner() && p2.isMerged()) {
|
||||
toCheck.set(true);
|
||||
}
|
||||
}
|
||||
if (id2 != null && !toCheck.get()) {
|
||||
Plot p2 = area.getPlotAbs(id2);
|
||||
if (p2 != null && p2.hasOwner() && p2.isMerged()) {
|
||||
toCheck.set(true);
|
||||
}
|
||||
int size = plotWorld.SIZE;
|
||||
for (int X = 0; X < 16; X++) {
|
||||
short absX = (short) ((finalX + X) % size);
|
||||
for (int Z = 0; Z < 16; Z++) {
|
||||
short absZ = (short) ((finalZ + Z) % size);
|
||||
if (absX < 0) {
|
||||
absX += size;
|
||||
}
|
||||
if (absZ < 0) {
|
||||
absZ += size;
|
||||
}
|
||||
boolean condition;
|
||||
if (toCheck.get()) {
|
||||
condition = manager.getPlotId(
|
||||
finalX + X + plotWorld.ROAD_OFFSET_X,
|
||||
1,
|
||||
finalZ + Z + plotWorld.ROAD_OFFSET_Z
|
||||
) == null;
|
||||
} else {
|
||||
boolean gx = absX > plotWorld.PATH_WIDTH_LOWER;
|
||||
boolean gz = absZ > plotWorld.PATH_WIDTH_LOWER;
|
||||
boolean lx = absX < plotWorld.PATH_WIDTH_UPPER;
|
||||
boolean lz = absZ < plotWorld.PATH_WIDTH_UPPER;
|
||||
condition = !gx || !gz || !lx || !lz;
|
||||
}
|
||||
if (condition) {
|
||||
BaseBlock[] blocks = plotWorld.G_SCH.get(MathMan.pair(absX, absZ));
|
||||
int minY = Settings.Schematics.PASTE_ROAD_ON_TOP ? plotWorld.SCHEM_Y : 1;
|
||||
int maxY = Math.max(extend, blocks.length);
|
||||
for (int y = 0; y < maxY; y++) {
|
||||
if (y > blocks.length - 1) {
|
||||
}
|
||||
short size = plotWorld.SIZE;
|
||||
for (int X = 0; X < 16; X++) {
|
||||
short absX = (short) ((finalX + X) % size);
|
||||
for (int Z = 0; Z < 16; Z++) {
|
||||
short absZ = (short) ((finalZ + Z) % size);
|
||||
if (absX < 0) {
|
||||
absX += size;
|
||||
}
|
||||
if (absZ < 0) {
|
||||
absZ += size;
|
||||
}
|
||||
boolean condition;
|
||||
if (toCheck.get()) {
|
||||
condition = manager.getPlotId(
|
||||
finalX + X + plotWorld.ROAD_OFFSET_X,
|
||||
1,
|
||||
finalZ + Z + plotWorld.ROAD_OFFSET_Z
|
||||
) == null;
|
||||
} else {
|
||||
boolean gx = absX > plotWorld.PATH_WIDTH_LOWER;
|
||||
boolean gz = absZ > plotWorld.PATH_WIDTH_LOWER;
|
||||
boolean lx = absX < plotWorld.PATH_WIDTH_UPPER;
|
||||
boolean lz = absZ < plotWorld.PATH_WIDTH_UPPER;
|
||||
condition = !gx || !gz || !lx || !lz;
|
||||
}
|
||||
if (condition) {
|
||||
BaseBlock[] blocks = plotWorld.G_SCH.get(MathMan.pair(absX, absZ));
|
||||
int minY = Settings.Schematics.PASTE_ROAD_ON_TOP ? plotWorld.SCHEM_Y : area.getMinGenHeight() + 1;
|
||||
int maxDy = Math.max(extend, blocks.length);
|
||||
for (int dy = 0; dy < maxDy; dy++) {
|
||||
if (dy > blocks.length - 1) {
|
||||
queue.setBlock(
|
||||
finalX + X + plotWorld.ROAD_OFFSET_X,
|
||||
minY + dy,
|
||||
finalZ + Z + plotWorld.ROAD_OFFSET_Z,
|
||||
WEExtent.AIRBASE
|
||||
);
|
||||
} else {
|
||||
BaseBlock block = blocks[dy];
|
||||
if (block != null) {
|
||||
queue.setBlock(
|
||||
finalX + X + plotWorld.ROAD_OFFSET_X,
|
||||
minY + y,
|
||||
minY + dy,
|
||||
finalZ + Z + plotWorld.ROAD_OFFSET_Z,
|
||||
block
|
||||
);
|
||||
} else {
|
||||
queue.setBlock(
|
||||
finalX + X + plotWorld.ROAD_OFFSET_X,
|
||||
minY + dy,
|
||||
finalZ + Z + plotWorld.ROAD_OFFSET_Z,
|
||||
WEExtent.AIRBASE
|
||||
);
|
||||
} else {
|
||||
BaseBlock block = blocks[y];
|
||||
if (block != null) {
|
||||
queue.setBlock(
|
||||
finalX + X + plotWorld.ROAD_OFFSET_X,
|
||||
minY + y,
|
||||
finalZ + Z + plotWorld.ROAD_OFFSET_Z,
|
||||
block
|
||||
);
|
||||
} else {
|
||||
queue.setBlock(
|
||||
finalX + X + plotWorld.ROAD_OFFSET_X,
|
||||
minY + y,
|
||||
finalZ + Z + plotWorld.ROAD_OFFSET_Z,
|
||||
WEExtent.AIRBASE
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
BiomeType biome = plotWorld.G_SCH_B.get(MathMan.pair(absX, absZ));
|
||||
if (biome != null) {
|
||||
queue.setBiome(finalX + X + plotWorld.ROAD_OFFSET_X, finalZ + Z + plotWorld.ROAD_OFFSET_Z, biome);
|
||||
} else {
|
||||
queue.setBiome(
|
||||
finalX + X + plotWorld.ROAD_OFFSET_X,
|
||||
finalZ + Z + plotWorld.ROAD_OFFSET_Z,
|
||||
plotWorld.getPlotBiome()
|
||||
);
|
||||
}
|
||||
}
|
||||
BiomeType biome = plotWorld.G_SCH_B.get(MathMan.pair(absX, absZ));
|
||||
if (biome != null) {
|
||||
queue.setBiome(finalX + X + plotWorld.ROAD_OFFSET_X, finalZ + Z + plotWorld.ROAD_OFFSET_Z, biome);
|
||||
} else {
|
||||
queue.setBiome(
|
||||
finalX + X + plotWorld.ROAD_OFFSET_X,
|
||||
finalZ + Z + plotWorld.ROAD_OFFSET_Z,
|
||||
plotWorld.getPlotBiome()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (enqueue) {
|
||||
queue.enqueue();
|
||||
});
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -95,6 +95,7 @@ public abstract class IndependentPlotGenerator {
|
||||
* @param world ChunkGenerator Implementation
|
||||
* @return Chunk generator
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T> GeneratorWrapper<T> specify(final @NonNull String world) {
|
||||
return (GeneratorWrapper<T>) PlotSquared.platform().wrapPlotGenerator(world, this);
|
||||
}
|
||||
|
@ -96,7 +96,7 @@ public abstract class SquarePlotManager extends GridPlotManager {
|
||||
.floor(squarePlotWorld.ROAD_WIDTH / 2) - 1;
|
||||
int z = (squarePlotWorld.ROAD_OFFSET_Z + (pz * (squarePlotWorld.ROAD_WIDTH + squarePlotWorld.PLOT_WIDTH))) - (int) Math
|
||||
.floor(squarePlotWorld.ROAD_WIDTH / 2) - 1;
|
||||
return Location.at(squarePlotWorld.getWorldName(), x, Math.min(getWorldHeight(), 255), z);
|
||||
return Location.at(squarePlotWorld.getWorldName(), x, squarePlotWorld.getMaxGenHeight(), z);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -260,7 +260,7 @@ public abstract class SquarePlotManager extends GridPlotManager {
|
||||
- (int) Math.floor(squarePlotWorld.ROAD_WIDTH / 2);
|
||||
int z = (squarePlotWorld.ROAD_OFFSET_Z + (pz * (squarePlotWorld.ROAD_WIDTH + squarePlotWorld.PLOT_WIDTH))) - squarePlotWorld.PLOT_WIDTH
|
||||
- (int) Math.floor(squarePlotWorld.ROAD_WIDTH / 2);
|
||||
return Location.at(squarePlotWorld.getWorldName(), x, squarePlotWorld.getMinBuildHeight(), z);
|
||||
return Location.at(squarePlotWorld.getWorldName(), x, squarePlotWorld.getMinGenHeight(), z);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -174,21 +174,9 @@ public class PlotListener {
|
||||
String greeting = plot.getFlag(GreetingFlag.class);
|
||||
if (!greeting.isEmpty()) {
|
||||
if (!Settings.Chat.NOTIFICATION_AS_ACTIONBAR) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("flags.greeting_flag_format"),
|
||||
Template.of("world", plot.getWorldName()),
|
||||
Template.of("plot_id", plot.getId().toString()),
|
||||
Template.of("alias", plot.getAlias()),
|
||||
Template.of("greeting", greeting)
|
||||
);
|
||||
plot.format(StaticCaption.of(greeting), player, false).thenAcceptAsync(player::sendMessage);
|
||||
} else {
|
||||
player.sendActionBar(
|
||||
TranslatableCaption.of("flags.greeting_flag_format"),
|
||||
Template.of("world", plot.getWorldName()),
|
||||
Template.of("plot_id", plot.getId().toString()),
|
||||
Template.of("alias", plot.getAlias()),
|
||||
Template.of("greeting", greeting)
|
||||
);
|
||||
plot.format(StaticCaption.of(greeting), player, false).thenAcceptAsync(player::sendActionBar);
|
||||
}
|
||||
}
|
||||
|
||||
@ -413,21 +401,9 @@ public class PlotListener {
|
||||
String farewell = plot.getFlag(FarewellFlag.class);
|
||||
if (!farewell.isEmpty()) {
|
||||
if (!Settings.Chat.NOTIFICATION_AS_ACTIONBAR) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("flags.farewell_flag_format"),
|
||||
Template.of("world", plot.getWorldName()),
|
||||
Template.of("plot_id", plot.getId().toString()),
|
||||
Template.of("alias", plot.getAlias()),
|
||||
Template.of("farewell", farewell)
|
||||
);
|
||||
plot.format(StaticCaption.of(farewell), player, false).thenAcceptAsync(player::sendMessage);
|
||||
} else {
|
||||
player.sendActionBar(
|
||||
TranslatableCaption.of("flags.farewell_flag_format"),
|
||||
Template.of("world", plot.getWorldName()),
|
||||
Template.of("plot_id", plot.getId().toString()),
|
||||
Template.of("alias", plot.getAlias()),
|
||||
Template.of("farewell", farewell)
|
||||
);
|
||||
plot.format(StaticCaption.of(farewell), player, false).thenAcceptAsync(player::sendActionBar);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -42,8 +42,6 @@ import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
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 java.lang.reflect.Field;
|
||||
@ -53,8 +51,6 @@ import java.util.Set;
|
||||
|
||||
public class ProcessedWEExtent extends AbstractDelegateExtent {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + ProcessedWEExtent.class.getSimpleName());
|
||||
|
||||
private final Set<CuboidRegion> mask;
|
||||
private final String world;
|
||||
private final int max;
|
||||
@ -162,6 +158,7 @@ public class ProcessedWEExtent extends AbstractDelegateExtent {
|
||||
return null;
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public boolean setBiome(BlockVector2 position, BiomeType biome) {
|
||||
return WEManager.maskContains(this.mask, position.getX(), position.getZ()) && super
|
||||
|
@ -54,6 +54,7 @@ public class WEExtent extends AbstractDelegateExtent {
|
||||
this.mask = mask;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public boolean setBlock(BlockVector3 location, BlockStateHolder block)
|
||||
throws WorldEditException {
|
||||
|
@ -35,6 +35,7 @@ import com.plotsquared.core.plot.world.PlotAreaManager;
|
||||
import com.plotsquared.core.util.Permissions;
|
||||
import com.plotsquared.core.util.WEManager;
|
||||
import com.plotsquared.core.util.WorldUtil;
|
||||
import com.sk89q.worldedit.EditSession;
|
||||
import com.sk89q.worldedit.WorldEdit;
|
||||
import com.sk89q.worldedit.entity.Player;
|
||||
import com.sk89q.worldedit.event.extent.EditSessionEvent;
|
||||
@ -67,6 +68,9 @@ public class WESubscriber {
|
||||
WorldEdit.getInstance().getEventBus().unregister(this);
|
||||
return;
|
||||
}
|
||||
if (event.getStage() != EditSession.Stage.BEFORE_HISTORY) {
|
||||
return;
|
||||
}
|
||||
World worldObj = event.getWorld();
|
||||
if (worldObj == null) {
|
||||
return;
|
||||
|
@ -58,6 +58,21 @@ public interface World<T> {
|
||||
*/
|
||||
@NonNull String getName();
|
||||
|
||||
/**
|
||||
* Get the min world height. Inclusive.
|
||||
*
|
||||
* @since 6.6.0
|
||||
*/
|
||||
int getMinHeight();
|
||||
|
||||
|
||||
/**
|
||||
* Get the max world height. Inclusive.
|
||||
*
|
||||
* @since 6.6.0
|
||||
*/
|
||||
int getMaxHeight();
|
||||
|
||||
class NullWorld<T> implements World<T> {
|
||||
|
||||
private NullWorld() {
|
||||
@ -74,6 +89,16 @@ public interface World<T> {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMinHeight() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxHeight() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object obj) {
|
||||
return obj instanceof NullWorld;
|
||||
|
@ -52,6 +52,7 @@ public interface PermissionHolder {
|
||||
* @param permission Permission
|
||||
* @param key Permission "key"
|
||||
* @return {@code true} if the owner has the given permission, else {@code false}
|
||||
* @since 6.0.10
|
||||
*/
|
||||
default boolean hasKeyedPermission(
|
||||
final @NonNull String permission,
|
||||
@ -115,6 +116,7 @@ public interface PermissionHolder {
|
||||
* @param permission Permission
|
||||
* @param key Permission "key"
|
||||
* @return {@code true} if the owner has the given permission, else {@code false}
|
||||
* @since 6.0.10
|
||||
*/
|
||||
boolean hasKeyedPermission(@Nullable String world, @NonNull String permission, @NonNull String key);
|
||||
|
||||
|
@ -59,7 +59,9 @@ public interface PermissionProfile {
|
||||
* @param permission Permission
|
||||
* @param key Permission "key"
|
||||
* @return {@code true} if the owner has the given permission, else {@code false}
|
||||
* @since 6.0.10
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
default boolean hasKeyedPermission(
|
||||
final @NonNull String permission,
|
||||
final @NonNull String key
|
||||
@ -75,6 +77,7 @@ public interface PermissionProfile {
|
||||
* @param permission Permission
|
||||
* @param key Permission "key"
|
||||
* @return {@code true} if the owner has the given permission, else {@code false}
|
||||
* @since 6.0.10
|
||||
*/
|
||||
boolean hasKeyedPermission(
|
||||
@Nullable String world, final @NonNull String permission,
|
||||
|
@ -62,6 +62,7 @@ public final class MetaDataKey<T> {
|
||||
* @param <T> Type
|
||||
* @return MetaData key instance
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static @NonNull <T> MetaDataKey<T> of(final @NonNull String key, final @NonNull TypeLiteral<T> type) {
|
||||
synchronized (keyMetaData) {
|
||||
return (MetaDataKey<T>)
|
||||
|
@ -47,6 +47,7 @@ final class PersistentMetaDataAccess<T> extends MetaDataAccess<T> {
|
||||
return this.getPlayer().hasPersistentMeta(getMetaDataKey().toString());
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public @Nullable T remove() {
|
||||
this.checkClosed();
|
||||
|
@ -104,7 +104,8 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
||||
private static final Set<PlotPlayer<?>> debugModeEnabled =
|
||||
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 PlotAreaManager plotAreaManager;
|
||||
private final EventDispatcher eventDispatcher;
|
||||
@ -128,6 +129,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
||||
this.permissionHandler = permissionHandler;
|
||||
}
|
||||
|
||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||
public static <T> PlotPlayer<T> from(final @NonNull T object) {
|
||||
// fast path
|
||||
if (converters.containsKey(object.getClass())) {
|
||||
@ -234,6 +236,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
||||
* @param <T> the object type to return
|
||||
* @return the value assigned to the key or null if it does not exist
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
<T> T getMeta(String key) {
|
||||
if (this.meta != null) {
|
||||
return (T) this.meta.get(key);
|
||||
@ -361,7 +364,6 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
||||
}
|
||||
|
||||
public int getClusterCount(String world) {
|
||||
UUID uuid = getUUID();
|
||||
int count = 0;
|
||||
for (PlotArea area : this.plotAreaManager.getPlotAreasSet(world)) {
|
||||
for (PlotCluster cluster : area.getClusters()) {
|
||||
@ -376,9 +378,12 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
||||
/**
|
||||
* Get a {@link Set} of plots owned by this player.
|
||||
*
|
||||
* <p>
|
||||
* Take a look at {@link PlotSquared} for more searching functions.
|
||||
* See {@link #getPlotCount()} for the number of plots.
|
||||
* </p>
|
||||
*
|
||||
* @return a {@link Set} of plots owned by the player
|
||||
* @see PlotSquared for more searching functions
|
||||
* @see #getPlotCount() for the number of plots
|
||||
*/
|
||||
public Set<Plot> getPlots() {
|
||||
return PlotQuery.newQuery().ownedBy(this).asSet();
|
||||
@ -499,7 +504,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
||||
* Retrieves the attribute of this player.
|
||||
*
|
||||
* @param key metadata key
|
||||
* @return the attribute will be either true or false
|
||||
* @return the attribute will be either {@code true} or {@code false}
|
||||
*/
|
||||
public boolean getAttribute(String key) {
|
||||
if (!hasPersistentMeta("attrib_" + key)) {
|
||||
@ -570,7 +575,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
||||
/**
|
||||
* Check if this player is banned.
|
||||
*
|
||||
* @return true if the player is banned, false otherwise.
|
||||
* @return {@code true} if the player is banned, {@code false} otherwise.
|
||||
*/
|
||||
public abstract boolean isBanned();
|
||||
|
||||
@ -795,16 +800,16 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
|
||||
final @NonNull MetaDataKey<T> key,
|
||||
final @NonNull T value
|
||||
) {
|
||||
final Object rawValue = value;
|
||||
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)) {
|
||||
this.setPersistentMeta(key.toString(), ByteArrayUtilities.booleanToBytes((boolean) rawValue));
|
||||
this.setPersistentMeta(key.toString(), ByteArrayUtilities.booleanToBytes((boolean) (Object) value));
|
||||
} else {
|
||||
throw new IllegalArgumentException(String.format("Unknown meta data type '%s'", key.getType()));
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Nullable <T> T getPersistentMeta(final @NonNull MetaDataKey<T> key) {
|
||||
final byte[] value = this.getPersistentMeta(key.toString());
|
||||
if (value == null) {
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user