Fix animations playing multiple times (finally)

This commit is contained in:
flogic 2020-11-01 15:10:14 -07:00
parent 6a39205ac6
commit 762df55c1d
No known key found for this signature in database
GPG Key ID: AD25E4DF29DECD31
5 changed files with 41 additions and 3 deletions

View File

@ -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 @Config(name = "smooth-chunks") @Config.Gui.Background("minecraft:textures/block/stone.png") @Getter
public class SmoothChunksConfig implements ConfigData { 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.") @Comment("Duration of the animation in seconds.")
double duration = 1; double duration = 1;

View File

@ -6,6 +6,7 @@ import cc.flogi.dev.smoothchunks.client.config.SmoothChunksConfig;
import cc.flogi.dev.smoothchunks.util.UtilEasing; import cc.flogi.dev.smoothchunks.util.UtilEasing;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.Getter;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.chunk.ChunkBuilder; import net.minecraft.client.render.chunk.ChunkBuilder;
import net.minecraft.client.util.math.MatrixStack; 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.Direction;
import net.minecraft.util.math.Vec3i; import net.minecraft.util.math.Vec3i;
import java.util.ArrayList;
import java.util.List;
import java.util.WeakHashMap; import java.util.WeakHashMap;
/** /**
@ -23,10 +26,15 @@ import java.util.WeakHashMap;
public final class ChunkAnimationHandler { public final class ChunkAnimationHandler {
private static final ChunkAnimationHandler instance = new ChunkAnimationHandler(); private static final ChunkAnimationHandler instance = new ChunkAnimationHandler();
private final WeakHashMap<ChunkBuilder.BuiltChunk, AnimationController> animations = new WeakHashMap<>(); private final WeakHashMap<ChunkBuilder.BuiltChunk, AnimationController> animations = new WeakHashMap<>();
@Getter private final List<Vec3i> loadedChunks = new ArrayList<>();
public static ChunkAnimationHandler get() {return instance;} public static ChunkAnimationHandler get() {return instance;}
public void addChunk(ChunkBuilder.BuiltChunk chunk) { public void addChunk(ChunkBuilder.BuiltChunk chunk) {
Vec3i origin = chunk.getOrigin();
if (loadedChunks.contains(origin)) return;
loadedChunks.add(origin);
Direction direction = null; Direction direction = null;
if (SmoothChunksClient.get().getConfig().getLoadAnimation() == LoadAnimation.INWARD if (SmoothChunksClient.get().getConfig().getLoadAnimation() == LoadAnimation.INWARD

View File

@ -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());
}
}

View File

@ -1,6 +1,7 @@
package cc.flogi.dev.smoothchunks.mixin; package cc.flogi.dev.smoothchunks.mixin;
import cc.flogi.dev.smoothchunks.client.handler.ChunkAnimationHandler; 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.BlockBufferBuilderStorage;
import net.minecraft.client.render.chunk.ChunkBuilder; import net.minecraft.client.render.chunk.ChunkBuilder;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@ -17,7 +18,7 @@ import java.util.concurrent.CompletableFuture;
* Created on 10/07/2020 * Created on 10/07/2020
*/ */
@SuppressWarnings("rawtypes") @Mixin(ChunkBuilder.BuiltChunk.RebuildTask.class) @SuppressWarnings("rawtypes") @Mixin(ChunkBuilder.BuiltChunk.RebuildTask.class)
public abstract class ChunkBuilderMixin { public abstract class RebuildTaskMixin {
//Parent class //Parent class
@SuppressWarnings("ShadowTarget") @Shadow private ChunkBuilder.BuiltChunk field_20839; @SuppressWarnings("ShadowTarget") @Shadow private ChunkBuilder.BuiltChunk field_20839;

View File

@ -5,7 +5,8 @@
"compatibilityLevel": "JAVA_8", "compatibilityLevel": "JAVA_8",
"mixins": [], "mixins": [],
"client": [ "client": [
"ChunkBuilderMixin", "BuiltChunkMixin",
"RebuildTaskMixin",
"WorldRendererMixin" "WorldRendererMixin"
], ],
"injectors": { "injectors": {