Better structures.

This commit is contained in:
tastybento 2023-03-11 21:37:21 -08:00
parent c30841440b
commit 87fb333753
8 changed files with 140 additions and 330 deletions

View File

@ -59,7 +59,7 @@
<powermock.version>2.0.9</powermock.version> <powermock.version>2.0.9</powermock.version>
<!-- More visible way how to change dependency versions --> <!-- More visible way how to change dependency versions -->
<spigot.version>1.19.3-R0.1-SNAPSHOT</spigot.version> <spigot.version>1.19.3-R0.1-SNAPSHOT</spigot.version>
<bentobox.version>1.22.0-SNAPSHOT</bentobox.version> <bentobox.version>1.22.1-SNAPSHOT</bentobox.version>
<!-- Revision variable removes warning about dynamic version --> <!-- Revision variable removes warning about dynamic version -->
<revision>${build.version}-SNAPSHOT</revision> <revision>${build.version}-SNAPSHOT</revision>
<!-- Do not change unless you want different name for local builds. --> <!-- Do not change unless you want different name for local builds. -->

View File

@ -87,8 +87,6 @@ public class Boxed extends GameModeAddon {
new AdminPlaceStructureCommand(this); new AdminPlaceStructureCommand(this);
} }
}; };
} }
private boolean loadSettings() { private boolean loadSettings() {
@ -183,7 +181,7 @@ public class Boxed extends GameModeAddon {
// This creates a vanilla base world with biomes // This creates a vanilla base world with biomes
AbstractBoxedChunkGenerator seedBaseGen = new BoxedSeedChunkGenerator(this, Environment.NETHER); AbstractBoxedChunkGenerator seedBaseGen = new BoxedSeedChunkGenerator(this, Environment.NETHER);
baseWorldNether = WorldCreator baseWorldNether = WorldCreator
.name(SEED+NETHER+BASE) .name(worldName + "/" + SEED+NETHER+BASE)
.generator(seedBaseGen) .generator(seedBaseGen)
.environment(Environment.NETHER) .environment(Environment.NETHER)
.seed(getSettings().getSeed()) .seed(getSettings().getSeed())
@ -196,7 +194,7 @@ public class Boxed extends GameModeAddon {
log("Creating Boxed Biomed Nether world ..."); log("Creating Boxed Biomed Nether world ...");
seedWorldNether = WorldCreator seedWorldNether = WorldCreator
.name(SEED+NETHER) .name(worldName + "/" + SEED+NETHER)
.generator(new BoxedSeedChunkGenerator(this, Environment.NETHER, new NetherSeedBiomeGenerator(this, seedBaseGen))) .generator(new BoxedSeedChunkGenerator(this, Environment.NETHER, new NetherSeedBiomeGenerator(this, seedBaseGen)))
.environment(Environment.NETHER) .environment(Environment.NETHER)
.seed(getSettings().getSeed()) .seed(getSettings().getSeed())
@ -219,7 +217,7 @@ public class Boxed extends GameModeAddon {
// This creates a vanilla base world with biomes // This creates a vanilla base world with biomes
AbstractBoxedChunkGenerator seedBaseGen = new BoxedSeedChunkGenerator(this, Environment.NORMAL); AbstractBoxedChunkGenerator seedBaseGen = new BoxedSeedChunkGenerator(this, Environment.NORMAL);
baseWorld = WorldCreator baseWorld = WorldCreator
.name(SEED+BASE) .name(worldName + "/" + SEED+BASE)
.generator(seedBaseGen) .generator(seedBaseGen)
.environment(Environment.NORMAL) .environment(Environment.NORMAL)
.seed(getSettings().getSeed()) .seed(getSettings().getSeed())
@ -232,7 +230,7 @@ public class Boxed extends GameModeAddon {
log("Creating Boxed Biomed world ..."); log("Creating Boxed Biomed world ...");
seedWorld = WorldCreator seedWorld = WorldCreator
.name(SEED) .name(worldName + "/" + SEED)
.generator(new BoxedSeedChunkGenerator(this, Environment.NORMAL, new SeedBiomeGenerator(this, seedBaseGen))) .generator(new BoxedSeedChunkGenerator(this, Environment.NORMAL, new SeedBiomeGenerator(this, seedBaseGen)))
.environment(Environment.NORMAL) .environment(Environment.NORMAL)
.seed(getSettings().getSeed()) .seed(getSettings().getSeed())
@ -395,4 +393,8 @@ public class Boxed extends GameModeAddon {
return boxedBlockPopulator; return boxedBlockPopulator;
} }
@Override
public boolean isUsesNewChunkGeneration() {
return true;
}
} }

View File

@ -76,51 +76,11 @@ public class Settings implements WorldSettings {
@ConfigEntry(path = "world.generator.seed", needsReset = true) @ConfigEntry(path = "world.generator.seed", needsReset = true)
private long seed = 602103456450L; private long seed = 602103456450L;
@ConfigComment("Area seed center. This is where the areas are copied from.")
@ConfigEntry(path = "world.generator.seed-start.normal.x")
private int seedX = 0;
@ConfigEntry(path = "world.generator.seed-start.normal.z")
private int seedZ = 0;
@ConfigComment("Nether area seed center. This is where the areas are copied from.")
@ConfigEntry(path = "world.generator.seed-start.nether.x")
private int netherSeedX = 0;
@ConfigEntry(path = "world.generator.seed-start.nether.z")
private int netherSeedZ = 0;
@ConfigComment("End area seed center. This is where the areas are copied from.")
@ConfigEntry(path = "world.generator.seed-start.end.x")
private int endSeedX = 0;
@ConfigEntry(path = "world.generator.seed-start.end.z")
private int endSeedZ = 0;
@ConfigComment("World difficulty setting - PEACEFUL, EASY, NORMAL, HARD") @ConfigComment("World difficulty setting - PEACEFUL, EASY, NORMAL, HARD")
@ConfigComment("Other plugins may override this setting") @ConfigComment("Other plugins may override this setting")
@ConfigEntry(path = "world.difficulty") @ConfigEntry(path = "world.difficulty")
private Difficulty difficulty = Difficulty.NORMAL; private Difficulty difficulty = Difficulty.NORMAL;
@ConfigComment("Generate surface")
@ConfigEntry(path = "world.generator.generate-surface", needsRestart = true)
private boolean generateSurface = true;
@ConfigComment("Generate caves")
@ConfigEntry(path = "world.generator.generate-caves", needsRestart = true)
private boolean generateCaves = true;
@ConfigComment("Generate Decorations")
@ConfigEntry(path = "world.generator.generate-decorations", needsRestart = true)
private boolean generateDecorations = true;
@ConfigComment("Generate mobs")
@ConfigEntry(path = "world.generator.generate-mobs", needsRestart = true)
private boolean generateMobs = true;
@ConfigComment("Allow surface structures - villages, shipwrecks, broken portals, etc.")
@ConfigComment("These will be randomly placed, so may not be available for every player.")
@ConfigEntry(path = "world.generator.allow-structures", needsRestart = true)
private boolean allowStructures = true;
@ConfigComment("Spawn limits. These override the limits set in bukkit.yml") @ConfigComment("Spawn limits. These override the limits set in bukkit.yml")
@ConfigComment("If set to a negative number, the server defaults will be used") @ConfigComment("If set to a negative number, the server defaults will be used")
@ConfigEntry(path = "world.spawn-limits.monsters") @ConfigEntry(path = "world.spawn-limits.monsters")
@ -161,21 +121,11 @@ public class Settings implements WorldSettings {
@ConfigEntry(path = "world.start-z") @ConfigEntry(path = "world.start-z")
private int islandStartZ = 0; private int islandStartZ = 0;
@ConfigComment("Area height - Lowest is 5.")
@ConfigComment("It is the y coordinate of the bedrock block in the blueprint.")
@ConfigEntry(path = "world.area-height")
private int islandHeight = 5;
@ConfigComment("Maximum number of player areas in the world. Set to -1 or 0 for unlimited.") @ConfigComment("Maximum number of player areas in the world. Set to -1 or 0 for unlimited.")
@ConfigComment("If the number of areas is greater than this number, it will stop players from joining the world.") @ConfigComment("If the number of areas is greater than this number, it will stop players from joining the world.")
@ConfigEntry(path = "world.max-areas") @ConfigEntry(path = "world.max-areas")
private int maxIslands = -1; private int maxIslands = -1;
@ConfigComment("The default game mode for this world. Players will be set to this mode when they create")
@ConfigComment("a new area for example. Options are SURVIVAL, CREATIVE, ADVENTURE, SPECTATOR")
@ConfigEntry(path = "world.default-game-mode")
private GameMode defaultGameMode = GameMode.SURVIVAL;
@ConfigComment("The maximum number of players a player can ban at any one time in this game mode.") @ConfigComment("The maximum number of players a player can ban at any one time in this game mode.")
@ConfigComment("The permission boxed.ban.maxlimit.X where X is a number can also be used per player") @ConfigComment("The permission boxed.ban.maxlimit.X where X is a number can also be used per player")
@ConfigComment("-1 = unlimited") @ConfigComment("-1 = unlimited")
@ -191,13 +141,6 @@ public class Settings implements WorldSettings {
@ConfigEntry(path = "world.nether.generate") @ConfigEntry(path = "world.nether.generate")
private boolean netherGenerate = true; private boolean netherGenerate = true;
@ConfigComment("Nether spawn protection radius - this is the distance around the nether spawn")
@ConfigComment("that will be public from player interaction (breaking blocks, pouring lava etc.)")
@ConfigComment("Minimum is 0 (not recommended), maximum is 100. Default is 25.")
@ConfigComment("Only applies to vanilla nether")
@ConfigEntry(path = "world.nether.spawn-radius")
private int netherSpawnRadius = 32;
@ConfigComment("This option indicates if nether portals should be linked via dimensions.") @ConfigComment("This option indicates if nether portals should be linked via dimensions.")
@ConfigComment("Option will simulate vanilla portal mechanics that links portals together") @ConfigComment("Option will simulate vanilla portal mechanics that links portals together")
@ConfigComment("or creates a new portal, if there is not a portal in that dimension.") @ConfigComment("or creates a new portal, if there is not a portal in that dimension.")
@ -205,7 +148,7 @@ public class Settings implements WorldSettings {
private boolean makeNetherPortals = false; private boolean makeNetherPortals = false;
// End // End
@ConfigComment("End Nether - if this is false, the end world will not be made and access to") @ConfigComment("End World - if this is false, the end world will not be made and access to")
@ConfigComment("the end will not occur. Other plugins may still enable portal usage.") @ConfigComment("the end will not occur. Other plugins may still enable portal usage.")
@ConfigEntry(path = "world.end.generate") @ConfigEntry(path = "world.end.generate")
private boolean endGenerate = true; private boolean endGenerate = true;
@ -369,7 +312,7 @@ public class Settings implements WorldSettings {
@ConfigComment("Grant these advancements") @ConfigComment("Grant these advancements")
@ConfigEntry(path = "area.reset.on-leave.grant-advancements") @ConfigEntry(path = "area.reset.on-leave.grant-advancements")
private List<String> onLeaveGrantAdvancements = new ArrayList<>(); private List<String> onLeaveGrantAdvancements = new ArrayList<>();
@ConfigComment("Toggles the automatic area creation upon the player's first login on your server.") @ConfigComment("Toggles the automatic area creation upon the player's first login on your server.")
@ConfigComment("If set to true,") @ConfigComment("If set to true,")
@ConfigComment(" * Upon connecting to your server for the first time, the player will be told that") @ConfigComment(" * Upon connecting to your server for the first time, the player will be told that")
@ -412,13 +355,6 @@ public class Settings implements WorldSettings {
@ConfigEntry(path = "area.teleport-player-to-area-when-created") @ConfigEntry(path = "area.teleport-player-to-area-when-created")
private boolean teleportPlayerToIslandUponIslandCreation = true; private boolean teleportPlayerToIslandUponIslandCreation = true;
@ConfigComment("Create Nether or End areas if they are missing when a player goes through a portal.")
@ConfigComment("Nether and End areas are usually pasted when a player makes their area, but if they are")
@ConfigComment("missing for some reason, you can switch this on.")
@ConfigComment("Note that bedrock removal glitches can exploit this option.")
@ConfigEntry(path = "area.create-missing-nether-end-areas")
private boolean pasteMissingIslands = false;
// Commands // Commands
@ConfigComment("List of commands to run when a player joins an area or creates one.") @ConfigComment("List of commands to run when a player joins an area or creates one.")
@ConfigComment("These commands are run by the console, unless otherwise stated using the [SUDO] prefix,") @ConfigComment("These commands are run by the console, unless otherwise stated using the [SUDO] prefix,")
@ -464,14 +400,14 @@ public class Settings implements WorldSettings {
private List<String> onRespawnCommands = new ArrayList<>(); private List<String> onRespawnCommands = new ArrayList<>();
// Sethome // Sethome
@ConfigComment("Allow setting home in the nether. Only available on nether areas, not vanilla nether.") @ConfigComment("Allow setting home in the nether.")
@ConfigEntry(path = "area.sethome.nether.allow") @ConfigEntry(path = "area.sethome.nether.allow")
private boolean allowSetHomeInNether = true; private boolean allowSetHomeInNether = true;
@ConfigEntry(path = "area.sethome.nether.require-confirmation") @ConfigEntry(path = "area.sethome.nether.require-confirmation")
private boolean requireConfirmationToSetHomeInNether = true; private boolean requireConfirmationToSetHomeInNether = true;
@ConfigComment("Allow setting home in the end. Only available on end areas, not vanilla end.") @ConfigComment("Allow setting home in the end.")
@ConfigEntry(path = "area.sethome.the-end.allow") @ConfigEntry(path = "area.sethome.the-end.allow")
private boolean allowSetHomeInTheEnd = true; private boolean allowSetHomeInTheEnd = true;
@ -503,7 +439,7 @@ public class Settings implements WorldSettings {
@ConfigEntry(path = "protection.geo-limit-settings") @ConfigEntry(path = "protection.geo-limit-settings")
private List<String> geoLimitSettings = new ArrayList<>(); private List<String> geoLimitSettings = new ArrayList<>();
@ConfigComment("Boxed blocked mobs.") @ConfigComment("Blocked mobs.")
@ConfigComment("List of mobs that should not spawn in Boxed.") @ConfigComment("List of mobs that should not spawn in Boxed.")
@ConfigEntry(path = "protection.block-mobs") @ConfigEntry(path = "protection.block-mobs")
private List<String> mobLimitSettings = new ArrayList<>(); private List<String> mobLimitSettings = new ArrayList<>();
@ -596,7 +532,7 @@ public class Settings implements WorldSettings {
*/ */
@Override @Override
public int getIslandHeight() { public int getIslandHeight() {
return islandHeight; return 5;
} }
/** /**
@ -628,7 +564,7 @@ public class Settings implements WorldSettings {
*/ */
@Override @Override
public GameMode getDefaultGameMode() { public GameMode getDefaultGameMode() {
return defaultGameMode; return GameMode.SURVIVAL;
} }
/** /**
@ -652,7 +588,7 @@ public class Settings implements WorldSettings {
*/ */
@Override @Override
public int getNetherSpawnRadius() { public int getNetherSpawnRadius() {
return netherSpawnRadius; return 32;
} }
/** /**
@ -990,13 +926,6 @@ public class Settings implements WorldSettings {
this.islandStartZ = islandStartZ; this.islandStartZ = islandStartZ;
} }
/**
* @param islandHeight the islandHeight to set
*/
public void setIslandHeight(int islandHeight) {
this.islandHeight = islandHeight;
}
/** /**
* @param maxIslands the maxIslands to set * @param maxIslands the maxIslands to set
*/ */
@ -1004,13 +933,6 @@ public class Settings implements WorldSettings {
this.maxIslands = maxIslands; this.maxIslands = maxIslands;
} }
/**
* @param defaultGameMode the defaultGameMode to set
*/
public void setDefaultGameMode(GameMode defaultGameMode) {
this.defaultGameMode = defaultGameMode;
}
/** /**
* @param netherGenerate the netherGenerate to set * @param netherGenerate the netherGenerate to set
*/ */
@ -1018,13 +940,6 @@ public class Settings implements WorldSettings {
this.netherGenerate = netherGenerate; this.netherGenerate = netherGenerate;
} }
/**
* @param netherSpawnRadius the netherSpawnRadius to set
*/
public void setNetherSpawnRadius(int netherSpawnRadius) {
this.netherSpawnRadius = netherSpawnRadius;
}
/** /**
* @param endGenerate the endGenerate to set * @param endGenerate the endGenerate to set
*/ */
@ -1465,14 +1380,7 @@ public class Settings implements WorldSettings {
*/ */
@Override @Override
public boolean isPasteMissingIslands() { public boolean isPasteMissingIslands() {
return pasteMissingIslands; return false;
}
/**
* @param pasteMissingIslands the pasteMissingIslands to set
*/
public void setPasteMissingIslands(boolean pasteMissingIslands) {
this.pasteMissingIslands = pasteMissingIslands;
} }
/** /**
@ -1673,20 +1581,6 @@ public class Settings implements WorldSettings {
return false; return false;
} }
/**
* @return the allowStructures
*/
public boolean isAllowStructures() {
return allowStructures;
}
/**
* @param allowStructures the allowStructures to set
*/
public void setAllowStructures(boolean allowStructures) {
this.allowStructures = allowStructures;
}
/** /**
* @return the onJoinResetAdvancements * @return the onJoinResetAdvancements
*/ */
@ -1773,62 +1667,6 @@ public class Settings implements WorldSettings {
this.broadcastAdvancements = broadcastAdvancements; this.broadcastAdvancements = broadcastAdvancements;
} }
/**
* @return the generateSurface
*/
public boolean isGenerateSurface() {
return generateSurface;
}
/**
* @param generateSurface the generateSurface to set
*/
public void setGenerateSurface(boolean generateSurface) {
this.generateSurface = generateSurface;
}
/**
* @return the generateCaves
*/
public boolean isGenerateCaves() {
return generateCaves;
}
/**
* @param generateCaves the generateCaves to set
*/
public void setGenerateCaves(boolean generateCaves) {
this.generateCaves = generateCaves;
}
/**
* @return the generateDecorations
*/
public boolean isGenerateDecorations() {
return generateDecorations;
}
/**
* @param generateDecorations the generateDecorations to set
*/
public void setGenerateDecorations(boolean generateDecorations) {
this.generateDecorations = generateDecorations;
}
/**
* @return the generateMobs
*/
public boolean isGenerateMobs() {
return generateMobs;
}
/**
* @param generateMobs the generateMobs to set
*/
public void setGenerateMobs(boolean generateMobs) {
this.generateMobs = generateMobs;
}
/** /**
* @return the denyVisitorAdvancements * @return the denyVisitorAdvancements
*/ */
@ -1847,85 +1685,42 @@ public class Settings implements WorldSettings {
* @return the seedX * @return the seedX
*/ */
public int getSeedX() { public int getSeedX() {
return seedX; return 0;
}
/**
* @param seedX the seedX to set
*/
public void setSeedX(int seedX) {
this.seedX = seedX;
} }
/** /**
* @return the seedZ * @return the seedZ
*/ */
public int getSeedZ() { public int getSeedZ() {
return seedZ; return 0;
}
/**
* @param seedZ the seedZ to set
*/
public void setSeedZ(int seedZ) {
this.seedZ = seedZ;
} }
/** /**
* @return the netherSeedX * @return the netherSeedX
*/ */
public int getNetherSeedX() { public int getNetherSeedX() {
return netherSeedX; return 0;
}
/**
* @param netherSeedX the netherSeedX to set
*/
public void setNetherSeedX(int netherSeedX) {
this.netherSeedX = netherSeedX;
} }
/** /**
* @return the netherSeedZ * @return the netherSeedZ
*/ */
public int getNetherSeedZ() { public int getNetherSeedZ() {
return netherSeedZ; return 0;
}
/**
* @param netherSeedZ the netherSeedZ to set
*/
public void setNetherSeedZ(int netherSeedZ) {
this.netherSeedZ = netherSeedZ;
} }
/** /**
* @return the endSeedX * @return the endSeedX
*/ */
public int getEndSeedX() { public int getEndSeedX() {
return endSeedX; return 0;
}
/**
* @param endSeedX the endSeedX to set
*/
public void setEndSeedX(int endSeedX) {
this.endSeedX = endSeedX;
} }
/** /**
* @return the endSeedZ * @return the endSeedZ
*/ */
public int getEndSeedZ() { public int getEndSeedZ() {
return endSeedZ; return 0;
} }
/**
* @param endSeedZ the endSeedZ to set
*/
public void setEndSeedZ(int endSeedZ) {
this.endSeedZ = endSeedZ;
}
} }

View File

@ -125,7 +125,8 @@ public abstract class AbstractBoxedChunkGenerator extends ChunkGenerator {
@Override @Override
public boolean shouldGenerateMobs() { public boolean shouldGenerateMobs() {
return this.addon.getSettings().isGenerateMobs(); return true;
//return this.addon.getSettings().isGenerateMobs();
} }
@Override @Override

View File

@ -44,6 +44,8 @@ import net.minecraft.world.level.block.entity.TileEntity;
import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.events.BentoBoxReadyEvent; import world.bentobox.bentobox.api.events.BentoBoxReadyEvent;
import world.bentobox.bentobox.api.events.island.IslandCreatedEvent; import world.bentobox.bentobox.api.events.island.IslandCreatedEvent;
import world.bentobox.bentobox.api.events.island.IslandDeleteEvent;
import world.bentobox.bentobox.api.events.island.IslandResettedEvent;
import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.database.objects.Island;
import world.bentobox.bentobox.util.Pair; import world.bentobox.bentobox.util.Pair;
import world.bentobox.bentobox.util.Util; import world.bentobox.bentobox.util.Util;
@ -57,6 +59,7 @@ import world.bentobox.boxed.objects.BoxedStructureBlock;
*/ */
public class NewAreaListener implements Listener { public class NewAreaListener implements Listener {
private static final List<BlockFace> CARDINALS = List.of(BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST);
private final Boxed addon; private final Boxed addon;
private File structureFile; private File structureFile;
private Queue<Item> itemsToBuild = new LinkedList<>(); private Queue<Item> itemsToBuild = new LinkedList<>();
@ -103,7 +106,7 @@ public class NewAreaListener implements Listener {
for (String struct : list) { for (String struct : list) {
Structure s = Bukkit.getStructureManager().loadStructure(NamespacedKey.fromString(struct)); Structure s = Bukkit.getStructureManager().loadStructure(NamespacedKey.fromString(struct));
if (s == null) { if (s == null) {
BentoBox.getInstance().log("Now loading group from: " + struct); //addon.log("Now loading group from: " + struct);
} }
} }
} }
@ -112,7 +115,15 @@ public class NewAreaListener implements Listener {
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onIslandCreated(IslandCreatedEvent event) { public void onIslandCreated(IslandCreatedEvent event) {
Island island = event.getIsland(); setUpIsland(event.getIsland());
}
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onIslandReset(IslandResettedEvent event) {
setUpIsland(event.getIsland());
}
private void setUpIsland(Island island) {
// Check if this island is in this game // Check if this island is in this game
if (!(addon.inWorld(island.getWorld()))) { if (!(addon.inWorld(island.getWorld()))) {
return; return;
@ -128,6 +139,7 @@ public class NewAreaListener implements Listener {
place("structure",config.getConfigurationSection(env), center, e); place("structure",config.getConfigurationSection(env), center, e);
} }
} }
} }
private void place(String string, ConfigurationSection section, Location center, Environment env) { private void place(String string, ConfigurationSection section, Location center, Environment env) {
@ -163,7 +175,7 @@ public class NewAreaListener implements Listener {
Location l = new Location(world, x, y, z); Location l = new Location(world, x, y, z);
itemsToBuild.add(new Item(name, s, l, rot, mirror)); itemsToBuild.add(new Item(name, s, l, rot, mirror));
} else { } else {
addon.logError("Structure file syntax error: " + name + " " + vector); addon.logError("Structure file syntax error: " + vector + ": " + value);
} }
} }
} }
@ -204,7 +216,7 @@ public class NewAreaListener implements Listener {
Block b = loc.getWorld().getBlockAt(x, y, z); Block b = loc.getWorld().getBlockAt(x, y, z);
if (b.getType().equals(Material.JIGSAW)) { if (b.getType().equals(Material.JIGSAW)) {
// I would like to read the data from the block and do something with it! // I would like to read the data from the block and do something with it!
processJigsaw(b); processJigsaw(b, structureRotation);
} else if (b.getType().equals(Material.STRUCTURE_BLOCK)) { } else if (b.getType().equals(Material.STRUCTURE_BLOCK)) {
processStructureBlock(b); processStructureBlock(b);
} }
@ -239,12 +251,15 @@ public class NewAreaListener implements Listener {
} }
private static final Map<Integer, EntityType> BUTCHER_ANIMALS = Map.of(0, EntityType.COW, 1, EntityType.SHEEP, 2, EntityType.PIG); private static final Map<Integer, EntityType> BUTCHER_ANIMALS = Map.of(0, EntityType.COW, 1, EntityType.SHEEP, 2, EntityType.PIG);
private static void processJigsaw(Block b) { private static void processJigsaw(Block b, StructureRotation structureRotation) {
String data = nmsData(b); String data = nmsData(b);
BoxedJigsawBlock bjb = gson.fromJson(data, BoxedJigsawBlock.class); BoxedJigsawBlock bjb = gson.fromJson(data, BoxedJigsawBlock.class);
BentoBox.getInstance().logDebug("Jigsaw: " + bjb); //BentoBox.getInstance().logDebug("Jigsaw: " + bjb);
BlockData bd = Bukkit.createBlockData(bjb.getFinal_state()); //BentoBox.getInstance().logDebug("FinalState: " + bjb.getFinal_state());
b.setType(bd.getMaterial()); String finalState = correctDirection(bjb.getFinal_state(), structureRotation);
//BentoBox.getInstance().logDebug("FinalState after rotation: " + finalState);
BlockData bd = Bukkit.createBlockData(finalState);
b.setBlockData(bd);
EntityType type = EntityType type =
switch (bjb.getPool()) { switch (bjb.getPool()) {
case "minecraft:bastion/mobs/piglin" -> EntityType.PIGLIN; case "minecraft:bastion/mobs/piglin" -> EntityType.PIGLIN;
@ -257,6 +272,7 @@ public class NewAreaListener implements Listener {
case "minecraft:village/common/cows" -> EntityType.COW; case "minecraft:village/common/cows" -> EntityType.COW;
case "minecraft:village/common/iron_golem" -> EntityType.IRON_GOLEM; case "minecraft:village/common/iron_golem" -> EntityType.IRON_GOLEM;
case "minecraft:village/common/butcher_animals" -> BUTCHER_ANIMALS.get(new Random().nextInt(3)); case "minecraft:village/common/butcher_animals" -> BUTCHER_ANIMALS.get(new Random().nextInt(3));
case "minecraft:village/common/animals" -> BUTCHER_ANIMALS.get(new Random().nextInt(3));
default -> null; default -> null;
}; };
if (bjb.getPool().contains("zombie/villagers")) { if (bjb.getPool().contains("zombie/villagers")) {
@ -266,11 +282,70 @@ public class NewAreaListener implements Listener {
} }
// Spawn it // Spawn it
if (type != null && b.getWorld().spawnEntity(b.getRelative(BlockFace.UP).getLocation(), type) != null) { if (type != null && b.getWorld().spawnEntity(b.getRelative(BlockFace.UP).getLocation(), type) != null) {
BentoBox.getInstance().logDebug("Spawned a " + type + " at " + b.getRelative(BlockFace.UP).getLocation()); //BentoBox.getInstance().logDebug("Spawned a " + type + " at " + b.getRelative(BlockFace.UP).getLocation());
} }
} }
/**
* Corrects the direction of a block based on the structure's rotation
* @param finalState - the final block state of the block, which may include a facing: direction
* @param sr - the structure's rotation
* @return a rewritten blockstate with the updated direction, if required
*/
private static String correctDirection(String finalState, StructureRotation sr) {
if (sr.equals(StructureRotation.NONE)) {
// No change
return finalState;
}
BlockFace oldDirection = getDirection(finalState);
BlockFace newDirection = getNewDirection(oldDirection, sr);
if (newDirection.equals(BlockFace.SELF)) {
// No change - shouldn't happen, but just in case
return finalState;
}
return finalState.replace(oldDirection.name().toLowerCase(Locale.ENGLISH), newDirection.name().toLowerCase(Locale.ENGLISH));
}
/**
* Adjusts the direction based on the StructureRotation
* @param oldDirection the old direction to adjust
* @param sr the structure rotation
* @return the new direction, or SELF if something weird happens
*/
private static BlockFace getNewDirection(BlockFace oldDirection, StructureRotation sr) {
if (sr.equals(StructureRotation.CLOCKWISE_180)) {
return oldDirection.getOppositeFace();
} else if (sr.equals(StructureRotation.CLOCKWISE_90)) {
return switch(oldDirection) {
case EAST -> BlockFace.SOUTH;
case NORTH -> BlockFace.EAST;
case SOUTH -> BlockFace.WEST;
case WEST -> BlockFace.NORTH;
default -> BlockFace.SELF;
};
} else if (sr.equals(StructureRotation.COUNTERCLOCKWISE_90)) {
return switch(oldDirection) {
case EAST -> BlockFace.NORTH;
case NORTH -> BlockFace.WEST;
case SOUTH -> BlockFace.EAST;
case WEST -> BlockFace.SOUTH;
default -> BlockFace.SELF;
};
}
return BlockFace.SELF;
}
/**
* Looks for north, south, east, west in the blockstate.
* @param finalState - the final block state of the block
* @return direction, if found, otherwise SELF
*/
private static BlockFace getDirection(String finalState) {
return CARDINALS.stream().filter(bf -> finalState.contains(bf.name().toLowerCase(Locale.ENGLISH))).findFirst().orElse(BlockFace.SELF);
}
private static String nmsData(Block block) { private static String nmsData(Block block) {
Location w = block.getLocation(); Location w = block.getLocation();
CraftWorld cw = (CraftWorld) w.getWorld(); // CraftWorld is NMS one CraftWorld cw = (CraftWorld) w.getWorld(); // CraftWorld is NMS one

View File

@ -1,4 +1,4 @@
# Boxed Configuration 2.0.2-SNAPSHOT-LOCAL # Boxed Configuration ${version}
boxed: boxed:
command: command:
# Player Command. What command users will run to access their area. # Player Command. What command users will run to access their area.
@ -31,35 +31,6 @@ world:
# World seed. # World seed.
# /!\ BentoBox currently does not support changing this value mid-game. If you do need to change it, do a full reset of your databases and worlds. # /!\ BentoBox currently does not support changing this value mid-game. If you do need to change it, do a full reset of your databases and worlds.
seed: 602103456450 seed: 602103456450
seed-start:
normal:
# Area seed center. This is where the areas are copied from.
x: 0
z: 0
nether:
# Nether area seed center. This is where the areas are copied from.
x: 0
z: 0
end:
# End area seed center. This is where the areas are copied from.
x: 0
z: 0
# Generate surface
# /!\ In order to apply the changes made to this option, you must restart your server. Reloading BentoBox or the server won't work.
generate-surface: true
# Generate caves
# /!\ In order to apply the changes made to this option, you must restart your server. Reloading BentoBox or the server won't work.
generate-caves: true
# Generate Decorations
# /!\ In order to apply the changes made to this option, you must restart your server. Reloading BentoBox or the server won't work.
generate-decorations: true
# Generate mobs
# /!\ In order to apply the changes made to this option, you must restart your server. Reloading BentoBox or the server won't work.
generate-mobs: true
# Allow surface structures - villages, shipwrecks, broken portals, etc.
# These will be randomly placed, so may not be available for every player.
# /!\ In order to apply the changes made to this option, you must restart your server. Reloading BentoBox or the server won't work.
allow-structures: false
# World difficulty setting - PEACEFUL, EASY, NORMAL, HARD # World difficulty setting - PEACEFUL, EASY, NORMAL, HARD
# Other plugins may override this setting # Other plugins may override this setting
difficulty: NORMAL difficulty: NORMAL
@ -90,15 +61,9 @@ world:
# If none of this makes sense, leave it at 0,0. # If none of this makes sense, leave it at 0,0.
start-x: 0 start-x: 0
start-z: 0 start-z: 0
# Area height - Lowest is 5.
# It is the y coordinate of the bedrock block in the blueprint.
area-height: 8
# Maximum number of player areas in the world. Set to -1 or 0 for unlimited. # Maximum number of player areas in the world. Set to -1 or 0 for unlimited.
# If the number of areas is greater than this number, it will stop players from joining the world. # If the number of areas is greater than this number, it will stop players from joining the world.
max-areas: -1 max-areas: -1
# The default game mode for this world. Players will be set to this mode when they create
# a new area for example. Options are SURVIVAL, CREATIVE, ADVENTURE, SPECTATOR
default-game-mode: SURVIVAL
# The maximum number of players a player can ban at any one time in this game mode. # The maximum number of players a player can ban at any one time in this game mode.
# The permission boxed.ban.maxlimit.X where X is a number can also be used per player # The permission boxed.ban.maxlimit.X where X is a number can also be used per player
# -1 = unlimited # -1 = unlimited
@ -110,18 +75,13 @@ world:
# Note that with a standard nether all players arrive at the same portal and entering a # Note that with a standard nether all players arrive at the same portal and entering a
# portal will return them back to their areas. # portal will return them back to their areas.
generate: true generate: true
# Nether spawn protection radius - this is the distance around the nether spawn
# that will be public from player interaction (breaking blocks, pouring lava etc.)
# Minimum is 0 (not recommended), maximum is 100. Default is 25.
# Only applies to vanilla nether
spawn-radius: 32
# This option indicates if nether portals should be linked via dimensions. # This option indicates if nether portals should be linked via dimensions.
# Option will simulate vanilla portal mechanics that links portals together # Option will simulate vanilla portal mechanics that links portals together
# or creates a new portal, if there is not a portal in that dimension. # or creates a new portal, if there is not a portal in that dimension.
# Added since 1.0.3. # Added since 1.0.3.
create-and-link-portals: true create-and-link-portals: true
end: end:
# End Nether - if this is false, the end world will not be made and access to # End World - if this is false, the end world will not be made and access to
# the end will not occur. Other plugins may still enable portal usage. # the end will not occur. Other plugins may still enable portal usage.
generate: false generate: false
# Mob white list - these mobs will NOT be removed when logging in or doing /boxed # Mob white list - these mobs will NOT be removed when logging in or doing /boxed
@ -168,6 +128,7 @@ world:
TRADING: true TRADING: true
EGGS: false EGGS: false
ITEM_DROP: true ITEM_DROP: true
CHEST: false
NOTE_BLOCK: true NOTE_BLOCK: true
ENTER_EXIT_MESSAGES: true ENTER_EXIT_MESSAGES: true
FLINT_AND_STEEL: false FLINT_AND_STEEL: false
@ -242,8 +203,8 @@ world:
BREAK_HOPPERS: 500 BREAK_HOPPERS: 500
FURNACE: 500 FURNACE: 500
MONSTER_SPAWNERS_SPAWN: 500 MONSTER_SPAWNERS_SPAWN: 500
ANVIL: 500
MINECART: 500 MINECART: 500
ANVIL: 500
FISH_SCOOPING: 500 FISH_SCOOPING: 500
FIRE_IGNITE: 500 FIRE_IGNITE: 500
END_PORTAL: 500 END_PORTAL: 500
@ -255,11 +216,11 @@ world:
BREAK_SPAWNERS: 500 BREAK_SPAWNERS: 500
LEVER: 0 LEVER: 0
ELYTRA: 0 ELYTRA: 0
RIDING: 500
CAKE: 500 CAKE: 500
HURT_MONSTERS: 0 HURT_MONSTERS: 0
RIDING: 500
NAME_TAG: 500
ARMOR_STAND: 500 ARMOR_STAND: 500
NAME_TAG: 500
TRADING: 0 TRADING: 0
EGGS: 500 EGGS: 500
ITEM_DROP: 0 ITEM_DROP: 0
@ -267,10 +228,10 @@ world:
FLINT_AND_STEEL: 500 FLINT_AND_STEEL: 500
NETHER_PORTAL: 0 NETHER_PORTAL: 0
LECTERN: 500 LECTERN: 500
ITEM_PICKUP: 0
CROP_TRAMPLE: 500 CROP_TRAMPLE: 500
BREWING: 500 ITEM_PICKUP: 0
DROPPER: 500 DROPPER: 500
BREWING: 500
TNT_PRIMING: 500 TNT_PRIMING: 500
COLLECT_WATER: 500 COLLECT_WATER: 500
BUTTON: 0 BUTTON: 0
@ -278,18 +239,18 @@ world:
COMMAND_RANKS: 500 COMMAND_RANKS: 500
BEACON: 500 BEACON: 500
TRAPDOOR: 500 TRAPDOOR: 500
EXPERIENCE_BOTTLE_THROWING: 500
PRESSURE_PLATE: 0 PRESSURE_PLATE: 0
EXPERIENCE_BOTTLE_THROWING: 500
DYE: 500 DYE: 500
ITEM_FRAME: 500 ITEM_FRAME: 500
PLACE_BLOCKS: 500 PLACE_BLOCKS: 500
CRAFTING: 0 CRAFTING: 0
ENCHANTING: 500
ANIMAL_SPAWNERS_SPAWN: 500
SHEARING: 500 SHEARING: 500
ANIMAL_SPAWNERS_SPAWN: 500
ENCHANTING: 500
BOAT: 0 BOAT: 0
BED: 500
SPAWN_EGGS: 500 SPAWN_EGGS: 500
BED: 500
MILKING: 500 MILKING: 500
DISPENSER: 500 DISPENSER: 500
GATE: 0 GATE: 0
@ -300,8 +261,8 @@ world:
MOUNT_INVENTORY: 500 MOUNT_INVENTORY: 500
CHORUS_FRUIT: 500 CHORUS_FRUIT: 500
CONTAINER: 500 CONTAINER: 500
POTION_THROWING: 500
JUKEBOX: 500 JUKEBOX: 500
POTION_THROWING: 500
# These are the default settings for new areas # These are the default settings for new areas
default-area-settings: default-area-settings:
PVP_END: false PVP_END: false
@ -313,8 +274,8 @@ world:
MONSTER_NATURAL_SPAWN: true MONSTER_NATURAL_SPAWN: true
FIRE_IGNITE: true FIRE_IGNITE: true
FIRE_SPREAD: true FIRE_SPREAD: true
ANIMAL_SPAWNERS_SPAWN: true
FIRE_BURNING: true FIRE_BURNING: true
ANIMAL_SPAWNERS_SPAWN: true
PVP_OVERWORLD: false PVP_OVERWORLD: false
# These settings/flags are hidden from users # These settings/flags are hidden from users
# Ops can toggle hiding in-game using SHIFT-LEFT-CLICK on flags in settings # Ops can toggle hiding in-game using SHIFT-LEFT-CLICK on flags in settings
@ -446,11 +407,6 @@ area:
# Toggles whether the player should be teleported automatically to his area when it is created. # Toggles whether the player should be teleported automatically to his area when it is created.
# If set to false, the player will be told his area is ready but will have to teleport to his area using the command. # If set to false, the player will be told his area is ready but will have to teleport to his area using the command.
teleport-player-to-area-when-created: true teleport-player-to-area-when-created: true
# Create Nether or End areas if they are missing when a player goes through a portal.
# Nether and End areas are usually pasted when a player makes their area, but if they are
# missing for some reason, you can switch this on.
# Note that bedrock removal glitches can exploit this option.
create-missing-nether-end-areas: false
commands: commands:
# List of commands to run when a player joins an area or creates one. # List of commands to run when a player joins an area or creates one.
# These commands are run by the console, unless otherwise stated using the [SUDO] prefix, # These commands are run by the console, unless otherwise stated using the [SUDO] prefix,
@ -492,11 +448,11 @@ area:
on-respawn: [] on-respawn: []
sethome: sethome:
nether: nether:
# Allow setting home in the nether. Only available on nether areas, not vanilla nether. # Allow setting home in the nether.
allow: true allow: true
require-confirmation: true require-confirmation: true
the-end: the-end:
# Allow setting home in the end. Only available on end areas, not vanilla end. # Allow setting home in the end.
allow: true allow: true
require-confirmation: true require-confirmation: true
deaths: deaths:
@ -512,7 +468,7 @@ protection:
# Geo restrict mobs. # Geo restrict mobs.
# Mobs that exit the area space where they were spawned will be removed. # Mobs that exit the area space where they were spawned will be removed.
geo-limit-settings: [] geo-limit-settings: []
# Boxed blocked mobs. # Blocked mobs.
# List of mobs that should not spawn in Boxed. # List of mobs that should not spawn in Boxed.
block-mobs: [] block-mobs: []
# Invincible visitors. List of damages that will not affect visitors. # Invincible visitors. List of damages that will not affect visitors.

View File

@ -2,12 +2,15 @@ normal:
0,64,80: village/plains/houses/plains_masons_house_1,CLOCKWISE_90 0,64,80: village/plains/houses/plains_masons_house_1,CLOCKWISE_90
-38,63,20: ruined_portal/portal_5 -38,63,20: ruined_portal/portal_5
3,58,-60: shipwreck/rightsideup_backhalf 3,58,-60: shipwreck/rightsideup_backhalf
16,67,23: village/plains/houses/plains_cartographer_1 -17,56,0: shipwreck/rightsideup_full_degraded,CLOCKWISE_180
16,67,13: village/plains/houses/plains_cartographer_1
-66,63,17: igloo/top -66,63,17: igloo/top
-34,52,-35: underwater_ruin/warm_5 -34,52,-35: underwater_ruin/warm_1
80,71,113: pillager_outpost/watchtower
33,69,-34: village/savanna/town_centers/savanna_meeting_point_1 33,69,-34: village/savanna/town_centers/savanna_meeting_point_1
26,70,-41: village/savanna/houses/savanna_medium_house_2,NONE,NONE 26,70,-41: village/savanna/houses/savanna_medium_house_2,NONE,NONE
42,69,-21: village/savanna/houses/savanna_large_farm_2,NONE,NONE
13,69,-37: village/savanna/houses/savanna_animal_pen_2,CLOCKWISE_180,NONE
53,71,-23: village/savanna/houses/savanna_small_house_4,NONE,NONE
34,69,-29: village/common/iron_golem 34,69,-29: village/common/iron_golem
41,69,-26: village/common/animals/cat_calico 41,69,-26: village/common/animals/cat_calico
35,69,-22: village/common/animals/cat_calico 35,69,-22: village/common/animals/cat_calico
@ -19,7 +22,13 @@ normal:
15,70,108: village/desert/houses/desert_butcher_shop_1 15,70,108: village/desert/houses/desert_butcher_shop_1
10,70,112: village/desert/houses/desert_temple_1,COUNTERCLOCKWISE_90 10,70,112: village/desert/houses/desert_temple_1,COUNTERCLOCKWISE_90
-71,63,107: igloo/top -71,63,107: igloo/top
-25,57,-30: shipwreck/rightsideup_full_degraded,CLOCKWISE_180 80,71,113: pillager_outpost/watchtower
15,67,16: village/plains/villagers/unemployed,NONE,NONE
51,76,22: ruined_portal/portal_6,NONE,NONE
-26,70,33: village/snowy/houses/snowy_library_1,CLOCKWISE_180,NONE
-31,71,30: village/plains/villagers/unemployed,CLOCKWISE_180,NONE
-3,65,84: village/plains/villagers/unemployed,CLOCKWISE_180,NONE
nether: nether:
16,32,0: bastion/bridge/starting_pieces/entrance 16,32,0: bastion/bridge/starting_pieces/entrance
62,33,-17: bastion/hoglin_stable/walls/wall_base 62,33,-17: bastion/hoglin_stable/walls/wall_base

View File

@ -10,7 +10,6 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import org.bukkit.Difficulty; import org.bukkit.Difficulty;
import org.bukkit.GameMode;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -90,15 +89,6 @@ public class SettingsTest {
assertEquals(123, s.getIslandStartZ()); assertEquals(123, s.getIslandStartZ());
} }
/**
* Test method for {@link world.bentobox.boxed.Settings#setIslandHeight(int)}.
*/
@Test
public void testSetIslandHeight() {
s.setIslandHeight(123);
assertEquals(123, s.getIslandHeight());
}
/** /**
* Test method for {@link world.bentobox.boxed.Settings#setMaxIslands(int)}. * Test method for {@link world.bentobox.boxed.Settings#setMaxIslands(int)}.
*/ */
@ -108,15 +98,6 @@ public class SettingsTest {
assertEquals(123, s.getMaxIslands()); assertEquals(123, s.getMaxIslands());
} }
/**
* Test method for {@link world.bentobox.boxed.Settings#setDefaultGameMode(org.bukkit.GameMode)}.
*/
@Test
public void testSetDefaultGameMode() {
s.setDefaultGameMode(GameMode.CREATIVE);
assertEquals(GameMode.CREATIVE, s.getDefaultGameMode());
}
/** /**
* Test method for {@link world.bentobox.boxed.Settings#setNetherGenerate(boolean)}. * Test method for {@link world.bentobox.boxed.Settings#setNetherGenerate(boolean)}.
*/ */
@ -126,15 +107,6 @@ public class SettingsTest {
assertTrue(s.isNetherGenerate()); assertTrue(s.isNetherGenerate());
} }
/**
* Test method for {@link world.bentobox.boxed.Settings#setNetherSpawnRadius(int)}.
*/
@Test
public void testSetNetherSpawnRadius() {
s.setNetherSpawnRadius(123);
assertEquals(123, s.getNetherSpawnRadius());
}
/** /**
* Test method for {@link world.bentobox.boxed.Settings#setEndGenerate(boolean)}. * Test method for {@link world.bentobox.boxed.Settings#setEndGenerate(boolean)}.
*/ */