From 655c684633424c02c7540f4b3819325dc6b1cb49 Mon Sep 17 00:00:00 2001 From: noone-075 Date: Tue, 1 Sep 2026 16:33:47 +0200 Subject: [PATCH 01/10] feat: totally rework structure generation API - structures are now built per location/seed instead of being singleton instances - added chunk-aware placement and slicing via PlaceableStructure and getChunk(...) - structures can now be used directly in a ChunkGenerator workflow - added AbstractGenerableStructure.locateNearest(...) for generation lookup - updated HerobrineShrineTestStructure and RickQRCodeTestSchemStructure to the new API - removed getInstance() usage; construct structure objects directly - simplified the wlib debug command to select by name instead of using clazz - kept a registration helper for centralized structure discovery --- dependency-reduced-pom.xml | 273 ++++++++++++++++++ .../api/structure/AbstractBaseStructure.java | 98 +------ .../structure/AbstractGenerableStructure.java | 57 ++++ .../wlib/api/structure/BlockRelative.java | 4 + .../api/structure/PlaceableStructure.java | 147 ++++++++++ .../wlib/internal/command/WLIBCommand.java | 21 +- .../HerobrineShrineTestStructure.java | 19 +- .../RickQRCodeTestSchemStructure.java | 16 +- 8 files changed, 533 insertions(+), 102 deletions(-) create mode 100644 dependency-reduced-pom.xml create mode 100644 src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java create mode 100644 src/main/java/xyz/webmc/wlib/api/structure/PlaceableStructure.java diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml new file mode 100644 index 0000000..17b1aee --- /dev/null +++ b/dependency-reduced-pom.xml @@ -0,0 +1,273 @@ + + + 4.0.0 + xyz.webmc + wlib + 1.2.9-SNAPSHOT + + + + true + src/main/resources + + **/*.yml + + + + src/main/resources + + **/*.yml + + + + ${project.artifactId}-${project.version} + + + maven-shade-plugin + 3.6.2 + + + package + + shade + + + false + true + + + dev.colbster937.reflect + ${plugin.pckg}.lib.mirror + + + dev.colbster937.util + ${plugin.pckg}.lib.jutil + + + com.tcoded.folialib + ${plugin.pckg}.lib.folialib + + + com.cryptomorin.xseries + ${plugin.pckg}.lib.xseries + + + net.sandrohc.schematic4j + ${plugin.pckg}.lib.schematic4j + + + org.json + ${plugin.pckg}.lib.json + + + org.semver4j + ${plugin.pckg}.lib.semver4j + + + javassist + ${plugin.pckg}.lib.javassist + + + + + *:* + + org/checkerframework/** + org/slf4j/** + + + + + + + + + com.mycila + license-maven-plugin + 5.1.2 + + + com.mycila + license-maven-plugin-git + 5.1.2 + + + + + ${plugin.athr} + + + +
src/build/resources/LICENSE_HEADER.txt
+ + src/**/*.java + +
+
+
+
+ + org.codehaus.gmavenplus + gmavenplus-plugin + 4.3.1 + + + generate-resources + + execute + + + + + + + + + + + org.apache.groovy + groovy + 5.0.8 + + + + + io.github.git-commit-id + git-commit-id-maven-plugin + 10.0.0 + + + + revision + + + + + false + + + + com.diffplug.spotless + spotless-maven-plugin + 3.10.0 + + + process-sources + + apply + + + + + + + ${maven.compiler.source} + + + + ${plugin.pckg},java,javax, + + + + + newline after license header + \*/\R*package + */ + +package + + + + +
+
+ + + spigotmc + https://hub.spigotmc.org/nexus/content/repositories/public/ + + + java-mirror + https://maven.colbster937.dev/colbster937/java-mirror/ + + + java-util + https://maven.colbster937.dev/colbster937/java-util/ + + + schematic4j + https://maven.colbster937.dev/colbster937/schematic4j/ + + + tcoded + https://repo.tcoded.com/releases/ + + + placeholderapi + https://repo.extendedclip.com/content/repositories/placeholderapi/ + + + + ignore + + + ignore + + lax1dude + https://repo.lax1dude.net/repository/releases/ + + + + + org.bukkit + bukkit + 1.8-R0.1-SNAPSHOT + provided + + + me.clip + placeholderapi + 2.12.3 + provided + + + net.luckperms + api + 5.5 + provided + + + net.lax1dude.eaglercraft.backend + api-bukkit + 1.1.0 + provided + + + org.apache.logging.log4j + log4j-core + 2.26.1 + provided + + + org.apache.logging.log4j + log4j-api + 2.26.1 + provided + + + + + github + https://maven.pkg.github.com/WebMCDevelopment/wlib/ + + + + 17 + ${project.groupId}.${project.artifactId} + ${project.version}+${git.commit.id.abbrev} + UTF-8 + Colbster937 + PlaceholderAPI, LuckPerms, Essentials, EaglercraftXServer + WLIB + +
diff --git a/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java b/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java index d84fd41..bd18cf7 100644 --- a/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java +++ b/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java @@ -13,114 +13,48 @@ package xyz.webmc.wlib.api.structure; -import xyz.webmc.wlib.api.util.SchemUtil; +import org.bukkit.Location; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; - -import com.cryptomorin.xseries.XMaterial; -import dev.colbster937.reflect.MirrorSafe; -import net.sandrohc.schematic4j.exception.ParsingException; -import net.sandrohc.schematic4j.schematic.Schematic; -import net.sandrohc.schematic4j.schematic.types.SchematicBlock; -import net.sandrohc.schematic4j.schematic.types.SchematicBlockPos; -import org.bukkit.Location; - -@SuppressWarnings({ "unchecked" }) public abstract class AbstractBaseStructure { - private static final Map, AbstractBaseStructure> INSTANCES = new HashMap<>(); - - private final List blocks = new ArrayList<>(); + private static List> structures = new ArrayList<>(); private final String name; protected AbstractBaseStructure(final String name) { this.name = name; } - public final void place(final Location loc) { - final Location offset = loc.clone().add(this.getOffsetX(), this.getOffsetY(), this.getOffsetZ()); - for (final BlockRelative blk : blocks) { - blk.place(offset); - } - } - public final String getName() { return this.name; } - public int getOffsetX() { - return 0; - } + public abstract PlaceableStructure build(long seed); - public int getOffsetY() { - return 0; + public final void place(final Location loc, final long seed) { + this.build(seed).place(loc); } - public int getOffsetZ() { - return 0; + public final void place(final Location loc) { + this.place(loc, 0L); } - protected final void addBlock(final BlockRelative blk) { - this.blocks.add(blk); + public final PlaceableStructure getChunk(final int chunkX, final int chunkZ, final long seed) { + return this.build(seed).getChunk(chunkX, chunkZ); } - protected final void loadSchematic(final InputStream is) throws IOException, ParsingException { - try (is) { - final Schematic schematic = SchemUtil.readSchematic(is); - - final int width = schematic.width(); - final int height = schematic.height(); - final int length = schematic.length(); - - final SchematicBlockPos offset = schematic.offset(); - - for (int y = 0; y < height; y++) { - for (int z = 0; z < length; z++) { - for (int x = 0; x < width; x++) { - final SchematicBlock block = schematic.block(x, y, z); - if (block != SchematicBlock.AIR) { - final XMaterial mat = XMaterial.matchXMaterial(block.block().replace("minecraft:", "")).orElse(XMaterial.AIR); - if (mat != null) { - final StringBuilder sb = new StringBuilder(); - - for (final Map.Entry entry : block.states().entrySet()) { - if (sb.length() > 0) { - sb.append(","); - } - - sb.append(entry.getKey()); - sb.append("="); - sb.append(entry.getValue()); - } - - this.addBlock(new BlockRelative(x - offset.x, y - offset.y, z - offset.z, mat, "[" + sb.toString() + "]")); - } - } - } - } - } - } + public final PlaceableStructure getChunk(final int chunkX, final int chunkZ) { + return this.getChunk(chunkX, chunkZ, 0L); } - protected final void loadSchematic(final File file) throws IOException, ParsingException { - loadSchematic(new FileInputStream(file)); + public static List> getStructures() { + return structures; } - public static final T getInstance(final Class clazz, final Object... params) { - AbstractBaseStructure structure = INSTANCES.get(clazz); - - if (structure == null) { - structure = MirrorSafe.invokeConstructor(clazz, params); - INSTANCES.put(clazz, structure); + public static void registerStructure(final Class structureClass) { + if (structureClass != null && !structures.contains(structureClass)) { + structures.add(structureClass); } - - return (T) structure; } } diff --git a/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java b/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java new file mode 100644 index 0000000..157720d --- /dev/null +++ b/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2026 Colbster937 + * + * SPDX-License-Identifier: AGPL-3.0-or-later + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * See the LICENSE file for details. + */ + +package xyz.webmc.wlib.api.structure; + +import org.bukkit.Location; + +public abstract class AbstractGenerableStructure extends AbstractBaseStructure { + static final int SEARCH_RADIUS = 100; + + protected AbstractGenerableStructure(final String name) { + super(name); + } + + public abstract boolean canGenerateAt(final int chunkX, final int chunkZ, final long worldSeed); + + public final Location locateNearest(final Location pos, final long worldSeed) { + if (pos == null || pos.getWorld() == null) { + return null; + } + + final int centerChunkX = pos.getChunk().getX(); + final int centerChunkZ = pos.getChunk().getZ(); + + if (this.canGenerateAt(centerChunkX, centerChunkZ, worldSeed)) { + return new Location(pos.getWorld(), centerChunkX * 16 + 8, pos.getWorld().getHighestBlockYAt(centerChunkX * 16 + 8, centerChunkZ * 16 + 8), centerChunkZ * 16 + 8); + } + + for (int radius = 1; radius <= SEARCH_RADIUS; radius++) { + for (int dz = -radius; dz <= radius; dz++) { + for (int dx = -radius; dx <= radius; dx++) { + if (Math.max(Math.abs(dx), Math.abs(dz)) != radius) { + continue; + } + + final int chunkX = centerChunkX + dx; + final int chunkZ = centerChunkZ + dz; + if (this.canGenerateAt(chunkX, chunkZ, worldSeed)) { + return new Location(pos.getWorld(), chunkX * 16 + 8, pos.getWorld().getHighestBlockYAt(chunkX * 16 + 8, chunkZ * 16 + 8), chunkZ * 16 + 8); + } + } + } + } + + return null; + } +} diff --git a/src/main/java/xyz/webmc/wlib/api/structure/BlockRelative.java b/src/main/java/xyz/webmc/wlib/api/structure/BlockRelative.java index d6880eb..bd84e19 100644 --- a/src/main/java/xyz/webmc/wlib/api/structure/BlockRelative.java +++ b/src/main/java/xyz/webmc/wlib/api/structure/BlockRelative.java @@ -110,4 +110,8 @@ public final String getDataModern() { public final byte getDataLegacy() { return dataLegacy; } + + public final BlockRelative offset(final int x, final int y, final int z) { + return new BlockRelative(this.x + x, this.y + y, this.z + z, this.mat, this.dataModern, this.dataLegacy); + } } diff --git a/src/main/java/xyz/webmc/wlib/api/structure/PlaceableStructure.java b/src/main/java/xyz/webmc/wlib/api/structure/PlaceableStructure.java new file mode 100644 index 0000000..210bcb8 --- /dev/null +++ b/src/main/java/xyz/webmc/wlib/api/structure/PlaceableStructure.java @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2026 Colbster937 + * + * SPDX-License-Identifier: AGPL-3.0-or-later + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * See the LICENSE file for details. + */ + +package xyz.webmc.wlib.api.structure; + +import xyz.webmc.wlib.api.util.SchemUtil; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import com.cryptomorin.xseries.XMaterial; +import net.sandrohc.schematic4j.exception.ParsingException; +import net.sandrohc.schematic4j.schematic.Schematic; +import net.sandrohc.schematic4j.schematic.types.SchematicBlock; +import net.sandrohc.schematic4j.schematic.types.SchematicBlockPos; +import org.bukkit.Chunk; +import org.bukkit.Location; + +public class PlaceableStructure { + private final String name; + private final List blocks = new ArrayList<>(); + + public PlaceableStructure(final String name) { + this.name = name; + } + + public final String getName() { + return this.name; + } + + public final List getBlocks() { + return Collections.unmodifiableList(this.blocks); + } + + public final void addBlock(final BlockRelative block) { + if (block != null) { + this.blocks.add(block); + } + } + + public final void addBlocks(final Collection blocks) { + if (blocks != null) { + this.blocks.addAll(blocks); + } + } + + public final void addBlocks(final BlockRelative... blocks) { + if (blocks != null) { + Collections.addAll(this.blocks, blocks); + } + } + + public final void place(final Location loc) { + final Location origin = loc.clone(); + for (final BlockRelative block : this.blocks) { + block.place(origin); + } + } + + public final void place(final Chunk chunk) { + final PlaceableStructure chunkData = this.getChunk(0, 0); + final Location origin = new Location(chunk.getWorld(), chunk.getX() * 16, 65, chunk.getZ() * 16); + chunkData.place(origin); + } + + public final PlaceableStructure getChunk(final int chunkX, final int chunkZ) { + final int minX = chunkX * 16; + final int maxX = minX + 15; + final int minZ = chunkZ * 16; + final int maxZ = minZ + 15; + + final PlaceableStructure chunk = new PlaceableStructure(this.name + "_chunk_" + chunkX + "_" + chunkZ); + for (final BlockRelative block : this.blocks) { + if (block.getX() >= minX && block.getX() <= maxX && block.getZ() >= minZ && block.getZ() <= maxZ) { + chunk.addBlock(block.offset(-minX, 0, -minZ)); + } + } + + return chunk; + } + + public final void loadSchematic(final InputStream is) throws IOException, ParsingException { + this.loadSchematic(is, 0, 0, 0); + } + + public final void loadSchematic(final InputStream is, final int offsetX, final int offsetY, final int offsetZ) throws IOException, ParsingException { + try (is) { + final Schematic schematic = SchemUtil.readSchematic(is); + + final int width = schematic.width(); + final int height = schematic.height(); + final int length = schematic.length(); + final SchematicBlockPos offset = schematic.offset(); + + for (int y = 0; y < height; y++) { + for (int z = 0; z < length; z++) { + for (int x = 0; x < width; x++) { + final SchematicBlock block = schematic.block(x, y, z); + if (block != SchematicBlock.AIR) { + final XMaterial mat = XMaterial.matchXMaterial(block.block().replace("minecraft:", "")).orElse(XMaterial.AIR); + if (mat != null) { + final StringBuilder sb = new StringBuilder(); + + for (final Map.Entry entry : block.states().entrySet()) { + if (sb.length() > 0) { + sb.append(","); + } + + sb.append(entry.getKey()); + sb.append("="); + sb.append(entry.getValue()); + } + + this.addBlock(new BlockRelative(x - offset.x + offsetX, y - offset.y + offsetY, z - offset.z + offsetZ, mat, "[" + sb.toString() + "]")); + } + } + } + } + } + } + } + + public final void loadSchematic(final File file) throws IOException, ParsingException { + this.loadSchematic(file, 0, 0, 0); + } + + public final void loadSchematic(final File file, final int offsetX, final int offsetY, final int offsetZ) throws IOException, ParsingException { + this.loadSchematic(new FileInputStream(file), offsetX, offsetY, offsetZ); + } +} diff --git a/src/main/java/xyz/webmc/wlib/internal/command/WLIBCommand.java b/src/main/java/xyz/webmc/wlib/internal/command/WLIBCommand.java index 1aa962e..07e5a22 100644 --- a/src/main/java/xyz/webmc/wlib/internal/command/WLIBCommand.java +++ b/src/main/java/xyz/webmc/wlib/internal/command/WLIBCommand.java @@ -73,26 +73,31 @@ public final boolean run(final CommandSender sender, final String label, final S if (act.equals("throw")) { throw new CommandException(); } else if (act.equals("place")) { + if (args.length < 3) { + super.sendUsageMessage(sender, label); + return true; + } + bool1 = false; if (sender instanceof Player plr) { final String struct = args[2].trim(); - Class clazz = null; + final AbstractBaseStructure structure; if (struct.equals("shrine")) { - clazz = HerobrineShrineTestStructure.class; + structure = new HerobrineShrineTestStructure(); } else if (struct.equals("rick")) { - clazz = RickQRCodeTestSchemStructure.class; + structure = new RickQRCodeTestSchemStructure(); + } else { + bool1 = true; + bool2 = false; + structure = null; } - if (clazz != null) { - final AbstractBaseStructure structure = AbstractBaseStructure.getInstance(clazz); + if (structure != null) { final Location loc = plr.getLocation(); structure.place(loc.clone()); SchedulerUtil.teleportAsync(plr, loc.clone().add(1, 1, 0).getBlock().getLocation().clone().add(0.5D, 0, 0.5D)); sender.sendMessage(ChatColor.GREEN + "Placed structure " + structure.getName()); - } else { - bool1 = true; - bool2 = false; } } else { sendOnlyPlayersMessage(sender); diff --git a/src/main/java/xyz/webmc/wlib/internal/structure/HerobrineShrineTestStructure.java b/src/main/java/xyz/webmc/wlib/internal/structure/HerobrineShrineTestStructure.java index 0c08197..1fa453f 100644 --- a/src/main/java/xyz/webmc/wlib/internal/structure/HerobrineShrineTestStructure.java +++ b/src/main/java/xyz/webmc/wlib/internal/structure/HerobrineShrineTestStructure.java @@ -15,33 +15,38 @@ import xyz.webmc.wlib.api.structure.AbstractBaseStructure; import xyz.webmc.wlib.api.structure.BlockRelative; +import xyz.webmc.wlib.api.structure.PlaceableStructure; import com.cryptomorin.xseries.XMaterial; public final class HerobrineShrineTestStructure extends AbstractBaseStructure { public HerobrineShrineTestStructure() { super("herobrine_shrine"); + } + + @Override + public PlaceableStructure build(final long seed) { + final PlaceableStructure structure = new PlaceableStructure(this.getName()); for (int y = 0; y < 3; y++) { for (int x = -1; x < 2; x++) { for (int z = -1; z < 2; z++) { if (y == 0) { - super.addBlock(new BlockRelative(x, y, z, XMaterial.GOLD_BLOCK)); + structure.addBlock(new BlockRelative(x, y, z, XMaterial.GOLD_BLOCK)); } else if (y == 1) { if (x != z && x + z != 0) { - super.addBlock(new BlockRelative(x, y, z, XMaterial.REDSTONE_TORCH)); + structure.addBlock(new BlockRelative(x, y, z, XMaterial.REDSTONE_TORCH)); } else if (x == 0 && z == 0) { - super.addBlock(new BlockRelative(x, y, z, XMaterial.NETHERRACK)); + structure.addBlock(new BlockRelative(x, y, z, XMaterial.NETHERRACK)); } } else if (y == 2 && x == 0 && z == 0) { - super.addBlock(new BlockRelative(x, y, z, XMaterial.FIRE)); + structure.addBlock(new BlockRelative(x, y, z, XMaterial.FIRE)); } } } } - } - public static HerobrineShrineTestStructure getInstance() { - return getInstance(HerobrineShrineTestStructure.class); + return structure; } + } diff --git a/src/main/java/xyz/webmc/wlib/internal/structure/RickQRCodeTestSchemStructure.java b/src/main/java/xyz/webmc/wlib/internal/structure/RickQRCodeTestSchemStructure.java index 21f7d24..53ce106 100644 --- a/src/main/java/xyz/webmc/wlib/internal/structure/RickQRCodeTestSchemStructure.java +++ b/src/main/java/xyz/webmc/wlib/internal/structure/RickQRCodeTestSchemStructure.java @@ -14,6 +14,7 @@ package xyz.webmc.wlib.internal.structure; import xyz.webmc.wlib.api.structure.AbstractBaseStructure; +import xyz.webmc.wlib.api.structure.PlaceableStructure; import java.io.IOException; import java.io.InputStream; @@ -21,14 +22,19 @@ import net.sandrohc.schematic4j.exception.ParsingException; public final class RickQRCodeTestSchemStructure extends AbstractBaseStructure { - public RickQRCodeTestSchemStructure() throws IOException, ParsingException { + public RickQRCodeTestSchemStructure(){ super("rick_qr"); + } + + @Override + public PlaceableStructure build(final long seed) { + final PlaceableStructure structure = new PlaceableStructure(this.getName()); try (InputStream is = RickQRCodeTestSchemStructure.class.getResourceAsStream("/schematics/rick.schem")) { - super.loadSchematic(is); + structure.loadSchematic(is); + } catch (final IOException | ParsingException ex) { + throw new RuntimeException("Failed to load schematic for structure " + this.getName(), ex); } + return structure; } - public static RickQRCodeTestSchemStructure getInstance() { - return getInstance(RickQRCodeTestSchemStructure.class); - } } From e74cf88cd1546f86e2d2024dc8435edc00a4d152 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 1 Sep 2026 14:37:06 +0000 Subject: [PATCH 02/10] chore: auto-format code --- .../xyz/webmc/wlib/api/structure/AbstractBaseStructure.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java b/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java index bd18cf7..c78e32b 100644 --- a/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java +++ b/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java @@ -13,11 +13,11 @@ package xyz.webmc.wlib.api.structure; -import org.bukkit.Location; - import java.util.ArrayList; import java.util.List; +import org.bukkit.Location; + public abstract class AbstractBaseStructure { private static List> structures = new ArrayList<>(); private final String name; From 3fc7dca6f5077839169d4d0711abe1b6c616c843 Mon Sep 17 00:00:00 2001 From: noone-075 Date: Tue, 1 Sep 2026 16:59:35 +0200 Subject: [PATCH 03/10] feat: pushed version to 1.3.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cda4150..65b412c 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 xyz.webmc wlib - 1.2.9-SNAPSHOT + 1.3.1-SNAPSHOT github From 412a2179acd80a47222fad2e0b3f2831ea1d4ed2 Mon Sep 17 00:00:00 2001 From: noone-075 Date: Wed, 2 Sep 2026 13:30:08 +0200 Subject: [PATCH 04/10] chore: fixed codestyle - fixed all errors from @colbster937's review - changed some if chains to switch statements (WLIBCommand.java) - dependency-reduced-pom.xml is now in my local .gitignore --- dependency-reduced-pom.xml | 273 ------------------ src/main/java/xyz/webmc/wlib/api/WLIB.java | 2 +- .../api/structure/AbstractBaseStructure.java | 10 +- .../structure/AbstractGenerableStructure.java | 48 +-- .../wlib/api/structure/BlockRelative.java | 2 +- .../wlib/internal/command/WLIBCommand.java | 68 ++--- .../HerobrineShrineTestStructure.java | 1 - .../RickQRCodeTestSchemStructure.java | 3 +- 8 files changed, 74 insertions(+), 333 deletions(-) delete mode 100644 dependency-reduced-pom.xml diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml deleted file mode 100644 index 17b1aee..0000000 --- a/dependency-reduced-pom.xml +++ /dev/null @@ -1,273 +0,0 @@ - - - 4.0.0 - xyz.webmc - wlib - 1.2.9-SNAPSHOT - - - - true - src/main/resources - - **/*.yml - - - - src/main/resources - - **/*.yml - - - - ${project.artifactId}-${project.version} - - - maven-shade-plugin - 3.6.2 - - - package - - shade - - - false - true - - - dev.colbster937.reflect - ${plugin.pckg}.lib.mirror - - - dev.colbster937.util - ${plugin.pckg}.lib.jutil - - - com.tcoded.folialib - ${plugin.pckg}.lib.folialib - - - com.cryptomorin.xseries - ${plugin.pckg}.lib.xseries - - - net.sandrohc.schematic4j - ${plugin.pckg}.lib.schematic4j - - - org.json - ${plugin.pckg}.lib.json - - - org.semver4j - ${plugin.pckg}.lib.semver4j - - - javassist - ${plugin.pckg}.lib.javassist - - - - - *:* - - org/checkerframework/** - org/slf4j/** - - - - - - - - - com.mycila - license-maven-plugin - 5.1.2 - - - com.mycila - license-maven-plugin-git - 5.1.2 - - - - - ${plugin.athr} - - - -
src/build/resources/LICENSE_HEADER.txt
- - src/**/*.java - -
-
-
-
- - org.codehaus.gmavenplus - gmavenplus-plugin - 4.3.1 - - - generate-resources - - execute - - - - - - - - - - - org.apache.groovy - groovy - 5.0.8 - - - - - io.github.git-commit-id - git-commit-id-maven-plugin - 10.0.0 - - - - revision - - - - - false - - - - com.diffplug.spotless - spotless-maven-plugin - 3.10.0 - - - process-sources - - apply - - - - - - - ${maven.compiler.source} - - - - ${plugin.pckg},java,javax, - - - - - newline after license header - \*/\R*package - */ - -package - - - - -
-
- - - spigotmc - https://hub.spigotmc.org/nexus/content/repositories/public/ - - - java-mirror - https://maven.colbster937.dev/colbster937/java-mirror/ - - - java-util - https://maven.colbster937.dev/colbster937/java-util/ - - - schematic4j - https://maven.colbster937.dev/colbster937/schematic4j/ - - - tcoded - https://repo.tcoded.com/releases/ - - - placeholderapi - https://repo.extendedclip.com/content/repositories/placeholderapi/ - - - - ignore - - - ignore - - lax1dude - https://repo.lax1dude.net/repository/releases/ - - - - - org.bukkit - bukkit - 1.8-R0.1-SNAPSHOT - provided - - - me.clip - placeholderapi - 2.12.3 - provided - - - net.luckperms - api - 5.5 - provided - - - net.lax1dude.eaglercraft.backend - api-bukkit - 1.1.0 - provided - - - org.apache.logging.log4j - log4j-core - 2.26.1 - provided - - - org.apache.logging.log4j - log4j-api - 2.26.1 - provided - - - - - github - https://maven.pkg.github.com/WebMCDevelopment/wlib/ - - - - 17 - ${project.groupId}.${project.artifactId} - ${project.version}+${git.commit.id.abbrev} - UTF-8 - Colbster937 - PlaceholderAPI, LuckPerms, Essentials, EaglercraftXServer - WLIB - -
diff --git a/src/main/java/xyz/webmc/wlib/api/WLIB.java b/src/main/java/xyz/webmc/wlib/api/WLIB.java index a972d02..3db2823 100644 --- a/src/main/java/xyz/webmc/wlib/api/WLIB.java +++ b/src/main/java/xyz/webmc/wlib/api/WLIB.java @@ -28,7 +28,7 @@ import org.bukkit.plugin.Plugin; import org.semver4j.Semver; -@SuppressWarnings({ "NonConstantLogger" }) +@SuppressWarnings({ "NonConstantLogger" , "null"}) public final class WLIB { private static final StackWalker stackWalker = StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE); private static final List plugins = new ArrayList<>(); diff --git a/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java b/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java index c78e32b..2d56e9c 100644 --- a/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java +++ b/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java @@ -19,7 +19,7 @@ import org.bukkit.Location; public abstract class AbstractBaseStructure { - private static List> structures = new ArrayList<>(); + private static final List> STRUCTURES = new ArrayList<>(); private final String name; protected AbstractBaseStructure(final String name) { @@ -49,12 +49,12 @@ public final PlaceableStructure getChunk(final int chunkX, final int chunkZ) { } public static List> getStructures() { - return structures; + return STRUCTURES; } - public static void registerStructure(final Class structureClass) { - if (structureClass != null && !structures.contains(structureClass)) { - structures.add(structureClass); + public static void registerStructure(final Class clazz) { + if (clazz != null && !STRUCTURES.contains(clazz)) { + STRUCTURES.add(clazz); } } } diff --git a/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java b/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java index 157720d..c3a6388 100644 --- a/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java +++ b/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java @@ -14,6 +14,7 @@ package xyz.webmc.wlib.api.structure; import org.bukkit.Location; +import org.bukkit.World; public abstract class AbstractGenerableStructure extends AbstractBaseStructure { static final int SEARCH_RADIUS = 100; @@ -25,28 +26,34 @@ protected AbstractGenerableStructure(final String name) { public abstract boolean canGenerateAt(final int chunkX, final int chunkZ, final long worldSeed); public final Location locateNearest(final Location pos, final long worldSeed) { - if (pos == null || pos.getWorld() == null) { - return null; - } + if (pos != null && pos.getWorld() != null) { + final int centerChunkX = pos.getChunk().getX(); + final int centerChunkZ = pos.getChunk().getZ(); + final World world = pos.getWorld(); - final int centerChunkX = pos.getChunk().getX(); - final int centerChunkZ = pos.getChunk().getZ(); + for (int radius = 0; radius <= SEARCH_RADIUS; radius++) { + final int minX = centerChunkX - radius; + final int maxX = centerChunkX + radius; + final int minZ = centerChunkZ - radius; + final int maxZ = centerChunkZ + radius; - if (this.canGenerateAt(centerChunkX, centerChunkZ, worldSeed)) { - return new Location(pos.getWorld(), centerChunkX * 16 + 8, pos.getWorld().getHighestBlockYAt(centerChunkX * 16 + 8, centerChunkZ * 16 + 8), centerChunkZ * 16 + 8); - } + for (int chunkX = minX; chunkX <= maxX; chunkX++) { + if (this.canGenerateAt(chunkX, minZ, worldSeed)) { + return this.createLocation(world, chunkX, minZ); + } - for (int radius = 1; radius <= SEARCH_RADIUS; radius++) { - for (int dz = -radius; dz <= radius; dz++) { - for (int dx = -radius; dx <= radius; dx++) { - if (Math.max(Math.abs(dx), Math.abs(dz)) != radius) { - continue; + if (minZ != maxZ && this.canGenerateAt(chunkX, maxZ, worldSeed)) { + return this.createLocation(world, chunkX, maxZ); } + } - final int chunkX = centerChunkX + dx; - final int chunkZ = centerChunkZ + dz; - if (this.canGenerateAt(chunkX, chunkZ, worldSeed)) { - return new Location(pos.getWorld(), chunkX * 16 + 8, pos.getWorld().getHighestBlockYAt(chunkX * 16 + 8, chunkZ * 16 + 8), chunkZ * 16 + 8); + for (int chunkZ = minZ + 1; chunkZ < maxZ; chunkZ++) { + if (this.canGenerateAt(minX, chunkZ, worldSeed)) { + return this.createLocation(world, minX, chunkZ); + } + + if (minX != maxX && this.canGenerateAt(maxX, chunkZ, worldSeed)) { + return this.createLocation(world, maxX, chunkZ); } } } @@ -54,4 +61,11 @@ public final Location locateNearest(final Location pos, final long worldSeed) { return null; } + + private Location createLocation(final World world, final int chunkX, final int chunkZ) { + final int blockX = chunkX * 16 + 8; + final int blockZ = chunkZ * 16 + 8; + + return new Location(world, blockX, 65, blockZ); + } } diff --git a/src/main/java/xyz/webmc/wlib/api/structure/BlockRelative.java b/src/main/java/xyz/webmc/wlib/api/structure/BlockRelative.java index bd84e19..bab27ed 100644 --- a/src/main/java/xyz/webmc/wlib/api/structure/BlockRelative.java +++ b/src/main/java/xyz/webmc/wlib/api/structure/BlockRelative.java @@ -71,7 +71,7 @@ public void place(final Location loc) { final Material _mat = this.mat.parseMaterial(); if (mat != null) { - if (WLIB.getIsModernServer() && this.dataModern != null) { + if (WLIB.getIsModernServer() && this.dataModern != null && _mat != null) { final Object data = MirrorSafe.invokeMethod(Bukkit.class, "createBlockData", new Object[] { "minecraft:" + _mat.name().toLowerCase() + this.dataModern }); MirrorSafe.invokeMethod(Block.class, blk, "setBlockData", data, false); } else { diff --git a/src/main/java/xyz/webmc/wlib/internal/command/WLIBCommand.java b/src/main/java/xyz/webmc/wlib/internal/command/WLIBCommand.java index 07e5a22..cfb0f22 100644 --- a/src/main/java/xyz/webmc/wlib/internal/command/WLIBCommand.java +++ b/src/main/java/xyz/webmc/wlib/internal/command/WLIBCommand.java @@ -73,34 +73,34 @@ public final boolean run(final CommandSender sender, final String label, final S if (act.equals("throw")) { throw new CommandException(); } else if (act.equals("place")) { - if (args.length < 3) { - super.sendUsageMessage(sender, label); - return true; - } - - bool1 = false; - if (sender instanceof Player plr) { - final String struct = args[2].trim(); - final AbstractBaseStructure structure; - - if (struct.equals("shrine")) { - structure = new HerobrineShrineTestStructure(); - } else if (struct.equals("rick")) { - structure = new RickQRCodeTestSchemStructure(); + if (args.length >= 3) { + bool1 = false; + if (sender instanceof Player plr) { + final String struct = args[2].trim(); + final AbstractBaseStructure structure; + + switch (struct) { + case "shrine" -> structure = new HerobrineShrineTestStructure(); + case "rick" -> structure = new RickQRCodeTestSchemStructure(); + default -> { + bool1 = true; + bool2 = false; + structure = null; + } + } + + if (structure != null) { + final Location loc = plr.getLocation(); + structure.place(loc.clone()); + SchedulerUtil.teleportAsync(plr, loc.clone().add(0, 1, 0).getBlock().getLocation().clone().add(0.5D, 0, 0.5D)); + sender.sendMessage(ChatColor.GREEN + "Placed structure " + structure.getName()); + } } else { - bool1 = true; - bool2 = false; - structure = null; + sendOnlyPlayersMessage(sender); } - if (structure != null) { - final Location loc = plr.getLocation(); - structure.place(loc.clone()); - SchedulerUtil.teleportAsync(plr, loc.clone().add(1, 1, 0).getBlock().getLocation().clone().add(0.5D, 0, 0.5D)); - sender.sendMessage(ChatColor.GREEN + "Placed structure " + structure.getName()); - } } else { - sendOnlyPlayersMessage(sender); + return true; } } } @@ -120,10 +120,9 @@ public final boolean run(final CommandSender sender, final String label, final S @Override public final List tab(final CommandSender sender, final String label, final String[] args) { - if (args.length > 0) { - final List ret = new ArrayList<>(); - - if (args.length == 1) { + final List ret = new ArrayList<>(); + switch (args.length) { + case 1 -> { if (sender.hasPermission("wlib.plugins")) { ret.add("plugins"); } @@ -139,21 +138,22 @@ public final List tab(final CommandSender sender, final String label, fi if (sender.hasPermission("wlib.debug")) { ret.add("debug"); } - } else if (args.length == 2) { + } + + case 2 -> { if (args[0].equals("debug") && sender.hasPermission("wlib.debug")) { ret.add("throw"); ret.add("place"); } - } else if (args.length == 3) { + } + + case 3 -> { if (args[0].equals("debug") && args[1].equals("place") && sender.hasPermission("wlib.debug")) { ret.add("shrine"); ret.add("rick"); } } - - return ret; - } else { - return List.of(); } + return ret; } } diff --git a/src/main/java/xyz/webmc/wlib/internal/structure/HerobrineShrineTestStructure.java b/src/main/java/xyz/webmc/wlib/internal/structure/HerobrineShrineTestStructure.java index 1fa453f..d142949 100644 --- a/src/main/java/xyz/webmc/wlib/internal/structure/HerobrineShrineTestStructure.java +++ b/src/main/java/xyz/webmc/wlib/internal/structure/HerobrineShrineTestStructure.java @@ -48,5 +48,4 @@ public PlaceableStructure build(final long seed) { return structure; } - } diff --git a/src/main/java/xyz/webmc/wlib/internal/structure/RickQRCodeTestSchemStructure.java b/src/main/java/xyz/webmc/wlib/internal/structure/RickQRCodeTestSchemStructure.java index 53ce106..25a2dc3 100644 --- a/src/main/java/xyz/webmc/wlib/internal/structure/RickQRCodeTestSchemStructure.java +++ b/src/main/java/xyz/webmc/wlib/internal/structure/RickQRCodeTestSchemStructure.java @@ -29,12 +29,13 @@ public RickQRCodeTestSchemStructure(){ @Override public PlaceableStructure build(final long seed) { final PlaceableStructure structure = new PlaceableStructure(this.getName()); + try (InputStream is = RickQRCodeTestSchemStructure.class.getResourceAsStream("/schematics/rick.schem")) { structure.loadSchematic(is); } catch (final IOException | ParsingException ex) { throw new RuntimeException("Failed to load schematic for structure " + this.getName(), ex); } + return structure; } - } From 04e5ab23c2a5f9d53e8693cb28f134774e8f6ca9 Mon Sep 17 00:00:00 2001 From: noone-075 Date: Wed, 2 Sep 2026 13:54:39 +0200 Subject: [PATCH 05/10] fix: added final statements --- .../xyz/webmc/wlib/api/structure/AbstractBaseStructure.java | 4 ++-- .../java/xyz/webmc/wlib/api/structure/PlaceableStructure.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java b/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java index 2d56e9c..fcab2e9 100644 --- a/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java +++ b/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java @@ -48,11 +48,11 @@ public final PlaceableStructure getChunk(final int chunkX, final int chunkZ) { return this.getChunk(chunkX, chunkZ, 0L); } - public static List> getStructures() { + public final static List> getStructures() { return STRUCTURES; } - public static void registerStructure(final Class clazz) { + public final static void registerStructure(final Class clazz) { if (clazz != null && !STRUCTURES.contains(clazz)) { STRUCTURES.add(clazz); } diff --git a/src/main/java/xyz/webmc/wlib/api/structure/PlaceableStructure.java b/src/main/java/xyz/webmc/wlib/api/structure/PlaceableStructure.java index 210bcb8..24cbe9c 100644 --- a/src/main/java/xyz/webmc/wlib/api/structure/PlaceableStructure.java +++ b/src/main/java/xyz/webmc/wlib/api/structure/PlaceableStructure.java @@ -33,7 +33,7 @@ import org.bukkit.Chunk; import org.bukkit.Location; -public class PlaceableStructure { +public final class PlaceableStructure { private final String name; private final List blocks = new ArrayList<>(); From c5360dfb49b8d7d3653464e22d5167dc46ce2eca Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 2 Sep 2026 12:04:27 +0000 Subject: [PATCH 06/10] chore: auto-format code --- .../xyz/webmc/wlib/api/structure/AbstractBaseStructure.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java b/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java index fcab2e9..416fe12 100644 --- a/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java +++ b/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java @@ -48,11 +48,11 @@ public final PlaceableStructure getChunk(final int chunkX, final int chunkZ) { return this.getChunk(chunkX, chunkZ, 0L); } - public final static List> getStructures() { + public static final List> getStructures() { return STRUCTURES; } - public final static void registerStructure(final Class clazz) { + public static final void registerStructure(final Class clazz) { if (clazz != null && !STRUCTURES.contains(clazz)) { STRUCTURES.add(clazz); } From be183eead2a2550370e55986e654d438996dfdd0 Mon Sep 17 00:00:00 2001 From: noone Date: Wed, 2 Sep 2026 15:52:15 +0200 Subject: [PATCH 07/10] feat: changed a lot - HerobrineShrineTestStructure now extends AbstractGenerableStructure instead of AbstractBaseStructure - Added getGenerationSeed method to AbstractGenerableStructure - fixed review comments - fix code issues --- .../api/structure/AbstractBaseStructure.java | 64 ++++++++++++++----- .../structure/AbstractGenerableStructure.java | 42 ++++++++++-- .../api/structure/PlaceableStructure.java | 2 +- .../wlib/internal/command/WLIBCommand.java | 49 +++++++++++--- .../HerobrineShrineTestStructure.java | 14 +++- .../RickQRCodeTestSchemStructure.java | 6 +- 6 files changed, 139 insertions(+), 38 deletions(-) diff --git a/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java b/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java index 416fe12..8ad2400 100644 --- a/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java +++ b/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java @@ -13,9 +13,15 @@ package xyz.webmc.wlib.api.structure; +import xyz.webmc.wlib.api.WLIB; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import net.sandrohc.schematic4j.exception.ParsingException; import org.bukkit.Location; public abstract class AbstractBaseStructure { @@ -30,31 +36,59 @@ public final String getName() { return this.name; } - public abstract PlaceableStructure build(long seed); + public abstract PlaceableStructure build(); - public final void place(final Location loc, final long seed) { - this.build(seed).place(loc); + public static final List> getStructures() { + return STRUCTURES; } - public final void place(final Location loc) { - this.place(loc, 0L); + public static final void registerStructure(final Class clazz) { + if (clazz != null && !STRUCTURES.contains(clazz)) { + STRUCTURES.add(clazz); + } } - public final PlaceableStructure getChunk(final int chunkX, final int chunkZ, final long seed) { - return this.build(seed).getChunk(chunkX, chunkZ); + /* + * DEPRECATED METHODS USE PlaceableStructure and .build() INSTEAD + * + * The 2 first methods are here to make the transition easier, but .build must be use in the future. + */ + + @Deprecated(forRemoval = true) + public void place(final Location loc) { + this.build().place(loc); } - public final PlaceableStructure getChunk(final int chunkX, final int chunkZ) { - return this.getChunk(chunkX, chunkZ, 0L); + @Deprecated(forRemoval = true) + public int getOffsetY() { + WLIB.warnDeprecatedUsage(); + return 0; } - public static final List> getStructures() { - return STRUCTURES; + @Deprecated(forRemoval = true) + public int getOffsetZ() { + WLIB.warnDeprecatedUsage(); + return 0; } - public static final void registerStructure(final Class clazz) { - if (clazz != null && !STRUCTURES.contains(clazz)) { - STRUCTURES.add(clazz); - } + @Deprecated(forRemoval = true) + protected final void addBlock(final BlockRelative blk) { + WLIB.warnDeprecatedUsage(); + } + + @Deprecated(forRemoval = true) + protected final void loadSchematic(final InputStream is) throws IOException, ParsingException { + WLIB.warnDeprecatedUsage(); + } + + @Deprecated(forRemoval = true) + protected final void loadSchematic(final File file) throws IOException, ParsingException { + WLIB.warnDeprecatedUsage(); + } + + @Deprecated(forRemoval = true) + public static final T getInstance(final Class clazz, final Object... params) { + WLIB.warnDeprecatedUsage(); + return null; } } diff --git a/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java b/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java index c3a6388..d0e9233 100644 --- a/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java +++ b/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java @@ -25,7 +25,18 @@ protected AbstractGenerableStructure(final String name) { public abstract boolean canGenerateAt(final int chunkX, final int chunkZ, final long worldSeed); + public abstract long getGenerationSeed(final int chunkX, final int chunkZ, final long worldSeed); + + public abstract PlaceableStructure build(final long seed); + + @Override + public final PlaceableStructure build() { + return this.build(0); + } + public final Location locateNearest(final Location pos, final long worldSeed) { + Location ret = null; + if (pos != null && pos.getWorld() != null) { final int centerChunkX = pos.getChunk().getX(); final int centerChunkZ = pos.getChunk().getZ(); @@ -39,27 +50,39 @@ public final Location locateNearest(final Location pos, final long worldSeed) { for (int chunkX = minX; chunkX <= maxX; chunkX++) { if (this.canGenerateAt(chunkX, minZ, worldSeed)) { - return this.createLocation(world, chunkX, minZ); + ret = this.createLocation(world, chunkX, minZ); + break; } - if (minZ != maxZ && this.canGenerateAt(chunkX, maxZ, worldSeed)) { - return this.createLocation(world, chunkX, maxZ); + if (this.canGenerateAt(chunkX, maxZ, worldSeed)) { + ret = this.createLocation(world, chunkX, maxZ); + break; } } + if (ret != null) { + break; + } + for (int chunkZ = minZ + 1; chunkZ < maxZ; chunkZ++) { if (this.canGenerateAt(minX, chunkZ, worldSeed)) { - return this.createLocation(world, minX, chunkZ); + ret = this.createLocation(world, minX, chunkZ); + break; } - if (minX != maxX && this.canGenerateAt(maxX, chunkZ, worldSeed)) { - return this.createLocation(world, maxX, chunkZ); + if (this.canGenerateAt(maxX, chunkZ, worldSeed)) { + ret = this.createLocation(world, maxX, chunkZ); + break; } } + + if (ret != null) { + break; + } } } - return null; + return ret; } private Location createLocation(final World world, final int chunkX, final int chunkZ) { @@ -68,4 +91,9 @@ private Location createLocation(final World world, final int chunkX, final int c return new Location(world, blockX, 65, blockZ); } + + @Deprecated(forRemoval = true) + public void place(final Location loc) { + this.build(getGenerationSeed(loc.getChunk().getX(), loc.getChunk().getZ(), loc.getWorld().getSeed())).place(loc); + } } diff --git a/src/main/java/xyz/webmc/wlib/api/structure/PlaceableStructure.java b/src/main/java/xyz/webmc/wlib/api/structure/PlaceableStructure.java index 24cbe9c..14236a2 100644 --- a/src/main/java/xyz/webmc/wlib/api/structure/PlaceableStructure.java +++ b/src/main/java/xyz/webmc/wlib/api/structure/PlaceableStructure.java @@ -34,8 +34,8 @@ import org.bukkit.Location; public final class PlaceableStructure { - private final String name; private final List blocks = new ArrayList<>(); + private final String name; public PlaceableStructure(final String name) { this.name = name; diff --git a/src/main/java/xyz/webmc/wlib/internal/command/WLIBCommand.java b/src/main/java/xyz/webmc/wlib/internal/command/WLIBCommand.java index cfb0f22..13b59a1 100644 --- a/src/main/java/xyz/webmc/wlib/internal/command/WLIBCommand.java +++ b/src/main/java/xyz/webmc/wlib/internal/command/WLIBCommand.java @@ -16,6 +16,7 @@ import xyz.webmc.wlib.api.WLIB; import xyz.webmc.wlib.api.command.WCommand; import xyz.webmc.wlib.api.structure.AbstractBaseStructure; +import xyz.webmc.wlib.api.structure.AbstractGenerableStructure; import xyz.webmc.wlib.api.util.PermissionUtil; import xyz.webmc.wlib.api.util.SchedulerUtil; import xyz.webmc.wlib.api.util.TextUtil; @@ -91,15 +92,39 @@ public final boolean run(final CommandSender sender, final String label, final S if (structure != null) { final Location loc = plr.getLocation(); - structure.place(loc.clone()); - SchedulerUtil.teleportAsync(plr, loc.clone().add(0, 1, 0).getBlock().getLocation().clone().add(0.5D, 0, 0.5D)); + if (structure instanceof AbstractGenerableStructure generable) { + final long seed = generable.getGenerationSeed(loc.getChunk().getX(), loc.getChunk().getZ(), + plr.getWorld().getSeed()); + generable.build(seed).place(loc.clone()); + } else { + structure.build().place(loc.clone()); + } + SchedulerUtil.teleportAsync(plr, + loc.clone().add(0, 1, 0).getBlock().getLocation().clone().add(0.5D, 0, 0.5D)); sender.sendMessage(ChatColor.GREEN + "Placed structure " + structure.getName()); } } else { sendOnlyPlayersMessage(sender); + return true; + } + } + } else if (act.equals("locateHerobrine")) { + if (sender instanceof Player plr) { + final AbstractGenerableStructure structure = new HerobrineShrineTestStructure(); + final Location loc = structure.locateNearest(plr.getLocation(), plr.getWorld().getSeed()); + if (loc != null) { + /* + * Unless an other plugin use a chunk generator to generate the Herobrine Shrine the structure will NOT naturaly spawn. This is a theoretical location. + */ + sender.sendMessage(ChatColor.GREEN + "Nearest naturaly spawned Herobrine Shrine would be at " + ChatColor.AQUA + loc.getBlockX() + + ChatColor.GREEN + ", " + ChatColor.AQUA + loc.getBlockY() + ChatColor.GREEN + ", " + + ChatColor.AQUA + "~" + ChatColor.GREEN + " in world " + + ChatColor.AQUA + loc.getWorld().getName()); + } else { + sender.sendMessage(ChatColor.RED + "No naturaly spawned Herobrine Shrine would be within search radius."); } - } else { + sendOnlyPlayersMessage(sender); return true; } } @@ -107,20 +132,23 @@ public final boolean run(final CommandSender sender, final String label, final S } } - if (bool1) { - if (!bool2) { - super.sendUsageMessage(sender, label); - } else { - super.sendPermissionMessage(sender, label); - } + if(bool1) + + { + if (!bool2) { + super.sendUsageMessage(sender, label); + } else { + super.sendPermissionMessage(sender, label); } + } - return true; + return true; } @Override public final List tab(final CommandSender sender, final String label, final String[] args) { final List ret = new ArrayList<>(); + switch (args.length) { case 1 -> { if (sender.hasPermission("wlib.plugins")) { @@ -154,6 +182,7 @@ public final List tab(final CommandSender sender, final String label, fi } } } + return ret; } } diff --git a/src/main/java/xyz/webmc/wlib/internal/structure/HerobrineShrineTestStructure.java b/src/main/java/xyz/webmc/wlib/internal/structure/HerobrineShrineTestStructure.java index d142949..f8e2d96 100644 --- a/src/main/java/xyz/webmc/wlib/internal/structure/HerobrineShrineTestStructure.java +++ b/src/main/java/xyz/webmc/wlib/internal/structure/HerobrineShrineTestStructure.java @@ -13,13 +13,13 @@ package xyz.webmc.wlib.internal.structure; -import xyz.webmc.wlib.api.structure.AbstractBaseStructure; +import xyz.webmc.wlib.api.structure.AbstractGenerableStructure; import xyz.webmc.wlib.api.structure.BlockRelative; import xyz.webmc.wlib.api.structure.PlaceableStructure; import com.cryptomorin.xseries.XMaterial; -public final class HerobrineShrineTestStructure extends AbstractBaseStructure { +public final class HerobrineShrineTestStructure extends AbstractGenerableStructure { public HerobrineShrineTestStructure() { super("herobrine_shrine"); } @@ -48,4 +48,14 @@ public PlaceableStructure build(final long seed) { return structure; } + + @Override + public boolean canGenerateAt(final int chunkX, final int chunkZ, final long worldSeed) { + return (chunkX + chunkZ) % 10 == 0; + } + + @Override + public long getGenerationSeed(final int chunkX, final int chunkZ, final long worldSeed) { + return worldSeed + (chunkX * 31L) + (chunkZ * 17L); + } } diff --git a/src/main/java/xyz/webmc/wlib/internal/structure/RickQRCodeTestSchemStructure.java b/src/main/java/xyz/webmc/wlib/internal/structure/RickQRCodeTestSchemStructure.java index 25a2dc3..4e061d9 100644 --- a/src/main/java/xyz/webmc/wlib/internal/structure/RickQRCodeTestSchemStructure.java +++ b/src/main/java/xyz/webmc/wlib/internal/structure/RickQRCodeTestSchemStructure.java @@ -22,18 +22,18 @@ import net.sandrohc.schematic4j.exception.ParsingException; public final class RickQRCodeTestSchemStructure extends AbstractBaseStructure { - public RickQRCodeTestSchemStructure(){ + public RickQRCodeTestSchemStructure() { super("rick_qr"); } @Override - public PlaceableStructure build(final long seed) { + public PlaceableStructure build() { final PlaceableStructure structure = new PlaceableStructure(this.getName()); try (InputStream is = RickQRCodeTestSchemStructure.class.getResourceAsStream("/schematics/rick.schem")) { structure.loadSchematic(is); } catch (final IOException | ParsingException ex) { - throw new RuntimeException("Failed to load schematic for structure " + this.getName(), ex); + throw new RuntimeException(ex); } return structure; From 1ed7e3792dafa78847aa566be1b1f564f3c1ab5e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 2 Sep 2026 13:53:40 +0000 Subject: [PATCH 08/10] chore: auto-format code --- .../webmc/wlib/api/structure/AbstractGenerableStructure.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java b/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java index d0e9233..1912ee4 100644 --- a/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java +++ b/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java @@ -36,7 +36,7 @@ public final PlaceableStructure build() { public final Location locateNearest(final Location pos, final long worldSeed) { Location ret = null; - + if (pos != null && pos.getWorld() != null) { final int centerChunkX = pos.getChunk().getX(); final int centerChunkZ = pos.getChunk().getZ(); From 25fe9bee3c6a7a827a080a4d47e269b0229df58c Mon Sep 17 00:00:00 2001 From: Colbster937 Date: Thu, 3 Sep 2026 11:31:50 -0500 Subject: [PATCH 09/10] chore: fix issues that i can --- .../api/structure/AbstractBaseStructure.java | 22 ++++---- .../structure/AbstractGenerableStructure.java | 51 +++++++------------ .../api/structure/WeightedStructureTable.java | 4 ++ .../wlib/internal/command/WLIBCommand.java | 41 ++++----------- 4 files changed, 45 insertions(+), 73 deletions(-) diff --git a/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java b/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java index 8ad2400..9a5a2d1 100644 --- a/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java +++ b/src/main/java/xyz/webmc/wlib/api/structure/AbstractBaseStructure.java @@ -48,47 +48,51 @@ public static final void registerStructure(final Class cl } } - /* - * DEPRECATED METHODS USE PlaceableStructure and .build() INSTEAD - * - * The 2 first methods are here to make the transition easier, but .build must be use in the future. - */ - @Deprecated(forRemoval = true) public void place(final Location loc) { + WLIB.warnDeprecatedUsage(); this.build().place(loc); } + @Deprecated(forRemoval = true) + public int getOffsetX() { + WLIB.warnDeprecatedUsage(); + throw new UnsupportedOperationException(); + } + @Deprecated(forRemoval = true) public int getOffsetY() { WLIB.warnDeprecatedUsage(); - return 0; + throw new UnsupportedOperationException(); } @Deprecated(forRemoval = true) public int getOffsetZ() { WLIB.warnDeprecatedUsage(); - return 0; + throw new UnsupportedOperationException(); } @Deprecated(forRemoval = true) protected final void addBlock(final BlockRelative blk) { WLIB.warnDeprecatedUsage(); + throw new UnsupportedOperationException(); } @Deprecated(forRemoval = true) protected final void loadSchematic(final InputStream is) throws IOException, ParsingException { WLIB.warnDeprecatedUsage(); + throw new UnsupportedOperationException(); } @Deprecated(forRemoval = true) protected final void loadSchematic(final File file) throws IOException, ParsingException { WLIB.warnDeprecatedUsage(); + throw new UnsupportedOperationException(); } @Deprecated(forRemoval = true) public static final T getInstance(final Class clazz, final Object... params) { WLIB.warnDeprecatedUsage(); - return null; + throw new UnsupportedOperationException(); } } diff --git a/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java b/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java index 1912ee4..cb097e6 100644 --- a/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java +++ b/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java @@ -16,6 +16,8 @@ import org.bukkit.Location; import org.bukkit.World; +import xyz.webmc.wlib.api.WLIB; + public abstract class AbstractGenerableStructure extends AbstractBaseStructure { static final int SEARCH_RADIUS = 100; @@ -42,6 +44,7 @@ public final Location locateNearest(final Location pos, final long worldSeed) { final int centerChunkZ = pos.getChunk().getZ(); final World world = pos.getWorld(); + search: for (int radius = 0; radius <= SEARCH_RADIUS; radius++) { final int minX = centerChunkX - radius; final int maxX = centerChunkX + radius; @@ -49,51 +52,35 @@ public final Location locateNearest(final Location pos, final long worldSeed) { final int maxZ = centerChunkZ + radius; for (int chunkX = minX; chunkX <= maxX; chunkX++) { - if (this.canGenerateAt(chunkX, minZ, worldSeed)) { - ret = this.createLocation(world, chunkX, minZ); - break; - } - - if (this.canGenerateAt(chunkX, maxZ, worldSeed)) { - ret = this.createLocation(world, chunkX, maxZ); - break; + for (int chunkZ : new int[] { minZ, maxZ }) { + if (this.canGenerateAt(chunkX, chunkZ, worldSeed)) { + ret = this.createLocation(world, chunkX, chunkZ); + break search; + } } } - if (ret != null) { - break; - } - for (int chunkZ = minZ + 1; chunkZ < maxZ; chunkZ++) { - if (this.canGenerateAt(minX, chunkZ, worldSeed)) { - ret = this.createLocation(world, minX, chunkZ); - break; - } - - if (this.canGenerateAt(maxX, chunkZ, worldSeed)) { - ret = this.createLocation(world, maxX, chunkZ); - break; + for (int chunkX : new int[] { minX, maxX }) { + if (this.canGenerateAt(chunkX, chunkZ, worldSeed)) { + ret = this.createLocation(world, chunkX, chunkZ); + break search; + } } } - - if (ret != null) { - break; - } } } return ret; } - private Location createLocation(final World world, final int chunkX, final int chunkZ) { - final int blockX = chunkX * 16 + 8; - final int blockZ = chunkZ * 16 + 8; - - return new Location(world, blockX, 65, blockZ); - } - @Deprecated(forRemoval = true) - public void place(final Location loc) { + public final void place(final Location loc) { + WLIB.warnDeprecatedUsage(); this.build(getGenerationSeed(loc.getChunk().getX(), loc.getChunk().getZ(), loc.getWorld().getSeed())).place(loc); } + + private Location createLocation(final World world, final int chunkX, final int chunkZ) { + return new Location(world, chunkX * 16 + 8, 65, chunkZ * 16 + 8); + } } diff --git a/src/main/java/xyz/webmc/wlib/api/structure/WeightedStructureTable.java b/src/main/java/xyz/webmc/wlib/api/structure/WeightedStructureTable.java index 5e777cc..55070c7 100644 --- a/src/main/java/xyz/webmc/wlib/api/structure/WeightedStructureTable.java +++ b/src/main/java/xyz/webmc/wlib/api/structure/WeightedStructureTable.java @@ -13,6 +13,7 @@ package xyz.webmc.wlib.api.structure; +import xyz.webmc.wlib.api.WLIB; import xyz.webmc.wlib.api.util.RNGUtil; import java.util.ArrayList; @@ -22,6 +23,7 @@ import dev.colbster937.util.WeightedObjectTable; import org.bukkit.Location; +@SuppressWarnings({ "removal" }) public final class WeightedStructureTable extends WeightedObjectTable { public WeightedStructureTable(final long seed, final WeightedStructure... structures) { super(seed, structures); @@ -41,7 +43,9 @@ public WeightedStructureTable(final Class... st this(weigh(structures)); } + @Deprecated(forRemoval = true) public void place(final Location loc) { + WLIB.warnDeprecatedUsage(); this.computeRandomObject().place(loc); } diff --git a/src/main/java/xyz/webmc/wlib/internal/command/WLIBCommand.java b/src/main/java/xyz/webmc/wlib/internal/command/WLIBCommand.java index 13b59a1..1ad9552 100644 --- a/src/main/java/xyz/webmc/wlib/internal/command/WLIBCommand.java +++ b/src/main/java/xyz/webmc/wlib/internal/command/WLIBCommand.java @@ -93,14 +93,12 @@ public final boolean run(final CommandSender sender, final String label, final S if (structure != null) { final Location loc = plr.getLocation(); if (structure instanceof AbstractGenerableStructure generable) { - final long seed = generable.getGenerationSeed(loc.getChunk().getX(), loc.getChunk().getZ(), - plr.getWorld().getSeed()); + final long seed = generable.getGenerationSeed(loc.getChunk().getX(), loc.getChunk().getZ(), plr.getWorld().getSeed()); generable.build(seed).place(loc.clone()); } else { structure.build().place(loc.clone()); } - SchedulerUtil.teleportAsync(plr, - loc.clone().add(0, 1, 0).getBlock().getLocation().clone().add(0.5D, 0, 0.5D)); + SchedulerUtil.teleportAsync(plr, loc.clone().add(0, 1, 0).getBlock().getLocation().clone().add(0.5D, 0, 0.5D)); sender.sendMessage(ChatColor.GREEN + "Placed structure " + structure.getName()); } } else { @@ -108,41 +106,20 @@ public final boolean run(final CommandSender sender, final String label, final S return true; } } - } else if (act.equals("locateHerobrine")) { - if (sender instanceof Player plr) { - final AbstractGenerableStructure structure = new HerobrineShrineTestStructure(); - final Location loc = structure.locateNearest(plr.getLocation(), plr.getWorld().getSeed()); - if (loc != null) { - /* - * Unless an other plugin use a chunk generator to generate the Herobrine Shrine the structure will NOT naturaly spawn. This is a theoretical location. - */ - sender.sendMessage(ChatColor.GREEN + "Nearest naturaly spawned Herobrine Shrine would be at " + ChatColor.AQUA + loc.getBlockX() - + ChatColor.GREEN + ", " + ChatColor.AQUA + loc.getBlockY() + ChatColor.GREEN + ", " - + ChatColor.AQUA + "~" + ChatColor.GREEN + " in world " - + ChatColor.AQUA + loc.getWorld().getName()); - } else { - sender.sendMessage(ChatColor.RED + "No naturaly spawned Herobrine Shrine would be within search radius."); - } - } else { - sendOnlyPlayersMessage(sender); - return true; - } } } } } - if(bool1) - - { - if (!bool2) { - super.sendUsageMessage(sender, label); - } else { - super.sendPermissionMessage(sender, label); + if (bool1) { + if (!bool2) { + super.sendUsageMessage(sender, label); + } else { + super.sendPermissionMessage(sender, label); + } } - } - return true; + return true; } @Override From 9c24671c543f8fe8059b397836b4d70897ebda1d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 3 Sep 2026 20:04:50 +0000 Subject: [PATCH 10/10] chore: auto-format code --- .../webmc/wlib/api/structure/AbstractGenerableStructure.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java b/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java index cb097e6..0bd9c6f 100644 --- a/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java +++ b/src/main/java/xyz/webmc/wlib/api/structure/AbstractGenerableStructure.java @@ -13,11 +13,11 @@ package xyz.webmc.wlib.api.structure; +import xyz.webmc.wlib.api.WLIB; + import org.bukkit.Location; import org.bukkit.World; -import xyz.webmc.wlib.api.WLIB; - public abstract class AbstractGenerableStructure extends AbstractBaseStructure { static final int SEARCH_RADIUS = 100;