From: Irtimaled Date: Sun, 10 May 2020 22:27:16 +0000 (-0700) Subject: Add support for blocks only spawnable at night X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=25b713767df6970f226ae61b66b0ffd8ccb6378e;p=BoundingBoxOutlineReloaded.git Add support for blocks only spawnable at night --- diff --git a/src/main/java/com/irtimaled/bbor/client/commands/SpawningSphereCommand.java b/src/main/java/com/irtimaled/bbor/client/commands/SpawningSphereCommand.java index a97c360..c109863 100644 --- a/src/main/java/com/irtimaled/bbor/client/commands/SpawningSphereCommand.java +++ b/src/main/java/com/irtimaled/bbor/client/commands/SpawningSphereCommand.java @@ -1,12 +1,16 @@ package com.irtimaled.bbor.client.commands; +import com.irtimaled.bbor.client.Player; import com.irtimaled.bbor.client.providers.SpawningSphereProvider; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import net.minecraft.client.Minecraft; import net.minecraft.command.Commands; import net.minecraft.command.ISuggestionProvider; import net.minecraft.command.arguments.Vec3Argument; import net.minecraft.util.math.Vec3d; +import net.minecraft.world.EnumLightType; +import net.minecraft.world.World; public class SpawningSphereCommand { private static final String COMMAND = "bbor:spawningSphere"; @@ -43,12 +47,31 @@ public class SpawningSphereCommand { })) .then(Commands.literal(CALCULATE_SPAWNABLE) .executes(context -> { - int count = SpawningSphereProvider.recalculateSpawnableSpacesCount(); + if(!SpawningSphereProvider.hasSpawningSphereInDimension(Player.getDimensionId())) { + CommandHelper.feedback(context, "bbor.commands.spawningSphere.notSet"); + return 0; + } - String format = count == -1 ? "bbor.commands.spawningSphere.notSet" : "bbor.commands.spawningSphere.calculated"; - CommandHelper.feedback(context, format, String.format("%,d", count)); + Counts counts = new Counts(); + World world = Minecraft.getInstance().world; + SpawningSphereProvider.calculateSpawnableSpacesCount(pos -> { + counts.spawnable++; + if(world.getLightFor(EnumLightType.SKY, pos) > 7) + counts.nightSpawnable++; + }); + SpawningSphereProvider.setSpawnableSpacesCount(counts.spawnable); + + CommandHelper.feedback(context, "bbor.commands.spawningSphere.calculated", + String.format("%,d", counts.spawnable), + String.format("%,d", counts.nightSpawnable)); return 0; })); commandDispatcher.register(command); } + + private static class Counts { + private int spawnable = 0; + private int nightSpawnable = 0; + + } } diff --git a/src/main/java/com/irtimaled/bbor/client/interop/BlockProcessor.java b/src/main/java/com/irtimaled/bbor/client/interop/BlockProcessor.java index fbcdfdc..1b66b03 100644 --- a/src/main/java/com/irtimaled/bbor/client/interop/BlockProcessor.java +++ b/src/main/java/com/irtimaled/bbor/client/interop/BlockProcessor.java @@ -1,6 +1,8 @@ package com.irtimaled.bbor.client.interop; +import net.minecraft.util.math.BlockPos; + @FunctionalInterface public interface BlockProcessor { - boolean process(int x, int y, int z); + void process(BlockPos blockPos); } diff --git a/src/main/java/com/irtimaled/bbor/client/interop/SpawnableBlocksHelper.java b/src/main/java/com/irtimaled/bbor/client/interop/SpawnableBlocksHelper.java index f781a6c..e4d7637 100644 --- a/src/main/java/com/irtimaled/bbor/client/interop/SpawnableBlocksHelper.java +++ b/src/main/java/com/irtimaled/bbor/client/interop/SpawnableBlocksHelper.java @@ -38,7 +38,7 @@ public class SpawnableBlocksHelper { BlockPos pos = new BlockPos(x, y, z); upperBlockState = world.getBlockState(pos); if (isSpawnable(world, pos, spawnBlockState, upperBlockState)) { - blockProcessor.process(x, y, z); + blockProcessor.process(pos); } } } diff --git a/src/main/java/com/irtimaled/bbor/client/interop/SpawningSphereHelper.java b/src/main/java/com/irtimaled/bbor/client/interop/SpawningSphereHelper.java index e9a5e6e..f20ef77 100644 --- a/src/main/java/com/irtimaled/bbor/client/interop/SpawningSphereHelper.java +++ b/src/main/java/com/irtimaled/bbor/client/interop/SpawningSphereHelper.java @@ -9,7 +9,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; public class SpawningSphereHelper { - public static int findSpawnableSpaces(Point center, Coords coords, int width, int height, BlockProcessor blockProcessor) { + public static void findSpawnableSpaces(Point center, Coords coords, int width, int height, BlockProcessor blockProcessor) { int blockX = coords.getX(); int minX = blockX - width; int maxX = blockX + width + 1; @@ -23,7 +23,6 @@ public class SpawningSphereHelper { int maxY = Math.min(255, blockY + height); World world = Minecraft.getInstance().world; - int processed = 0; for (int x = minX; x < maxX; x++) { for (int z = minZ; z < maxZ; z++) { double closestX = x + 0.5D; @@ -40,14 +39,12 @@ public class SpawningSphereHelper { upperBlockState = world.getBlockState(pos); distance = center.getDistance(new Point(closestX, y, closestZ)); if (isWithinSpawnableZone(distance) && - SpawnableBlocksHelper.isSpawnable(world, pos, spawnBlockState, upperBlockState) && - blockProcessor.process(x, y, z)) { - processed++; + SpawnableBlocksHelper.isSpawnable(world, pos, spawnBlockState, upperBlockState)) { + blockProcessor.process(pos); } } } } - return processed; } private static boolean isWithinSpawnableZone(double distance) { diff --git a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawnableBlocks.java b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawnableBlocks.java index 8f3a4d5..889f2af 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawnableBlocks.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawnableBlocks.java @@ -2,19 +2,19 @@ package com.irtimaled.bbor.client.models; import com.irtimaled.bbor.common.BoundingBoxType; import com.irtimaled.bbor.common.models.AbstractBoundingBox; -import com.irtimaled.bbor.common.models.Coords; +import net.minecraft.util.math.BlockPos; import java.util.HashSet; import java.util.Set; public class BoundingBoxSpawnableBlocks extends AbstractBoundingBox { - private final Set blocks = new HashSet<>(); + private final Set blocks = new HashSet<>(); public BoundingBoxSpawnableBlocks() { super(BoundingBoxType.SpawnableBlocks); } - public Set getBlocks() { + public Set getBlocks() { return blocks; } diff --git a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawningSphere.java b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawningSphere.java index b5bbd59..fbf6b8b 100644 --- a/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawningSphere.java +++ b/src/main/java/com/irtimaled/bbor/client/models/BoundingBoxSpawningSphere.java @@ -2,8 +2,8 @@ package com.irtimaled.bbor.client.models; import com.irtimaled.bbor.common.BoundingBoxType; import com.irtimaled.bbor.common.models.BoundingBoxSphere; -import com.irtimaled.bbor.common.models.Coords; import com.irtimaled.bbor.common.models.Point; +import net.minecraft.util.math.BlockPos; import java.util.HashSet; import java.util.Set; @@ -12,14 +12,14 @@ public class BoundingBoxSpawningSphere extends BoundingBoxSphere { public static final int SAFE_RADIUS = 24; public static final int SPAWN_RADIUS = 128; - private final Set blocks = new HashSet<>(); + private final Set blocks = new HashSet<>(); private Integer spawnableCount; public BoundingBoxSpawningSphere(Point point) { super(point, SPAWN_RADIUS, BoundingBoxType.AFKSphere); } - public Set getBlocks() { + public Set getBlocks() { return blocks; } diff --git a/src/main/java/com/irtimaled/bbor/client/providers/SpawnableBlocksProvider.java b/src/main/java/com/irtimaled/bbor/client/providers/SpawnableBlocksProvider.java index 4f3704e..243cf48 100644 --- a/src/main/java/com/irtimaled/bbor/client/providers/SpawnableBlocksProvider.java +++ b/src/main/java/com/irtimaled/bbor/client/providers/SpawnableBlocksProvider.java @@ -7,7 +7,6 @@ import com.irtimaled.bbor.client.interop.SpawnableBlocksHelper; import com.irtimaled.bbor.client.models.BoundingBoxSpawnableBlocks; import com.irtimaled.bbor.common.BoundingBoxType; import com.irtimaled.bbor.common.MathHelper; -import com.irtimaled.bbor.common.models.Coords; import net.minecraft.client.Minecraft; import java.util.HashSet; @@ -47,13 +46,11 @@ public class SpawnableBlocksProvider implements IBoundingBoxProvider getSpawnableBlocks() { BoundingBoxSpawnableBlocks boundingBox = new BoundingBoxSpawnableBlocks(); - Set blocks = boundingBox.getBlocks(); int width = MathHelper.floor(Math.pow(2, 1 + ConfigManager.spawnableBlocksRenderWidth.get())); int height = MathHelper.floor(Math.pow(2, ConfigManager.spawnableBlocksRenderHeight.get())); - SpawnableBlocksHelper.findSpawnableBlocks(Player.getCoords(), width, height, - (x, y, z) -> blocks.add(new Coords(x, y, z))); + SpawnableBlocksHelper.findSpawnableBlocks(Player.getCoords(), width, height, boundingBox.getBlocks()::add); Set boundingBoxes = new HashSet<>(); boundingBoxes.add(boundingBox); diff --git a/src/main/java/com/irtimaled/bbor/client/providers/SpawningSphereProvider.java b/src/main/java/com/irtimaled/bbor/client/providers/SpawningSphereProvider.java index 6b17475..a5a2a1e 100644 --- a/src/main/java/com/irtimaled/bbor/client/providers/SpawningSphereProvider.java +++ b/src/main/java/com/irtimaled/bbor/client/providers/SpawningSphereProvider.java @@ -3,11 +3,11 @@ package com.irtimaled.bbor.client.providers; import com.irtimaled.bbor.client.Player; import com.irtimaled.bbor.client.config.BoundingBoxTypeHelper; import com.irtimaled.bbor.client.config.ConfigManager; +import com.irtimaled.bbor.client.interop.BlockProcessor; import com.irtimaled.bbor.client.interop.SpawningSphereHelper; import com.irtimaled.bbor.client.models.BoundingBoxSpawningSphere; import com.irtimaled.bbor.common.BoundingBoxType; import com.irtimaled.bbor.common.MathHelper; -import com.irtimaled.bbor.common.models.Coords; import com.irtimaled.bbor.common.models.Point; import net.minecraft.client.Minecraft; @@ -25,9 +25,7 @@ public class SpawningSphereProvider implements IBoundingBoxProvider true); } static boolean playerInsideSphere() { - return spawningSphereInDimension(Player.getDimensionId()) && spawningSphere.isWithinSphere(Player.getPoint()); + return hasSpawningSphereInDimension(Player.getDimensionId()) && spawningSphere.isWithinSphere(Player.getPoint()); } - private static boolean spawningSphereInDimension(int dimensionId) { + public static boolean hasSpawningSphereInDimension(int dimensionId) { return spawningSphere != null && SpawningSphereProvider.dimensionId == dimensionId; } + public static void setSpawnableSpacesCount(int count) { + if (spawningSphere != null) { + spawningSphere.setSpawnableCount(count); + } + } + @Override public boolean canProvide(int dimensionId) { - return spawningSphereInDimension(dimensionId) && BoundingBoxTypeHelper.shouldRender(BoundingBoxType.AFKSphere); + return hasSpawningSphereInDimension(dimensionId) && BoundingBoxTypeHelper.shouldRender(BoundingBoxType.AFKSphere); } @Override @@ -91,14 +88,12 @@ public class SpawningSphereProvider implements IBoundingBoxProvider getSpawningSphere() { - Set blocks = spawningSphere.getBlocks(); - blocks.clear(); + spawningSphere.getBlocks().clear(); if (ConfigManager.renderAFKSpawnableBlocks.get()) { int width = MathHelper.floor(Math.pow(2, 1 + ConfigManager.spawnableBlocksRenderWidth.get())); int height = MathHelper.floor(Math.pow(2, ConfigManager.spawnableBlocksRenderHeight.get())); - SpawningSphereHelper.findSpawnableSpaces(spawningSphere.getPoint(), Player.getCoords(), width, height, - (x, y, z) -> blocks.add(new Coords(x, y, z))); + SpawningSphereHelper.findSpawnableSpaces(spawningSphere.getPoint(), Player.getCoords(), width, height, spawningSphere.getBlocks()::add); } Set boundingBoxes = new HashSet<>(); boundingBoxes.add(spawningSphere); diff --git a/src/main/resources/assets/bbor/lang/en_us.json b/src/main/resources/assets/bbor/lang/en_us.json index d345041..c3ec628 100644 --- a/src/main/resources/assets/bbor/lang/en_us.json +++ b/src/main/resources/assets/bbor/lang/en_us.json @@ -81,7 +81,7 @@ "bbor.commands.spawningSphere.set": "Spawning sphere set", "bbor.commands.spawningSphere.notSet": "No spawning sphere set", "bbor.commands.spawningSphere.cleared": "Spawning sphere cleared", - "bbor.commands.spawningSphere.calculated": "Calculated %s spawnable spaces", + "bbor.commands.spawningSphere.calculated": "Calculated %s spawnable spaces (%s only at night)", "bbor.renderer.spawningSphere.spawnable": "Spawnable:", "bbor.renderer.spawningSphere.none": "None"