From 9f4473079144a1e97a8b4299b015722ee4c74f61 Mon Sep 17 00:00:00 2001 From: Patrick Miller Date: Mon, 3 Aug 2026 15:51:30 -0400 Subject: [PATCH 1/2] Add X/Z support for Chunks --- .../skript/classes/data/BukkitClasses.java | 74 ----------- .../skript/bukkit/BukkitModule.java | 1 + .../skript/bukkit/types/ChunkClassInfo.java | 118 ++++++++++++++++++ 3 files changed, 119 insertions(+), 74 deletions(-) create mode 100644 src/main/java/org/skriptlang/skript/bukkit/types/ChunkClassInfo.java diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java index 7089b80c64a..3cd3a529c17 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java @@ -347,80 +347,6 @@ public String toVariableNameString(InventoryHolder holder) { .since("2.0") .after("itemtype", "itemstack", "entitydata", "entitytype")); - Classes.registerClass(new ClassInfo<>(Chunk.class, "chunk") - .user("chunks?") - .name("Chunk") - .description("A chunk is a cuboid of 16×16×128 (x×z×y) blocks. Chunks are spread on a fixed rectangular grid in their world.") - .usage("") - .examples("") - .since("2.0") - .parser(new Parser<>() { - @Override - public boolean canParse(final ParseContext context) { - return false; - } - - @Override - public String toString(final Chunk c, final int flags) { - return "chunk (" + c.getX() + "," + c.getZ() + ") of " + c.getWorld().getName(); - } - - @Override - public String toVariableNameString(final Chunk c) { - return c.getWorld().getName() + ":" + c.getX() + "," + c.getZ(); - } - }) - .serializer(new Serializer<>() { - @Override - public Fields serialize(Chunk chunk) { - final Fields f = new Fields(); - f.putObject("world", chunk.getWorld()); - f.putPrimitive("x", chunk.getX()); - f.putPrimitive("z", chunk.getZ()); - return f; - } - - @Override - public boolean canBeInstantiated() { - return false; - } - - @Override - protected Chunk deserialize(Fields fields) throws StreamCorruptedException { - World world = fields.getObject("world", World.class); - if (world == null) - throw new StreamCorruptedException("Missing world"); - - int x = fields.getPrimitive("x", int.class); - int z = fields.getPrimitive("z", int.class); - return world.getChunkAt(x, z); - } - - // return c.getWorld().getName() + ":" + c.getX() + "," + c.getZ(); - @Override - @Nullable - public Chunk deserialize(final String s) { - final String[] split = s.split("[:,]"); - if (split.length != 3) - return null; - final World w = Bukkit.getWorld(split[0]); - if (w == null) - return null; - try { - final int x = Integer.parseInt(split[1]); - final int z = Integer.parseInt(split[1]); - return w.getChunkAt(x, z); - } catch (final NumberFormatException e) { - return null; - } - } - - @Override - public boolean mustSyncDeserialization() { - return true; - } - })); - Material[] allMaterials = Material.values(); Classes.registerClass(new ClassInfo<>(Material.class, "material") .name(ClassInfo.NO_DOC) diff --git a/src/main/java/org/skriptlang/skript/bukkit/BukkitModule.java b/src/main/java/org/skriptlang/skript/bukkit/BukkitModule.java index ffa8d4bab03..f7b9d49c80d 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/BukkitModule.java +++ b/src/main/java/org/skriptlang/skript/bukkit/BukkitModule.java @@ -63,6 +63,7 @@ public Iterable children() { @Override protected void initSelf(SkriptAddon addon) { Classes.registerClass(new BlockClassInfo()); + Classes.registerClass(new ChunkClassInfo()); Classes.registerClass(new EntityClassInfo()); Classes.registerClass(new InventoryClassInfo()); Classes.registerClass(new ItemStackClassInfo()); diff --git a/src/main/java/org/skriptlang/skript/bukkit/types/ChunkClassInfo.java b/src/main/java/org/skriptlang/skript/bukkit/types/ChunkClassInfo.java new file mode 100644 index 00000000000..6bee5680fc5 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/types/ChunkClassInfo.java @@ -0,0 +1,118 @@ +package org.skriptlang.skript.bukkit.types; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.ClassInfo; +import ch.njol.skript.classes.Parser; +import ch.njol.skript.classes.Serializer; +import ch.njol.skript.lang.ParseContext; +import ch.njol.yggdrasil.Fields; +import org.bukkit.Chunk; +import org.bukkit.World; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; +import org.skriptlang.skript.lang.properties.Property; +import org.skriptlang.skript.lang.properties.handlers.WXYZHandler; +import org.skriptlang.skript.lang.properties.handlers.base.PropertyHandler; + +import java.io.StreamCorruptedException; + +@ApiStatus.Internal +public class ChunkClassInfo extends ClassInfo { + + public ChunkClassInfo() { + super(Chunk.class, "chunk"); + user("chunks?") + .name("Chunk") + .description(""" + A chunk is a 16 by 16 segment of a world, stretching from the world's bottom to its top. \ + Chunks are spread on a fixed rectangular grid in their world.\ + """) + .since("2.0") + .parser(new ChunkParser()) + .serializer(new ChunkSerializer()) + .property(Property.WXYZ, + "The X or Z coordinate of the chunk. Added in INSERT VERSION.", + Skript.instance(), + new ChunkWXYZHandler()); + } + + private static class ChunkParser extends Parser { + // + @Override + public boolean canParse(ParseContext context) { + return false; + } + + @Override + public String toString(Chunk chunk, int flags) { + return "chunk (" + chunk.getX() + "," + chunk.getZ() + ") of " + chunk.getWorld().getName(); + } + + @Override + public String toVariableNameString(final Chunk c) { + return c.getWorld().getName() + ":" + c.getX() + "," + c.getZ(); + } + // + } + + private static class ChunkSerializer extends Serializer { + // + @Override + public Fields serialize(Chunk chunk) { + Fields fields = new Fields(); + fields.putObject("world", chunk.getWorld()); + fields.putPrimitive("x", chunk.getX()); + fields.putPrimitive("z", chunk.getZ()); + return fields; + } + + @Override + public boolean canBeInstantiated() { + return false; + } + + @Override + protected Chunk deserialize(Fields fields) throws StreamCorruptedException { + World world = fields.getObject("world", World.class); + if (world == null) { + throw new StreamCorruptedException("Missing world"); + } + int x = fields.getPrimitive("x", int.class); + int z = fields.getPrimitive("z", int.class); + return world.getChunkAt(x, z); + } + + @Override + public boolean mustSyncDeserialization() { + return true; + } + // + } + + private static class ChunkWXYZHandler extends WXYZHandler { + // + @Override + public PropertyHandler newInstance() { + var instance = new ChunkClassInfo.ChunkWXYZHandler(); + instance.axis(axis); + return instance; + } + + @Override + public Integer convert(Chunk chunk) { + return axis == Axis.X ? chunk.getX() : chunk.getZ(); + } + + @Override + public boolean supportsAxis(Axis axis) { + return axis == Axis.X || axis == Axis.Z; + } + + @Override + public @NotNull Class returnType() { + return Integer.class; + } + // + } + +} From 17cfa8977457848e78861c04b6d8d80689f1c434 Mon Sep 17 00:00:00 2001 From: Patrick Miller Date: Tue, 4 Aug 2026 15:22:52 -0400 Subject: [PATCH 2/2] Improve toVariableNameString parameter name Co-authored-by: SirSmurfy2 <82696841+Absolutionism@users.noreply.github.com> --- .../org/skriptlang/skript/bukkit/types/ChunkClassInfo.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/skriptlang/skript/bukkit/types/ChunkClassInfo.java b/src/main/java/org/skriptlang/skript/bukkit/types/ChunkClassInfo.java index 6bee5680fc5..2aa1fd89997 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/types/ChunkClassInfo.java +++ b/src/main/java/org/skriptlang/skript/bukkit/types/ChunkClassInfo.java @@ -49,8 +49,8 @@ public String toString(Chunk chunk, int flags) { } @Override - public String toVariableNameString(final Chunk c) { - return c.getWorld().getName() + ":" + c.getX() + "," + c.getZ(); + public String toVariableNameString(Chunk chunk) { + return chunk.getWorld().getName() + ":" + chunk.getX() + "," + chunk.getZ(); } // }