mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2025-07-03 06:04:43 +02:00
Compare commits
16 Commits
fix/missin
...
fix/v7/def
Author | SHA1 | Date | |
---|---|---|---|
ae270074f2 | |||
1ddc19ff69 | |||
a6d436e841 | |||
9b0b39ac2e | |||
638f0bd078 | |||
c27b838dad | |||
e0cb2949df | |||
59be582c28 | |||
f6cbb3792f | |||
a68918f830 | |||
1a7ded864e | |||
cbc8bc8879 | |||
21f79d1c13 | |||
293d7acf2d | |||
d876d3722a | |||
dffb7672ff |
2
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
2
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@ -7,7 +7,7 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
value: |
|
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.
|
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/).
|
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!
|
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
|
- type: dropdown
|
||||||
|
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
|
url: https://discord.gg/intellectualsites
|
||||||
about: Our support Discord, please ask questions and seek support here.
|
about: Our support Discord, please ask questions and seek support here.
|
||||||
- name: PlotSquared Wiki
|
- 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.
|
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:
|
attributes:
|
||||||
value: |
|
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.
|
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
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
|
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@ -42,7 +42,7 @@ jobs:
|
|||||||
ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }}
|
ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }}
|
||||||
ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.SONATYPE_PASSWORD }}
|
ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.SONATYPE_PASSWORD }}
|
||||||
- name: Publish core javadoc
|
- name: Publish core javadoc
|
||||||
# if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
|
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
|
||||||
uses: cpina/github-action-push-to-another-repository@main
|
uses: cpina/github-action-push-to-another-repository@main
|
||||||
env:
|
env:
|
||||||
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
||||||
@ -54,7 +54,7 @@ jobs:
|
|||||||
target-branch: main
|
target-branch: main
|
||||||
target-directory: v7/core
|
target-directory: v7/core
|
||||||
- name: Publish bukkit javadoc
|
- name: Publish bukkit javadoc
|
||||||
# if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
|
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
|
||||||
uses: cpina/github-action-push-to-another-repository@main
|
uses: cpina/github-action-push-to-another-repository@main
|
||||||
env:
|
env:
|
||||||
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
||||||
|
@ -26,6 +26,7 @@ import com.plotsquared.core.plot.Plot;
|
|||||||
import com.plotsquared.core.plot.PlotArea;
|
import com.plotsquared.core.plot.PlotArea;
|
||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
|
import com.plotsquared.core.plot.world.PlotAreaManager;
|
||||||
import com.plotsquared.core.plot.world.SinglePlotArea;
|
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.RefClass;
|
||||||
import com.plotsquared.core.util.ReflectionUtils.RefField;
|
import com.plotsquared.core.util.ReflectionUtils.RefField;
|
||||||
import com.plotsquared.core.util.ReflectionUtils.RefMethod;
|
import com.plotsquared.core.util.ReflectionUtils.RefMethod;
|
||||||
@ -64,9 +65,11 @@ public class ChunkListener implements Listener {
|
|||||||
private final PlotAreaManager plotAreaManager;
|
private final PlotAreaManager plotAreaManager;
|
||||||
private final int version;
|
private final int version;
|
||||||
|
|
||||||
|
private RefMethod methodSetUnsaved;
|
||||||
private RefMethod methodGetHandleChunk;
|
private RefMethod methodGetHandleChunk;
|
||||||
private RefMethod methodGetHandleWorld;
|
private RefMethod methodGetHandleWorld;
|
||||||
private RefField mustSave;
|
private RefField mustNotSave;
|
||||||
|
private Object objChunkStatusFull = null;
|
||||||
/*
|
/*
|
||||||
private RefMethod methodGetFullChunk;
|
private RefMethod methodGetFullChunk;
|
||||||
private RefMethod methodGetBukkitChunk;
|
private RefMethod methodGetBukkitChunk;
|
||||||
@ -79,7 +82,6 @@ public class ChunkListener implements Listener {
|
|||||||
*/
|
*/
|
||||||
private Chunk lastChunk;
|
private Chunk lastChunk;
|
||||||
private boolean ignoreUnload = false;
|
private boolean ignoreUnload = false;
|
||||||
private boolean isTrueForNotSave = true;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public ChunkListener(final @NonNull PlotAreaManager plotAreaManager) {
|
public ChunkListener(final @NonNull PlotAreaManager plotAreaManager) {
|
||||||
@ -90,22 +92,27 @@ public class ChunkListener implements Listener {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
RefClass classCraftWorld = getRefClass("{cb}.CraftWorld");
|
RefClass classCraftWorld = getRefClass("{cb}.CraftWorld");
|
||||||
this.methodGetHandleWorld = classCraftWorld.getMethod("getHandle");
|
|
||||||
RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
|
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 {
|
try {
|
||||||
if (version < 17) {
|
if (version < 17) {
|
||||||
RefClass classChunk = getRefClass("{nms}.Chunk");
|
RefClass classChunk = getRefClass("{nms}.Chunk");
|
||||||
if (version == 13) {
|
this.mustNotSave = classChunk.getField("mustNotSave");
|
||||||
this.mustSave = classChunk.getField("mustSave");
|
|
||||||
this.isTrueForNotSave = false;
|
|
||||||
} else {
|
|
||||||
this.mustSave = classChunk.getField("mustNotSave");
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk");
|
RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk");
|
||||||
this.mustSave = classChunk.getField("mustNotSave");
|
this.mustNotSave = classChunk.getField("mustNotSave");
|
||||||
|
|
||||||
}
|
}
|
||||||
} catch (NoSuchFieldException e) {
|
} catch (NoSuchFieldException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -167,10 +174,13 @@ public class ChunkListener implements Listener {
|
|||||||
if (safe && shouldSave(world, chunk.getX(), chunk.getZ())) {
|
if (safe && shouldSave(world, chunk.getX(), chunk.getZ())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Object c = this.methodGetHandleChunk.of(chunk).call();
|
Object c = objChunkStatusFull != null
|
||||||
RefField.RefExecutor field = this.mustSave.of(c);
|
? this.methodGetHandleChunk.of(chunk).call(objChunkStatusFull)
|
||||||
if ((Boolean) field.get() != isTrueForNotSave) {
|
: this.methodGetHandleChunk.of(chunk).call();
|
||||||
field.set(isTrueForNotSave);
|
RefField.RefExecutor field = this.mustNotSave.of(c);
|
||||||
|
methodSetUnsaved.of(c).call(false);
|
||||||
|
if (!((Boolean) field.get())) {
|
||||||
|
field.set(true);
|
||||||
if (chunk.isLoaded()) {
|
if (chunk.isLoaded()) {
|
||||||
ignoreUnload = true;
|
ignoreUnload = true;
|
||||||
chunk.unload(false);
|
chunk.unload(false);
|
||||||
|
@ -152,7 +152,8 @@ public class EntityEventListener implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL",
|
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",
|
||||||
|
"DUPLICATION", "FROZEN", "SPELL" -> {
|
||||||
if (!area.isMobSpawning()) {
|
if (!area.isMobSpawning()) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
|
@ -31,45 +31,39 @@ import org.bukkit.event.Listener;
|
|||||||
import org.bukkit.event.world.ChunkEvent;
|
import org.bukkit.event.world.ChunkEvent;
|
||||||
import org.bukkit.event.world.ChunkLoadEvent;
|
import org.bukkit.event.world.ChunkLoadEvent;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
import static com.plotsquared.core.util.ReflectionUtils.getRefClass;
|
import static com.plotsquared.core.util.ReflectionUtils.getRefClass;
|
||||||
|
|
||||||
public class SingleWorldListener implements Listener {
|
public class SingleWorldListener implements Listener {
|
||||||
|
|
||||||
private final Method methodGetHandleChunk;
|
private final Method methodSetUnsaved;
|
||||||
private Field shouldSave = null;
|
private Method methodGetHandleChunk;
|
||||||
|
private Object objChunkStatusFull = null;
|
||||||
|
|
||||||
public SingleWorldListener() throws Exception {
|
public SingleWorldListener() throws Exception {
|
||||||
ReflectionUtils.RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
|
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 {
|
try {
|
||||||
if (PlotSquared.platform().serverVersion()[1] < 17) {
|
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle").getRealMethod();
|
||||||
ReflectionUtils.RefClass classChunk = getRefClass("{nms}.Chunk");
|
} catch (NoSuchMethodException ignored) {
|
||||||
if (PlotSquared.platform().serverVersion()[1] == 13) {
|
try {
|
||||||
this.shouldSave = classChunk.getField("mustSave").getRealField();
|
ReflectionUtils.RefClass classChunkStatus = getRefClass("net.minecraft.world.level.chunk.ChunkStatus");
|
||||||
} else {
|
this.objChunkStatusFull = classChunkStatus.getRealClass().getField("n").get(null);
|
||||||
this.shouldSave = classChunk.getField("s").getRealField();
|
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle", classChunkStatus.getRealClass()).getRealMethod();
|
||||||
}
|
} catch (NoSuchMethodException ex) {
|
||||||
} else if (PlotSquared.platform().serverVersion()[1] == 17) {
|
throw new RuntimeException(ex);
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void markChunkAsClean(Chunk chunk) {
|
public void markChunkAsClean(Chunk chunk) {
|
||||||
try {
|
try {
|
||||||
Object nmsChunk = methodGetHandleChunk.invoke(chunk);
|
Object nmsChunk = objChunkStatusFull != null
|
||||||
if (shouldSave != null) {
|
? this.methodGetHandleChunk.invoke(chunk, objChunkStatusFull)
|
||||||
this.shouldSave.set(nmsChunk, false);
|
: this.methodGetHandleChunk.invoke(chunk);
|
||||||
}
|
methodSetUnsaved.invoke(nmsChunk, false);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@ -85,7 +79,12 @@ public class SingleWorldListener implements Listener {
|
|||||||
if (!SinglePlotArea.isSinglePlotWorld(name)) {
|
if (!SinglePlotArea.isSinglePlotWorld(name)) {
|
||||||
return;
|
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());
|
markChunkAsClean(event.getChunk());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ public class Merge extends SubCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (direction == null && (args[0].equalsIgnoreCase("all") || args[0]
|
if (direction == null && (args[0].equalsIgnoreCase("all") || args[0]
|
||||||
.equalsIgnoreCase("auto"))) {
|
.equalsIgnoreCase("auto")) && player.hasPermission(Permission.PERMISSION_MERGE_ALL)) {
|
||||||
direction = Direction.ALL;
|
direction = Direction.ALL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ public class PluginCmd extends SubCommand {
|
|||||||
player.sendMessage(StaticCaption.of(
|
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>"));
|
"<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(
|
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(
|
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>"));
|
"<gray>>> </gray><gold><bold>Discord<reset><gray>: </gray><gold><click:open_url:https://discord.gg/intellectualsites>https://discord.gg/intellectualsites</gold>"));
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
|
@ -194,7 +194,7 @@ public class Settings extends Config {
|
|||||||
public List<String> WORLDS = new ArrayList<>(Collections.singletonList("*"));
|
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 static final class CALIBRATION {
|
||||||
|
|
||||||
public int VARIETY = 0;
|
public int VARIETY = 0;
|
||||||
@ -214,7 +214,7 @@ public class Settings extends Config {
|
|||||||
|
|
||||||
|
|
||||||
@Comment({"Chunk processor related settings",
|
@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 {
|
public static class Chunk_Processor {
|
||||||
|
|
||||||
@Comment("Auto trim will not save chunks which aren't claimed")
|
@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")
|
@Comment("Always show explosion Particles, even if explosion flag is set to false")
|
||||||
public static boolean ALWAYS_SHOW_EXPLOSIONS = false;
|
public static boolean ALWAYS_SHOW_EXPLOSIONS = false;
|
||||||
@Comment({"Blocks that may not be used in plot components",
|
@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>
|
public static List<String>
|
||||||
INVALID_BLOCKS = Arrays.asList(
|
INVALID_BLOCKS = Arrays.asList(
|
||||||
// Acacia Stuff
|
// Acacia Stuff
|
||||||
@ -402,7 +402,7 @@ public class Settings extends Config {
|
|||||||
|
|
||||||
|
|
||||||
@Comment({"Schematic Settings",
|
@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 {
|
public static final class Schematics {
|
||||||
|
|
||||||
@Comment(
|
@Comment(
|
||||||
@ -531,7 +531,7 @@ public class Settings extends Config {
|
|||||||
|
|
||||||
|
|
||||||
@Comment({"Backup related settings",
|
@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 {
|
public static final class Backup {
|
||||||
|
|
||||||
@Comment("Automatically backup plots when destructive commands are performed, e.g. /plot clear")
|
@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
|
public static boolean
|
||||||
PERSISTENT_ROAD_REGEN = true;
|
PERSISTENT_ROAD_REGEN = true;
|
||||||
@Comment({"Enable the `/plot component` preset GUI",
|
@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;
|
public static boolean COMPONENT_PRESETS = true;
|
||||||
@Comment("Enable per user locale")
|
@Comment("Enable per user locale")
|
||||||
public static boolean PER_USER_LOCALE = false;
|
public static boolean PER_USER_LOCALE = false;
|
||||||
|
@ -265,7 +265,6 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
|
|
||||||
int worldGenHeight = getMaxGenHeight() - getMinGenHeight() + 1;
|
int worldGenHeight = getMaxGenHeight() - getMinGenHeight() + 1;
|
||||||
|
|
||||||
int maxSchematicHeight = 0;
|
|
||||||
int plotSchemHeight = 0;
|
int plotSchemHeight = 0;
|
||||||
|
|
||||||
// SCHEM_Y should be normalised to the plot "start" height
|
// SCHEM_Y should be normalised to the plot "start" height
|
||||||
@ -275,49 +274,41 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
SCHEM_Y = getMinGenHeight();
|
SCHEM_Y = getMinGenHeight();
|
||||||
plotY = 0;
|
plotY = 0;
|
||||||
} else if (!Settings.Schematics.PASTE_ON_TOP) {
|
} else if (!Settings.Schematics.PASTE_ON_TOP) {
|
||||||
SCHEM_Y = getMinBuildHeight();
|
SCHEM_Y = getMinGenHeight();
|
||||||
plotY = 0;
|
plotY = 0;
|
||||||
}
|
}
|
||||||
maxSchematicHeight = plotY + plotSchemHeight;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int roadSchemHeight;
|
int roadSchemHeight = 0;
|
||||||
|
|
||||||
if (schematic1 != null) {
|
if (schematic1 != null) {
|
||||||
roadSchemHeight = Math.max(
|
roadSchemHeight = Math.max(
|
||||||
schematic1.getClipboard().getDimensions().getY(),
|
schematic1.getClipboard().getDimensions().getY(),
|
||||||
schematic2.getClipboard().getDimensions().getY()
|
schematic2.getClipboard().getDimensions().getY()
|
||||||
);
|
);
|
||||||
maxSchematicHeight = Math.max(roadSchemHeight, maxSchematicHeight);
|
if (roadSchemHeight == worldGenHeight) {
|
||||||
if (maxSchematicHeight == worldGenHeight) {
|
|
||||||
SCHEM_Y = getMinGenHeight();
|
SCHEM_Y = getMinGenHeight();
|
||||||
roadY = 0; // Road is the lowest schematic
|
roadY = 0; // Road is the lowest schematic
|
||||||
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldGenHeight) {
|
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldGenHeight) {
|
||||||
// Road is the lowest schematic. Normalize plotY to it.
|
// Road is the lowest schematic. Normalize plotY to it.
|
||||||
if (Settings.Schematics.PASTE_ON_TOP) {
|
if (Settings.Schematics.PASTE_ON_TOP) {
|
||||||
plotY = PLOT_HEIGHT - getMinGenHeight();
|
plotY = PLOT_HEIGHT - getMinGenHeight();
|
||||||
} else {
|
|
||||||
plotY = getMinBuildHeight() - getMinGenHeight();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (!Settings.Schematics.PASTE_ROAD_ON_TOP) {
|
} else if (!Settings.Schematics.PASTE_ROAD_ON_TOP) {
|
||||||
if (SCHEM_Y == getMinGenHeight()) { // Only possible if plot schematic is enabled
|
roadY = 0;
|
||||||
// Plot is still the lowest schematic, normalize roadY to it
|
SCHEM_Y = getMinGenHeight();
|
||||||
roadY = getMinBuildHeight() - getMinGenHeight();
|
if (schematic3 != null) {
|
||||||
} else if (schematic3 != null) {
|
|
||||||
SCHEM_Y = getMinBuildHeight();
|
|
||||||
roadY = 0;// Road is the lowest schematic
|
|
||||||
if (Settings.Schematics.PASTE_ON_TOP) {
|
if (Settings.Schematics.PASTE_ON_TOP) {
|
||||||
// Road is the lowest schematic. Normalize plotY to it.
|
// 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 {
|
} else {
|
||||||
roadY = minRoadWall - SCHEM_Y;
|
roadY = minRoadWall - SCHEM_Y;
|
||||||
maxSchematicHeight = Math.max(maxSchematicHeight, roadY + roadSchemHeight);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
int maxSchematicHeight = Math.max(plotY + plotSchemHeight, roadY + roadSchemHeight);
|
||||||
|
|
||||||
if (schematic3 != null) {
|
if (schematic3 != null) {
|
||||||
this.PLOT_SCHEMATIC = true;
|
this.PLOT_SCHEMATIC = true;
|
||||||
@ -562,7 +553,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
* Get the y value where the plot schematic should be pasted from.
|
* Get the y value where the plot schematic should be pasted from.
|
||||||
*
|
*
|
||||||
* @return plot schematic y start value
|
* @return plot schematic y start value
|
||||||
* @since TODO
|
* @since 7.0.0
|
||||||
*/
|
*/
|
||||||
public int getPlotYStart() {
|
public int getPlotYStart() {
|
||||||
return SCHEM_Y + plotY;
|
return SCHEM_Y + plotY;
|
||||||
@ -572,7 +563,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
* Get the y value where the road schematic should be pasted from.
|
* Get the y value where the road schematic should be pasted from.
|
||||||
*
|
*
|
||||||
* @return road schematic y start value
|
* @return road schematic y start value
|
||||||
* @since TODO
|
* @since 7.0.0
|
||||||
*/
|
*/
|
||||||
public int getRoadYStart() {
|
public int getRoadYStart() {
|
||||||
return SCHEM_Y + roadY;
|
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;
|
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 sx = bot.getX() - plotworld.ROAD_WIDTH + 1;
|
||||||
int sz = bot.getZ() + 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 ex = bot.getX();
|
||||||
int ez = top.getZ();
|
int ez = top.getZ();
|
||||||
int ey = get_ey(plotworld, queue, sx, ex, sz, ez, sy);
|
int ey = get_ey(plotworld, queue, sx, ex, sz, ez, sy);
|
||||||
|
@ -66,7 +66,7 @@ public final class UncheckedWorldLocation extends Location {
|
|||||||
* @param world World
|
* @param world World
|
||||||
* @param loc Coordinates
|
* @param loc Coordinates
|
||||||
* @return New location
|
* @return New location
|
||||||
* @since 6.9.0
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
@DoNotUse
|
@DoNotUse
|
||||||
public static @NonNull UncheckedWorldLocation at(final @NonNull String world, BlockVector3 loc) {
|
public static @NonNull UncheckedWorldLocation at(final @NonNull String world, BlockVector3 loc) {
|
||||||
|
@ -45,6 +45,7 @@ public enum Permission implements ComponentLike {
|
|||||||
PERMISSION_ADMIN_ENTRY_FORCEFIELD("plots.admin.entry.forcefield"),
|
PERMISSION_ADMIN_ENTRY_FORCEFIELD("plots.admin.entry.forcefield"),
|
||||||
PERMISSION_ADMIN_COMMANDS_CHATSPY("plots.admin.command.chatspy"),
|
PERMISSION_ADMIN_COMMANDS_CHATSPY("plots.admin.command.chatspy"),
|
||||||
PERMISSION_MERGE("plots.merge"),
|
PERMISSION_MERGE("plots.merge"),
|
||||||
|
PERMISSION_MERGE_ALL("plots.merge.all"),
|
||||||
PERMISSION_MERGE_OTHER("plots.merge.other"),
|
PERMISSION_MERGE_OTHER("plots.merge.other"),
|
||||||
PERMISSION_MERGE_KEEP_ROAD("plots.merge.keeproad"),
|
PERMISSION_MERGE_KEEP_ROAD("plots.merge.keeproad"),
|
||||||
PERMISSION_ADMIN_CAPS_OTHER("plots.admin.caps.other"),
|
PERMISSION_ADMIN_CAPS_OTHER("plots.admin.caps.other"),
|
||||||
|
@ -180,8 +180,7 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
this.worldConfiguration = worldConfiguration;
|
this.worldConfiguration = worldConfiguration;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Collection<PlotFlag<?, ?>> parseFlags(List<String> flagStrings) {
|
private static void parseFlags(FlagContainer flagContainer, List<String> flagStrings) {
|
||||||
final Collection<PlotFlag<?, ?>> flags = new ArrayList<>();
|
|
||||||
for (final String key : flagStrings) {
|
for (final String key : flagStrings) {
|
||||||
final String[] split;
|
final String[] split;
|
||||||
if (key.contains(";")) {
|
if (key.contains(";")) {
|
||||||
@ -193,7 +192,7 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
GlobalFlagContainer.getInstance().getFlagFromString(split[0]);
|
GlobalFlagContainer.getInstance().getFlagFromString(split[0]);
|
||||||
if (flagInstance != null) {
|
if (flagInstance != null) {
|
||||||
try {
|
try {
|
||||||
flags.add(flagInstance.parse(split[1]));
|
flagContainer.addFlag(flagInstance.parse(split[1]));
|
||||||
} catch (final FlagParseException e) {
|
} catch (final FlagParseException e) {
|
||||||
LOGGER.warn(
|
LOGGER.warn(
|
||||||
"Failed to parse default flag with key '{}' and value '{}'. "
|
"Failed to parse default flag with key '{}' and value '{}'. "
|
||||||
@ -204,9 +203,10 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
);
|
);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
flagContainer.addUnknownFlag(split[0], split[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return flags;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@ -405,7 +405,7 @@ public abstract class PlotArea implements ComponentLike {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.getFlagContainer().addAll(parseFlags(flags));
|
parseFlags(this.getFlagContainer(), flags);
|
||||||
ConsolePlayer.getConsole().sendMessage(
|
ConsolePlayer.getConsole().sendMessage(
|
||||||
TranslatableCaption.of("flags.area_flags"),
|
TranslatableCaption.of("flags.area_flags"),
|
||||||
TagResolver.resolver("flags", Tag.inserting(Component.text(flags.toString())))
|
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.roadFlags = roadflags.size() > 0;
|
||||||
this.getRoadFlagContainer().addAll(parseFlags(roadflags));
|
parseFlags(this.getRoadFlagContainer(), roadflags);
|
||||||
ConsolePlayer.getConsole().sendMessage(
|
ConsolePlayer.getConsole().sendMessage(
|
||||||
TranslatableCaption.of("flags.road_flags"),
|
TranslatableCaption.of("flags.road_flags"),
|
||||||
TagResolver.resolver("flags", Tag.inserting(Component.text(roadflags.toString())))
|
TagResolver.resolver("flags", Tag.inserting(Component.text(roadflags.toString())))
|
||||||
|
@ -27,16 +27,16 @@ is to provide a lag-free and smooth experience.
|
|||||||
|
|
||||||
* [Download](https://www.spigotmc.org/resources/77506/)
|
* [Download](https://www.spigotmc.org/resources/77506/)
|
||||||
* [Discord](https://discord.gg/intellectualsites)
|
* [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)
|
* [Issues](https://github.com/IntellectualSites/PlotSquared/issues)
|
||||||
* [Translations](https://intellectualsites.crowdin.com/plotsquared/)
|
* [Translations](https://intellectualsites.crowdin.com/plotsquared/)
|
||||||
* [Contributing](https://github.com/IntellectualSites/.github/blob/main/CONTRIBUTING.md)
|
* [Contributing](https://github.com/IntellectualSites/.github/blob/main/CONTRIBUTING.md)
|
||||||
|
|
||||||
### Developer Resources
|
### Developer Resources
|
||||||
|
|
||||||
* [API Documentation](https://intellectualsites.github.io/plotsquared-documentation/api/api-documentation)
|
* [API Documentation](https://intellectualsites.gitbook.io/plotsquared/api/api-documentation)
|
||||||
* [Event API](https://intellectualsites.github.io/plotsquared-documentation/api/event-api)
|
* [Event API](https://intellectualsites.gitbook.io/plotsquared/api/event-api)
|
||||||
* [Flag API](https://intellectualsites.github.io/plotsquared-documentation/api/flag-api)
|
* [Flag API](https://intellectualsites.gitbook.io/plotsquared/api/flag-api)
|
||||||
|
|
||||||
# Official Addons
|
# Official Addons
|
||||||
|
|
||||||
|
@ -77,12 +77,12 @@ subprojects {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(platform("com.intellectualsites.bom:bom-newest:1.31"))
|
implementation(platform("com.intellectualsites.bom:bom-newest:1.34"))
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
// Tests
|
// Tests
|
||||||
testImplementation("org.junit.jupiter:junit-jupiter:5.9.3")
|
testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
|
||||||
}
|
}
|
||||||
|
|
||||||
plugins.withId("java") {
|
plugins.withId("java") {
|
||||||
|
@ -20,7 +20,7 @@ squirrelid = "0.3.2"
|
|||||||
# Gradle plugins
|
# Gradle plugins
|
||||||
shadow = "8.1.1"
|
shadow = "8.1.1"
|
||||||
grgit = "4.1.1"
|
grgit = "4.1.1"
|
||||||
spotless = "6.19.0"
|
spotless = "6.20.0"
|
||||||
nexus = "1.3.0"
|
nexus = "1.3.0"
|
||||||
|
|
||||||
[libraries]
|
[libraries]
|
||||||
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,6 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
validateDistributionUrl=true
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
Javadocs generated for
|
Javadocs generated for
|
||||||
<a href="https://github.com/IntellectualSites/PlotSquared/" rel="noopener nofollow noreferrer" target="_blank"> PlotSquared</a> |
|
<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> :)
|
Visit us on our <a href="https://discord.gg/intellectualsites" rel="noopener nofollow noreferrer"> Discord server</a> :)
|
||||||
|
Reference in New Issue
Block a user