From 3b4a0ff4bcf555a8fd755c5b11c78fe4f8bcc627 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Tue, 2 Jul 2024 17:08:55 -0500 Subject: [PATCH] test --- .../core/level/AbstractDhLevel.java | 8 ++-- .../renderer/GenericObjectRenderer.java | 1 + .../core/sql/repo/BeaconBeamRepo.java | 39 +++++++++++++++---- .../chunk/IChunkWrapper.java | 39 +++++++++++++++++-- 4 files changed, 72 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhLevel.java index be6bbe0a8..b2a1b08b8 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhLevel.java @@ -191,7 +191,7 @@ public abstract class AbstractDhLevel implements IDhLevel { if (this.beaconBeamRepo != null) { - return this.beaconBeamRepo.getAllBeamsForSectionPos(pos); + return this.beaconBeamRepo.getAllBeamsForPos(pos); } else { @@ -221,7 +221,7 @@ public abstract class AbstractDhLevel implements IDhLevel } // get existing beams - List existingBeamList = this.beaconBeamRepo.getAllBeamsForSectionPos(pos); + List existingBeamList = this.beaconBeamRepo.getAllBeamsForPos(chunkPos); HashMap existingBeamByPos = new HashMap<>(existingBeamList.size()); for (int i = 0; i < existingBeamList.size(); i++) { @@ -296,7 +296,7 @@ public abstract class AbstractDhLevel implements IDhLevel if (this.beaconBeamRepo != null) { // get beams in pos - List existingBeamList = this.beaconBeamRepo.getAllBeamsForSectionPos(pos); + List existingBeamList = this.beaconBeamRepo.getAllBeamsForPos(pos); for (int i = 0; i < existingBeamList.size(); i++) { BeaconBeamDTO beam = existingBeamList.get(i); @@ -334,7 +334,7 @@ public abstract class AbstractDhLevel implements IDhLevel if (this.beaconBeamRepo != null) { // get beams in pos - List existingBeamList = this.beaconBeamRepo.getAllBeamsForSectionPos(pos); + List existingBeamList = this.beaconBeamRepo.getAllBeamsForPos(pos); for (int i = 0; i < existingBeamList.size(); i++) { BeaconBeamDTO beam = existingBeamList.get(i); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/GenericObjectRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/GenericObjectRenderer.java index 9d4b56d62..25b6b2f30 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/GenericObjectRenderer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/GenericObjectRenderer.java @@ -74,6 +74,7 @@ import java.util.stream.Stream; */ public class GenericObjectRenderer implements IDhApiCustomRenderRegister { + // TODO should be level specific, not global @Deprecated public static GenericObjectRenderer INSTANCE = new GenericObjectRenderer(); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/sql/repo/BeaconBeamRepo.java b/core/src/main/java/com/seibel/distanthorizons/core/sql/repo/BeaconBeamRepo.java index 5882c3729..9616a79b2 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/sql/repo/BeaconBeamRepo.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/sql/repo/BeaconBeamRepo.java @@ -21,10 +21,10 @@ package com.seibel.distanthorizons.core.sql.repo; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.pos.DhBlockPos; -import com.seibel.distanthorizons.core.pos.DhBlockPos; +import com.seibel.distanthorizons.core.pos.DhChunkPos; import com.seibel.distanthorizons.core.pos.DhSectionPos; import com.seibel.distanthorizons.core.sql.dto.BeaconBeamDTO; -import com.seibel.distanthorizons.core.sql.dto.BeaconBeamDTO; +import com.seibel.distanthorizons.core.util.LodUtil; import org.apache.logging.log4j.Logger; import java.awt.*; @@ -145,20 +145,43 @@ public class BeaconBeamRepo extends AbstractDhRepo // additional methods // //====================// - public List getAllBeamsForSectionPos(long pos) + public List getAllBeamsForPos(DhChunkPos chunkPos) + { + int minBlockX = chunkPos.getMinBlockX(); + int minBlockZ = chunkPos.getMinBlockZ(); + int maxBlockX = minBlockX + LodUtil.CHUNK_WIDTH; + int maxBlockZ = minBlockZ + LodUtil.CHUNK_WIDTH; + + return this.getAllBeamsInBlockPosRange( + minBlockX, minBlockZ, + maxBlockX, maxBlockZ + ); + } + + public List getAllBeamsForPos(long pos) { int minBlockX = DhSectionPos.getMinCornerBlockX(pos); int minBlockZ = DhSectionPos.getMinCornerBlockZ(pos); int maxBlockX = minBlockX + DhSectionPos.getBlockWidth(pos); int maxBlockZ = minBlockZ + DhSectionPos.getBlockWidth(pos); - + return this.getAllBeamsInBlockPosRange( + minBlockX, minBlockZ, + maxBlockX, maxBlockZ + ); + } + + public List getAllBeamsInBlockPosRange( + int minBlockX, int minBlockZ, + int maxBlockX, int maxBlockZ + ) + { List> objectMapList = this.queryDictionary( "SELECT * " + - "FROM "+this.getTableName()+" " + - "WHERE " + - "BlockPosX >= "+minBlockX+" AND BlockPosX <= "+maxBlockX+" " + - "AND BlockPosZ >= "+minBlockZ+" AND BlockPosX <= "+maxBlockZ); + "FROM "+this.getTableName()+" " + + "WHERE " + + minBlockX+" <= BlockPosX AND BlockPosX <= "+maxBlockX+" AND " + + minBlockZ+" <= BlockPosZ AND BlockPosZ <= "+maxBlockZ); ArrayList beamList = new ArrayList<>(); for (Map objectMap : objectMapList) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/chunk/IChunkWrapper.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/chunk/IChunkWrapper.java index 09d8538ba..d31b005fc 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/chunk/IChunkWrapper.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/chunk/IChunkWrapper.java @@ -255,15 +255,48 @@ public interface IChunkWrapper extends IBindable for (int i = 0; i < blockPosList.size(); i++) { DhBlockPos pos = blockPosList.get(i); - IBlockStateWrapper block = this.getBlockState(pos.convertToChunkRelativePos()); + DhBlockPos relPos = pos.convertToChunkRelativePos(); + + IBlockStateWrapper block = this.getBlockState(relPos); if (block.getSerialString().toLowerCase().contains("minecraft:beacon")) { - BeaconBeamDTO beam = new BeaconBeamDTO(blockPosList.get(i), Color.WHITE); - beaconPosList.add(beam); + if (isBeaconActive(relPos.x, relPos.y, relPos.z, this)) + { + BeaconBeamDTO beam = new BeaconBeamDTO(blockPosList.get(i), Color.WHITE); + beaconPosList.add(beam); + } } } return beaconPosList; } + static boolean isBeaconActive(int relBlockX, int y, int relBlockZ, IChunkWrapper chunkWrapper) + { + for (int x = -1; x<= 1; x++) + { + for (int z = -1; z <= 1; z++) + { + if ((relBlockX + x < 0 || relBlockX + x >= LodUtil.CHUNK_WIDTH) + || (relBlockZ + z < 0 || relBlockZ + z >= LodUtil.CHUNK_WIDTH)) + { + // if the beacon is on the border of a chunk and all other blocks are there, assume it's complete + //TODO! Check adjacent chunk, if possible + continue; + } + String blockId = chunkWrapper.getBlockState(relBlockX + x, y -1, relBlockZ + z).getSerialString(); + + if (!(blockId.contains("diamond_block") + || blockId.contains("iron_block") + || blockId.contains("emerald_block") + || blockId.contains("netherite_block") + || blockId.contains("gold_block"))) + { + return false; + } + } + } + return true; + } + }