mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2025-07-03 06:04:43 +02:00
Compare commits
45 Commits
fix/stop-i
...
feature/v7
Author | SHA1 | Date | |
---|---|---|---|
dfcc21c7ac | |||
638f0bd078 | |||
c27b838dad | |||
e0cb2949df | |||
59be582c28 | |||
f6cbb3792f | |||
a68918f830 | |||
1a7ded864e | |||
cbc8bc8879 | |||
21f79d1c13 | |||
293d7acf2d | |||
d876d3722a | |||
dffb7672ff | |||
f867867a42 | |||
59eefd6865 | |||
587a286d05 | |||
e10caf6aa0 | |||
08b325e37d | |||
c394108ba6 | |||
31e89019f1 | |||
3a7075e28d | |||
8373b7874e | |||
fe13882b97 | |||
f45064c4c4 | |||
af32399dd2 | |||
f3c03348d9 | |||
a53330e39b | |||
e2ba93dab9 | |||
9d43434e40 | |||
4f421167d1 | |||
94f4619c2c | |||
9885d3e506 | |||
a54276d3b2 | |||
cbb284b0fd | |||
ed22b22e9c | |||
444ccda807 | |||
db361cc420 | |||
079dc02cfe | |||
e98791c865 | |||
7c3112f30f | |||
c01f5f5c7d | |||
95caa19505 | |||
b8055201df | |||
81daefae4a | |||
02437a8c72 |
7
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
7
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@ -7,8 +7,8 @@ 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://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!
|
||||
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.gitbook.io/plotsquared/).
|
||||
Do NOT use the public issue tracker to report security vulnerabilities! They are disclosed using [this](https://github.com/IntellectualSites/PlotSquared/security/policy) GitHub form!
|
||||
|
||||
- type: dropdown
|
||||
attributes:
|
||||
@ -27,6 +27,9 @@ 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.20.1'
|
||||
- '1.20'
|
||||
- '1.19.4'
|
||||
- '1.19.3'
|
||||
- '1.19.2'
|
||||
- '1.19.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://intellectualsites.github.io/plotsquared-documentation/
|
||||
url: https://intellectualsites.gitbook.io/plotsquared/
|
||||
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://intellectualsites.github.io/plotsquared-documentation/).
|
||||
For anything else than a feature request, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://intellectualsites.gitbook.io/plotsquared/).
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
|
1
renovate.json → .github/renovate.json
vendored
1
renovate.json → .github/renovate.json
vendored
@ -4,6 +4,7 @@
|
||||
"config:base",
|
||||
":semanticCommitsDisabled"
|
||||
],
|
||||
"automerge": true,
|
||||
"labels": [
|
||||
"dependencies"
|
||||
],
|
5
.github/workflows/codeql.yml
vendored
5
.github/workflows/codeql.yml
vendored
@ -21,6 +21,11 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
- name: Setup Java
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: 17
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v2
|
||||
with:
|
||||
|
@ -18,7 +18,7 @@ repositories {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
api(projects.plotSquaredCore)
|
||||
api(projects.plotsquaredCore)
|
||||
|
||||
// Metrics
|
||||
implementation("org.bstats:bstats-bukkit")
|
||||
@ -62,6 +62,7 @@ tasks.processResources {
|
||||
}
|
||||
|
||||
tasks.named<ShadowJar>("shadowJar") {
|
||||
dependsOn(":plotsquared-core:shadowJar")
|
||||
dependencies {
|
||||
exclude(dependency("org.checkerframework:"))
|
||||
}
|
||||
@ -102,7 +103,7 @@ tasks {
|
||||
opt.links("https://jd.papermc.io/paper/1.19/")
|
||||
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString())
|
||||
opt.links("https://intellectualsites.github.io/plotsquared-javadocs/core/")
|
||||
opt.links("https://jd.advntr.dev/api/4.12.0/")
|
||||
opt.links("https://jd.advntr.dev/api/4.14.0/")
|
||||
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
|
||||
opt.links("https://checkerframework.org/api/")
|
||||
opt.isLinkSource = true
|
||||
|
@ -50,7 +50,6 @@ import com.plotsquared.bukkit.util.BukkitUtil;
|
||||
import com.plotsquared.bukkit.util.BukkitWorld;
|
||||
import com.plotsquared.bukkit.util.SetGenCB;
|
||||
import com.plotsquared.bukkit.util.TranslationUpdateManager;
|
||||
import com.plotsquared.bukkit.util.UpdateUtility;
|
||||
import com.plotsquared.bukkit.util.task.BukkitTaskManager;
|
||||
import com.plotsquared.bukkit.util.task.PaperTimeConverter;
|
||||
import com.plotsquared.bukkit.util.task.SpigotTimeConverter;
|
||||
@ -303,9 +302,11 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
||||
|
||||
this.serverLocale = Locale.forLanguageTag(Settings.Enabled_Components.DEFAULT_LOCALE);
|
||||
|
||||
/* TODO Enable update checker before v7 is released to GA
|
||||
if (PremiumVerification.isPremium() && Settings.Enabled_Components.UPDATE_NOTIFICATIONS) {
|
||||
injector.getInstance(UpdateUtility.class).updateChecker();
|
||||
}
|
||||
*/
|
||||
|
||||
if (PremiumVerification.isPremium()) {
|
||||
LOGGER.info("PlotSquared version licensed to Spigot user {}", getUserID());
|
||||
|
@ -34,9 +34,12 @@ import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator;
|
||||
import com.plotsquared.core.util.ChunkManager;
|
||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||
import com.sk89q.worldedit.math.BlockVector2;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.bukkit.HeightMap;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.Registry;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Biome;
|
||||
import org.bukkit.generator.BiomeProvider;
|
||||
@ -48,10 +51,14 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
|
||||
import static java.util.function.Predicate.not;
|
||||
|
||||
public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrapper<ChunkGenerator> {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BukkitPlotGenerator.class.getSimpleName());
|
||||
@ -284,7 +291,7 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
|
||||
*/
|
||||
@SuppressWarnings("deprecation") // The entire method is deprecated, but kept for compatibility with <=1.16.2
|
||||
@Override
|
||||
@Deprecated(since = "TODO")
|
||||
@Deprecated(since = "7.0.0")
|
||||
public @NonNull ChunkData generateChunkData(
|
||||
@NonNull World world, @NonNull Random random, int x, int z, @NonNull BiomeGrid biome
|
||||
) {
|
||||
@ -414,7 +421,11 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
|
||||
if (lastPlotArea != null && name.equals(this.levelName) && chunkX == lastChunkX && chunkZ == lastChunkZ) {
|
||||
return lastPlotArea;
|
||||
}
|
||||
PlotArea area = UncheckedWorldLocation.at(name, chunkX << 4, 0, chunkZ << 4).getPlotArea();
|
||||
BlockVector3 loc = BlockVector3.at(chunkX << 4, 0, chunkZ << 4);
|
||||
if (lastPlotArea != null && lastPlotArea.getRegion().contains(loc) && lastPlotArea.getRegion().contains(loc)) {
|
||||
return lastPlotArea;
|
||||
}
|
||||
PlotArea area = UncheckedWorldLocation.at(name, loc).getPlotArea();
|
||||
if (area == null) {
|
||||
throw new IllegalStateException(String.format(
|
||||
"Cannot generate chunk that does not belong to a plot area. World: %s",
|
||||
@ -434,9 +445,16 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
|
||||
private static final List<Biome> BIOMES;
|
||||
|
||||
static {
|
||||
ArrayList<Biome> biomes = new ArrayList<>(List.of(Biome.values()));
|
||||
biomes.remove(Biome.CUSTOM);
|
||||
BIOMES = List.copyOf(biomes);
|
||||
Set<Biome> disabledBiomes = EnumSet.of(Biome.CUSTOM);
|
||||
if (PlotSquared.platform().serverVersion()[1] <= 19) {
|
||||
final Biome cherryGrove = Registry.BIOME.get(NamespacedKey.minecraft("cherry_grove"));
|
||||
if (cherryGrove != null) {
|
||||
disabledBiomes.add(cherryGrove);
|
||||
}
|
||||
}
|
||||
BIOMES = Arrays.stream(Biome.values())
|
||||
.filter(not(disabledBiomes::contains))
|
||||
.toList();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1116,6 +1116,7 @@ public class BlockEventListener implements Listener {
|
||||
if (plot != null) {
|
||||
plot.debug("Explosion was cancelled because explosion = false");
|
||||
}
|
||||
return;
|
||||
}
|
||||
event.blockList().removeIf(blox -> !plot.equals(area.getOwnedPlot(BukkitUtil.adapt(blox.getLocation()))));
|
||||
}
|
||||
|
@ -26,6 +26,7 @@ import com.plotsquared.core.plot.Plot;
|
||||
import com.plotsquared.core.plot.PlotArea;
|
||||
import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.SculkSensorInteractFlag;
|
||||
import com.plotsquared.core.util.PlotFlagUtil;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
@ -96,12 +97,12 @@ public class BlockEventListener117 implements Listener {
|
||||
area,
|
||||
MiscInteractFlag.class,
|
||||
true
|
||||
) || plot != null && !plot.getFlag(
|
||||
MiscInteractFlag.class)) {
|
||||
) || plot != null && (!plot.getFlag(MiscInteractFlag.class) || !plot.getFlag(SculkSensorInteractFlag.class))) {
|
||||
if (plotPlayer != null) {
|
||||
if (plot != null) {
|
||||
if (!plot.isAdded(plotPlayer.getUUID())) {
|
||||
plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because misc-interact = false");
|
||||
plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because both " +
|
||||
"sculk-sensor-interact and misc-interact = false");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
@ -112,13 +113,15 @@ public class BlockEventListener117 implements Listener {
|
||||
if (plot != null) {
|
||||
if (itemThrower == null && (itemThrower = item.getOwner()) == null) {
|
||||
plot.debug(
|
||||
"A thrown item couldn't trigger sculk sensors because misc-interact = false and the item's owner could not be resolved.");
|
||||
"A thrown item couldn't trigger sculk sensors because both sculk-sensor-interact and " +
|
||||
"misc-interact = false and the item's owner could not be resolved.");
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
if (!plot.isAdded(itemThrower)) {
|
||||
if (!plot.isAdded(itemThrower)) {
|
||||
plot.debug("A thrown item couldn't trigger sculk sensors because misc-interact = false");
|
||||
plot.debug("A thrown item couldn't trigger sculk sensors because both sculk-sensor-interact and " +
|
||||
"misc-interact = false");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
@ -137,7 +140,6 @@ public class BlockEventListener117 implements Listener {
|
||||
if (area == null) {
|
||||
for (int i = blocks.size() - 1; i >= 0; i--) {
|
||||
Location blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation());
|
||||
blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation());
|
||||
if (blockLocation.isPlotArea()) {
|
||||
blocks.remove(i);
|
||||
}
|
||||
|
@ -26,6 +26,7 @@ import com.plotsquared.core.plot.Plot;
|
||||
import com.plotsquared.core.plot.PlotArea;
|
||||
import com.plotsquared.core.plot.world.PlotAreaManager;
|
||||
import com.plotsquared.core.plot.world.SinglePlotArea;
|
||||
import com.plotsquared.core.util.ReflectionUtils;
|
||||
import com.plotsquared.core.util.ReflectionUtils.RefClass;
|
||||
import com.plotsquared.core.util.ReflectionUtils.RefField;
|
||||
import com.plotsquared.core.util.ReflectionUtils.RefMethod;
|
||||
@ -64,9 +65,11 @@ public class ChunkListener implements Listener {
|
||||
private final PlotAreaManager plotAreaManager;
|
||||
private final int version;
|
||||
|
||||
private RefMethod methodSetUnsaved;
|
||||
private RefMethod methodGetHandleChunk;
|
||||
private RefMethod methodGetHandleWorld;
|
||||
private RefField mustSave;
|
||||
private RefField mustNotSave;
|
||||
private Object objChunkStatusFull = null;
|
||||
/*
|
||||
private RefMethod methodGetFullChunk;
|
||||
private RefMethod methodGetBukkitChunk;
|
||||
@ -79,7 +82,6 @@ public class ChunkListener implements Listener {
|
||||
*/
|
||||
private Chunk lastChunk;
|
||||
private boolean ignoreUnload = false;
|
||||
private boolean isTrueForNotSave = true;
|
||||
|
||||
@Inject
|
||||
public ChunkListener(final @NonNull PlotAreaManager plotAreaManager) {
|
||||
@ -90,22 +92,27 @@ public class ChunkListener implements Listener {
|
||||
}
|
||||
try {
|
||||
RefClass classCraftWorld = getRefClass("{cb}.CraftWorld");
|
||||
this.methodGetHandleWorld = classCraftWorld.getMethod("getHandle");
|
||||
RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
|
||||
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle");
|
||||
ReflectionUtils.RefClass classChunkAccess = getRefClass("net.minecraft.world.level.chunk.IChunkAccess");
|
||||
this.methodSetUnsaved = classChunkAccess.getMethod("a", boolean.class);
|
||||
try {
|
||||
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle");
|
||||
} catch (NoSuchMethodException ignored) {
|
||||
try {
|
||||
RefClass classChunkStatus = getRefClass("net.minecraft.world.level.chunk.ChunkStatus");
|
||||
this.objChunkStatusFull = classChunkStatus.getRealClass().getField("n").get(null);
|
||||
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle", classChunkStatus.getRealClass());
|
||||
} catch (NoSuchMethodException ex) {
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
}
|
||||
try {
|
||||
if (version < 17) {
|
||||
RefClass classChunk = getRefClass("{nms}.Chunk");
|
||||
if (version == 13) {
|
||||
this.mustSave = classChunk.getField("mustSave");
|
||||
this.isTrueForNotSave = false;
|
||||
} else {
|
||||
this.mustSave = classChunk.getField("mustNotSave");
|
||||
}
|
||||
this.mustNotSave = classChunk.getField("mustNotSave");
|
||||
} else {
|
||||
RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk");
|
||||
this.mustSave = classChunk.getField("mustNotSave");
|
||||
|
||||
this.mustNotSave = classChunk.getField("mustNotSave");
|
||||
}
|
||||
} catch (NoSuchFieldException e) {
|
||||
e.printStackTrace();
|
||||
@ -167,10 +174,13 @@ public class ChunkListener implements Listener {
|
||||
if (safe && shouldSave(world, chunk.getX(), chunk.getZ())) {
|
||||
return false;
|
||||
}
|
||||
Object c = this.methodGetHandleChunk.of(chunk).call();
|
||||
RefField.RefExecutor field = this.mustSave.of(c);
|
||||
if ((Boolean) field.get() != isTrueForNotSave) {
|
||||
field.set(isTrueForNotSave);
|
||||
Object c = objChunkStatusFull != null
|
||||
? this.methodGetHandleChunk.of(chunk).call(objChunkStatusFull)
|
||||
: this.methodGetHandleChunk.of(chunk).call();
|
||||
RefField.RefExecutor field = this.mustNotSave.of(c);
|
||||
methodSetUnsaved.of(c).call(false);
|
||||
if (!((Boolean) field.get())) {
|
||||
field.set(true);
|
||||
if (chunk.isLoaded()) {
|
||||
ignoreUnload = true;
|
||||
chunk.unload(false);
|
||||
|
@ -152,7 +152,8 @@ public class EntityEventListener implements Listener {
|
||||
}
|
||||
}
|
||||
case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL",
|
||||
"TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN" -> {
|
||||
"TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN", "NETHER_PORTAL", "DEFAULT",
|
||||
"DUPLICATION", "FROZEN", "SPELL" -> {
|
||||
if (!area.isMobSpawning()) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
|
@ -1167,7 +1167,7 @@ public class PlayerEventListener implements Listener {
|
||||
}
|
||||
}
|
||||
if (type.isEdible()) {
|
||||
//Allow all players to eat while also allowing the block place event ot be fired
|
||||
//Allow all players to eat while also allowing the block place event to be fired
|
||||
return;
|
||||
}
|
||||
if (type == Material.ARMOR_STAND) {
|
||||
|
@ -31,45 +31,39 @@ import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.world.ChunkEvent;
|
||||
import org.bukkit.event.world.ChunkLoadEvent;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import static com.plotsquared.core.util.ReflectionUtils.getRefClass;
|
||||
|
||||
public class SingleWorldListener implements Listener {
|
||||
|
||||
private final Method methodGetHandleChunk;
|
||||
private Field shouldSave = null;
|
||||
private final Method methodSetUnsaved;
|
||||
private Method methodGetHandleChunk;
|
||||
private Object objChunkStatusFull = null;
|
||||
|
||||
public SingleWorldListener() throws Exception {
|
||||
ReflectionUtils.RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
|
||||
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle").getRealMethod();
|
||||
ReflectionUtils.RefClass classChunkAccess = getRefClass("net.minecraft.world.level.chunk.IChunkAccess");
|
||||
this.methodSetUnsaved = classChunkAccess.getMethod("a", boolean.class).getRealMethod();
|
||||
try {
|
||||
if (PlotSquared.platform().serverVersion()[1] < 17) {
|
||||
ReflectionUtils.RefClass classChunk = getRefClass("{nms}.Chunk");
|
||||
if (PlotSquared.platform().serverVersion()[1] == 13) {
|
||||
this.shouldSave = classChunk.getField("mustSave").getRealField();
|
||||
} else {
|
||||
this.shouldSave = classChunk.getField("s").getRealField();
|
||||
}
|
||||
} 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();
|
||||
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle").getRealMethod();
|
||||
} catch (NoSuchMethodException ignored) {
|
||||
try {
|
||||
ReflectionUtils.RefClass classChunkStatus = getRefClass("net.minecraft.world.level.chunk.ChunkStatus");
|
||||
this.objChunkStatusFull = classChunkStatus.getRealClass().getField("n").get(null);
|
||||
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle", classChunkStatus.getRealClass()).getRealMethod();
|
||||
} catch (NoSuchMethodException ex) {
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
} catch (NoSuchFieldException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void markChunkAsClean(Chunk chunk) {
|
||||
try {
|
||||
Object nmsChunk = methodGetHandleChunk.invoke(chunk);
|
||||
if (shouldSave != null) {
|
||||
this.shouldSave.set(nmsChunk, false);
|
||||
}
|
||||
Object nmsChunk = objChunkStatusFull != null
|
||||
? this.methodGetHandleChunk.invoke(chunk, objChunkStatusFull)
|
||||
: this.methodGetHandleChunk.invoke(chunk);
|
||||
methodSetUnsaved.invoke(nmsChunk, false);
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@ -85,7 +79,12 @@ public class SingleWorldListener implements Listener {
|
||||
if (!SinglePlotArea.isSinglePlotWorld(name)) {
|
||||
return;
|
||||
}
|
||||
|
||||
int x = event.getChunk().getX();
|
||||
int z = event.getChunk().getZ();
|
||||
if (x < 16 && x > -16 && z < 16 && z > -16) {
|
||||
// Allow spawn to generate
|
||||
return;
|
||||
}
|
||||
markChunkAsClean(event.getChunk());
|
||||
}
|
||||
|
||||
|
@ -28,24 +28,32 @@ import java.nio.file.Paths;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* This is a helper class which replaces occurrences of 'suggest_command' with 'run_command' in messages_%.json.
|
||||
* This is a helper class which replaces older syntax no longer supported by MiniMessage with replacements in messages_%.json.
|
||||
* MiniMessage changed the syntax between major releases. To warrant a smooth upgrade, we attempt to replace any occurrences
|
||||
* while loading PlotSquared.
|
||||
*
|
||||
* @since TODO
|
||||
* @since 7.0.0
|
||||
*/
|
||||
@NotPublic
|
||||
public class TranslationUpdateManager {
|
||||
|
||||
public static void upgradeTranslationFile() throws IOException {
|
||||
String searchText = "suggest_command";
|
||||
String replacementText = "run_command";
|
||||
String suggestCommand = "suggest_command";
|
||||
String suggestCommandReplacement = "run_command";
|
||||
String minHeight = "minHeight";
|
||||
String minheightReplacement = "minheight";
|
||||
String maxHeight = "maxHeight";
|
||||
String maxheightReplacement = "maxheight";
|
||||
|
||||
try (Stream<Path> paths = Files.walk(Paths.get(PlotSquared.platform().getDirectory().toPath().resolve("lang").toUri()))) {
|
||||
paths
|
||||
.filter(Files::isRegularFile)
|
||||
.filter(p -> p.getFileName().toString().matches("messages_[a-z]{2}\\.json"))
|
||||
.forEach(p -> replaceInFile(p, searchText, replacementText));
|
||||
.forEach(p -> {
|
||||
replaceInFile(p, suggestCommand, suggestCommandReplacement);
|
||||
replaceInFile(p, minHeight, minheightReplacement);
|
||||
replaceInFile(p, maxHeight, maxheightReplacement);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -68,8 +68,8 @@ tasks {
|
||||
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
|
||||
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.advntr.dev/api/4.12.0/")
|
||||
opt.links("https://jd.advntr.dev/text-minimessage/4.12.0/")
|
||||
opt.links("https://jd.advntr.dev/api/4.14.0/")
|
||||
opt.links("https://jd.advntr.dev/text-minimessage/4.14.0/")
|
||||
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
|
||||
opt.links("https://checkerframework.org/api/")
|
||||
opt.links("https://javadoc.io/doc/com.intellectualsites.informative-annotations/informative-annotations/latest/")
|
||||
|
@ -294,12 +294,15 @@ public class Auto extends SubCommand {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (this.econHandler != null && plotarea.useEconomy()) {
|
||||
if (this.econHandler != null && plotarea.useEconomy() && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
|
||||
PlotExpression costExp = plotarea.getPrices().get("claim");
|
||||
PlotExpression mergeCostExp = plotarea.getPrices().get("merge");
|
||||
int size = sizeX * sizeZ;
|
||||
double mergeCost = size <= 1 || mergeCostExp == null ? 0d : mergeCostExp.evaluate(size);
|
||||
double cost = costExp.evaluate(Settings.Limit.GLOBAL ?
|
||||
player.getPlotCount() :
|
||||
player.getPlotCount(plotarea.getWorldName()));
|
||||
cost = (sizeX * sizeZ) * cost;
|
||||
cost = size * cost + mergeCost;
|
||||
if (cost > 0d) {
|
||||
if (!this.econHandler.isSupported()) {
|
||||
player.sendMessage(TranslatableCaption.of("economy.vault_or_consumer_null"));
|
||||
|
@ -141,7 +141,7 @@ public class Claim extends SubCommand {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.econHandler.isEnabled(area) && !force) {
|
||||
if (this.econHandler.isEnabled(area) && !force && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
|
||||
PlotExpression costExr = area.getPrices().get("claim");
|
||||
double cost = costExr.evaluate(currentPlots);
|
||||
if (cost > 0d) {
|
||||
|
@ -112,15 +112,15 @@ public class Kick extends SubCommand {
|
||||
for (PlotPlayer<?> player2 : players) {
|
||||
if (!plot.equals(player2.getCurrentPlot())) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("errors.invalid_player"),
|
||||
TagResolver.resolver("value", Tag.inserting(Component.text(args[0])))
|
||||
TranslatableCaption.of("kick.player_not_in_plot"),
|
||||
TagResolver.resolver("player", Tag.inserting(Component.text(player2.getName())))
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (player2.hasPermission(Permission.PERMISSION_ADMIN_ENTRY_DENIED)) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("cluster.cannot_kick_player"),
|
||||
TagResolver.resolver("name", Tag.inserting(Component.text(player2.getName())))
|
||||
TranslatableCaption.of("kick.cannot_kick_player"),
|
||||
TagResolver.resolver("player", Tag.inserting(Component.text(player2.getName())))
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
@ -183,7 +183,7 @@ public class MainCommand extends Command {
|
||||
if (cmd.hasConfirmation(player)) {
|
||||
CmdConfirm.addPending(player, cmd.getUsage(), () -> {
|
||||
PlotArea area = player.getApplicablePlotArea();
|
||||
if (area != null && econHandler.isEnabled(area)) {
|
||||
if (area != null && econHandler.isEnabled(area) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
|
||||
PlotExpression priceEval =
|
||||
area.getPrices().get(cmd.getFullId());
|
||||
double price = priceEval != null ? priceEval.evaluate(0d) : 0d;
|
||||
@ -201,7 +201,7 @@ public class MainCommand extends Command {
|
||||
return;
|
||||
}
|
||||
PlotArea area = player.getApplicablePlotArea();
|
||||
if (area != null && econHandler.isEnabled(area)) {
|
||||
if (area != null && econHandler.isEnabled(area) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
|
||||
PlotExpression priceEval = area.getPrices().get(cmd.getFullId());
|
||||
double price = priceEval != null ? priceEval.evaluate(0d) : 0d;
|
||||
if (price != 0d && econHandler.getMoney(player) < price) {
|
||||
|
@ -178,7 +178,7 @@ public class Merge extends SubCommand {
|
||||
return true;
|
||||
}
|
||||
if (plot.getPlotModificationManager().autoMerge(Direction.ALL, maxSize, uuid, player, terrain)) {
|
||||
if (this.econHandler.isEnabled(plotArea) && price > 0d) {
|
||||
if (this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d) {
|
||||
this.econHandler.withdrawMoney(player, price);
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("economy.removed_balance"),
|
||||
@ -196,8 +196,8 @@ public class Merge extends SubCommand {
|
||||
player.sendMessage(TranslatableCaption.of("merge.no_available_automerge"));
|
||||
return false;
|
||||
}
|
||||
if (!force && this.econHandler.isEnabled(plotArea) && price > 0d
|
||||
&& this.econHandler.getMoney(player) < price) {
|
||||
if (!force && this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d && this.econHandler.getMoney(
|
||||
player) < price) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("economy.cannot_afford_merge"),
|
||||
TagResolver.resolver("money", Tag.inserting(Component.text(this.econHandler.format(price))))
|
||||
@ -218,7 +218,7 @@ public class Merge extends SubCommand {
|
||||
return true;
|
||||
}
|
||||
if (plot.getPlotModificationManager().autoMerge(direction, maxSize - size, uuid, player, terrain)) {
|
||||
if (this.econHandler.isEnabled(plotArea) && price > 0d) {
|
||||
if (this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d) {
|
||||
this.econHandler.withdrawMoney(player, price);
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("economy.removed_balance"),
|
||||
@ -259,7 +259,7 @@ public class Merge extends SubCommand {
|
||||
accepter.sendMessage(TranslatableCaption.of("merge.merge_not_valid"));
|
||||
return;
|
||||
}
|
||||
if (this.econHandler.isEnabled(plotArea) && price > 0d) {
|
||||
if (this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d) {
|
||||
if (!force && this.econHandler.getMoney(player) < price) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("economy.cannot_afford_merge"),
|
||||
@ -303,7 +303,7 @@ public class Merge extends SubCommand {
|
||||
player,
|
||||
terrain
|
||||
)) {
|
||||
if (this.econHandler.isEnabled(plotArea) && price > 0d) {
|
||||
if (this.econHandler.isEnabled(plotArea) && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON) && price > 0d) {
|
||||
if (!force && this.econHandler.getMoney(player) < price) {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("economy.cannot_afford_merge"),
|
||||
|
@ -56,7 +56,7 @@ public class Music extends SubCommand {
|
||||
.asList("music_disc_13", "music_disc_cat", "music_disc_blocks", "music_disc_chirp",
|
||||
"music_disc_far", "music_disc_mall", "music_disc_mellohi", "music_disc_stal",
|
||||
"music_disc_strad", "music_disc_ward", "music_disc_11", "music_disc_wait", "music_disc_otherside",
|
||||
"music_disc_pigstep", "music_disc_5"
|
||||
"music_disc_pigstep", "music_disc_5", "music_disc_relic"
|
||||
);
|
||||
|
||||
private final InventoryUtil inventoryUtil;
|
||||
|
@ -46,7 +46,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://intellectualsites.github.io/plotsquared-documentation/>https://intellectualsites.github.io/plotsquared-documentation/</gold>"));
|
||||
"<gray>>> </gray><gold><bold>Wiki<reset><gray>: </gray><gold><click:open_url:https://intellectualsites.gitbook.io/plotsquared/>https://intellectualsites.gitbook.io/plotsquared/</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(
|
||||
|
@ -206,7 +206,7 @@ public class ComponentPresetManager {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (componentPreset.cost() > 0.0D) {
|
||||
if (componentPreset.cost() > 0.0D && !player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_ECON)) {
|
||||
if (!econHandler.isEnabled(plot.getArea())) {
|
||||
getPlayer().sendMessage(
|
||||
TranslatableCaption.of("preset.economy_disabled"),
|
||||
|
@ -194,7 +194,7 @@ public class Settings extends Config {
|
||||
public List<String> WORLDS = new ArrayList<>(Collections.singletonList("*"));
|
||||
|
||||
|
||||
@Comment("See: https://intellectualsites.github.io/plotsquared-documentation/optimization/plot-analysis for a description of each value.")
|
||||
@Comment("See: https://intellectualsites.gitbook.io/plotsquared/optimization/plot-analysis for a description of each value.")
|
||||
public static final class CALIBRATION {
|
||||
|
||||
public int VARIETY = 0;
|
||||
@ -214,7 +214,7 @@ public class Settings extends Config {
|
||||
|
||||
|
||||
@Comment({"Chunk processor related settings",
|
||||
"See https://intellectualsites.github.io/plotsquared-documentation/optimization/chunk-processor for more information."})
|
||||
"See https://intellectualsites.gitbook.io/plotsquared/optimization/chunk-processor for more information."})
|
||||
public static class Chunk_Processor {
|
||||
|
||||
@Comment("Auto trim will not save chunks which aren't claimed")
|
||||
@ -280,7 +280,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://intellectualsites.github.io/plotsquared-documentation/customization/plot-components"})
|
||||
"Checkout the wiki article regarding plot components before modifying: https://intellectualsites.gitbook.io/plotsquared/customization/plot-components"})
|
||||
public static List<String>
|
||||
INVALID_BLOCKS = Arrays.asList(
|
||||
// Acacia Stuff
|
||||
@ -402,7 +402,7 @@ public class Settings extends Config {
|
||||
|
||||
|
||||
@Comment({"Schematic Settings",
|
||||
"See https://intellectualsites.github.io/plotsquared-documentation/schematics/schematic-on-claim for more information."})
|
||||
"See https://intellectualsites.gitbook.io/plotsquared/schematics/schematic-on-claim for more information."})
|
||||
public static final class Schematics {
|
||||
|
||||
@Comment(
|
||||
@ -531,7 +531,7 @@ public class Settings extends Config {
|
||||
|
||||
|
||||
@Comment({"Backup related settings",
|
||||
"See https://intellectualsites.github.io/plotsquared-documentation/plot-backups for more information."})
|
||||
"See https://intellectualsites.gitbook.io/plotsquared/plot-backups for more information."})
|
||||
public static final class Backup {
|
||||
|
||||
@Comment("Automatically backup plots when destructive commands are performed, e.g. /plot clear")
|
||||
@ -783,7 +783,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://intellectualsites.github.io/plotsquared-documentation/customization/plot-components"})
|
||||
"Read more about components here: https://intellectualsites.gitbook.io/plotsquared/customization/plot-components"})
|
||||
public static boolean COMPONENT_PRESETS = true;
|
||||
@Comment("Enable per user locale")
|
||||
public static boolean PER_USER_LOCALE = false;
|
||||
|
@ -40,7 +40,7 @@ public interface Caption {
|
||||
*
|
||||
* @param localeHolder Locale holder
|
||||
* @return {@link ComponentLike}
|
||||
* @since TODO
|
||||
* @since 7.0.0
|
||||
*/
|
||||
@NonNull Component toComponent(@NonNull LocaleHolder localeHolder);
|
||||
|
||||
|
@ -51,7 +51,7 @@ public class CaptionHolder {
|
||||
* Get the {@link TagResolver}s to use when resolving tags in the {@link Caption}.
|
||||
*
|
||||
* @return The tag resolvers to use.
|
||||
* @since TODO
|
||||
* @since 7.0.0
|
||||
*/
|
||||
public TagResolver[] getTagResolvers() {
|
||||
return this.tagResolvers;
|
||||
@ -61,7 +61,7 @@ public class CaptionHolder {
|
||||
* Set the {@link TagResolver}s to use when resolving tags in the {@link Caption}.
|
||||
*
|
||||
* @param tagResolvers The tag resolvers to use.
|
||||
* @since TODO
|
||||
* @since 7.0.0
|
||||
*/
|
||||
public void setTagResolvers(TagResolver... tagResolvers) {
|
||||
this.tagResolvers = tagResolvers;
|
||||
|
@ -28,16 +28,20 @@ import com.plotsquared.core.plot.flag.implementations.PlotTitleFlag;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.event.ClickEvent;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import net.kyori.adventure.text.minimessage.ParsingException;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import static com.plotsquared.core.configuration.caption.ComponentTransform.nested;
|
||||
import static com.plotsquared.core.configuration.caption.ComponentTransform.stripClicks;
|
||||
|
||||
public class CaptionUtility {
|
||||
|
||||
private static final Pattern LEGACY_FORMATTING = Pattern.compile("§[a-gklmnor0-9]");
|
||||
|
||||
// flags which values are parsed by minimessage
|
||||
private static final Set<Class<? extends PlotFlag<?, ?>>> MINI_MESSAGE_FLAGS = Set.of(
|
||||
GreetingFlag.class,
|
||||
@ -100,7 +104,14 @@ public class CaptionUtility {
|
||||
*/
|
||||
public static String stripClickEvents(final @NonNull String miniMessageString) {
|
||||
// parse, transform and serialize again
|
||||
Component component = MiniMessage.miniMessage().deserialize(miniMessageString);
|
||||
Component component;
|
||||
try {
|
||||
component = MiniMessage.miniMessage().deserialize(miniMessageString);
|
||||
} catch (ParsingException e) {
|
||||
// if the String cannot be parsed, we try stripping legacy colors
|
||||
String legacyStripped = LEGACY_FORMATTING.matcher(miniMessageString).replaceAll("");
|
||||
component = MiniMessage.miniMessage().deserialize(legacyStripped);
|
||||
}
|
||||
component = CLICK_STRIP_TRANSFORM.transform(component);
|
||||
return MiniMessage.miniMessage().serialize(component);
|
||||
}
|
||||
|
@ -19,6 +19,7 @@
|
||||
package com.plotsquared.core.configuration.file;
|
||||
|
||||
import com.plotsquared.core.configuration.serialization.ConfigurationSerialization;
|
||||
import org.yaml.snakeyaml.LoaderOptions;
|
||||
import org.yaml.snakeyaml.constructor.SafeConstructor;
|
||||
import org.yaml.snakeyaml.error.YAMLException;
|
||||
import org.yaml.snakeyaml.nodes.Node;
|
||||
@ -30,6 +31,7 @@ import java.util.Map;
|
||||
public class YamlConstructor extends SafeConstructor {
|
||||
|
||||
YamlConstructor() {
|
||||
super(new LoaderOptions());
|
||||
yamlConstructors.put(Tag.MAP, new ConstructCustomObject());
|
||||
}
|
||||
|
||||
|
@ -21,6 +21,7 @@ package com.plotsquared.core.configuration.file;
|
||||
import com.plotsquared.core.configuration.ConfigurationSection;
|
||||
import com.plotsquared.core.configuration.serialization.ConfigurationSerializable;
|
||||
import com.plotsquared.core.configuration.serialization.ConfigurationSerialization;
|
||||
import org.yaml.snakeyaml.DumperOptions;
|
||||
import org.yaml.snakeyaml.nodes.Node;
|
||||
import org.yaml.snakeyaml.representer.Representer;
|
||||
|
||||
@ -30,6 +31,7 @@ import java.util.Map;
|
||||
class YamlRepresenter extends Representer {
|
||||
|
||||
YamlRepresenter() {
|
||||
super(new DumperOptions());
|
||||
this.multiRepresenters.put(ConfigurationSection.class, new RepresentConfigurationSection());
|
||||
this.multiRepresenters
|
||||
.put(ConfigurationSerializable.class, new RepresentConfigurationSerializable());
|
||||
|
@ -379,10 +379,11 @@ public class ClassicPlotManager extends SquarePlotManager {
|
||||
}
|
||||
}
|
||||
|
||||
int yStart = classicPlotWorld.getMinBuildHeight() + (classicPlotWorld.PLOT_BEDROCK ? 1 : 0);
|
||||
if (!plot.isMerged(Direction.NORTH)) {
|
||||
int z = bot.getZ();
|
||||
for (int x = bot.getX(); x < top.getX(); x++) {
|
||||
for (int y = classicPlotWorld.getMinBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
for (int y = yStart; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
queue.setBlock(x, y, z, blocks);
|
||||
}
|
||||
}
|
||||
@ -390,7 +391,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 = classicPlotWorld.getMinBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
for (int y = yStart; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
queue.setBlock(x, y, z, blocks);
|
||||
}
|
||||
}
|
||||
@ -398,7 +399,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 = classicPlotWorld.getMinBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
for (int y = yStart; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
queue.setBlock(x, y, z, blocks);
|
||||
}
|
||||
}
|
||||
@ -406,7 +407,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 = classicPlotWorld.getMinBuildHeight(); y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
for (int y = yStart; y <= classicPlotWorld.WALL_HEIGHT; y++) {
|
||||
queue.setBlock(x, y, z, blocks);
|
||||
}
|
||||
}
|
||||
|
@ -69,8 +69,8 @@ public class HybridGen extends IndependentPlotGenerator {
|
||||
EnumSet<SchematicFeature> features
|
||||
) {
|
||||
int minY; // Math.min(world.PLOT_HEIGHT, world.ROAD_HEIGHT);
|
||||
if ((features.contains(SchematicFeature.ROAD) && Settings.Schematics.PASTE_ROAD_ON_TOP)
|
||||
|| (!features.contains(SchematicFeature.ROAD) && Settings.Schematics.PASTE_ON_TOP)) {
|
||||
boolean isRoad = features.contains(SchematicFeature.ROAD);
|
||||
if ((isRoad && Settings.Schematics.PASTE_ROAD_ON_TOP) || (!isRoad && Settings.Schematics.PASTE_ON_TOP)) {
|
||||
minY = world.SCHEM_Y;
|
||||
} else {
|
||||
minY = world.getMinBuildHeight();
|
||||
|
@ -162,6 +162,7 @@ public class HybridPlotManager extends ClassicPlotManager {
|
||||
} else {
|
||||
minY = hybridPlotWorld.getMinBuildHeight();
|
||||
}
|
||||
int schemYDiff = (isRoad ? hybridPlotWorld.getRoadYStart() : hybridPlotWorld.getPlotYStart()) - minY;
|
||||
BaseBlock airBlock = BlockTypes.AIR.getDefaultState().toBaseBlock();
|
||||
for (int x = pos1.getX(); x <= pos2.getX(); x++) {
|
||||
short absX = (short) ((x - hybridPlotWorld.ROAD_OFFSET_X) % size);
|
||||
@ -178,10 +179,14 @@ public class HybridPlotManager extends ClassicPlotManager {
|
||||
for (int y = 0; y < blocks.length; y++) {
|
||||
if (blocks[y] != null) {
|
||||
queue.setBlock(x, minY + y, z, blocks[y]);
|
||||
} else if (!isRoad) {
|
||||
// This is necessary, otherwise any blocks not specified in the schematic will remain after a clear
|
||||
// Do not set air for road as this may cause cavernous roads when debugroadregen is used
|
||||
} else if (y > schemYDiff) {
|
||||
// This is necessary, otherwise any blocks not specified in the schematic will remain after a clear.
|
||||
// This should only be done where the schematic has actually "started"
|
||||
queue.setBlock(x, minY + y, z, airBlock);
|
||||
} else if (isRoad) {
|
||||
queue.setBlock(x, minY + y, z, hybridPlotWorld.ROAD_BLOCK.toPattern());
|
||||
} else {
|
||||
queue.setBlock(x, minY + y, z, hybridPlotWorld.MAIN_BLOCK.toPattern());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -76,6 +76,9 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
||||
* The Y level at which schematic generation will start, lowest of either road or plot schematic generation.
|
||||
*/
|
||||
public int SCHEM_Y;
|
||||
|
||||
private int plotY;
|
||||
private int roadY;
|
||||
private Location SIGN_LOCATION;
|
||||
private File root = null;
|
||||
private int lastOverlayHeightError = Integer.MIN_VALUE;
|
||||
@ -252,68 +255,60 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
||||
|
||||
SCHEM_Y = schematicStartHeight();
|
||||
|
||||
// plotY and roadY are important to allow plot and/or road schematic "overflow" into each other without causing AIOOB
|
||||
// exceptions when attempting either to set blocks to, or get block from G_SCH
|
||||
// plotY and roadY are important to allow plot and/or road schematic "overflow" into each other
|
||||
// without causing AIOOB exceptions when attempting either to set blocks to, or get block from G_SCH
|
||||
// Default plot schematic start height, normalized to the minimum height schematics are pasted from.
|
||||
int plotY = PLOT_HEIGHT - SCHEM_Y;
|
||||
plotY = PLOT_HEIGHT - SCHEM_Y;
|
||||
int minRoadWall = Settings.Schematics.USE_WALL_IN_ROAD_SCHEM_HEIGHT ? Math.min(ROAD_HEIGHT, WALL_HEIGHT) : ROAD_HEIGHT;
|
||||
// Default road schematic start height, normalized to the minimum height schematics are pasted from.
|
||||
int roadY = minRoadWall - SCHEM_Y;
|
||||
roadY = minRoadWall - SCHEM_Y;
|
||||
|
||||
int worldGenHeight = getMaxGenHeight() - getMinGenHeight() + 1;
|
||||
|
||||
int maxSchematicHeight = 0;
|
||||
int plotSchemHeight = 0;
|
||||
|
||||
// SCHEM_Y should be normalised to the plot "start" height
|
||||
if (schematic3 != null) {
|
||||
plotSchemHeight = maxSchematicHeight = schematic3.getClipboard().getDimensions().getY();
|
||||
if (maxSchematicHeight == worldGenHeight) {
|
||||
plotSchemHeight = schematic3.getClipboard().getDimensions().getY();
|
||||
if (plotSchemHeight == worldGenHeight) {
|
||||
SCHEM_Y = getMinGenHeight();
|
||||
plotY = 0;
|
||||
} else if (!Settings.Schematics.PASTE_ON_TOP) {
|
||||
SCHEM_Y = getMinBuildHeight();
|
||||
SCHEM_Y = getMinGenHeight();
|
||||
plotY = 0;
|
||||
}
|
||||
}
|
||||
|
||||
int roadSchemHeight;
|
||||
int roadSchemHeight = 0;
|
||||
|
||||
if (schematic1 != null) {
|
||||
roadSchemHeight = Math.max(
|
||||
schematic1.getClipboard().getDimensions().getY(),
|
||||
schematic2.getClipboard().getDimensions().getY()
|
||||
);
|
||||
maxSchematicHeight = Math.max(roadSchemHeight, maxSchematicHeight);
|
||||
if (maxSchematicHeight == worldGenHeight) {
|
||||
if (roadSchemHeight == worldGenHeight) {
|
||||
SCHEM_Y = getMinGenHeight();
|
||||
roadY = 0; // Road is the lowest schematic
|
||||
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldGenHeight) {
|
||||
// Road is the lowest schematic. Normalize plotY to it.
|
||||
if (Settings.Schematics.PASTE_ON_TOP) {
|
||||
plotY = PLOT_HEIGHT - getMinGenHeight();
|
||||
} else {
|
||||
plotY = getMinBuildHeight() - getMinGenHeight();
|
||||
}
|
||||
}
|
||||
} else if (!Settings.Schematics.PASTE_ROAD_ON_TOP) {
|
||||
if (SCHEM_Y == getMinGenHeight()) { // Only possible if plot schematic is enabled
|
||||
// Plot is still the lowest schematic, normalize roadY to it
|
||||
roadY = getMinBuildHeight() - getMinGenHeight();
|
||||
} else if (schematic3 != null) {
|
||||
SCHEM_Y = getMinBuildHeight();
|
||||
roadY = 0;// Road is the lowest schematic
|
||||
roadY = 0;
|
||||
SCHEM_Y = getMinGenHeight();
|
||||
if (schematic3 != null) {
|
||||
if (Settings.Schematics.PASTE_ON_TOP) {
|
||||
// Road is the lowest schematic. Normalize plotY to it.
|
||||
plotY = PLOT_HEIGHT - getMinBuildHeight();
|
||||
plotY = PLOT_HEIGHT - SCHEM_Y;
|
||||
}
|
||||
maxSchematicHeight = Math.max(maxSchematicHeight, plotY + plotSchemHeight);
|
||||
}
|
||||
} else {
|
||||
roadY = minRoadWall - SCHEM_Y;
|
||||
maxSchematicHeight = Math.max(maxSchematicHeight, roadY + roadSchemHeight);
|
||||
}
|
||||
}
|
||||
int maxSchematicHeight = Math.max(plotY + plotSchemHeight, roadY + roadSchemHeight);
|
||||
|
||||
if (schematic3 != null) {
|
||||
this.PLOT_SCHEMATIC = true;
|
||||
@ -554,4 +549,24 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
||||
return this.root;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the y value where the plot schematic should be pasted from.
|
||||
*
|
||||
* @return plot schematic y start value
|
||||
* @since 7.0.0
|
||||
*/
|
||||
public int getPlotYStart() {
|
||||
return SCHEM_Y + plotY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the y value where the road schematic should be pasted from.
|
||||
*
|
||||
* @return road schematic y start value
|
||||
* @since 7.0.0
|
||||
*/
|
||||
public int getRoadYStart() {
|
||||
return SCHEM_Y + roadY;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -529,7 +529,7 @@ public class HybridUtils {
|
||||
Math.min(plotworld.PLOT_HEIGHT, Math.min(plotworld.WALL_HEIGHT, plotworld.ROAD_HEIGHT)) : plotworld.ROAD_HEIGHT;
|
||||
int sx = bot.getX() - plotworld.ROAD_WIDTH + 1;
|
||||
int sz = bot.getZ() + 1;
|
||||
int sy = Settings.Schematics.PASTE_ROAD_ON_TOP ? schemY : plot.getArea().getMinBuildHeight();
|
||||
int sy = Settings.Schematics.PASTE_ROAD_ON_TOP ? schemY : plot.getArea().getMinGenHeight();
|
||||
int ex = bot.getX();
|
||||
int ez = top.getZ();
|
||||
int ey = get_ey(plotworld, queue, sx, ex, sz, ez, sy);
|
||||
@ -668,7 +668,7 @@ public class HybridUtils {
|
||||
}
|
||||
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 minY = plotWorld.getRoadYStart();
|
||||
int maxDy = Math.max(extend, blocks.length);
|
||||
for (int dy = 0; dy < maxDy; dy++) {
|
||||
if (dy > blocks.length - 1) {
|
||||
|
@ -46,7 +46,7 @@ public abstract class IndependentPlotGenerator {
|
||||
* @param result Queue to write to
|
||||
* @param settings PlotArea (settings)
|
||||
* @param biomes If biomes should be generated
|
||||
* @since TODO
|
||||
* @since 7.0.0
|
||||
*/
|
||||
public abstract void generateChunk(ZeroedDelegateScopedQueueCoordinator result, PlotArea settings, boolean biomes);
|
||||
|
||||
@ -55,7 +55,7 @@ public abstract class IndependentPlotGenerator {
|
||||
*
|
||||
* @param result Queue to write to
|
||||
* @param setting PlotArea (settings)
|
||||
* @since TODO
|
||||
* @since 7.0.0
|
||||
*/
|
||||
public void populateChunk(ZeroedDelegateScopedQueueCoordinator result, PlotArea setting) {
|
||||
}
|
||||
@ -108,7 +108,7 @@ public abstract class IndependentPlotGenerator {
|
||||
* @param y World y position
|
||||
* @param z World z position
|
||||
* @return Biome type to be generated
|
||||
* @since TODO
|
||||
* @since 7.0.0
|
||||
*/
|
||||
public abstract BiomeType getBiome(PlotArea settings, int x, int y, int z);
|
||||
|
||||
|
@ -60,6 +60,19 @@ public final class UncheckedWorldLocation extends Location {
|
||||
return new UncheckedWorldLocation(world, x, y, z);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a new location with yaw and pitch equal to 0
|
||||
*
|
||||
* @param world World
|
||||
* @param loc Coordinates
|
||||
* @return New location
|
||||
* @since TODO
|
||||
*/
|
||||
@DoNotUse
|
||||
public static @NonNull UncheckedWorldLocation at(final @NonNull String world, BlockVector3 loc) {
|
||||
return new UncheckedWorldLocation(world, loc.getX(), loc.getY(), loc.getZ());
|
||||
}
|
||||
|
||||
@Override
|
||||
@DoNotUse
|
||||
public @NonNull String getWorldName() {
|
||||
|
@ -200,7 +200,8 @@ public enum Permission implements ComponentLike {
|
||||
PERMISSION_RATE("plots.rate"),
|
||||
PERMISSION_ADMIN_FLIGHT("plots.admin.flight"),
|
||||
PERMISSION_ADMIN_COMPONENTS_OTHER("plots.admin.component.other"),
|
||||
PERMISSION_ADMIN_BYPASS_BORDER("plots.admin.border.bypass");
|
||||
PERMISSION_ADMIN_BYPASS_BORDER("plots.admin.border.bypass"),
|
||||
PERMISSION_ADMIN_BYPASS_ECON("plots.admin.econ.bypass");
|
||||
//</editor-fold>
|
||||
|
||||
private final String text;
|
||||
|
@ -180,8 +180,7 @@ public abstract class PlotArea implements ComponentLike {
|
||||
this.worldConfiguration = worldConfiguration;
|
||||
}
|
||||
|
||||
private static Collection<PlotFlag<?, ?>> parseFlags(List<String> flagStrings) {
|
||||
final Collection<PlotFlag<?, ?>> flags = new ArrayList<>();
|
||||
private static void parseFlags(FlagContainer flagContainer, List<String> flagStrings) {
|
||||
for (final String key : flagStrings) {
|
||||
final String[] split;
|
||||
if (key.contains(";")) {
|
||||
@ -193,7 +192,7 @@ public abstract class PlotArea implements ComponentLike {
|
||||
GlobalFlagContainer.getInstance().getFlagFromString(split[0]);
|
||||
if (flagInstance != null) {
|
||||
try {
|
||||
flags.add(flagInstance.parse(split[1]));
|
||||
flagContainer.addFlag(flagInstance.parse(split[1]));
|
||||
} catch (final FlagParseException e) {
|
||||
LOGGER.warn(
|
||||
"Failed to parse default flag with key '{}' and value '{}'. "
|
||||
@ -204,9 +203,10 @@ public abstract class PlotArea implements ComponentLike {
|
||||
);
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else {
|
||||
flagContainer.addUnknownFlag(split[0], split[1]);
|
||||
}
|
||||
}
|
||||
return flags;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@ -405,7 +405,7 @@ public abstract class PlotArea implements ComponentLike {
|
||||
}
|
||||
}
|
||||
}
|
||||
this.getFlagContainer().addAll(parseFlags(flags));
|
||||
parseFlags(this.getFlagContainer(), flags);
|
||||
ConsolePlayer.getConsole().sendMessage(
|
||||
TranslatableCaption.of("flags.area_flags"),
|
||||
TagResolver.resolver("flags", Tag.inserting(Component.text(flags.toString())))
|
||||
@ -427,7 +427,7 @@ public abstract class PlotArea implements ComponentLike {
|
||||
}
|
||||
}
|
||||
this.roadFlags = roadflags.size() > 0;
|
||||
this.getRoadFlagContainer().addAll(parseFlags(roadflags));
|
||||
parseFlags(this.getRoadFlagContainer(), roadflags);
|
||||
ConsolePlayer.getConsole().sendMessage(
|
||||
TranslatableCaption.of("flags.road_flags"),
|
||||
TagResolver.resolver("flags", Tag.inserting(Component.text(roadflags.toString())))
|
||||
@ -657,9 +657,9 @@ public abstract class PlotArea implements ComponentLike {
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("height.height_limit"),
|
||||
TagResolver.builder()
|
||||
.tag("minHeight", Tag.inserting(Component.text(minBuildHeight)))
|
||||
.tag("minheight", Tag.inserting(Component.text(minBuildHeight)))
|
||||
.tag(
|
||||
"maxHeight",
|
||||
"maxheight",
|
||||
Tag.inserting(Component.text(maxBuildHeight))
|
||||
).build()
|
||||
);
|
||||
|
@ -91,6 +91,7 @@ import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.PveFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.PvpFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.RedstoneFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.SculkSensorInteractFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.SnowFormFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.SnowMeltFlag;
|
||||
@ -172,6 +173,7 @@ public final class GlobalFlagContainer extends FlagContainer {
|
||||
this.addFlag(MobBreakFlag.MOB_BREAK_FALSE);
|
||||
this.addFlag(MobPlaceFlag.MOB_PLACE_FALSE);
|
||||
this.addFlag(MiscInteractFlag.MISC_INTERACT_FALSE);
|
||||
this.addFlag(SculkSensorInteractFlag.SCULK_SENSOR_INTERACT_FALSE);
|
||||
this.addFlag(MiscPlaceFlag.MISC_PLACE_FALSE);
|
||||
this.addFlag(MycelGrowFlag.MYCEL_GROW_TRUE);
|
||||
this.addFlag(NotifyEnterFlag.NOTIFY_ENTER_FALSE);
|
||||
|
@ -88,7 +88,7 @@ public abstract class PlotFlag<T, F extends PlotFlag<T, F>> {
|
||||
* Gets the flag name as a Kyori {@link Component}
|
||||
*
|
||||
* @see #getFlagName(Class)
|
||||
* @since TODO
|
||||
* @since 7.0.0
|
||||
*/
|
||||
public static <T, F extends PlotFlag<T, F>> Component getFlagNameComponent(Class<F> flagClass) {
|
||||
return Component.text(getFlagName(flagClass));
|
||||
|
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* PlotSquared, a land and world management plugin for Minecraft.
|
||||
* Copyright (C) IntellectualSites <https://intellectualsites.com>
|
||||
* Copyright (C) IntellectualSites team and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.plotsquared.core.plot.flag.implementations;
|
||||
|
||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||
import com.plotsquared.core.plot.flag.types.BooleanFlag;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
|
||||
public class SculkSensorInteractFlag extends BooleanFlag<SculkSensorInteractFlag> {
|
||||
|
||||
public static final SculkSensorInteractFlag SCULK_SENSOR_INTERACT_TRUE = new SculkSensorInteractFlag(true);
|
||||
public static final SculkSensorInteractFlag SCULK_SENSOR_INTERACT_FALSE = new SculkSensorInteractFlag(false);
|
||||
|
||||
private SculkSensorInteractFlag(boolean value) {
|
||||
super(value, TranslatableCaption.of("flags.flag_description_sculk_sensor_interact"));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SculkSensorInteractFlag flagOf(@NonNull Boolean value) {
|
||||
return value ? SCULK_SENSOR_INTERACT_TRUE : SCULK_SENSOR_INTERACT_FALSE;
|
||||
}
|
||||
|
||||
}
|
@ -29,17 +29,17 @@ import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
@Singleton
|
||||
public class DefaultPlotAreaManager implements PlotAreaManager {
|
||||
|
||||
final PlotArea[] noPlotAreas = new PlotArea[0];
|
||||
private final Map<String, PlotWorld> plotWorlds = new HashMap<>();
|
||||
private final Map<String, PlotWorld> plotWorlds = new ConcurrentHashMap<>();
|
||||
|
||||
@Override
|
||||
public @NonNull PlotArea[] getAllPlotAreas() {
|
||||
|
@ -111,7 +111,7 @@ public interface PlotAreaManager {
|
||||
*
|
||||
* @param worldName Name of the world to add
|
||||
* @return {@code true} if successful, {@code false} if world already existed
|
||||
* @since TODO
|
||||
* @since 7.0.0
|
||||
*/
|
||||
boolean addWorld(@NonNull String worldName);
|
||||
|
||||
|
@ -66,7 +66,7 @@ public abstract class QueueCoordinator {
|
||||
* @param x chunk x coordinate
|
||||
* @param z chunk z coordinate
|
||||
* @return a new {@link ZeroedDelegateScopedQueueCoordinator}
|
||||
* @since TODO
|
||||
* @since 7.0.0
|
||||
*/
|
||||
public ZeroedDelegateScopedQueueCoordinator getForChunk(int x, int z, int minY, int maxY) {
|
||||
int bx = x << 4;
|
||||
|
@ -32,7 +32,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
* zero in the x and z directions, i.e. starting from 0,0. An offset of the minimum point of the region will then be applied to
|
||||
* x and z.
|
||||
*
|
||||
* @since TODO
|
||||
* @since 7.0.0
|
||||
*/
|
||||
public class ZeroedDelegateScopedQueueCoordinator extends DelegateQueueCoordinator {
|
||||
|
||||
@ -50,7 +50,7 @@ public class ZeroedDelegateScopedQueueCoordinator extends DelegateQueueCoordinat
|
||||
/**
|
||||
* Create a new ScopedQueueCoordinator instance that delegates to a given QueueCoordinator. Locations are inclusive.
|
||||
*
|
||||
* @since TODO
|
||||
* @since 7.0.0
|
||||
*/
|
||||
public ZeroedDelegateScopedQueueCoordinator(@Nullable QueueCoordinator parent, @NonNull Location min, @NonNull Location max) {
|
||||
super(parent);
|
||||
|
@ -36,7 +36,7 @@ public abstract class ChunkManager {
|
||||
private static final Map<BlockVector2, RunnableVal<ZeroedDelegateScopedQueueCoordinator>> addChunks = new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* @since TODO
|
||||
* @since 7.0.0
|
||||
*/
|
||||
public static void setChunkInPlotArea(
|
||||
RunnableVal<ZeroedDelegateScopedQueueCoordinator> force,
|
||||
@ -76,7 +76,7 @@ public abstract class ChunkManager {
|
||||
}
|
||||
|
||||
/**
|
||||
* @since TODO
|
||||
* @since 7.0.0
|
||||
*/
|
||||
public static boolean preProcessChunk(BlockVector2 loc, ZeroedDelegateScopedQueueCoordinator queue) {
|
||||
final RunnableVal<ZeroedDelegateScopedQueueCoordinator> forceChunk = forceChunks.get(loc);
|
||||
@ -89,7 +89,7 @@ public abstract class ChunkManager {
|
||||
}
|
||||
|
||||
/**
|
||||
* @since TODO
|
||||
* @since 7.0.0
|
||||
*/
|
||||
public static boolean postProcessChunk(BlockVector2 loc, ZeroedDelegateScopedQueueCoordinator queue) {
|
||||
final RunnableVal<ZeroedDelegateScopedQueueCoordinator> addChunk = forceChunks.get(loc);
|
||||
|
@ -27,7 +27,7 @@ import java.util.Collection;
|
||||
/**
|
||||
* A utility class for modifying components.
|
||||
*
|
||||
* @since TODO
|
||||
* @since 7.0.0
|
||||
*/
|
||||
public class ComponentHelper {
|
||||
|
||||
@ -37,7 +37,7 @@ public class ComponentHelper {
|
||||
* @param components The components to join
|
||||
* @param delimiter The delimiter to use between the components
|
||||
* @return The joined components
|
||||
* @since TODO
|
||||
* @since 7.0.0
|
||||
*/
|
||||
public static ComponentLike join(Collection<? extends ComponentLike> components, Component delimiter) {
|
||||
return join(components.toArray(ComponentLike[]::new), delimiter);
|
||||
@ -49,7 +49,7 @@ public class ComponentHelper {
|
||||
* @param components The components to join
|
||||
* @param delimiter The delimiter to use between the components
|
||||
* @return The joined components
|
||||
* @since TODO
|
||||
* @since 7.0.0
|
||||
*/
|
||||
public static Component join(ComponentLike[] components, Component delimiter) {
|
||||
TextComponent.Builder builder = Component.text();
|
||||
|
@ -41,7 +41,7 @@
|
||||
"cluster.cluster_deleted": "<prefix><dark_aqua>Successfully deleted the cluster </dark_aqua><gold><cluster></gold><dark_aqua>.</dark_aqua>",
|
||||
"cluster.cluster_resized": "<prefix><dark_aqua>Successfully resized the cluster.</dark_aqua>",
|
||||
"cluster.cluster_added_user": "<prefix><dark_aqua>Successfully added user to the cluster.</dark_aqua>",
|
||||
"cluster.cannot_kick_player": "<prefix><red>You cannot kick that player: </red><gray><name></gray>",
|
||||
"cluster.cannot_kick_player": "<prefix><red>You cannot kick the player <gray><name></gray>.</red>",
|
||||
"cluster.cluster_invited": "<prefix><gold>You have been invited to the following cluster: </gold><gray><cluster>.</gray>",
|
||||
"cluster.cluster_removed": "<prefix><gold>You have been removed from cluster: </gold><gray><cluster>.</gray>",
|
||||
"cluster.cluster_kicked_user": "<prefix><dark_aqua>Successfully kicked the user from the cluster.</dark_aqua>",
|
||||
@ -411,6 +411,8 @@
|
||||
"deny.no_enter": "<prefix><red>You are denied from the plot <red><gold><plot></gold><red> and therefore not allowed to enter.</red>",
|
||||
"deny.you_got_denied": "<prefix><red>You are denied from the plot you were previously on, and got teleported to spawn.</red>",
|
||||
"deny.cant_remove_owner": "<prefix><red>You can't remove the plot owner.</red>",
|
||||
"kick.player_not_in_plot": "<prefix><red>The player <gray><player></gray> is not on this plot.</red>",
|
||||
"kick.cannot_kick_player": "<prefix><red>You cannot kick the player <gray><player></gray>.</red>",
|
||||
"kick.you_got_kicked": "<prefix><dark_aqua>You got kicked from the plot!</dark_aqua>",
|
||||
"trusted.trusted_added": "<prefix><dark_aqua>You successfully trusted a user to the plot.</dark_aqua>",
|
||||
"trusted.plot_removed_user": "<prefix><red>Plot <plot> of which you were added to has been deleted due to owner inactivity.</red>",
|
||||
@ -486,7 +488,7 @@
|
||||
"single.get_position": "<prefix><gold>Go to the first corner and use: <gray><command> to create position 1.</gold>",
|
||||
"single.delete_world_region": "<prefix><red>Stop the server and delete: <world>/region.</red>",
|
||||
"single.regeneration_complete": "<prefix><gold>Regeneration complete.</gold>",
|
||||
"single.worldcreation_location": "<prefix><gold>World creation settings may be stored in multiple locations:</gold>\n<dark_gray> - </dark_gray><gray>bukkit.yml in your server's root folder.</gray>\n<dark_gray> - </dark_gray><gray>PlotSquared's settings.yml</gray>\n<dark_gray> - </dark_gray><gray>Hyperverse's worlds.yml (or any world management plugin)</gray>\n<dark_gray> - </dark_gray><red>Stop the server and delete it from these locations.</red>",
|
||||
"single.worldcreation_location": "<prefix><gold>World creation settings may be stored in multiple locations:</gold>\n<dark_gray> - </dark_gray><gray>bukkit.yml in your server's root folder.</gray>\n<dark_gray> - </dark_gray><gray>PlotSquared's worlds.yml</gray>\n<dark_gray> - </dark_gray><gray>Hyperverse's worlds.yml (or any world management plugin)</gray>\n<dark_gray> - </dark_gray><red>Stop the server and delete it from these locations.</red>",
|
||||
"legacyconfig.legacy_config_found": "<prefix><green>A legacy configuration file was detected. Conversion will be attempted.</green>",
|
||||
"legacyconfig.legacy_config_backup": "<prefix><gold>A copy of worlds.yml has been saved in the file worlds.yml.old</gold>.",
|
||||
"legacyconfig.legacy_config_replaced": "<prefix><gray><value1> has been replaced with <value2></gray>",
|
||||
@ -572,6 +574,7 @@
|
||||
"flags.flag_description_misc_break": "<gray>Set to `true` to allow guests to break miscellaneous items.</gray>",
|
||||
"flags.flag_description_misc_cap": "<gray>Set to an integer value to limit the amount of miscellaneous entities on the plot.</gray>",
|
||||
"flags.flag_description_misc_interact": "<gray>Set to `true` to allow guests to interact with miscellaneous items.</gray>",
|
||||
"flags.flag_description_sculk_sensor_interact": "<gray>Set to `true` to allow guests to interact with sculk sensors.</gray>",
|
||||
"flags.flag_description_misc_place": "<gray>Set to `true` to allow guests to place miscellaneous items.</gray>",
|
||||
"flags.flag_description_mob_break": "<gray>Set to `true` to allow mobs to break blocks within the plot.</gray>",
|
||||
"flags.flag_description_mob_cap": "<gray>Set to an integer value to limit the amount of mobs on the plot.</gray>",
|
||||
|
@ -27,16 +27,16 @@ is to provide a lag-free and smooth experience.
|
||||
|
||||
* [Download](https://www.spigotmc.org/resources/77506/)
|
||||
* [Discord](https://discord.gg/intellectualsites)
|
||||
* [Wiki](https://intellectualsites.github.io/plotsquared-documentation/)
|
||||
* [Wiki](https://intellectualsites.gitbook.io/plotsquared/)
|
||||
* [Issues](https://github.com/IntellectualSites/PlotSquared/issues)
|
||||
* [Translations](https://intellectualsites.crowdin.com/plotsquared/)
|
||||
* [Contributing](https://github.com/IntellectualSites/.github/blob/main/CONTRIBUTING.md)
|
||||
|
||||
### Developer Resources
|
||||
|
||||
* [API Documentation](https://intellectualsites.github.io/plotsquared-documentation/api/api-documentation)
|
||||
* [Event API](https://intellectualsites.github.io/plotsquared-documentation/api/event-api)
|
||||
* [Flag API](https://intellectualsites.github.io/plotsquared-documentation/api/flag-api)
|
||||
* [API Documentation](https://intellectualsites.gitbook.io/plotsquared/api/api-documentation)
|
||||
* [Event API](https://intellectualsites.gitbook.io/plotsquared/api/event-api)
|
||||
* [Flag API](https://intellectualsites.gitbook.io/plotsquared/api/flag-api)
|
||||
|
||||
# Official Addons
|
||||
|
||||
|
@ -20,7 +20,7 @@ plugins {
|
||||
id("xyz.jpenilla.run-paper") version "2.1.0"
|
||||
}
|
||||
|
||||
group = "com.plotsquared"
|
||||
group = "com.intellectualsites.plotsquared"
|
||||
version = "7.0.0-SNAPSHOT"
|
||||
|
||||
if (!File("$rootDir/.git").exists()) {
|
||||
@ -77,7 +77,7 @@ subprojects {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(platform("com.intellectualsites.bom:bom-newest:1.27"))
|
||||
implementation(platform("com.intellectualsites.bom:bom-newest:1.31"))
|
||||
}
|
||||
|
||||
dependencies {
|
||||
@ -210,7 +210,7 @@ subprojects {
|
||||
}
|
||||
|
||||
nexusPublishing {
|
||||
repositories {
|
||||
this.repositories {
|
||||
sonatype {
|
||||
nexusUrl.set(URI.create("https://s01.oss.sonatype.org/service/local/"))
|
||||
snapshotRepositoryUrl.set(URI.create("https://s01.oss.sonatype.org/content/repositories/snapshots/"))
|
||||
@ -222,12 +222,12 @@ tasks.getByName<Jar>("jar") {
|
||||
enabled = false
|
||||
}
|
||||
|
||||
val supportedVersions = listOf("1.16.5", "1.17", "1.17.1", "1.18.2", "1.19", "1.19.1", "1.19.2", "1.19.3", "1.19.4")
|
||||
val supportedVersions = listOf("1.16.5", "1.17", "1.17.1", "1.18.2", "1.19", "1.19.1", "1.19.2", "1.19.3", "1.19.4", "1.20")
|
||||
tasks {
|
||||
supportedVersions.forEach {
|
||||
register<RunServer>("runServer-$it") {
|
||||
minecraftVersion(it)
|
||||
pluginJars(*project(":PlotSquared-Bukkit").getTasksByName("shadowJar", false).map { (it as Jar).archiveFile }
|
||||
pluginJars(*project(":plotsquared-bukkit").getTasksByName("shadowJar", false).map { (it as Jar).archiveFile }
|
||||
.toTypedArray())
|
||||
jvmArgs("-DPaper.IgnoreJavaVersion=true", "-Dcom.mojang.eula.agree=true")
|
||||
group = "run paper"
|
||||
|
@ -1,13 +1,13 @@
|
||||
[versions]
|
||||
# Platform expectations
|
||||
guice = "5.1.0"
|
||||
guice = "7.0.0"
|
||||
spotbugs = "4.7.3"
|
||||
|
||||
# Plugins
|
||||
worldedit = "7.2.14"
|
||||
worldedit = "7.2.15"
|
||||
placeholderapi = "2.11.3"
|
||||
luckperms = "5.4"
|
||||
essentialsx = "2.19.7"
|
||||
essentialsx = "2.20.0"
|
||||
mvdwapi = "3.1.1"
|
||||
|
||||
# Third party
|
||||
@ -18,9 +18,9 @@ arkitektonika = "2.1.2"
|
||||
squirrelid = "0.3.2"
|
||||
|
||||
# Gradle plugins
|
||||
shadow = "7.1.2"
|
||||
shadow = "8.1.1"
|
||||
grgit = "4.1.1"
|
||||
spotless = "6.18.0"
|
||||
spotless = "6.20.0"
|
||||
nexus = "1.3.0"
|
||||
|
||||
[libraries]
|
||||
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
3
gradle/wrapper/gradle-wrapper.properties
vendored
3
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,6 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
16
gradlew
vendored
16
gradlew
vendored
@ -85,9 +85,6 @@ done
|
||||
APP_BASE_NAME=${0##*/}
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
|
||||
@ -133,10 +130,13 @@ location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD=java
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
if ! command -v java >/dev/null 2>&1
|
||||
then
|
||||
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
@ -144,7 +144,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
# shellcheck disable=SC3045
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
@ -152,7 +152,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
'' | soft) :;; #(
|
||||
*)
|
||||
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
# shellcheck disable=SC3045
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
@ -197,6 +197,10 @@ if "$cygwin" || "$msys" ; then
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Collect all arguments for the java command;
|
||||
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||
# shell script including quotes and variable substitutions, so put them in
|
||||
|
@ -1,4 +1,4 @@
|
||||
Javadocs generated for
|
||||
<a href="https://github.com/IntellectualSites/PlotSquared/" rel="noopener nofollow noreferrer" target="_blank"> PlotSquared</a> |
|
||||
<a href="https://intellectualsites.github.io/plotsquared-documentation/" rel="noopener nofollow noreferrer"> Documentation </a> |
|
||||
<a href="https://intellectualsites.gitbook.io/plotsquared/" rel="noopener nofollow noreferrer"> Documentation </a> |
|
||||
Visit us on our <a href="https://discord.gg/intellectualsites" rel="noopener nofollow noreferrer"> Discord server</a> :)
|
||||
|
@ -2,7 +2,7 @@ rootProject.name = "PlotSquared"
|
||||
|
||||
include("Core", "Bukkit")
|
||||
|
||||
project(":Core").name = "PlotSquared-Core"
|
||||
project(":Bukkit").name = "PlotSquared-Bukkit"
|
||||
project(":Core").name = "plotsquared-core"
|
||||
project(":Bukkit").name = "plotsquared-bukkit"
|
||||
|
||||
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
|
||||
|
Reference in New Issue
Block a user