diff --git a/src/main/java/eu/mhsl/minecraft/endlessjumper/generator/BlockTransition.java b/src/main/java/eu/mhsl/minecraft/endlessjumper/generator/BlockTransition.java index 3ea5072..6bbfdbf 100644 --- a/src/main/java/eu/mhsl/minecraft/endlessjumper/generator/BlockTransition.java +++ b/src/main/java/eu/mhsl/minecraft/endlessjumper/generator/BlockTransition.java @@ -18,6 +18,10 @@ public class BlockTransition { /** Zeit vom Start bis der echte Block steht (Spawn-Vorlauf + Animation + Puffer). */ public static final int TOTAL_TICKS = DURATION_TICKS + 3; private static final double START_SCALE = 0.3; + // minimal kleiner als der Block: sobald der echte Block steht, verdeckt er das Display ohne Z-Fighting + private static final double END_SCALE = 0.998; + // der Client braucht nach dem Setzen ein, zwei Frames bis der Block sichtbar ist: so lange bleibt das Display + private static final int OVERLAP_TICKS = 4; public static void animate(Instance world, Pos from, Pos to, Block block, int delayTicks, Runnable onArrival) { world.scheduler().buildTask(() -> spawn(world, from, to, block, onArrival)) @@ -44,16 +48,14 @@ public class BlockTransition { display.scheduler().buildTask(() -> { display.editEntityMeta(BlockDisplayMeta.class, meta -> { meta.setTransformationInterpolationStartDelta(0); - meta.setScale(Vec.ONE); - meta.setTranslation(Vec.ZERO); + meta.setScale(new Vec(END_SCALE)); + meta.setTranslation(new Vec((1 - END_SCALE) / 2)); }); display.teleport(to); }).delay(TaskSchedule.tick(2)).schedule(); - display.scheduler().buildTask(() -> { - onArrival.run(); - display.remove(); - }).delay(TaskSchedule.tick(TOTAL_TICKS)).schedule(); + display.scheduler().buildTask(onArrival).delay(TaskSchedule.tick(TOTAL_TICKS)).schedule(); + display.scheduler().buildTask(display::remove).delay(TaskSchedule.tick(TOTAL_TICKS + OVERLAP_TICKS)).schedule(); }); } }