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";
}))
.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;
+
+ }
}
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);
}
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);
}
}
}
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;
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;
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) {
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<Coords> blocks = new HashSet<>();
+ private final Set<BlockPos> blocks = new HashSet<>();
public BoundingBoxSpawnableBlocks() {
super(BoundingBoxType.SpawnableBlocks);
}
- public Set<Coords> getBlocks() {
+ public Set<BlockPos> getBlocks() {
return blocks;
}
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;
public static final int SAFE_RADIUS = 24;
public static final int SPAWN_RADIUS = 128;
- private final Set<Coords> blocks = new HashSet<>();
+ private final Set<BlockPos> blocks = new HashSet<>();
private Integer spawnableCount;
public BoundingBoxSpawningSphere(Point point) {
super(point, SPAWN_RADIUS, BoundingBoxType.AFKSphere);
}
- public Set<Coords> getBlocks() {
+ public Set<BlockPos> getBlocks() {
return blocks;
}
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;
private Set<BoundingBoxSpawnableBlocks> getSpawnableBlocks() {
BoundingBoxSpawnableBlocks boundingBox = new BoundingBoxSpawnableBlocks();
- Set<Coords> 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<BoundingBoxSpawnableBlocks> boundingBoxes = new HashSet<>();
boundingBoxes.add(boundingBox);
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;
public static void setSphere(double x, double y, double z) {
Point point = new Point(snapToNearestHalf(x), y, snapToNearestHalf(z));
- if (spawningSphere != null && spawningSphere.getPoint().equals(point)) {
- return;
- }
+ if (spawningSphere != null && spawningSphere.getPoint().equals(point)) return;
clear();
dimensionId = Player.getDimensionId();
}
public static boolean clear() {
- if(spawningSphere != null) {
+ if (spawningSphere != null) {
lastBoundingBox = null;
spawningSphere = null;
dimensionId = null;
return false;
}
- public static int recalculateSpawnableSpacesCount() {
+ public static void calculateSpawnableSpacesCount(BlockProcessor blockProcessor) {
if (spawningSphere != null) {
Point sphereCenter = spawningSphere.getPoint();
- int spawnableSpacesCount = getSpawnableSpacesCount(sphereCenter);
- spawningSphere.setSpawnableCount(spawnableSpacesCount);
- return spawnableSpacesCount;
+ int size = BoundingBoxSpawningSphere.SPAWN_RADIUS + 2;
+ SpawningSphereHelper.findSpawnableSpaces(sphereCenter, sphereCenter.getCoords(), size, size, blockProcessor);
}
- return -1;
- }
-
- private static int getSpawnableSpacesCount(Point center) {
- int size = BoundingBoxSpawningSphere.SPAWN_RADIUS + 2;
- return SpawningSphereHelper.findSpawnableSpaces(center, center.getCoords(), size, size, (x, y, z) -> 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
}
private Set<BoundingBoxSpawningSphere> getSpawningSphere() {
- Set<Coords> 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<BoundingBoxSpawningSphere> boundingBoxes = new HashSet<>();
boundingBoxes.add(spawningSphere);
"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"