From 5f27eedde246ae0ab225618a446c99173c3b9684 Mon Sep 17 00:00:00 2001 From: Christian Knaapen Date: Tue, 17 Jan 2023 22:41:38 +0100 Subject: [PATCH] Keeping outlines until animation is done. Fix itemstack not found error when undoing in creative. Disabled create test code. --- .../buildmodifier/BuildModifiers.java | 2 +- .../buildmodifier/UndoRedo.java | 8 ++--- .../create/CreateClientTest.java | 34 +++++++++--------- .../foundation/utility/outliner/Outliner.java | 6 ++++ .../render/BlockPreviews.java | 36 ++++++++++++++----- 5 files changed, 55 insertions(+), 31 deletions(-) diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BuildModifiers.java b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BuildModifiers.java index 1a5d16f..1826f37 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BuildModifiers.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BuildModifiers.java @@ -50,7 +50,7 @@ public class BuildModifiers { } else { - int delay = CommonConfig.visuals.appearAnimationLength.get() * 3; //DelayedBlockPlacer is called 3 times per tick? + int delay = CommonConfig.visuals.appearAnimationLength.get() * 3 - 3; //DelayedBlockPlacer is called 3 times per tick? //place blocks after delay EffortlessBuilding.DELAYED_BLOCK_PLACER.placeBlocksDelayed(new DelayedBlockPlacer.Entry(world, player, coordinates, diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/UndoRedo.java b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/UndoRedo.java index 20b9a48..b27b0d5 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/UndoRedo.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/UndoRedo.java @@ -98,14 +98,14 @@ public class UndoRedo { if (previousBlockStates.get(i).equals(newBlockStates.get(i))) continue; //get blockstate from itemstack - BlockState previousBlockState = Blocks.AIR.defaultBlockState(); + BlockState previousBlockState = previousBlockStates.get(i); if (itemStack.getItem() instanceof BlockItem) { previousBlockState = ((BlockItem) itemStack.getItem()).getBlock().defaultBlockState(); } if (player.level.isLoaded(coordinate)) { //check itemstack empty - if (itemStack.isEmpty()) { + if (itemStack.isEmpty() && !player.isCreative()) { itemStack = findItemStackInInventory(player, previousBlockStates.get(i)); //get blockstate from new itemstack if (!itemStack.isEmpty() && itemStack.getItem() instanceof BlockItem) { @@ -158,14 +158,14 @@ public class UndoRedo { if (previousBlockStates.get(i).equals(newBlockStates.get(i))) continue; //get blockstate from itemstack - BlockState newBlockState = Blocks.AIR.defaultBlockState(); + BlockState newBlockState = newBlockStates.get(i); if (itemStack.getItem() instanceof BlockItem) { newBlockState = ((BlockItem) itemStack.getItem()).getBlock().defaultBlockState(); } if (player.level.isLoaded(coordinate)) { //check itemstack empty - if (itemStack.isEmpty()) { + if (itemStack.isEmpty() && !player.isCreative()) { itemStack = findItemStackInInventory(player, newBlockStates.get(i)); //get blockstate from new itemstack if (!itemStack.isEmpty() && itemStack.getItem() instanceof BlockItem) { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/CreateClientTest.java b/src/main/java/nl/requios/effortlessbuilding/create/CreateClientTest.java index 2f4f2c4..c19bd0b 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/CreateClientTest.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/CreateClientTest.java @@ -11,21 +11,21 @@ import nl.requios.effortlessbuilding.create.foundation.utility.Color; @Mod.EventBusSubscriber(Dist.CLIENT) public class CreateClientTest { - @SubscribeEvent - public static void onTick(TickEvent.ClientTickEvent event) { - CreateClient.GHOST_BLOCKS.showGhostState(1, Blocks.SPRUCE_LOG.defaultBlockState()) - .at(0, 120, 0) - .breathingAlpha(); - CreateClient.GHOST_BLOCKS.showGhostState(2, Blocks.SPRUCE_LOG.defaultBlockState()) - .at(1, 120, 0) - .breathingAlpha(); - - CreateClient.OUTLINER.showAABB(1, new AABB(0, 0, 0, 10, 2, 6) - .move(10, 120, 0)) - .withFaceTexture(AllSpecialTextures.CHECKERED) - .colored(new Color(0.11f, 0.49f, 0.7f, 1f)) -// .colored(0xbfbfbf) - .disableNormals() - .lineWidth(1 / 32f); - } +// @SubscribeEvent +// public static void onTick(TickEvent.ClientTickEvent event) { +// CreateClient.GHOST_BLOCKS.showGhostState(1, Blocks.SPRUCE_LOG.defaultBlockState()) +// .at(0, 120, 0) +// .breathingAlpha(); +// CreateClient.GHOST_BLOCKS.showGhostState(2, Blocks.SPRUCE_LOG.defaultBlockState()) +// .at(1, 120, 0) +// .breathingAlpha(); +// +// CreateClient.OUTLINER.showAABB(1, new AABB(0, 0, 0, 10, 2, 6) +// .move(10, 120, 0)) +// .withFaceTexture(AllSpecialTextures.CHECKERED) +// .colored(new Color(0.11f, 0.49f, 0.7f, 1f)) +//// .colored(0xbfbfbf) +// .disableNormals() +// .lineWidth(1 / 32f); +// } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/Outliner.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/Outliner.java index c2f0660..c1df937 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/Outliner.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/Outliner.java @@ -75,6 +75,12 @@ public class Outliner { outlines.get(slot).ticksTillRemoval = 1; } + //ADDED + public void keep(Object slot, int ticks) { + if (outlines.containsKey(slot)) + outlines.get(slot).ticksTillRemoval = ticks; + } + public void remove(Object slot) { outlines.remove(slot); } diff --git a/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviews.java b/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviews.java index 1e20aca..78ee7dc 100644 --- a/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviews.java +++ b/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviews.java @@ -30,6 +30,7 @@ import nl.requios.effortlessbuilding.compatibility.CompatHelper; import nl.requios.effortlessbuilding.create.AllSpecialTextures; import nl.requios.effortlessbuilding.create.CreateClient; import nl.requios.effortlessbuilding.create.foundation.utility.Color; +import nl.requios.effortlessbuilding.create.foundation.utility.VecHelper; import nl.requios.effortlessbuilding.helper.ReachHelper; import nl.requios.effortlessbuilding.helper.SurvivalHelper; import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem; @@ -59,8 +60,6 @@ public class BlockPreviews { float dissolve = (ClientEvents.ticksInGame - placed.time) / (float) totalTime; renderBlockPreviews(player, modifierSettings, placed.coordinates, placed.blockStates, placed.itemStacks, dissolve, placed.firstPos, placed.secondPos, false, placed.breaking); - - CreateClient.OUTLINER.showCluster(placed.time, placed.coordinates); } } } @@ -291,7 +290,7 @@ public class BlockPreviews { float scale = 0.5f; float alpha = 0.7f; if (dissolve > 0f) { - float animationLength = 0.7f; + float animationLength = 0.8f; double firstToSecond = secondPos.distSqr(firstPos); double place = 0; @@ -308,20 +307,18 @@ public class BlockPreviews { t = Mth.clamp(t, 0, 1); //Now we got a usable t value for this block - float sine = Mth.sin((t + (1/7f) * t) * Mth.TWO_PI - (3/4f) * Mth.PI); // -1 to 1 - sine = (sine + 1f) / 2f; // 0 to 1 - -// scale = 1f + (sine * 0.5f); - t = (float) Mth.smoothstep(t); +// t = (float) bezier(t, .58,-0.08,.23,1.33); + if (!breaking) { scale = 0.5f + (t * 0.3f); alpha = 0.7f + (t * 0.3f); } else { t = 1f - t; scale = 0.5f + (t * 0.5f); - alpha = t; + alpha = 0.7f + (t * 0.3f); } + alpha = Mth.clamp(alpha, 0, 1); } CreateClient.GHOST_BLOCKS.showGhostState(blockPos.toShortString(), blockState) @@ -330,6 +327,23 @@ public class BlockPreviews { .scale(scale); } + //A bezier easing function where implicit first and last control points are (0,0) and (1,1). + public static double bezier(double t, double x1, double y1, double x2, double y2) { + double t2 = t * t; + double t3 = t2 * t; + + double cx = 3.0 * x1; + double bx = 3.0 * (x2 - x1) - cx; + double ax = 1.0 - cx -bx; + + double cy = 3.0 * y1; + double by = 3.0 * (y2 - y1) - cy; + double ay = 1.0 - cy - by; + + // Calculate the curve point at parameter value t + return (ay * t3) + (by * t2) + (cy * t) + 0; + } + public static void onBlocksPlaced() { onBlocksPlaced(previousCoordinates, previousItemStacks, previousBlockStates, previousFirstPos, previousSecondPos); } @@ -350,6 +364,8 @@ public class BlockPreviews { placedDataList.add(new PlacedData(ClientEvents.ticksInGame, coordinates, blockStates, itemStacks, firstPos, secondPos, false)); } + + CreateClient.OUTLINER.keep(firstPos, CommonConfig.visuals.appearAnimationLength.get()); } } @@ -376,6 +392,8 @@ public class BlockPreviews { placedDataList.add(new PlacedData(ClientEvents.ticksInGame, coordinates, blockStates, itemStacks, firstPos, secondPos, true)); } + + CreateClient.OUTLINER.keep(firstPos, CommonConfig.visuals.breakAnimationLength.get()); } }