From f6474d2840aca6932b7ec9effee8b12103f27f63 Mon Sep 17 00:00:00 2001 From: TudbuT Date: Wed, 29 May 2024 00:25:34 +0200 Subject: [PATCH] seedoverlay working, but still with messy decorations --- Client/libs/TuddyLIB.jar | Bin 456553 -> 456314 bytes .../client/gui/lib/component/Component.java | 2 +- .../com/baseband/client/module/Feature.java | 7 +- .../baseband/client/module/render/HUD.java | 4 +- .../client/module/world/SeedOverlay.java | 255 +++++++++++++++--- .../util/adapt/SimpleWorldGenerator.java | 93 ++++--- .../client/util/render/Tesselator.java | 10 +- 7 files changed, 301 insertions(+), 70 deletions(-) diff --git a/Client/libs/TuddyLIB.jar b/Client/libs/TuddyLIB.jar index 7a99aafc03472867dd937751cadfcb80760acb67..05858562ee4d141f58893fb30d6c459389e29eef 100644 GIT binary patch delta 32155 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 delta 32619 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 aG~b42enT3f(frZ;$M(UuPQ1YuzW)PCi*wBY diff --git a/Client/src/main/java/com/baseband/client/gui/lib/component/Component.java b/Client/src/main/java/com/baseband/client/gui/lib/component/Component.java index df52ecf..2e5066a 100644 --- a/Client/src/main/java/com/baseband/client/gui/lib/component/Component.java +++ b/Client/src/main/java/com/baseband/client/gui/lib/component/Component.java @@ -25,7 +25,7 @@ public abstract class Component { @Marker(Integer.MIN_VALUE) static final boolean FALSE = false; - public static final int MARKER_PREFIX = -512; + private static final int MARKER_PREFIX = -512; public static final int M_GUI_EXPANDED = MARKER_PREFIX + 1; public Point loc; diff --git a/Client/src/main/java/com/baseband/client/module/Feature.java b/Client/src/main/java/com/baseband/client/module/Feature.java index 37525ff..91e6a50 100644 --- a/Client/src/main/java/com/baseband/client/module/Feature.java +++ b/Client/src/main/java/com/baseband/client/module/Feature.java @@ -28,6 +28,9 @@ import java.util.HashMap; //Double fuck you if this involves commands too then it's a feature not a module public abstract class Feature extends ToggleButton implements SetCommand { + private static final int MARKER_PREFIX = -1024; + public static final int M_ENABLED = MARKER_PREFIX + 1; + protected Setup Setup; protected BaseBand bb; @@ -35,7 +38,7 @@ public abstract class Feature extends ToggleButton implements SetCommand { public Category category; - @Marker(1) + @Marker(M_ENABLED) public boolean enabled = defaultEnable(); @Config("Toggle") @@ -176,7 +179,7 @@ public abstract class Feature extends ToggleButton implements SetCommand { } handle = settings; - BaseBand.registerUpdater(settings.linkWith(this, FieldFinder.findMarked(Feature.class, 1)).name("Enabled")).populate(); + BaseBand.registerUpdater(settings.linkWith(this, FieldFinder.findMarked(Feature.class, M_ENABLED)).name("Enabled")).populate(); Description description = getClass().getDeclaredAnnotation(Description.class); if(description != null) diff --git a/Client/src/main/java/com/baseband/client/module/render/HUD.java b/Client/src/main/java/com/baseband/client/module/render/HUD.java index 870cc65..ee51145 100644 --- a/Client/src/main/java/com/baseband/client/module/render/HUD.java +++ b/Client/src/main/java/com/baseband/client/module/render/HUD.java @@ -40,7 +40,7 @@ public class HUD extends Feature { private final long start = new Date().getTime(); public Notification(String text) { - this(text, 5000); + this(text, 10000); } public Notification(String text, int ms) { @@ -181,7 +181,7 @@ public class HUD extends Feature { int localYSize = ySize; String text = TextSplitter.breakText(notif.text, xSize - textOffset * 2); - localYSize -= TextSplitter.getStringHeight(text) - mc.fontRenderer.FONT_HEIGHT; + localYSize += TextSplitter.getStringHeight(text) - mc.fontRenderer.FONT_HEIGHT; int textboxYSize = localYSize; localYSize = notif.opacity(localYSize, 1); diff --git a/Client/src/main/java/com/baseband/client/module/world/SeedOverlay.java b/Client/src/main/java/com/baseband/client/module/world/SeedOverlay.java index ae052d2..2282db4 100644 --- a/Client/src/main/java/com/baseband/client/module/world/SeedOverlay.java +++ b/Client/src/main/java/com/baseband/client/module/world/SeedOverlay.java @@ -2,6 +2,7 @@ package com.baseband.client.module.world; import com.baseband.client.BaseBand; import com.baseband.client.configuration.annotation.Config; +import com.baseband.client.configuration.annotation.Gate; import com.baseband.client.configuration.annotation.Range; import com.baseband.client.module.Feature; import com.baseband.client.module.category.World; @@ -9,12 +10,20 @@ import com.baseband.client.module.render.ClickGUI; import com.baseband.client.util.adapt.SimpleWorldGenerator; import com.baseband.client.util.misc.Description; import com.baseband.client.util.misc.GlobalUtil; +import com.baseband.client.util.misc.Marker; import com.baseband.client.util.misc.Trigger; +import com.baseband.client.util.render.Pixels; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.init.Blocks; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import net.minecraft.world.chunk.Chunk; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.lwjgl.opengl.GL11; +import de.tudbut.tools.Lock; + +import java.util.Objects; import static com.baseband.client.util.render.Tesselator.*; @@ -24,11 +33,24 @@ import static com.baseband.client.util.render.Tesselator.*; public class SeedOverlay extends Feature { @Config("Seed") + @Description("The world seed you want to overlay") public String seed = "enter the server seed"; @Config("Distance (chunks)") + @Description("The distance at which chunks should be checked. Higher is a lot slower. ยง7(This is O(n^2).)") + @Gate(1) @Range("0..8") - public int rd = 8; + public int rd = 4; + + @Config("Opacity") + @Description("The opacity of rendered overlay.") + @Range("0.01..0.8") + public float opacity = 0.2f; + + @Marker(1) + boolean canSetRD = true; + @Marker(2) + boolean running = false; SimpleWorldGenerator genOverworld = null, genNether = null, genEnd = null; @@ -38,56 +60,223 @@ public class SeedOverlay extends Feature { } @Trigger("Generate now") + @Description("Hit this after entering the Seed - this starts the world generators and initializes the render buffers.") + @Gate(1) public void generate() { - BaseBand.ifFeaturePresent(ClickGUI.class, gui -> gui.setEnabled(false)); - long seed; - try { - seed = Long.parseLong(this.seed); - } catch (NumberFormatException e) { - seed = this.seed.hashCode(); - } - BaseBand.notify("Creating world with seed " + seed + "..."); - genOverworld = SimpleWorldGenerator.overworld(mc.world.getWorldInfo(), seed); - genNether = SimpleWorldGenerator.nether(mc.world.getWorldInfo(), seed); - genEnd = SimpleWorldGenerator.end(mc.world.getWorldInfo(), seed); - int rd = this.rd + 1; - int length = rd * 16 * 256 * rd * 16; - BaseBand.notify("World generators acquired. Allocating render buffer with " + (length * 4 / 1024) + "KB space."); - bufferPosition = new BlockPos((mc.player.chunkCoordX - 4) * 16, 0, (mc.player.chunkCoordZ - 4) * 16); - buffer = new int[rd * 16][256][rd * 16]; - GlobalUtil.LOGGER.info("Allocated."); - for (int x = 0; x < rd * 16; x++) { - for (int z = 0; z < rd * 16; z++) { - buffer[x][0][z] = 0x800000ff; + running = true; + canSetRD = false; + new Thread(() -> { + BaseBand.ifFeaturePresent(ClickGUI.class, gui -> gui.setEnabled(false)); + long seed; + try { + seed = Long.parseLong(this.seed); + } catch (NumberFormatException e) { + seed = this.seed.hashCode(); } + BaseBand.notify("Creating world with seed " + seed + "..."); + int rd = this.rd * 2 + 1; + genOverworld = SimpleWorldGenerator.overworld(mc.world.getWorldInfo(), seed, rd); + genNether = SimpleWorldGenerator.nether(mc.world.getWorldInfo(), seed, rd); + genEnd = SimpleWorldGenerator.end(mc.world.getWorldInfo(), seed, rd); + int length = rd * 16 * 256 * rd * 16; + BaseBand.notify("World generators acquired. Allocating render buffer with " + (length * 4 / 1024) + "KB space."); + bufferPosition = new BlockPos((mc.player.chunkCoordX - this.rd) * 16, 0, (mc.player.chunkCoordZ - this.rd) * 16); + frontBuffer = new int[rd * 16][256][rd * 16]; + backBuffer = new int[rd * 16][256][rd * 16]; + GlobalUtil.LOGGER.info("Allocated."); + for (int x = 0; x < rd * 16; x++) { + for (int z = 0; z < rd * 16; z++) { + frontBuffer[x][0][z] = 0x800000ff; + backBuffer[x][0][z] = 0x800000ff; + } + } + GlobalUtil.LOGGER.info("Filled buffer with test state."); + BaseBand.notify("Render buffer created. Starting..."); + setEnabled(true); + }, this + " init").start(); + } + + @Trigger("Stop world") + @Description("Shuts down the generators, frees the render buffers, disables the module. This must be done before changing the Distance.") + @Gate(2) + public void stopWorld() { + new Thread(() -> { + setEnabled(false); + + running = false; + + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + // these should already be stopped! + if(updater.isAlive() || generator.isAlive()) { + GlobalUtil.LOGGER.warn(this + " threads were still running when stopping the world. This should not happen! Stopping them forcefully."); + //noinspection deprecation + updater.stop(); + //noinspection deprecation + generator.stop(); + } + + canSetRD = true; + + genOverworld.destroy(); + genNether.destroy(); + genEnd.destroy(); + genOverworld = null; + genNether = null; + genEnd = null; + bufferPosition = null; + frontBuffer = null; + backBuffer = null; + }, this + " stopper").start(); + } + + Thread updater, generator; + + @Override + public void onEnable() { + updater = new Thread(this::updateSeedOverlay, this + " updater"); + updater.start(); + generator = new Thread(this::genLoop, this + " generator"); + generator.start(); + } + + private void genLoop() { + Lock lock = new Lock(); + while (enabled) { + lock.lock(100); + int rd = this.rd * 2 + 1; + net.minecraft.world.World mcWorld = mc.world; + EntityPlayerSP player = mc.player; + + if(notIngame()) + break; + + SimpleWorldGenerator gen = getGen(mcWorld); + + int ocx = (player.chunkCoordX - this.rd); + int ocz = (player.chunkCoordZ - this.rd); + + gen.tick(); + + for (int x = -1; x < rd + 1; x++) { + for (int z = -1; z < rd + 1; z++) { + gen.provideChunk(ocx + x, ocz + z); + if(!enabled) + return; + } + } + lock.waitHere(); } - GlobalUtil.LOGGER.info("Filled buffer with test state."); - BaseBand.notify("Render buffer created. Starting..."); - setEnabled(true); + } + + private SimpleWorldGenerator getGen(net.minecraft.world.World world) { + SimpleWorldGenerator gen; + switch (world.provider.getDimensionType()) { + case OVERWORLD: + gen = genOverworld; + break; + case NETHER: + gen = genNether; + break; + case THE_END: + gen = genEnd; + break; + default: + throw new RuntimeException("Dimension " + world.provider.getDimensionType() + " not available for SeedOverlay!"); + } + return gen; } BlockPos bufferPosition = null; - int[][][] buffer = null; + int[][][] backBuffer = null; + int[][][] frontBuffer = null; + + private void updateSeedOverlay() { + while (enabled) { + int rd = this.rd * 2 + 1; + net.minecraft.world.World world = mc.world; + EntityPlayerSP player = mc.player; + + if(notIngame()) + break; + + SimpleWorldGenerator gen = getGen(world); + + int ocx = (player.chunkCoordX - this.rd), ox = ocx * 16; + int ocz = (player.chunkCoordZ - this.rd), oz = ocz * 16; + + Chunk[][] chunks = new Chunk[rd][rd]; + + for (int x = 0; x < chunks.length; x++) { + for (int z = 0; z < chunks[x].length; z++) { + chunks[x][z] = gen.getLoadedChunk(ocx + x, ocz + z); + } + } + + int red = Pixels.mulTransparency(0xffff0000, opacity); + int green = Pixels.mulTransparency(0xff00ff00, opacity); + int yellow = Pixels.mulTransparency(0xffffff00, opacity); + for (int x = 0; x < backBuffer.length; x++) { + for (int z = 0; z < backBuffer[x][0].length; z++) { + if(!enabled) + return; + Chunk c = chunks[x / 16][z / 16]; + Chunk rc = world.getChunk(ocx + x / 16, ocz + z / 16); + if(c == null || !c.isTerrainPopulated()) + continue; + if(rc.isEmpty() || !rc.isTerrainPopulated()) + continue; + for (int y = 0; y < backBuffer[x].length; y++) { + if(c.getBlockState(x, y, z).getBlock() == rc.getBlockState(x, y, z).getBlock()) { + backBuffer[x][y][z] = 0; + continue; + } + if(rc.getBlockState(x, y, z).getBlock() == Blocks.AIR) { + backBuffer[x][y][z] = red; + continue; + } + if(c.getBlockState(x, y, z).getBlock() == Blocks.AIR) { + backBuffer[x][y][z] = green; + continue; + } + backBuffer[x][y][z] = yellow; + } + } + } + swapBuffers(new BlockPos(ox, 0, oz)); + } + } + + private synchronized void swapBuffers(BlockPos bufferPosition) { + this.bufferPosition = bufferPosition; + int[][][] oldFront = this.frontBuffer; + this.frontBuffer = this.backBuffer; + this.backBuffer = oldFront; + } @SubscribeEvent - public void onRender(RenderWorldLastEvent event) { - if(buffer == null) { + public synchronized void onRender(RenderWorldLastEvent event) { + if(frontBuffer == null) { BaseBand.notify("Please input a |Seed| and trigger |Generate now|"); toggle(); return; } - Vec3d p = mc.player.getPositionEyes(event.getPartialTicks()); + Vec3d p = Objects.requireNonNull(mc.getRenderViewEntity()).getPositionEyes(event.getPartialTicks()); ready(); translate(-p.x + bufferPosition.getX(), -p.y + bufferPosition.getY(), -p.z + bufferPosition.getZ()); color(0xffff00ff); // if this renders, this is an error depth(false); begin(GL11.GL_QUADS); - for (int x = 0; x < buffer.length; x++) { - for (int y = 0; y < buffer[x].length; y++) { - for (int z = 0; z < buffer[y].length; z++) { - int c = buffer[x][y][z]; + for (int x = 0; x < frontBuffer.length; x++) { + for (int y = 0; y < frontBuffer[x].length; y++) { + for (int z = 0; z < frontBuffer[x][y].length; z++) { + int c = frontBuffer[x][y][z]; if(c != 0) { - color(c); + changeColor(c); drawBlockFacesNow(x, y, z); } } diff --git a/Client/src/main/java/com/baseband/client/util/adapt/SimpleWorldGenerator.java b/Client/src/main/java/com/baseband/client/util/adapt/SimpleWorldGenerator.java index f053efb..503dcc1 100644 --- a/Client/src/main/java/com/baseband/client/util/adapt/SimpleWorldGenerator.java +++ b/Client/src/main/java/com/baseband/client/util/adapt/SimpleWorldGenerator.java @@ -1,11 +1,12 @@ package com.baseband.client.util.adapt; import com.baseband.client.Setup; -import de.tudbut.obj.Vector2i; +import com.baseband.client.util.misc.GlobalUtil; import net.minecraft.client.Minecraft; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.profiler.Profiler; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.DimensionType; import net.minecraft.world.World; import net.minecraft.world.WorldProvider; @@ -25,74 +26,83 @@ import java.util.Map; public class SimpleWorldGenerator implements IChunkProvider { - final World world; - final HashMap loaded = new HashMap<>(); + public final World world; + final HashMap loaded = new HashMap<>(); final IChunkGenerator generator; final Minecraft mc = Minecraft.getMinecraft(); - public SimpleWorldGenerator(World world, IChunkGenerator generator) { + final int distance; + + private SimpleWorldGenerator(DummyWorld world, IChunkGenerator generator, int distance) { this.world = world; this.generator = generator; + this.distance = distance; + world.setChunkProvider(this); } - public static SimpleWorldGenerator overworld(WorldInfo original, long seed) { + public static SimpleWorldGenerator overworld(WorldInfo original, long seed, int unloadDistance) { NBTTagCompound nbt = original.cloneNBTCompound(null); nbt.setLong("RandomSeed", seed); - World world = new DummyWorld(new WorldInfo(nbt), DimensionType.OVERWORLD); - return new SimpleWorldGenerator(world, new ChunkGeneratorOverworld(world, seed, true, null)); + DummyWorld world = new DummyWorld(new WorldInfo(nbt), DimensionType.OVERWORLD); + return new SimpleWorldGenerator(world, new ChunkGeneratorOverworld(world, seed, true, ""), unloadDistance); } - public static SimpleWorldGenerator nether(WorldInfo original, long seed) { + public static SimpleWorldGenerator nether(WorldInfo original, long seed, int unloadDistance) { NBTTagCompound nbt = original.cloneNBTCompound(null); nbt.setLong("RandomSeed", seed); - World world = new DummyWorld(new WorldInfo(nbt), DimensionType.NETHER); - return new SimpleWorldGenerator(world, new ChunkGeneratorHell(world, true, seed)); + DummyWorld world = new DummyWorld(new WorldInfo(nbt), DimensionType.NETHER); + return new SimpleWorldGenerator(world, new ChunkGeneratorHell(world, true, seed), unloadDistance); } - public static SimpleWorldGenerator end(WorldInfo original, long seed) { + public static SimpleWorldGenerator end(WorldInfo original, long seed, int unloadDistance) { NBTTagCompound nbt = original.cloneNBTCompound(null); nbt.setLong("RandomSeed", seed); - World world = new DummyWorld(new WorldInfo(nbt), DimensionType.THE_END); - return new SimpleWorldGenerator(world, new ChunkGeneratorEnd(world, true, seed, new BlockPos(0,0,0))); + DummyWorld world = new DummyWorld(new WorldInfo(nbt), DimensionType.THE_END); + return new SimpleWorldGenerator(world, new ChunkGeneratorEnd(world, true, seed, new BlockPos(0,0,0)), unloadDistance); } @Nullable @Override public Chunk getLoadedChunk(int x, int z) { - return loaded.get(new Vector2i(x, z)); + return loaded.get(new ChunkPos(x, z)); } @Override @Nonnull public Chunk provideChunk(int x, int z) { Chunk chunk = getLoadedChunk(x, z); - return chunk != null ? chunk : gen(x, z); + if(chunk == null) + return gen(x, z); + return chunk; } - public Chunk gen(int x, int z) { + public synchronized Chunk gen(int x, int z) { + GlobalUtil.LOGGER.debug(this + " is generating chunk at {} {}", x, z); + Chunk chunk = generator.generateChunk(x, z); - loaded.put(new Vector2i(x, z), chunk); + loaded.put(chunk.getPos(), chunk); chunk.onLoad(); chunk.populate(this, generator); chunk.onTick(true); + GlobalUtil.LOGGER.debug("Chunk gen finished"); + return chunk; } @Override - public boolean tick() { + public synchronized boolean tick() { - for (Map.Entry entry : loaded.entrySet()) { - Vector2i pos = entry.getKey(); - if(Math.abs(mc.player.chunkCoordX - pos.getX()) > mc.gameSettings.renderDistanceChunks) { - entry.getValue().onUnload(); - loaded.remove(pos); + for (Map.Entry entry : loaded.entrySet().toArray(new Map.Entry[0])) { + ChunkPos pos = entry.getKey(); + Chunk chunk = entry.getValue(); + if(Math.abs(mc.player.chunkCoordX - pos.x) > distance) { + onUnload(pos, chunk); continue; } - if(Math.abs(mc.player.chunkCoordZ - pos.getY()) > mc.gameSettings.renderDistanceChunks) { - entry.getValue().onUnload(); - loaded.remove(pos); + if(Math.abs(mc.player.chunkCoordZ - pos.z) > distance) { + onUnload(pos, chunk); continue; } } @@ -100,20 +110,39 @@ public class SimpleWorldGenerator implements IChunkProvider { return false; } + private void onUnload(ChunkPos pos, Chunk chunk) { + GlobalUtil.LOGGER.debug(this + " is unloading chunk at {} {}", pos.x, pos.z); + chunk.onUnload(); + loaded.remove(pos); + } + @Override @Nonnull public String makeString() { - return Setup.get().Name + ".SimpleWorldGenerator"; + return Setup.get().Name + "." + this; + } + + @Override + public String toString() { + return "SimpleWorldGenerator"; } @Override public boolean isChunkGeneratedAt(int x, int z) { - return loaded.containsKey(new Vector2i(x, z)); + return loaded.containsKey(new ChunkPos(x, z)); + } + + public synchronized void destroy() { + for (Map.Entry entry : loaded.entrySet().toArray(new Map.Entry[0])) { + onUnload(entry.getKey(), entry.getValue()); + } } private static class DummyWorld extends World { + public DummyWorld(WorldInfo info, DimensionType type) { super(new SaveHandlerMP(), info, new DummyWorldProvider(type), new Profiler(), false); + provider.setWorld(this); } @Override @@ -123,8 +152,12 @@ public class SimpleWorldGenerator implements IChunkProvider { } @Override - protected boolean isChunkLoaded(int x, int y, boolean b) { - throw new IllegalAccessError("Tried to treat dummy world like a real world"); + protected boolean isChunkLoaded(int x, int z, boolean b) { + return chunkProvider.isChunkGeneratedAt(x, z); + } + + public void setChunkProvider(SimpleWorldGenerator chunkProvider) { + this.chunkProvider = chunkProvider; } } diff --git a/Client/src/main/java/com/baseband/client/util/render/Tesselator.java b/Client/src/main/java/com/baseband/client/util/render/Tesselator.java index 582c028..71a2d7b 100644 --- a/Client/src/main/java/com/baseband/client/util/render/Tesselator.java +++ b/Client/src/main/java/com/baseband/client/util/render/Tesselator.java @@ -37,12 +37,18 @@ public class Tesselator { glColor4ub(bytes[1], bytes[2], bytes[3], bytes[0]); color = argb; } + public static void changeColor(int argb) { + byte[] bytes = PBIC.putInt(argb); + glColor4ub(bytes[1], bytes[2], bytes[3], bytes[0]); + } public static void depth(boolean b) { depth = b; - if(b) + if(b) { glEnable(GL_DEPTH_TEST); - else + } else { + glDisable(GL_DEPTH_TEST); glClear(GL_DEPTH_BUFFER_BIT); + } } public static void put(double x, double y, double z) { glVertex3d(x,y,z);