From 7eb4339a1b60157ce577e39a34490ac7208c1d31 Mon Sep 17 00:00:00 2001 From: tom lee Date: Wed, 9 Feb 2022 19:04:39 +0800 Subject: [PATCH] Update everything up to latest state --- .../wrappers/chunk/ChunkPosWrapper.java | 6 +- .../common/wrappers/chunk/ChunkWrapper.java | 6 +- .../BatchGenerationEnvironment.java | 11 ++-- .../worldGeneration/GenerationEvent.java | 4 +- .../worldGeneration/ThreadedParameters.java | 6 +- .../WorldGeneratorWrapper.java | 2 +- .../mimicObject/LightedWorldGenRegion.java | 7 +++ .../WorldGenStructFeatManager.java | 4 ++ .../worldGeneration/step/StepFeatures.java | 38 ++----------- core | 2 +- .../com/seibel/lod/fabric/ClientProxy.java | 56 +++++++++++-------- .../fabric/mixins/MixinChunkGenerator.java | 29 ++++++++++ .../seibel/lod/forge/ForgeClientProxy.java | 10 +++- .../lod/forge/mixins/MixinChunkGenerator.java | 29 ++++++++++ 14 files changed, 137 insertions(+), 73 deletions(-) create mode 100644 fabric/src/main/java/com/seibel/lod/fabric/mixins/MixinChunkGenerator.java create mode 100644 forge/src/main/java/com/seibel/lod/forge/mixins/MixinChunkGenerator.java diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/chunk/ChunkPosWrapper.java b/common/src/main/java/com/seibel/lod/common/wrappers/chunk/ChunkPosWrapper.java index 7fad568f5..a38216f8b 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/chunk/ChunkPosWrapper.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/chunk/ChunkPosWrapper.java @@ -2,6 +2,8 @@ package com.seibel.lod.common.wrappers.chunk; import java.util.Objects; +import com.seibel.lod.core.util.LevelPosUtil; +import com.seibel.lod.core.util.LodUtil; import com.seibel.lod.core.wrapperInterfaces.block.AbstractBlockPosWrapper; import com.seibel.lod.core.wrapperInterfaces.chunk.AbstractChunkPosWrapper; import com.seibel.lod.common.wrappers.block.BlockPosWrapper; @@ -84,13 +86,13 @@ public class ChunkPosWrapper extends AbstractChunkPosWrapper @Override public int getRegionX() { - return chunkPos.getRegionX(); + return LevelPosUtil.convert(LodUtil.CHUNK_DETAIL_LEVEL, chunkPos.x, LodUtil.REGION_DETAIL_LEVEL); } @Override public int getRegionZ() { - return chunkPos.getRegionZ(); + return LevelPosUtil.convert(LodUtil.CHUNK_DETAIL_LEVEL, chunkPos.z, LodUtil.REGION_DETAIL_LEVEL); } public ChunkPos getChunkPos() diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/chunk/ChunkWrapper.java b/common/src/main/java/com/seibel/lod/common/wrappers/chunk/ChunkWrapper.java index d88f09c17..b3c6c20bf 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/chunk/ChunkWrapper.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/chunk/ChunkWrapper.java @@ -1,5 +1,7 @@ package com.seibel.lod.common.wrappers.chunk; +import com.seibel.lod.core.util.LevelPosUtil; +import com.seibel.lod.core.util.LodUtil; import com.seibel.lod.core.wrapperInterfaces.block.IBlockColorWrapper; import com.seibel.lod.core.wrapperInterfaces.block.IBlockShapeWrapper; import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper; @@ -106,12 +108,12 @@ public class ChunkWrapper implements IChunkWrapper @Override public int getRegionPosX(){ - return chunk.getPos().getRegionX(); + return LevelPosUtil.convert(LodUtil.CHUNK_DETAIL_LEVEL, getChunkPosX(), LodUtil.REGION_DETAIL_LEVEL); } @Override public int getRegionPosZ(){ - return chunk.getPos().getRegionZ(); + return LevelPosUtil.convert(LodUtil.CHUNK_DETAIL_LEVEL, getChunkPosZ(), LodUtil.REGION_DETAIL_LEVEL); } @Override diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/BatchGenerationEnvironment.java b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/BatchGenerationEnvironment.java index 0a44aaeb2..498a454af 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/BatchGenerationEnvironment.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/BatchGenerationEnvironment.java @@ -229,7 +229,7 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv new LodThreadFactory("Gen-Worker-Thread", Thread.MIN_PRIORITY)); } - public boolean tryAddPoint(int px, int pz, int range, Steps target) + public boolean tryAddPoint(int px, int pz, int range, Steps target, boolean genAllDetails) { int boxSize = range * 2 + 1; int x = Math.floorDiv(px, boxSize) * boxSize + range; @@ -241,7 +241,7 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv return false; } // System.out.println(x + ", "+z); - events.add(new GenerationEvent(new ChunkPos(x, z), range, this, target)); + events.add(new GenerationEvent(new ChunkPos(x, z), range, this, target, genAllDetails)); return true; } @@ -380,6 +380,7 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv e.refreshTimeout(); region = new LightedWorldGenRegion(params.level, lightEngine, e.tParam.structFeat, chunks, ChunkStatus.STRUCTURE_STARTS, rangeEmpty, e.lightMode, generator); adaptor.setRegion(region); + e.tParam.makeStructFeat(region); referencedChunks = chunks.subGrid(e.range); referencedChunks = generateDirect(e, referencedChunks, e.target, region); @@ -432,17 +433,17 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv if (ENABLE_LOAD_EVENT_LOGGING) ClientApi.LOGGER.info("Detected full existing chunk at {}", target.getPos()); params.lodBuilder.generateLodNodeFromChunk(params.lodDim, new ChunkWrapper(target, region), - new LodBuilderConfig(DistanceGenerationMode.FULL), true); + new LodBuilderConfig(DistanceGenerationMode.FULL), true, e.genAllDetails); } else if (target.getStatus() == ChunkStatus.EMPTY && generationMode == DistanceGenerationMode.NONE) { params.lodBuilder.generateLodNodeFromChunk(params.lodDim, new ChunkWrapper(target, region), - LodBuilderConfig.getFillVoidConfig(), true); + LodBuilderConfig.getFillVoidConfig(), true, e.genAllDetails); } else { params.lodBuilder.generateLodNodeFromChunk(params.lodDim, new ChunkWrapper(target, region), - new LodBuilderConfig(generationMode), true); + new LodBuilderConfig(generationMode), true, e.genAllDetails); } if (e.lightMode == LightGenerationMode.FANCY || isFull) { diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/GenerationEvent.java b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/GenerationEvent.java index d0f95a01f..c65c8726a 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/GenerationEvent.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/GenerationEvent.java @@ -29,8 +29,9 @@ public final class GenerationEvent final Steps target; final LightGenerationMode lightMode; final PrefEvent pEvent = new PrefEvent(); + final boolean genAllDetails; - public GenerationEvent(ChunkPos pos, int range, BatchGenerationEnvironment generationGroup, Steps target) + public GenerationEvent(ChunkPos pos, int range, BatchGenerationEnvironment generationGroup, Steps target, boolean genAllDetails) { nanotime = System.nanoTime(); this.pos = pos; @@ -41,6 +42,7 @@ public final class GenerationEvent LightGenerationMode mode = CONFIG.client().worldGenerator().getLightGenerationMode(); this.lightMode = mode; + this.genAllDetails = genAllDetails; future = generationGroup.executors.submit(() -> { diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/ThreadedParameters.java b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/ThreadedParameters.java index c33398ce9..f641a5bc0 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/ThreadedParameters.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/ThreadedParameters.java @@ -12,7 +12,7 @@ public final class ThreadedParameters { private static final ThreadLocal localParam = new ThreadLocal(); final ServerLevel level; - public WorldGenStructFeatManager structFeat; + public final WorldGenStructFeatManager structFeat; boolean isValid = true; public final PerfCalculator perf = new PerfCalculator(); @@ -37,8 +37,8 @@ public final class ThreadedParameters structFeat = new WorldGenStructFeatManager(level, param.worldGenSettings, null); } - public void makeStructFeat(WorldGenLevel genLevel, WorldGenSettings worldGenSettings) + public void makeStructFeat(WorldGenLevel genLevel) { - structFeat = new WorldGenStructFeatManager(level, worldGenSettings, genLevel); + structFeat.setGenLevel(genLevel); } } \ No newline at end of file diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/WorldGeneratorWrapper.java b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/WorldGeneratorWrapper.java index 6a502b1bd..4fffffe76 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/WorldGeneratorWrapper.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/WorldGeneratorWrapper.java @@ -109,7 +109,7 @@ public class WorldGeneratorWrapper extends AbstractWorldGeneratorWrapper ChunkAccess ca = serverWorld.getChunkSource().getChunk(chunkX, chunkZ, targetStatus, true); if (ca == null) throw new RuntimeException("This should NEVER be null due to bool being true"); - lodBuilder.generateLodNodeFromChunk(lodDim, new ChunkWrapper(ca, serverWorld), new LodBuilderConfig(generationMode), false); + lodBuilder.generateLodNodeFromChunk(lodDim, new ChunkWrapper(ca, serverWorld), new LodBuilderConfig(generationMode), false, true); // long duration = System.nanoTime()-t; diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/mimicObject/LightedWorldGenRegion.java b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/mimicObject/LightedWorldGenRegion.java index 5be286eba..921f09dde 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/mimicObject/LightedWorldGenRegion.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/mimicObject/LightedWorldGenRegion.java @@ -41,6 +41,13 @@ public class LightedWorldGenRegion extends WorldGenRegion { private final List cache; private final StructureFeatureManager structFeat; Long2ObjectOpenHashMap chunkMap = new Long2ObjectOpenHashMap(); + private ChunkPos overrideCenterPos = null; + + public void setOverrideCenter(ChunkPos pos) {overrideCenterPos = pos;} + @Override + public ChunkPos getCenter() { + return overrideCenterPos==null ? super.getCenter() : overrideCenterPos; + } public LightedWorldGenRegion(ServerLevel serverLevel, WorldGenLevelLightEngine lightEngine, StructureFeatureManager structFeat, List list, ChunkStatus chunkStatus, int i, diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/mimicObject/WorldGenStructFeatManager.java b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/mimicObject/WorldGenStructFeatManager.java index 2e9deb4f5..1be8dfc4b 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/mimicObject/WorldGenStructFeatManager.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/mimicObject/WorldGenStructFeatManager.java @@ -23,6 +23,10 @@ public class WorldGenStructFeatManager extends StructureFeatureManager { this.genLevel = genLevel; this.worldGenSettings = worldGenSettings; } + + public void setGenLevel(WorldGenLevel genLevel) { + this.genLevel = genLevel; + } @Override public WorldGenStructFeatManager forWorldGenRegion(WorldGenRegion worldGenRegion) { diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/step/StepFeatures.java b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/step/StepFeatures.java index 24f571d7d..0383c3b21 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/step/StepFeatures.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/step/StepFeatures.java @@ -3,20 +3,14 @@ package com.seibel.lod.common.wrappers.worldGeneration.step; import java.util.ArrayList; import com.seibel.lod.common.wrappers.worldGeneration.ThreadedParameters; +import com.seibel.lod.common.wrappers.worldGeneration.mimicObject.LightedWorldGenRegion; import com.seibel.lod.common.wrappers.worldGeneration.BatchGenerationEnvironment; import com.seibel.lod.core.util.GridList; -import net.minecraft.CrashReport; import net.minecraft.ReportedException; -import net.minecraft.core.BlockPos; -import net.minecraft.server.level.WorldGenRegion; -import net.minecraft.world.level.StructureFeatureManager; -import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.ProtoChunk; -import net.minecraft.world.level.levelgen.WorldgenRandom; public final class StepFeatures { /** @@ -33,31 +27,7 @@ public final class StepFeatures { public final ChunkStatus STATUS = ChunkStatus.FEATURES; - public void applyBiomeDecoration(ChunkGenerator generator, WorldGenRegion worldGenRegion, - StructureFeatureManager structureFeatureManager, ChunkAccess chunk) { - int i = chunk.getPos().x; - int j = chunk.getPos().z; - int k = i * 16; - int l = j * 16; - BlockPos blockPos = new BlockPos(k, 0, l); - Biome biome = generator.biomeSource.getNoiseBiome((i << 2) + 2, 2, (j << 2) + 2); - WorldgenRandom worldgenRandom = new WorldgenRandom(); - long m = worldgenRandom.setDecorationSeed(worldGenRegion.getSeed(), k, l); - try { - synchronized (generator) { - biome.generate(structureFeatureManager, generator, worldGenRegion, m, worldgenRandom, blockPos); - } - } catch (Exception exception) { - CrashReport crashReport = CrashReport.forThrowable(exception, "Biome decoration"); - crashReport.addCategory("Generation") - - .setDetail("CenterX", Integer.valueOf(i)).setDetail("CenterZ", Integer.valueOf(j)) - .setDetail("Seed", Long.valueOf(m)).setDetail("Biome", biome); - throw new ReportedException(crashReport); - } - } - - public void generateGroup(ThreadedParameters tParams, WorldGenRegion worldGenRegion, GridList chunks) { + public void generateGroup(ThreadedParameters tParams, LightedWorldGenRegion worldGenRegion, GridList chunks) { ArrayList chunksToDo = new ArrayList(); for (ChunkAccess chunk : chunks) { @@ -69,10 +39,12 @@ public final class StepFeatures { for (ChunkAccess chunk : chunksToDo) { try { - applyBiomeDecoration(envionment.params.generator, worldGenRegion, tParams.structFeat, chunk); + worldGenRegion.setOverrideCenter(chunk.getPos()); + envionment.params.generator.applyBiomeDecoration(worldGenRegion, tParams.structFeat); } catch (ReportedException e) { e.printStackTrace(); } } + worldGenRegion.setOverrideCenter(null); } } \ No newline at end of file diff --git a/core b/core index 09b2d952b..cbcb7ca6a 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 09b2d952b62295b716514f212330ba625ac3929a +Subproject commit cbcb7ca6ac6bce3c237a3ca0283d29228dacd0f0 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 1b165bc5c..94f5ba581 100644 --- a/fabric/src/main/java/com/seibel/lod/fabric/ClientProxy.java +++ b/fabric/src/main/java/com/seibel/lod/fabric/ClientProxy.java @@ -21,6 +21,7 @@ package com.seibel.lod.fabric; import com.seibel.lod.core.api.ClientApi; import com.seibel.lod.core.api.EventApi; +import com.mojang.blaze3d.platform.InputConstants; import com.seibel.lod.common.wrappers.chunk.ChunkWrapper; import com.seibel.lod.common.wrappers.world.DimensionTypeWrapper; import com.seibel.lod.common.wrappers.world.WorldWrapper; @@ -31,15 +32,17 @@ import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton; 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; 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.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.server.MinecraftServer; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.chunk.LevelChunk; + +import java.util.HashSet; + import org.lwjgl.glfw.GLFW; /** @@ -148,30 +151,39 @@ public class ClientProxy eventApi.blockChangeEvent(chunk, dimType); } - - - // The debug mode keybinding, which will be registered - public static final KeyMapping DebugToggle = KeyBindingHelper.registerKeyBinding( - new KeyMapping("key.lod.DebugToggle", GLFW.GLFW_KEY_F8, "key.lod.category")); - - // The draw toggle keybinding, which will be registered - public static final KeyMapping DrawToggle = KeyBindingHelper.registerKeyBinding( - new KeyMapping("key.lod.DrawToggle", GLFW.GLFW_KEY_F6, "key.lod.category")); - - boolean PreDebugToggle = false; - boolean PreDrawToggle = false; + private static final int[] KEY_TO_CHECK_FOR = {GLFW.GLFW_KEY_F6, GLFW.GLFW_KEY_F8}; + + HashSet previousKeyDown = new HashSet(); + public void onKeyInput() { ILodConfigWrapperSingleton CONFIG = SingletonHandler.get(ILodConfigWrapperSingleton.class); if (CONFIG.client().advanced().debugging().getDebugKeybindingsEnabled()) { - // Only activates when you press the key - if (DebugToggle.isDown() && DebugToggle.isDown() != PreDebugToggle) - CONFIG.client().advanced().debugging().setDebugMode(CONFIG.client().advanced().debugging().getDebugMode().getNext()); - - if (DrawToggle.isDown() && DrawToggle.isDown() != PreDebugToggle) - CONFIG.client().advanced().debugging().setDrawLods(!CONFIG.client().advanced().debugging().getDrawLods()); + HashSet currectKeyDown = new HashSet(); + + // Note: Minecraft's InputConstants is same as GLFW Key values + //TODO: Use mixin to hook directly into the GLFW Keyboard event in minecraft KeyboardHandler + // Check all keys we need + for (int i = GLFW.GLFW_KEY_A; i <= GLFW.GLFW_KEY_Z; i++) { + if (InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), i)) { + currectKeyDown.add(i); + } + } + for (int i : KEY_TO_CHECK_FOR) { + if (InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), i)) { + currectKeyDown.add(i); + } + } + + // Diff and trigger events + for (int c : currectKeyDown) { + if (!previousKeyDown.contains(c)) { + ClientApi.INSTANCE.keyPressedEvent(c); + } + } + + // Update the set + previousKeyDown = currectKeyDown; } - PreDebugToggle = DebugToggle.isDown(); - PreDrawToggle = DrawToggle.isDown(); } } diff --git a/fabric/src/main/java/com/seibel/lod/fabric/mixins/MixinChunkGenerator.java b/fabric/src/main/java/com/seibel/lod/fabric/mixins/MixinChunkGenerator.java new file mode 100644 index 000000000..3a6cd79be --- /dev/null +++ b/fabric/src/main/java/com/seibel/lod/fabric/mixins/MixinChunkGenerator.java @@ -0,0 +1,29 @@ +package com.seibel.lod.fabric.mixins; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.WorldGenRegion; +import net.minecraft.world.level.StructureFeatureManager; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.WorldgenRandom; + +@Mixin(ChunkGenerator.class) +public class MixinChunkGenerator { + @Redirect(method = "applyBiomeDecoration", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/level/biome/Biome;generate(Lnet/minecraft/world/level/StructureFeatureManager;" + + "Lnet/minecraft/world/level/chunk/ChunkGenerator;Lnet/minecraft/server/level/WorldGenRegion;J" + + "Lnet/minecraft/world/level/levelgen/WorldgenRandom;Lnet/minecraft/core/BlockPos;)V" + + )) + private void wrapBiomeGenerateCall(Biome biome, StructureFeatureManager structFeatManager, ChunkGenerator generator, + WorldGenRegion genRegion, long l, WorldgenRandom random, BlockPos pos) { + synchronized((ChunkGenerator)(Object)this) { + biome.generate(structFeatManager, (ChunkGenerator)(Object)this, genRegion, l, random, pos); + } + } +} diff --git a/forge/src/main/java/com/seibel/lod/forge/ForgeClientProxy.java b/forge/src/main/java/com/seibel/lod/forge/ForgeClientProxy.java index 19799aed7..d2b28bdfc 100644 --- a/forge/src/main/java/com/seibel/lod/forge/ForgeClientProxy.java +++ b/forge/src/main/java/com/seibel/lod/forge/ForgeClientProxy.java @@ -22,10 +22,14 @@ package com.seibel.lod.forge; import com.seibel.lod.core.api.ClientApi; import com.seibel.lod.core.api.EventApi; import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper; + +import org.lwjgl.glfw.GLFW; + 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 net.minecraft.client.Minecraft; import net.minecraftforge.client.event.InputEvent; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.world.BlockEvent; @@ -102,9 +106,9 @@ public class ForgeClientProxy @SubscribeEvent public void onKeyInput(InputEvent.KeyInputEvent event) { - eventApi.onKeyInput(event.getKey(), event.getAction()); + if (Minecraft.getInstance().player == null) return; + if (event.getAction() != GLFW.GLFW_PRESS) return; + clientApi.keyPressedEvent(event.getKey()); } - - } diff --git a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinChunkGenerator.java b/forge/src/main/java/com/seibel/lod/forge/mixins/MixinChunkGenerator.java new file mode 100644 index 000000000..dc49fa937 --- /dev/null +++ b/forge/src/main/java/com/seibel/lod/forge/mixins/MixinChunkGenerator.java @@ -0,0 +1,29 @@ +package com.seibel.lod.forge.mixins; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.WorldGenRegion; +import net.minecraft.world.level.StructureFeatureManager; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.WorldgenRandom; + +@Mixin(ChunkGenerator.class) +public class MixinChunkGenerator { + @Redirect(method = "applyBiomeDecoration", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/level/biome/Biome;generate(Lnet/minecraft/world/level/StructureFeatureManager;" + + "Lnet/minecraft/world/level/chunk/ChunkGenerator;Lnet/minecraft/server/level/WorldGenRegion;J" + + "Lnet/minecraft/world/level/levelgen/WorldgenRandom;Lnet/minecraft/core/BlockPos;)V" + + )) + private void wrapBiomeGenerateCall(Biome biome, StructureFeatureManager structFeatManager, ChunkGenerator generator, + WorldGenRegion genRegion, long l, WorldgenRandom random, BlockPos pos) { + synchronized((ChunkGenerator)(Object)this) { + biome.generate(structFeatManager, (ChunkGenerator)(Object)this, genRegion, l, random, pos); + } + } +}