diff --git a/fabric/src/main/java/com/seibel/lod/fabric/ClientProxy.java b/fabric/src/main/java/com/seibel/lod/fabric/ClientProxy.java index e27cf37a9..73ccb4a99 100644 --- a/fabric/src/main/java/com/seibel/lod/fabric/ClientProxy.java +++ b/fabric/src/main/java/com/seibel/lod/fabric/ClientProxy.java @@ -25,6 +25,7 @@ import com.seibel.lod.common.wrappers.chunk.ChunkWrapper; import com.seibel.lod.common.wrappers.world.DimensionTypeWrapper; import com.seibel.lod.common.wrappers.world.WorldWrapper; +import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientChunkEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; @@ -32,6 +33,7 @@ import net.fabricmc.fabric.api.event.lifecycle.v1.ServerChunkEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; import net.minecraft.client.KeyMapping; +import net.minecraft.core.BlockPos; import net.minecraft.server.MinecraftServer; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; @@ -109,24 +111,33 @@ public class ClientProxy eventApi.worldUnloadEvent(); } - /* - public void blockChangeEvent(BlockEventData event) - { - // we only care about certain block events - if (event.getClass() == BlockEventData.BreakEvent.class || - event.getClass() == BlockEventData.EntityPlaceEvent.class || - event.getClass() == BlockEventData.EntityMultiPlaceEvent.class || - event.getClass() == BlockEventData.FluidPlaceBlockEvent.class || - event.getClass() == BlockEventData.PortalSpawnEvent.class) - { - IChunkWrapper chunk = new ChunkWrapper(event.getWorld().getChunk(event.getPos())); - DimensionTypeWrapper dimType = DimensionTypeWrapper.getDimensionTypeWrapper(event.getWorld().dimensionType()); - - // recreate the LOD where the blocks were changed - eventApi.blockChangeEvent(chunk, dimType); - } + /** + * Can someone tell me how to make this better + * @author Ran + * + * public void blockChangeEvent(BlockEventData event) { + * // we only care about certain block events + * if (event.getClass() == BlockEventData.BreakEvent.class || + * event.getClass() == BlockEventData.EntityPlaceEvent.class || + * event.getClass() == BlockEventData.EntityMultiPlaceEvent.class || + * event.getClass() == BlockEventData.FluidPlaceBlockEvent.class || + * event.getClass() == BlockEventData.PortalSpawnEvent.class) + * { + * IChunkWrapper chunk = new ChunkWrapper(event.getWorld().getChunk(event.getPos())); + * DimensionTypeWrapper dimType = DimensionTypeWrapper.getDimensionTypeWrapper(event.getWorld().dimensionType()); + * + * // recreate the LOD where the blocks were changed + * eventApi.blockChangeEvent(chunk, dimType); + * } + * } + */ + public void blockChangeEvent(LevelAccessor world, BlockPos pos) { + IChunkWrapper chunk = new ChunkWrapper(world.getChunk(pos)); + DimensionTypeWrapper dimType = DimensionTypeWrapper.getDimensionTypeWrapper(world.dimensionType()); + + // recreate the LOD where the blocks were changed + eventApi.blockChangeEvent(chunk, dimType); } - */ diff --git a/fabric/src/main/java/com/seibel/lod/fabric/mixins/events/MixinBlockUpdate.java b/fabric/src/main/java/com/seibel/lod/fabric/mixins/events/MixinBlockUpdate.java new file mode 100644 index 000000000..49b97f1fb --- /dev/null +++ b/fabric/src/main/java/com/seibel/lod/fabric/mixins/events/MixinBlockUpdate.java @@ -0,0 +1,27 @@ +package com.seibel.lod.fabric.mixins.events; + +import com.seibel.lod.fabric.Main; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket; +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; + +/** + * If someone has a better way to do this then please let me know. + * + * @author Ran + */ +@Mixin(ClientboundBlockUpdatePacket.class) +public abstract class MixinBlockUpdate { + @Shadow public abstract BlockPos getPos(); + + @Inject(method = "handle(Lnet/minecraft/network/protocol/game/ClientGamePacketListener;)V", at = @At("TAIL")) + private void onBlockUpdate(ClientGamePacketListener clientGamePacketListener, CallbackInfo ci) { + Main.client_proxy.blockChangeEvent(Minecraft.getInstance().player.clientLevel, this.getPos()); + } +} diff --git a/fabric/src/main/resources/lod.mixins.json b/fabric/src/main/resources/lod.mixins.json index b71c0db38..580161ae5 100644 --- a/fabric/src/main/resources/lod.mixins.json +++ b/fabric/src/main/resources/lod.mixins.json @@ -12,7 +12,8 @@ "MixinOptionsScreen", "MixinWorldRenderer", "events.MixinClientLevel", - "events.MixinMinecraft" + "events.MixinMinecraft", + "events.MixinBlockUpdate" ], "server": [], "injectors": {