From 762df55c1d95c7403370fd1251ddfdee95bae279 Mon Sep 17 00:00:00 2001 From: flogic Date: Sun, 1 Nov 2020 15:10:14 -0700 Subject: [PATCH] Fix animations playing multiple times (finally) --- .../client/config/SmoothChunksConfig.java | 2 +- .../client/handler/ChunkAnimationHandler.java | 8 ++++++ .../smoothchunks/mixin/BuiltChunkMixin.java | 28 +++++++++++++++++++ ...uilderMixin.java => RebuildTaskMixin.java} | 3 +- src/main/resources/smooth-chunks.mixins.json | 3 +- 5 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 src/main/java/cc/flogi/dev/smoothchunks/mixin/BuiltChunkMixin.java rename src/main/java/cc/flogi/dev/smoothchunks/mixin/{ChunkBuilderMixin.java => RebuildTaskMixin.java} (92%) diff --git a/src/main/java/cc/flogi/dev/smoothchunks/client/config/SmoothChunksConfig.java b/src/main/java/cc/flogi/dev/smoothchunks/client/config/SmoothChunksConfig.java index d4c6958..1e7495e 100644 --- a/src/main/java/cc/flogi/dev/smoothchunks/client/config/SmoothChunksConfig.java +++ b/src/main/java/cc/flogi/dev/smoothchunks/client/config/SmoothChunksConfig.java @@ -13,7 +13,7 @@ import me.sargunvohra.mcmods.autoconfig1u.shadowed.blue.endless.jankson.Comment; */ @Config(name = "smooth-chunks") @Config.Gui.Background("minecraft:textures/block/stone.png") @Getter public class SmoothChunksConfig implements ConfigData { - //TODO use localization for comment strings. + //TODO use localization for comment strings. (Somehow, not super straightforward bc annotations need const value) @Comment("Duration of the animation in seconds.") double duration = 1; diff --git a/src/main/java/cc/flogi/dev/smoothchunks/client/handler/ChunkAnimationHandler.java b/src/main/java/cc/flogi/dev/smoothchunks/client/handler/ChunkAnimationHandler.java index b86d4d8..7d9bebd 100644 --- a/src/main/java/cc/flogi/dev/smoothchunks/client/handler/ChunkAnimationHandler.java +++ b/src/main/java/cc/flogi/dev/smoothchunks/client/handler/ChunkAnimationHandler.java @@ -6,6 +6,7 @@ import cc.flogi.dev.smoothchunks.client.config.SmoothChunksConfig; import cc.flogi.dev.smoothchunks.util.UtilEasing; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.Getter; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.chunk.ChunkBuilder; import net.minecraft.client.util.math.MatrixStack; @@ -13,6 +14,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3i; +import java.util.ArrayList; +import java.util.List; import java.util.WeakHashMap; /** @@ -23,10 +26,15 @@ import java.util.WeakHashMap; public final class ChunkAnimationHandler { private static final ChunkAnimationHandler instance = new ChunkAnimationHandler(); private final WeakHashMap animations = new WeakHashMap<>(); + @Getter private final List loadedChunks = new ArrayList<>(); public static ChunkAnimationHandler get() {return instance;} public void addChunk(ChunkBuilder.BuiltChunk chunk) { + Vec3i origin = chunk.getOrigin(); + if (loadedChunks.contains(origin)) return; + loadedChunks.add(origin); + Direction direction = null; if (SmoothChunksClient.get().getConfig().getLoadAnimation() == LoadAnimation.INWARD diff --git a/src/main/java/cc/flogi/dev/smoothchunks/mixin/BuiltChunkMixin.java b/src/main/java/cc/flogi/dev/smoothchunks/mixin/BuiltChunkMixin.java new file mode 100644 index 0000000..696e611 --- /dev/null +++ b/src/main/java/cc/flogi/dev/smoothchunks/mixin/BuiltChunkMixin.java @@ -0,0 +1,28 @@ +package cc.flogi.dev.smoothchunks.mixin; + +import cc.flogi.dev.smoothchunks.client.handler.ChunkAnimationHandler; +import net.minecraft.client.render.chunk.ChunkBuilder; +import net.minecraft.util.math.BlockPos; +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; + +/** + * @author Caden Kriese (flogic) + * + * Created on 11/01/2020 + */ +@Mixin(ChunkBuilder.BuiltChunk.class) +public abstract class BuiltChunkMixin { + @Shadow public abstract BlockPos getOrigin(); + + @Inject( + method = "clear", + at = @At(value = "TAIL") + ) + public void onDelete(CallbackInfo ci) { + ChunkAnimationHandler.get().getLoadedChunks().remove(getOrigin()); + } +} diff --git a/src/main/java/cc/flogi/dev/smoothchunks/mixin/ChunkBuilderMixin.java b/src/main/java/cc/flogi/dev/smoothchunks/mixin/RebuildTaskMixin.java similarity index 92% rename from src/main/java/cc/flogi/dev/smoothchunks/mixin/ChunkBuilderMixin.java rename to src/main/java/cc/flogi/dev/smoothchunks/mixin/RebuildTaskMixin.java index cbc7d09..1e43800 100644 --- a/src/main/java/cc/flogi/dev/smoothchunks/mixin/ChunkBuilderMixin.java +++ b/src/main/java/cc/flogi/dev/smoothchunks/mixin/RebuildTaskMixin.java @@ -1,6 +1,7 @@ package cc.flogi.dev.smoothchunks.mixin; import cc.flogi.dev.smoothchunks.client.handler.ChunkAnimationHandler; +import net.minecraft.client.render.WorldRenderer; import net.minecraft.client.render.chunk.BlockBufferBuilderStorage; import net.minecraft.client.render.chunk.ChunkBuilder; import org.spongepowered.asm.mixin.Mixin; @@ -17,7 +18,7 @@ import java.util.concurrent.CompletableFuture; * Created on 10/07/2020 */ @SuppressWarnings("rawtypes") @Mixin(ChunkBuilder.BuiltChunk.RebuildTask.class) -public abstract class ChunkBuilderMixin { +public abstract class RebuildTaskMixin { //Parent class @SuppressWarnings("ShadowTarget") @Shadow private ChunkBuilder.BuiltChunk field_20839; diff --git a/src/main/resources/smooth-chunks.mixins.json b/src/main/resources/smooth-chunks.mixins.json index e8a09f3..d7e2079 100644 --- a/src/main/resources/smooth-chunks.mixins.json +++ b/src/main/resources/smooth-chunks.mixins.json @@ -5,7 +5,8 @@ "compatibilityLevel": "JAVA_8", "mixins": [], "client": [ - "ChunkBuilderMixin", + "BuiltChunkMixin", + "RebuildTaskMixin", "WorldRendererMixin" ], "injectors": {