From a5d04b374d590e1c993bf410950ee5ccbb3f2c54 Mon Sep 17 00:00:00 2001 From: Ridan Vandenbergh Date: Thu, 9 Aug 2018 02:14:06 +0200 Subject: [PATCH] fix chunkfinder render bugs, hopeless attempt at fixing portaltracers --- .../kami/event/ForgeEventProcessor.java | 2 ++ .../kami/event/events/ChunkEvent.java | 26 +++++++++++++++ .../client/MixinNetHandlerPlayClient.java | 5 +-- .../module/modules/render/ChunkFinder.java | 19 ++++++----- .../module/modules/render/PortalTracers.java | 33 ++++++++++--------- 5 files changed, 59 insertions(+), 26 deletions(-) create mode 100644 src/main/java/me/zeroeightsix/kami/event/events/ChunkEvent.java diff --git a/src/main/java/me/zeroeightsix/kami/event/ForgeEventProcessor.java b/src/main/java/me/zeroeightsix/kami/event/ForgeEventProcessor.java index bacc0bb31..a2ff7ab9a 100644 --- a/src/main/java/me/zeroeightsix/kami/event/ForgeEventProcessor.java +++ b/src/main/java/me/zeroeightsix/kami/event/ForgeEventProcessor.java @@ -123,6 +123,8 @@ public class ForgeEventProcessor { } @SubscribeEvent() public void onChunkLoaded(ChunkEvent.Load event) { KamiMod.EVENT_BUS.post(event); } + @SubscribeEvent() + public void onChunkLoaded(ChunkEvent.Unload event) { KamiMod.EVENT_BUS.post(event); } @SubscribeEvent public void onInputUpdate(InputUpdateEvent event) { KamiMod.EVENT_BUS.post(event); } @SubscribeEvent diff --git a/src/main/java/me/zeroeightsix/kami/event/events/ChunkEvent.java b/src/main/java/me/zeroeightsix/kami/event/events/ChunkEvent.java new file mode 100644 index 000000000..4c1eef9f4 --- /dev/null +++ b/src/main/java/me/zeroeightsix/kami/event/events/ChunkEvent.java @@ -0,0 +1,26 @@ +package me.zeroeightsix.kami.event.events; + +import me.zeroeightsix.kami.event.KamiEvent; +import net.minecraft.network.play.server.SPacketChunkData; +import net.minecraft.world.chunk.Chunk; + +/** + * @author 086 + */ +public class ChunkEvent extends KamiEvent { + Chunk chunk; + SPacketChunkData packet; + + public ChunkEvent(Chunk chunk, SPacketChunkData packet) { + this.chunk = chunk; + this.packet = packet; + } + + public Chunk getChunk() { + return chunk; + } + + public SPacketChunkData getPacket() { + return packet; + } +} diff --git a/src/main/java/me/zeroeightsix/kami/mixin/client/MixinNetHandlerPlayClient.java b/src/main/java/me/zeroeightsix/kami/mixin/client/MixinNetHandlerPlayClient.java index 28af156a1..fe470a655 100644 --- a/src/main/java/me/zeroeightsix/kami/mixin/client/MixinNetHandlerPlayClient.java +++ b/src/main/java/me/zeroeightsix/kami/mixin/client/MixinNetHandlerPlayClient.java @@ -1,5 +1,7 @@ package me.zeroeightsix.kami.mixin.client; +import me.zeroeightsix.kami.KamiMod; +import me.zeroeightsix.kami.event.events.ChunkEvent; import me.zeroeightsix.kami.module.modules.render.ChunkFinder; import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.network.play.server.SPacketChunkData; @@ -20,8 +22,7 @@ public class MixinNetHandlerPlayClient { at = @At(value = "INVOKE", target = "Lnet/minecraft/world/chunk/Chunk;read(Lnet/minecraft/network/PacketBuffer;IZ)V"), locals = LocalCapture.CAPTURE_FAILHARD) private void read(SPacketChunkData data, CallbackInfo info, Chunk chunk) { - if (!data.isFullChunk()) - ChunkFinder.newChunk(chunk); + KamiMod.EVENT_BUS.post(new ChunkEvent(chunk, data)); } } diff --git a/src/main/java/me/zeroeightsix/kami/module/modules/render/ChunkFinder.java b/src/main/java/me/zeroeightsix/kami/module/modules/render/ChunkFinder.java index 686f2a818..0a81e11f7 100644 --- a/src/main/java/me/zeroeightsix/kami/module/modules/render/ChunkFinder.java +++ b/src/main/java/me/zeroeightsix/kami/module/modules/render/ChunkFinder.java @@ -2,11 +2,11 @@ package me.zeroeightsix.kami.module.modules.render; import me.zero.alpine.listener.EventHandler; import me.zero.alpine.listener.Listener; +import me.zeroeightsix.kami.event.events.ChunkEvent; import me.zeroeightsix.kami.event.events.RenderEvent; import me.zeroeightsix.kami.module.Module; import me.zeroeightsix.kami.setting.Setting; import net.minecraft.world.chunk.Chunk; -import net.minecraftforge.event.world.ChunkEvent; import org.lwjgl.opengl.GL11; import java.util.ArrayList; @@ -68,21 +68,22 @@ public class ChunkFinder extends Module { } double x = mc.getRenderManager().renderPosX; - double y = relative ? 0 : mc.getRenderManager().renderPosY; + double y = relative ? 0 : -mc.getRenderManager().renderPosY; double z = mc.getRenderManager().renderPosZ; GL11.glTranslated(-x, y+yOffset, -z); GL11.glCallList(list); GL11.glTranslated(x, -(y+yOffset), z); } - public static void newChunk(Chunk chunk) { - chunks.add(chunk); - dirty = true; - } - @EventHandler - private Listener unloadListener = new Listener<>(event -> { - dirty = chunks.remove(event.getChunk()); + public Listener listener = new Listener<>(event -> { + if (!event.getPacket().isFullChunk()) { + chunks.add(event.getChunk()); + dirty = true; + } }); + @EventHandler + private Listener unloadListener = new Listener<>(event -> dirty = chunks.remove(event.getChunk())); + } diff --git a/src/main/java/me/zeroeightsix/kami/module/modules/render/PortalTracers.java b/src/main/java/me/zeroeightsix/kami/module/modules/render/PortalTracers.java index ae87a5d35..efe1ccbd3 100644 --- a/src/main/java/me/zeroeightsix/kami/module/modules/render/PortalTracers.java +++ b/src/main/java/me/zeroeightsix/kami/module/modules/render/PortalTracers.java @@ -2,14 +2,16 @@ package me.zeroeightsix.kami.module.modules.render; import me.zero.alpine.listener.EventHandler; import me.zero.alpine.listener.Listener; +import me.zeroeightsix.kami.event.events.ChunkEvent; import me.zeroeightsix.kami.event.events.RenderEvent; import me.zeroeightsix.kami.module.Module; import me.zeroeightsix.kami.setting.Setting; +import net.minecraft.block.BlockAir; import net.minecraft.block.BlockPortal; import net.minecraft.block.state.IBlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.chunk.Chunk; -import net.minecraftforge.event.world.ChunkEvent; +import net.minecraft.world.chunk.storage.ExtendedBlockStorage; import java.util.ArrayList; @@ -21,26 +23,27 @@ public class PortalTracers extends Module { @Setting(name = "Range") private int range = 5000; - ArrayList portals = new ArrayList<>(); + private ArrayList portals = new ArrayList<>(); @EventHandler - private Listener loadListener = new Listener<>(event -> { + private Listener loadListener = new Listener<>(event -> { Chunk chunk = event.getChunk(); - // Remove already registered portals from this chunk, allowing removed portals to vanish from tracers and no duplicates to be made portals.removeIf(blockPos -> blockPos.getX()/16 == chunk.x && blockPos.getZ()/16 == chunk.z); - for (int x = 0; x < 16; x++) { - for (int y = 0; y < 256; y++) { - for (int z = 0; z < 16; z++) { - IBlockState blockState = chunk.getBlockState(x, y, z); - if (blockState.getBlock() instanceof BlockPortal){ - int px = chunk.x*16 + x; - int py = y; - int pz = chunk.z*16 + z; - - portals.add(new BlockPos(px, py, pz)); - y+=6; // Skip a few y-layers because we're cool (non performance-heavy way of avoiding multiple lines to the same portal, and i'm just lazy) + for (ExtendedBlockStorage storage : chunk.getBlockStorageArray()) { + if (storage != null) { + for (int x = 0; x < 16; x++) { + for (int y = 0; y < 16; y++) { + for (int z = 0; z < 16; z++) { + if (storage.get(x, y, z).getBlock() instanceof BlockPortal) { + int px = chunk.x * 16 + x; + int py = storage.yBase + y; + int pz = chunk.z * 16 + z; + portals.add(new BlockPos(px, py, pz)); + y+=6; + } + } } } }