From d0458f80f9e5467e9119962867dcfb65e35d7476 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 8 Oct 2019 19:33:08 -0400 Subject: [PATCH] Cleanup --- .../kaptainwutax/seedcracker/FinderQueue.java | 54 +++++++++++++++ .../kaptainwutax/seedcracker/SeedCracker.java | 6 +- .../seedcracker/finder/BlockFinder.java | 19 +++--- .../finder/BuriedTreasureFinder.java | 14 ++-- .../seedcracker/finder/Finder.java | 36 +++++++++- .../mixin/ClientPlayNetworkHandlerMixin.java | 26 ++++++++ .../seedcracker/mixin/ClientWorldMixin.java | 18 +++++ .../mixin/DisableableProfilerMixin.java | 6 +- .../seedcracker/mixin/GameRendererMixin.java | 8 +-- .../kaptainwutax/seedcracker/render/Cube.java | 48 ++++++++++++++ .../kaptainwutax/seedcracker/render/Line.java | 65 +++++++++++++++++++ .../{RenderTracker.java => RenderQueue.java} | 10 +-- .../seedcracker/render/Renderer.java | 17 +++++ src/main/resources/seedcracker.mixins.json | 4 +- 14 files changed, 297 insertions(+), 34 deletions(-) create mode 100644 src/main/java/kaptainwutax/seedcracker/FinderQueue.java create mode 100644 src/main/java/kaptainwutax/seedcracker/mixin/ClientPlayNetworkHandlerMixin.java create mode 100644 src/main/java/kaptainwutax/seedcracker/mixin/ClientWorldMixin.java create mode 100644 src/main/java/kaptainwutax/seedcracker/render/Cube.java create mode 100644 src/main/java/kaptainwutax/seedcracker/render/Line.java rename src/main/java/kaptainwutax/seedcracker/render/{RenderTracker.java => RenderQueue.java} (80%) create mode 100644 src/main/java/kaptainwutax/seedcracker/render/Renderer.java diff --git a/src/main/java/kaptainwutax/seedcracker/FinderQueue.java b/src/main/java/kaptainwutax/seedcracker/FinderQueue.java new file mode 100644 index 0000000..402f845 --- /dev/null +++ b/src/main/java/kaptainwutax/seedcracker/FinderQueue.java @@ -0,0 +1,54 @@ +package kaptainwutax.seedcracker; + +import com.mojang.blaze3d.platform.GlStateManager; +import kaptainwutax.seedcracker.finder.BuriedTreasureFinder; +import kaptainwutax.seedcracker.finder.Finder; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.List; + +public class FinderQueue { + + private final static FinderQueue INSTANCE = new FinderQueue(); + private List activeFinders = new ArrayList<>(); + + + public FinderQueue() { + + } + + public static FinderQueue get() { + return INSTANCE; + } + + public void onChunkData(World world, ChunkPos chunkPos) { + BuriedTreasureFinder buriedTreasure = new BuriedTreasureFinder(world, chunkPos); + buriedTreasure.findInChunk(); + this.activeFinders.add(buriedTreasure); + } + + public void renderFinders() { + GlStateManager.disableTexture(); + + //Makes it render through blocks. + GlStateManager.disableDepthTest(); + + this.activeFinders.removeIf(Finder::isUseless); + + this.activeFinders.forEach(finder -> { + if(finder.shouldRender()) { + finder.render(); + } + }); + + GlStateManager.enableTexture(); + GlStateManager.enableDepthTest(); + } + + public void clear() { + this.activeFinders.clear(); + } + +} diff --git a/src/main/java/kaptainwutax/seedcracker/SeedCracker.java b/src/main/java/kaptainwutax/seedcracker/SeedCracker.java index e5e8e26..f262cb0 100644 --- a/src/main/java/kaptainwutax/seedcracker/SeedCracker.java +++ b/src/main/java/kaptainwutax/seedcracker/SeedCracker.java @@ -1,15 +1,13 @@ package kaptainwutax.seedcracker; -import kaptainwutax.seedcracker.finder.BlockFinder; +import kaptainwutax.seedcracker.render.RenderQueue; import net.fabricmc.api.ModInitializer; -import net.minecraft.block.Blocks; public class SeedCracker implements ModInitializer { @Override public void onInitialize() { - BlockFinder finder1 = new BlockFinder(Blocks.CHEST.getDefaultState()); - BlockFinder finder2 = new BlockFinder(Blocks.CHEST); + RenderQueue.get().add("hand", FinderQueue.get()::renderFinders); } } diff --git a/src/main/java/kaptainwutax/seedcracker/finder/BlockFinder.java b/src/main/java/kaptainwutax/seedcracker/finder/BlockFinder.java index d6137f1..505e96b 100644 --- a/src/main/java/kaptainwutax/seedcracker/finder/BlockFinder.java +++ b/src/main/java/kaptainwutax/seedcracker/finder/BlockFinder.java @@ -7,36 +7,37 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.chunk.ChunkSection; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; -public class BlockFinder extends Finder { +public abstract class BlockFinder extends Finder { private Set targetBlockStates = new HashSet<>(); - public BlockFinder(Block block) { + public BlockFinder(World world, ChunkPos chunkPos, Block block) { + super(world, chunkPos); this.targetBlockStates.addAll(block.getStateFactory().getStates()); } - public BlockFinder(BlockState blockState) { + public BlockFinder(World world, ChunkPos chunkPos, BlockState blockState) { + super(world, chunkPos); this.targetBlockStates.add(blockState); } @Override - public List findInChunk(World world, ChunkPos chunkPos) { + public List findInChunk() { List result = new ArrayList<>(); - ChunkWrapper chunkWrapper = new ChunkWrapper(world, chunkPos); + ChunkWrapper chunkWrapper = new ChunkWrapper(this.world, this.chunkPos); Chunk chunk = chunkWrapper.getChunk(); - for(BlockPos pos: CHUNK_POSITIONS) { - BlockState currentState = chunk.getBlockState(pos); + for(BlockPos blockPos: CHUNK_POSITIONS) { + BlockState currentState = chunk.getBlockState(blockPos); if(this.targetBlockStates.contains(currentState)) { - result.add(chunkPos.getCenterBlockPos().add(pos)); + result.add(this.chunkPos.getCenterBlockPos().add(blockPos)); } } diff --git a/src/main/java/kaptainwutax/seedcracker/finder/BuriedTreasureFinder.java b/src/main/java/kaptainwutax/seedcracker/finder/BuriedTreasureFinder.java index 7336687..90288eb 100644 --- a/src/main/java/kaptainwutax/seedcracker/finder/BuriedTreasureFinder.java +++ b/src/main/java/kaptainwutax/seedcracker/finder/BuriedTreasureFinder.java @@ -1,5 +1,6 @@ package kaptainwutax.seedcracker.finder; +import kaptainwutax.seedcracker.render.Cube; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.util.math.BlockPos; @@ -23,14 +24,15 @@ public class BuriedTreasureFinder extends BlockFinder { CHEST_HOLDERS.add(Blocks.DIORITE.getDefaultState()); } - public BuriedTreasureFinder() { - super(Blocks.CHEST); + public BuriedTreasureFinder(World world, ChunkPos chunkPos) { + + super(world, chunkPos, Blocks.CHEST); } @Override - public List findInChunk(World world, ChunkPos chunkPos) { + public List findInChunk() { //Gets all the positions with a chest in the chunk. - List result = super.findInChunk(world, chunkPos); + List result = super.findInChunk(); result.removeIf(pos -> { //Buried treasure chests always generate at (9, 9) within a chunk. @@ -47,9 +49,11 @@ public class BuriedTreasureFinder extends BlockFinder { if(!biome.hasStructureFeature(Feature.BURIED_TREASURE))return true; //Damn that chest be lucky! - return true; + return false; }); + result.forEach(pos -> this.renderers.add(new Cube(pos))); + return result; } diff --git a/src/main/java/kaptainwutax/seedcracker/finder/Finder.java b/src/main/java/kaptainwutax/seedcracker/finder/Finder.java index 711ff88..9acc712 100644 --- a/src/main/java/kaptainwutax/seedcracker/finder/Finder.java +++ b/src/main/java/kaptainwutax/seedcracker/finder/Finder.java @@ -1,7 +1,10 @@ package kaptainwutax.seedcracker.finder; +import kaptainwutax.seedcracker.render.Renderer; +import net.minecraft.client.MinecraftClient; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import java.util.ArrayList; @@ -12,6 +15,11 @@ public abstract class Finder { protected static final List CHUNK_POSITIONS = new ArrayList<>(); protected static final List SUB_CHUNK_POSITIONS = new ArrayList<>(); + protected MinecraftClient mc = MinecraftClient.getInstance(); + protected List renderers = new ArrayList<>(); + protected World world; + protected ChunkPos chunkPos; + static { for(int x = 0; x < 16; x++) { for(int z = 0; z < 16; z++) { @@ -24,10 +32,32 @@ public abstract class Finder { } } - public Finder() { - + public Finder(World world, ChunkPos chunkPos) { + this.world = world; + this.chunkPos = chunkPos; } - public abstract List findInChunk(World world, ChunkPos chunkPos); + public abstract List findInChunk(); + + public boolean shouldRender() { + Vec3d playerPos = mc.player.getPos(); + + double distance = playerPos.squaredDistanceTo( + this.chunkPos.x * 16, + playerPos.y, + this.chunkPos.z * 16 + ); + + int renderDistance = mc.options.viewDistance * 16 + 16; + return distance <= renderDistance * renderDistance + 32; + } + + public void render() { + this.renderers.forEach(Renderer::render); + } + + public boolean isUseless() { + return this.renderers.isEmpty(); + } } diff --git a/src/main/java/kaptainwutax/seedcracker/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/kaptainwutax/seedcracker/mixin/ClientPlayNetworkHandlerMixin.java new file mode 100644 index 0000000..5550fd6 --- /dev/null +++ b/src/main/java/kaptainwutax/seedcracker/mixin/ClientPlayNetworkHandlerMixin.java @@ -0,0 +1,26 @@ +package kaptainwutax.seedcracker.mixin; + +import kaptainwutax.seedcracker.FinderQueue; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.client.network.packet.ChunkDataS2CPacket; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.util.math.ChunkPos; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ClientPlayNetworkHandler.class) +public class ClientPlayNetworkHandlerMixin { + + @Shadow private ClientWorld world; + + @Inject(method = "onChunkData", at = @At("TAIL")) + private void onChunkData(ChunkDataS2CPacket packet, CallbackInfo ci) { + int chunkX = packet.getX(); + int chunkZ = packet.getZ(); + FinderQueue.get().onChunkData(this.world, new ChunkPos(chunkX, chunkZ)); + } + +} diff --git a/src/main/java/kaptainwutax/seedcracker/mixin/ClientWorldMixin.java b/src/main/java/kaptainwutax/seedcracker/mixin/ClientWorldMixin.java new file mode 100644 index 0000000..4bc202f --- /dev/null +++ b/src/main/java/kaptainwutax/seedcracker/mixin/ClientWorldMixin.java @@ -0,0 +1,18 @@ +package kaptainwutax.seedcracker.mixin; + +import kaptainwutax.seedcracker.FinderQueue; +import net.minecraft.client.world.ClientWorld; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ClientWorld.class) +public abstract class ClientWorldMixin { + + @Inject(method = "disconnect", at = @At("TAIL")) + private void disconnect(CallbackInfo ci) { + FinderQueue.get().clear(); + } + +} diff --git a/src/main/java/kaptainwutax/seedcracker/mixin/DisableableProfilerMixin.java b/src/main/java/kaptainwutax/seedcracker/mixin/DisableableProfilerMixin.java index 4e23cef..b037530 100644 --- a/src/main/java/kaptainwutax/seedcracker/mixin/DisableableProfilerMixin.java +++ b/src/main/java/kaptainwutax/seedcracker/mixin/DisableableProfilerMixin.java @@ -1,6 +1,6 @@ package kaptainwutax.seedcracker.mixin; -import kaptainwutax.seedcracker.render.RenderTracker; +import kaptainwutax.seedcracker.render.RenderQueue; import net.minecraft.util.profiler.DisableableProfiler; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -8,11 +8,11 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(DisableableProfiler.class) -public class DisableableProfilerMixin { +public abstract class DisableableProfilerMixin { @Inject(method = "swap(Ljava/lang/String;)V", at = @At("HEAD")) private void swap(String type, CallbackInfo ci) { - RenderTracker.get().onRender(type); + RenderQueue.get().onRender(type); } } diff --git a/src/main/java/kaptainwutax/seedcracker/mixin/GameRendererMixin.java b/src/main/java/kaptainwutax/seedcracker/mixin/GameRendererMixin.java index 8bd563f..2345295 100644 --- a/src/main/java/kaptainwutax/seedcracker/mixin/GameRendererMixin.java +++ b/src/main/java/kaptainwutax/seedcracker/mixin/GameRendererMixin.java @@ -1,6 +1,6 @@ package kaptainwutax.seedcracker.mixin; -import kaptainwutax.seedcracker.render.RenderTracker; +import kaptainwutax.seedcracker.render.RenderQueue; import net.minecraft.client.render.GameRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -8,16 +8,16 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(GameRenderer.class) -public class GameRendererMixin { +public abstract class GameRendererMixin { @Inject(method = "renderCenter", at = @At("HEAD")) private void renderCenterStart(float delta, long time, CallbackInfo ci) { - RenderTracker.get().setTrackRender(true); + RenderQueue.get().setTrackRender(true); } @Inject(method = "renderCenter", at = @At("TAIL")) private void renderCenterFinish(float delta, long time, CallbackInfo ci) { - RenderTracker.get().setTrackRender(false); + RenderQueue.get().setTrackRender(false); } } diff --git a/src/main/java/kaptainwutax/seedcracker/render/Cube.java b/src/main/java/kaptainwutax/seedcracker/render/Cube.java new file mode 100644 index 0000000..41bb376 --- /dev/null +++ b/src/main/java/kaptainwutax/seedcracker/render/Cube.java @@ -0,0 +1,48 @@ +package kaptainwutax.seedcracker.render; + +import net.minecraft.client.util.math.Vector4f; +import net.minecraft.util.math.BlockPos; + +public class Cube extends Renderer { + + public BlockPos pos; + public Vector4f color; + + private Line[] edges = new Line[12]; + + public Cube() { + this(BlockPos.ORIGIN, new Vector4f(1.0f, 1.0f, 1.0f, 1.0f)); + } + + public Cube(BlockPos pos) { + this(pos, new Vector4f(1.0f, 1.0f, 1.0f, 1.0f)); + } + + public Cube(BlockPos pos, Vector4f color) { + this.pos = pos; + this.color = color; + this.edges[0] = new Line(toVec3d(pos), toVec3d(pos.add(1, 0, 0)), this.color); + this.edges[1] = new Line(toVec3d(pos), toVec3d(pos.add(0, 1, 0)), this.color); + this.edges[2] = new Line(toVec3d(pos), toVec3d(pos.add(0, 0, 1)), this.color); + this.edges[3] = new Line(toVec3d(pos.add(1, 0, 1)), toVec3d(pos.add(1, 0, 0)), this.color); + this.edges[4] = new Line(toVec3d(pos.add(1, 0, 1)), toVec3d(pos.add(1, 1, 1)), this.color); + this.edges[5] = new Line(toVec3d(pos.add(1, 0, 1)), toVec3d(pos.add(0, 0, 1)), this.color); + this.edges[6] = new Line(toVec3d(pos.add(1, 1, 0)), toVec3d(pos.add(1, 0, 0)), this.color); + this.edges[7] = new Line(toVec3d(pos.add(1, 1, 0)), toVec3d(pos.add(0, 1, 0)), this.color); + this.edges[8] = new Line(toVec3d(pos.add(1, 1, 0)), toVec3d(pos.add(1, 1, 1)), this.color); + this.edges[9] = new Line(toVec3d(pos.add(0, 1, 1)), toVec3d(pos.add(0, 0, 1)), this.color); + this.edges[10] = new Line(toVec3d(pos.add(0, 1, 1)), toVec3d(pos.add(0, 1, 0)), this.color); + this.edges[11] = new Line(toVec3d(pos.add(0, 1, 1)), toVec3d(pos.add(1, 1, 1)), this.color); + } + + @Override + public void render() { + if(this.pos == null || this.color == null || this.edges == null)return; + + for(Line edge: this.edges) { + if(edge == null)continue; + edge.render(); + } + } + +} diff --git a/src/main/java/kaptainwutax/seedcracker/render/Line.java b/src/main/java/kaptainwutax/seedcracker/render/Line.java new file mode 100644 index 0000000..2113892 --- /dev/null +++ b/src/main/java/kaptainwutax/seedcracker/render/Line.java @@ -0,0 +1,65 @@ +package kaptainwutax.seedcracker.render; + +import com.mojang.blaze3d.platform.GlStateManager; +import net.minecraft.client.render.BufferBuilder; +import net.minecraft.client.render.Tessellator; +import net.minecraft.client.render.VertexFormats; +import net.minecraft.client.util.math.Vector4f; +import net.minecraft.util.math.Vec3d; + +public class Line extends Renderer { + + public Vec3d start; + public Vec3d end; + public Vector4f color; + + public Line() { + this(Vec3d.ZERO, Vec3d.ZERO, new Vector4f(1.0f, 1.0f, 1.0f, 1.0f)); + } + + public Line(Vec3d start, Vec3d end) { + this(start, end, new Vector4f(1.0f, 1.0f, 1.0f, 1.0f)); + } + + public Line(Vec3d start, Vec3d end, Vector4f color) { + this.start = start; + this.end = end; + this.color = color; + } + + @Override + public void render() { + if(this.start == null || this.end == null || this.color == null)return; + + Vec3d camPos = this.mc.gameRenderer.getCamera().getPos(); + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder buffer = tessellator.getBufferBuilder(); + + //This is how thick the line is. + GlStateManager.lineWidth(2.0f); + buffer.begin(3, VertexFormats.POSITION_COLOR); + + //Put the start and end vertices in the buffer. + this.putVertex(buffer, camPos, this.start); + this.putVertex(buffer, camPos, this.end); + + //Draw it all. + tessellator.draw(); + } + + protected void putVertex(BufferBuilder buffer, Vec3d camPos, Vec3d pos) { + for(int i = 0; i < 2; i++) { + buffer.vertex( + pos.getX() - camPos.x, + pos.getY() - camPos.y, + pos.getZ() - camPos.z + ).color( + this.color.getX(), + this.color.getY(), + this.color.getZ(), + this.color.getW() + ).next(); + } + } + +} diff --git a/src/main/java/kaptainwutax/seedcracker/render/RenderTracker.java b/src/main/java/kaptainwutax/seedcracker/render/RenderQueue.java similarity index 80% rename from src/main/java/kaptainwutax/seedcracker/render/RenderTracker.java rename to src/main/java/kaptainwutax/seedcracker/render/RenderQueue.java index 9bee9dc..0029650 100644 --- a/src/main/java/kaptainwutax/seedcracker/render/RenderTracker.java +++ b/src/main/java/kaptainwutax/seedcracker/render/RenderQueue.java @@ -2,18 +2,18 @@ package kaptainwutax.seedcracker.render; import java.util.*; -public class RenderTracker { +public class RenderQueue { - private static RenderTracker INSTANCE = new RenderTracker(); + private final static RenderQueue INSTANCE = new RenderQueue(); private Map> typeRunnableMap = new HashMap<>(); private boolean trackRender = false; - public static RenderTracker get() { + public static RenderQueue get() { return INSTANCE; } - public void addRenderRunnable(String type, Runnable runnable) { + public void add(String type, Runnable runnable) { Objects.requireNonNull(type); Objects.requireNonNull(runnable); @@ -25,7 +25,7 @@ public class RenderTracker { runnableList.add(runnable); } - public void removeRenderRunnable(String type, Runnable runnable) { + public void remove(String type, Runnable runnable) { Objects.requireNonNull(type); Objects.requireNonNull(runnable); diff --git a/src/main/java/kaptainwutax/seedcracker/render/Renderer.java b/src/main/java/kaptainwutax/seedcracker/render/Renderer.java new file mode 100644 index 0000000..88485bd --- /dev/null +++ b/src/main/java/kaptainwutax/seedcracker/render/Renderer.java @@ -0,0 +1,17 @@ +package kaptainwutax.seedcracker.render; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public abstract class Renderer { + + protected MinecraftClient mc = MinecraftClient.getInstance(); + + public abstract void render(); + + protected Vec3d toVec3d(BlockPos pos) { + return new Vec3d(pos.getX(), pos.getY(), pos.getZ()); + } + +} diff --git a/src/main/resources/seedcracker.mixins.json b/src/main/resources/seedcracker.mixins.json index a7372b3..c085f97 100644 --- a/src/main/resources/seedcracker.mixins.json +++ b/src/main/resources/seedcracker.mixins.json @@ -6,7 +6,9 @@ ], "client": [ "DisableableProfilerMixin", - "GameRendererMixin" + "GameRendererMixin", + "ClientPlayNetworkHandlerMixin", + "ClientWorldMixin" ], "injectors": { "defaultRequire": 1