Compare commits

..

4 Commits

Author SHA1 Message Date
21f79d1c13 Back to snapshot for development 2023-07-22 11:01:11 +02:00
293d7acf2d Release 7.0.0-rc.3 2023-07-22 10:56:35 +02:00
d876d3722a Fix default flags registration for third parties (#4114)
Co-authored-by: Leomixer17 <leonardo.dgs@yahoo.com>
2023-07-17 22:30:02 +02:00
dffb7672ff fix: add missing spawn event reasons (#4110) 2023-07-16 15:25:07 +01:00
5 changed files with 50 additions and 58 deletions

View File

@ -26,7 +26,6 @@ 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;
@ -65,11 +64,9 @@ 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 mustNotSave; private RefField mustSave;
private Object objChunkStatusFull = null;
/* /*
private RefMethod methodGetFullChunk; private RefMethod methodGetFullChunk;
private RefMethod methodGetBukkitChunk; private RefMethod methodGetBukkitChunk;
@ -82,6 +79,7 @@ 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) {
@ -92,27 +90,22 @@ 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");
ReflectionUtils.RefClass classChunkAccess = getRefClass("net.minecraft.world.level.chunk.IChunkAccess"); this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle");
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");
this.mustNotSave = classChunk.getField("mustNotSave"); if (version == 13) {
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.mustNotSave = classChunk.getField("mustNotSave"); this.mustSave = classChunk.getField("mustNotSave");
} }
} catch (NoSuchFieldException e) { } catch (NoSuchFieldException e) {
e.printStackTrace(); e.printStackTrace();
@ -174,13 +167,10 @@ 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 = objChunkStatusFull != null Object c = this.methodGetHandleChunk.of(chunk).call();
? this.methodGetHandleChunk.of(chunk).call(objChunkStatusFull) RefField.RefExecutor field = this.mustSave.of(c);
: this.methodGetHandleChunk.of(chunk).call(); if ((Boolean) field.get() != isTrueForNotSave) {
RefField.RefExecutor field = this.mustNotSave.of(c); field.set(isTrueForNotSave);
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);

View File

@ -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", "DEFAULT",
"DUPLICATION", "FROZEN", "SPELL" -> {
if (!area.isMobSpawning()) { if (!area.isMobSpawning()) {
event.setCancelled(true); event.setCancelled(true);
return; return;

View File

@ -31,39 +31,45 @@ 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 methodSetUnsaved; private final Method methodGetHandleChunk;
private Method methodGetHandleChunk; private Field shouldSave = null;
private Object objChunkStatusFull = null;
public SingleWorldListener() throws Exception { public SingleWorldListener() throws Exception {
ReflectionUtils.RefClass classCraftChunk = getRefClass("{cb}.CraftChunk"); ReflectionUtils.RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
ReflectionUtils.RefClass classChunkAccess = getRefClass("net.minecraft.world.level.chunk.IChunkAccess"); this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle").getRealMethod();
this.methodSetUnsaved = classChunkAccess.getMethod("a", boolean.class).getRealMethod();
try { try {
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle").getRealMethod(); if (PlotSquared.platform().serverVersion()[1] < 17) {
} catch (NoSuchMethodException ignored) { ReflectionUtils.RefClass classChunk = getRefClass("{nms}.Chunk");
try { if (PlotSquared.platform().serverVersion()[1] == 13) {
ReflectionUtils.RefClass classChunkStatus = getRefClass("net.minecraft.world.level.chunk.ChunkStatus"); this.shouldSave = classChunk.getField("mustSave").getRealField();
this.objChunkStatusFull = classChunkStatus.getRealClass().getField("n").get(null); } else {
this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle", classChunkStatus.getRealClass()).getRealMethod(); this.shouldSave = classChunk.getField("s").getRealField();
} catch (NoSuchMethodException ex) { }
throw new RuntimeException(ex); } else if (PlotSquared.platform().serverVersion()[1] == 17) {
ReflectionUtils.RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk");
this.shouldSave = classChunk.getField("r").getRealField();
} else if (PlotSquared.platform().serverVersion()[1] == 18) {
ReflectionUtils.RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.IChunkAccess");
this.shouldSave = classChunk.getField("b").getRealField();
} }
} catch (NoSuchFieldException e) {
e.printStackTrace();
} }
} }
public void markChunkAsClean(Chunk chunk) { public void markChunkAsClean(Chunk chunk) {
try { try {
Object nmsChunk = objChunkStatusFull != null Object nmsChunk = methodGetHandleChunk.invoke(chunk);
? this.methodGetHandleChunk.invoke(chunk, objChunkStatusFull) if (shouldSave != null) {
: this.methodGetHandleChunk.invoke(chunk); this.shouldSave.set(nmsChunk, false);
methodSetUnsaved.invoke(nmsChunk, false); }
} catch (Throwable e) { } catch (Throwable e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -79,12 +85,7 @@ 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());
} }

View File

@ -562,7 +562,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 +572,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;

View File

@ -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())))