diff --git a/pom.xml b/pom.xml index aa44183..a0fdd3e 100644 --- a/pom.xml +++ b/pom.xml @@ -30,13 +30,9 @@ - - codemc-snapshots - https://repo.codemc.org/repository/maven-snapshots - - codemc-releases - https://repo.codemc.org/repository/maven-releases + bentoboxworld + https://repo.codemc.org/repository/bentoboxworld/ @@ -45,8 +41,8 @@ UTF-8 17 - 1.20.2-R0.1-SNAPSHOT - 2.5.0-SNAPSHOT + 1.21.3-R0.1-SNAPSHOT + 2.7.1-SNAPSHOT ${build.version}-SNAPSHOT diff --git a/src/main/java/world/bentobox/caveblock/Settings.java b/src/main/java/world/bentobox/caveblock/Settings.java index a62acff..9990420 100644 --- a/src/main/java/world/bentobox/caveblock/Settings.java +++ b/src/main/java/world/bentobox/caveblock/Settings.java @@ -16,8 +16,6 @@ import org.bukkit.block.Biome; import org.bukkit.entity.EntityType; import org.eclipse.jdt.annotation.NonNull; -import com.google.common.base.Enums; - import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.configuration.ConfigComment; import world.bentobox.bentobox.api.configuration.ConfigEntry; @@ -147,7 +145,7 @@ public class Settings implements WorldSettings @ConfigComment("The default biome for the overworld") @ConfigEntry(path = "world.default-biome") - private Biome defaultBiome = Enums.getIfPresent(Biome.class, "DRIPSTONE_CAVES").or(Biome.THE_VOID); + private Biome defaultBiome = Biome.DRIPSTONE_CAVES; @ConfigComment("The maximum number of players a player can ban at any one time in this game mode.") @ConfigComment("The permission caveblock.ban.maxlimit.X where X is a number can also be used per player") @@ -231,7 +229,7 @@ public class Settings implements WorldSettings @ConfigComment("The default biome for the nether world (this may affect what mobs can spawn)") @ConfigEntry(path = "world.nether.biome", since = "1.14.0") - private Biome defaultNetherBiome = Enums.getIfPresent(Biome.class, "NETHER_WASTES").or(Biome.THE_VOID); + private Biome defaultNetherBiome = Biome.NETHER_WASTES; @ConfigComment("Nether spawn protection radius - this is the distance around the nether spawn") @ConfigComment("that will be protected from player interaction (breaking blocks, pouring lava etc.)") @@ -279,7 +277,7 @@ public class Settings implements WorldSettings @ConfigComment("The default biome for the end world (this may affect what mobs can spawn)") @ConfigEntry(path = "world.end.biome", since = "1.14.0") - private Biome defaultTheEndBiome = Enums.getIfPresent(Biome.class, "THE_END").or(Biome.THE_VOID); + private Biome defaultTheEndBiome = Biome.THE_END; @ConfigEntry(path = "world.end.dragon-spawn", experimental = true) private boolean dragonSpawn = false; diff --git a/src/main/java/world/bentobox/caveblock/generators/ChunkGeneratorWorld.java b/src/main/java/world/bentobox/caveblock/generators/ChunkGeneratorWorld.java index 08648c9..e5de1c0 100644 --- a/src/main/java/world/bentobox/caveblock/generators/ChunkGeneratorWorld.java +++ b/src/main/java/world/bentobox/caveblock/generators/ChunkGeneratorWorld.java @@ -56,27 +56,27 @@ public class ChunkGeneratorWorld extends ChunkGenerator { private Material getGroundRoofMaterial(World.Environment environment) { return switch (environment) { - case NETHER -> this.settings.isNetherRoof() ? Material.BEDROCK : this.settings.getNetherMainBlock(); - case THE_END -> this.settings.isEndRoof() ? Material.BEDROCK : this.settings.getEndMainBlock(); - default -> this.settings.isNormalRoof() ? Material.BEDROCK : this.settings.getNormalMainBlock(); + case NETHER -> this.settings.isNetherRoof() ? Material.BEDROCK : this.settings.getNetherMainBlock(); + case THE_END -> this.settings.isEndRoof() ? Material.BEDROCK : this.settings.getEndMainBlock(); + default -> this.settings.isNormalRoof() ? Material.BEDROCK : this.settings.getNormalMainBlock(); }; } private Material getGroundFloorMaterial(World.Environment environment) { return switch (environment) { - case NETHER -> this.settings.isNetherFloor() ? Material.BEDROCK : this.settings.getNetherMainBlock(); - case THE_END -> this.settings.isEndFloor() ? Material.BEDROCK : this.settings.getEndMainBlock(); - default -> this.settings.isNormalFloor() ? Material.BEDROCK : this.settings.getNormalMainBlock(); + case NETHER -> this.settings.isNetherFloor() ? Material.BEDROCK : this.settings.getNetherMainBlock(); + case THE_END -> this.settings.isEndFloor() ? Material.BEDROCK : this.settings.getEndMainBlock(); + default -> this.settings.isNormalFloor() ? Material.BEDROCK : this.settings.getNormalMainBlock(); }; } private Material getBaseMaterial(World.Environment environment) { return switch (environment) { - case NETHER -> this.settings.getNetherMainBlock(); - case THE_END -> this.settings.getEndMainBlock(); - default -> this.settings.getNormalMainBlock(); + case NETHER -> this.settings.getNetherMainBlock(); + case THE_END -> this.settings.getEndMainBlock(); + default -> this.settings.getNormalMainBlock(); }; } @@ -117,10 +117,10 @@ public class ChunkGeneratorWorld extends ChunkGenerator { final World.Environment environment = worldInfo.getEnvironment(); if (isNewGenerator) { switch (environment) { - case NETHER: - if (worldHeight + 1 > 34) { - chunkData.setRegion(0, minHeight + 1, 0, 16, 34, 16, Material.SOUL_SAND); - chunkData.setRegion(0, 34, 0, 16, worldHeight - 1, 16, Material.NETHERRACK); + case NETHER: + if (worldHeight + 1 > 34) { + chunkData.setRegion(0, minHeight + 1, 0, 16, 34, 16, Material.SOUL_SAND); + chunkData.setRegion(0, 34, 0, 16, worldHeight - 1, 16, Material.NETHERRACK); } else { chunkData.setRegion(0, minHeight + 1, 0, 16, worldHeight - 1, 16, Material.NETHERRACK); } diff --git a/src/main/java/world/bentobox/caveblock/generators/populators/EntitiesPopulator.java b/src/main/java/world/bentobox/caveblock/generators/populators/EntitiesPopulator.java index f688993..cc662ed 100644 --- a/src/main/java/world/bentobox/caveblock/generators/populators/EntitiesPopulator.java +++ b/src/main/java/world/bentobox/caveblock/generators/populators/EntitiesPopulator.java @@ -1,12 +1,21 @@ package world.bentobox.caveblock.generators.populators; +import java.util.Arrays; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.stream.Collectors; + import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World.Environment; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.WaterMob; import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.LimitedRegion; import org.bukkit.generator.WorldInfo; @@ -17,9 +26,6 @@ import world.bentobox.bentobox.util.Pair; import world.bentobox.caveblock.CaveBlock; import world.bentobox.caveblock.Utils; -import java.util.*; -import java.util.stream.Collectors; - /** * This class populates generated chunk with entities by random chance. */ @@ -29,17 +35,6 @@ public class EntitiesPopulator extends BlockPopulator { // Section: Variables // --------------------------------------------------------------------- - /** - * Water entities - */ - private static final List WATER_ENTITIES = Arrays.asList(EntityType.GUARDIAN, - EntityType.SQUID, - EntityType.COD, - EntityType.SALMON, - EntityType.PUFFERFISH, - EntityType.TROPICAL_FISH, - EntityType.DROWNED, - EntityType.DOLPHIN); /** * CaveBlock addon. */ @@ -170,12 +165,16 @@ public class EntitiesPopulator extends BlockPopulator { if (!limitedRegion.isInRegion(location)) return; if (!limitedRegion.getType(location).equals(originalMaterial)) return; - BoundingBox bb = this.getEntityBoundingBox(entityType, location); + // Spawn the entity and then make space for it + Entity entity = limitedRegion.spawnEntity(location, entityType); + BoundingBox bb = entity.getBoundingBox(); for (int x = (int) Math.floor(bb.getMinX()); x < bb.getMaxX(); x++) { for (int z = (int) Math.floor(bb.getMinZ()); z < bb.getMaxZ(); z++) { int y = (int) Math.floor(bb.getMinY()); if (!limitedRegion.isInRegion(x, y, z)) { + // Only spawn if it's in the region + entity.remove(); return; } @@ -186,19 +185,19 @@ public class EntitiesPopulator extends BlockPopulator { if (!limitedRegion.isInRegion(x, y, z) || !limitedRegion.getType(x, y, z).equals(originalMaterial)) { // Cannot place entity + entity.remove(); return; } - limitedRegion.setType(x, y, z, WATER_ENTITIES.contains(entityType) ? Material.WATER : Material.AIR); + limitedRegion.setType(x, y, z, entity instanceof WaterMob ? Material.WATER : Material.AIR); } // Add air block on top for all water entities (required for dolphin, okay for others) - if (WATER_ENTITIES.contains(entityType) && limitedRegion.isInRegion(x, y, z) && limitedRegion.getType(x, y, z).equals(originalMaterial)) { + if (entity instanceof WaterMob && limitedRegion.isInRegion(x, y, z) + && limitedRegion.getType(x, y, z).equals(originalMaterial)) { limitedRegion.setType(x, y, z, Material.CAVE_AIR); } } } - Entity entity = limitedRegion.spawnEntity(location, entityType); - if (entity instanceof LivingEntity livingEntity) { livingEntity.setAI(hasAI); @@ -206,76 +205,6 @@ public class EntitiesPopulator extends BlockPopulator { } } - - /** - * This is manual bounding box calculation base on entity type. - * @param entityType Entity type which bounding box should be created. - * @param location Location of the bounding box. - * @return Approximate bounding box of the entity type. - */ - private BoundingBox getEntityBoundingBox(EntityType entityType, Location location) - { - BoundingBox boundingBox = new BoundingBox(); - // Set bounding box to 1 for all entities - boundingBox.expand(1); - // Shift to correct location. - boundingBox.shift(location); - - switch (entityType) - { - // Turtles base size is 1.1 - case TURTLE -> boundingBox.expand(-0.05, 0, -0.05, 0.05, 0, 0.05); - // Panda base size is 1.3 and height is 1.25 - case PANDA -> boundingBox.expand(-0.15, 0, -0.15, 0.15, 0.25, 0.15); - // Sheep height is 1.3 - case SHEEP -> boundingBox.expand(0, 0, 0, 0, 0.3, 0); - // Cow height is 1.4 - case COW, MUSHROOM_COW -> boundingBox.expand(0, 0, 0, 0, 0.4, 0); - // Polar Bear base size is 1.3 and height is 1.4 - case POLAR_BEAR -> boundingBox.expand(-0.15, 0, -0.15, 0.15, 0.4, 0.15); - // Horse base size is 1.3964 - case HORSE, ZOMBIE_HORSE, SKELETON_HORSE -> boundingBox.expand(-0.2, 0, -0.2, 0.2, 0.6, 0.2); - // Llama height is 1.875 - case LLAMA -> boundingBox.expand(0, 0, 0, 0, 0.875, 0); - // Ravager base size is 1.95 and height is 2.2 - case RAVAGER -> boundingBox.expand(-0.48, 0, -0.48, 0.48, 1.2, 0.48); - // Spider base size is 1.4 - case SPIDER -> boundingBox.expand(-0.2, 0, -0.2, 0.2, 0, 0.2); - // Creeper height 1.7 - case CREEPER -> boundingBox.expand(0, 0, 0, 0, 0.7, 0); - // Blaze height 1.8 - case BLAZE -> boundingBox.expand(0, 0, 0, 0, 0.8, 0); - // Zombie, evoker, villager, husk, witch, vindicator, illusioner, drowned, pigman, villager and pillager height is 1.95 - case ZOMBIE, EVOKER, VILLAGER, HUSK, WITCH, VINDICATOR, ILLUSIONER, DROWNED, PIGLIN, PIGLIN_BRUTE, ZOMBIFIED_PIGLIN, ZOMBIE_VILLAGER, PILLAGER, WANDERING_TRADER -> - boundingBox.expand(0, 0, 0, 0, 0.95, 0); - // Skeletons height is 1.99 - case SKELETON, STRAY -> boundingBox.expand(0, 0, 0, 0, 0.99, 0); - // Elder Guardians base height is 2 - case ELDER_GUARDIAN -> boundingBox.expand(-0.5, 0, -0.5, 0.5, 1, 0.5); - // Slimes are up to 2.04 - case SLIME -> boundingBox.expand(-0.5, 0, -0.5, 0.5, 1, 0.5); - // Wither skeletons height is 2.4 - case WITHER_SKELETON -> boundingBox.expand(0, 0, 0, 0, 1.4, 0); - // Wither height is 3.5 - case WITHER -> boundingBox.expand(0, 0, 0, 0, 2.5, 0); - // Enderman height is 2.9 - case ENDERMAN -> boundingBox.expand(0, 0, 0, 0, 1.9, 0); - // Ghast base size is 4 - case GHAST -> boundingBox.expand(-2, 0, -2, 2, 3, 2); - // Iron Golem base size is 1.4 and height is 2.7 - case IRON_GOLEM -> boundingBox.expand(-0.2, 0, -0.2, 0.2, 1.7, 0.2); - // Snowman height is 1.9 - case SNOWMAN -> boundingBox.expand(0, 0, 0, 0, 0.9, 0); - // Hoglin base size is 1.4 and height is 1.3965 - case HOGLIN, ZOGLIN -> boundingBox.expand(-0.2, 0, -0.2, 0.2, 0.4, 0.2); - // Warden height is 2.9 - case WARDEN -> boundingBox.expand(0, 0, 0, 0, 1.9, 0); - } - - return boundingBox; - } - - // --------------------------------------------------------------------- // Section: Private Classes // --------------------------------------------------------------------- diff --git a/src/main/resources/addon.yml b/src/main/resources/addon.yml index 6d89523..9c1c382 100644 --- a/src/main/resources/addon.yml +++ b/src/main/resources/addon.yml @@ -1,7 +1,7 @@ name: CaveBlock main: world.bentobox.caveblock.CaveBlock version: ${version}${build.number} -api-version: 2.5.0 +api-version: 2.7.1 metrics: true repository: "BentoBoxWorld/CaveBlock" icon: "STONE_PICKAXE" diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 25d5d16..1bfe36f 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -150,6 +150,7 @@ world: - MATERIAL:GRANITE:40:10 - MATERIAL:ANDESITE:20:10 - MATERIAL:DIORITE:30:8 + - MATERIAL:LAVA:15:4 - ENTITY:ZOMBIE:10:1 - ENTITY:ENDERMAN:10:1 - ENTITY:SKELETON:10:1 @@ -200,7 +201,7 @@ world: - MATERIAL:MAGMA_BLOCK:10:3 - MATERIAL:GLOWSTONE:20:8 - MATERIAL:NETHER_BRICKS:10:5 - - MATERIAL:LAVA:10:1 + - MATERIAL:LAVA:30:10 - ENTITY:MAGMA_CUBE:0.5:1 - ENTITY:GHAST:0.1:1 - ENTITY:WITHER_SKELETON:0.1:1 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index b998ac6..cd64234 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,7 +1,7 @@ name: BentoBox-CaveBlock main: world.bentobox.caveblock.CaveBlockPladdon version: ${project.version}${build.number} -api-version: "1.19" +api-version: "1.21" authors: [tastybento, BONNe] contributors: ["The BentoBoxWorld Community"]