From ff9eb6a4c52a9fcb491ee3922d5c08fe522f24e1 Mon Sep 17 00:00:00 2001 From: SammySemicolon <69329424+SammySemicolon@users.noreply.github.com> Date: Sun, 19 Nov 2023 23:40:14 +0100 Subject: [PATCH] Transmutation Page Update --- .../client/screen/codex/EntryScreen.java | 3 +- .../client/screen/codex/pages/BookPage.java | 2 +- .../codex/pages/SpiritRiteRecipePage.java | 19 ++--- .../codex/pages/SpiritTransmutationPage.java | 66 +++++++++++++++--- .../recipe/MalumSpiritInfusionRecipes.java | 2 +- .../book/pages/spirit_transmutation_page.png | Bin 12165 -> 12537 bytes 6 files changed, 71 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/sammy/malum/client/screen/codex/EntryScreen.java b/src/main/java/com/sammy/malum/client/screen/codex/EntryScreen.java index 92042f7f8..554b8955a 100644 --- a/src/main/java/com/sammy/malum/client/screen/codex/EntryScreen.java +++ b/src/main/java/com/sammy/malum/client/screen/codex/EntryScreen.java @@ -72,7 +72,8 @@ public void render(PoseStack poseStack, int mouseX, int mouseY, float partialTic for (int i = openPages; i < openPages + 2; i++) { if (i < openEntry.pages.size()) { BookPage page = openEntry.pages.get(i); - page.render(minecraft, poseStack, this, mouseX, mouseY, partialTicks); + boolean isRepeat = i % 2 != 0 && page.getClass().equals(openEntry.pages.get(i - 1).getClass()); + page.render(minecraft, poseStack, this, mouseX, mouseY, partialTicks, isRepeat); if (i % 2 == 0) { page.renderLeft(minecraft, poseStack, this, mouseX, mouseY, partialTicks); } else { diff --git a/src/main/java/com/sammy/malum/client/screen/codex/pages/BookPage.java b/src/main/java/com/sammy/malum/client/screen/codex/pages/BookPage.java index 9c828e4df..64fa143a6 100644 --- a/src/main/java/com/sammy/malum/client/screen/codex/pages/BookPage.java +++ b/src/main/java/com/sammy/malum/client/screen/codex/pages/BookPage.java @@ -20,7 +20,7 @@ public boolean isValid() { return true; } - public void render(Minecraft minecraft, PoseStack poseStack, EntryScreen screen, int mouseX, int mouseY, float partialTicks) { + public void render(Minecraft minecraft, PoseStack poseStack, EntryScreen screen, int mouseX, int mouseY, float partialTicks, boolean isRepeat) { } diff --git a/src/main/java/com/sammy/malum/client/screen/codex/pages/SpiritRiteRecipePage.java b/src/main/java/com/sammy/malum/client/screen/codex/pages/SpiritRiteRecipePage.java index 398b16dc7..149752eca 100644 --- a/src/main/java/com/sammy/malum/client/screen/codex/pages/SpiritRiteRecipePage.java +++ b/src/main/java/com/sammy/malum/client/screen/codex/pages/SpiritRiteRecipePage.java @@ -14,14 +14,12 @@ import team.lodestar.lodestone.systems.easing.*; import team.lodestar.lodestone.systems.particle.builder.*; import team.lodestar.lodestone.systems.particle.data.*; -import team.lodestar.lodestone.systems.particle.data.color.*; import team.lodestar.lodestone.systems.particle.data.spin.*; import team.lodestar.lodestone.systems.particle.screen.*; import java.util.*; import static com.sammy.malum.client.screen.codex.ArcanaCodexHelper.*; -import static net.minecraft.util.Mth.nextFloat; public class SpiritRiteRecipePage extends BookPage { @@ -35,11 +33,13 @@ public SpiritRiteRecipePage(MalumRiteType riteType) { } @Override - public void render(Minecraft minecraft, PoseStack poseStack, EntryScreen screen, int mouseX, int mouseY, float partialTicks) { - if (ScreenParticleHandler.canSpawnParticles) { - RITE_PARTICLES.tick(); + public void render(Minecraft minecraft, PoseStack poseStack, EntryScreen screen, int mouseX, int mouseY, float partialTicks, boolean isRepeat) { + if (!isRepeat) { + if (ScreenParticleHandler.canSpawnParticles) { + RITE_PARTICLES.tick(); + } + ScreenParticleHandler.renderParticles(RITE_PARTICLES); } - ScreenParticleHandler.renderParticles(RITE_PARTICLES); } @Override @@ -72,11 +72,12 @@ public void renderRite(PoseStack poseStack, EntryScreen screen, int left, int to float xOffset = 25; float yMotion = RandomHelper.randomBetween(rand, 0.2f, 0.4f) * (rand.nextBoolean() ? -1 : 1); int lifetime = RandomHelper.randomBetween(rand, 40, 80); - float yScale = RandomHelper.randomBetween(rand, 0.2f, 0.6f); + float scale = RandomHelper.randomBetween(rand, 0.2f, 0.6f); + float spin = RandomHelper.randomBetween(rand, 0.2f, 0.4f); ScreenParticleBuilder.create(LodestoneScreenParticleRegistry.WISP, RITE_PARTICLES) .setTransparencyData(GenericParticleData.create(0.04f, 0.4f, 0f).setEasing(Easing.SINE_IN_OUT).build()) - .setSpinData(SpinParticleData.create(nextFloat(rand, 0.2f, 0.4f)).setEasing(Easing.EXPO_OUT).build()) - .setScaleData(GenericParticleData.create(yScale, 0).build()) + .setSpinData(SpinParticleData.create(spin).build()) + .setScaleData(GenericParticleData.create(scale, 0).build()) .setColorData(spiritType.createMainColorData().setCoefficient(0.25f).build()) .setLifetime(lifetime) .setMotion(0, yMotion) diff --git a/src/main/java/com/sammy/malum/client/screen/codex/pages/SpiritTransmutationPage.java b/src/main/java/com/sammy/malum/client/screen/codex/pages/SpiritTransmutationPage.java index 1174f0b9c..3b100c1ba 100644 --- a/src/main/java/com/sammy/malum/client/screen/codex/pages/SpiritTransmutationPage.java +++ b/src/main/java/com/sammy/malum/client/screen/codex/pages/SpiritTransmutationPage.java @@ -4,21 +4,32 @@ import com.sammy.malum.*; import com.sammy.malum.client.screen.codex.*; import com.sammy.malum.common.recipe.*; +import com.sammy.malum.registry.common.*; import com.sammy.malum.registry.common.item.*; import net.minecraft.client.*; import net.minecraft.network.chat.*; import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; import net.minecraftforge.data.loading.*; +import team.lodestar.lodestone.handlers.screenparticle.*; import team.lodestar.lodestone.helpers.*; +import team.lodestar.lodestone.setup.*; +import team.lodestar.lodestone.systems.easing.*; +import team.lodestar.lodestone.systems.particle.*; +import team.lodestar.lodestone.systems.particle.builder.*; +import team.lodestar.lodestone.systems.particle.data.*; +import team.lodestar.lodestone.systems.particle.data.spin.*; +import team.lodestar.lodestone.systems.particle.screen.*; import team.lodestar.lodestone.systems.recipe.*; import java.util.*; import static com.sammy.malum.client.screen.codex.ArcanaCodexHelper.*; -@SuppressWarnings("all") public class SpiritTransmutationPage extends BookPage { + + private static final ScreenParticleHolder TRANSMUTATION_PARTICLES = new ScreenParticleHolder(); + private final String headlineTranslationKey; private final List itemTree = new ArrayList<>(); @@ -49,16 +60,31 @@ public boolean isValid() { return !itemTree.isEmpty(); } + @Override + public void render(Minecraft minecraft, PoseStack poseStack, EntryScreen screen, int mouseX, int mouseY, float partialTicks, boolean isRepeat) { + if (!isRepeat) { + if (ScreenParticleHandler.canSpawnParticles) { + TRANSMUTATION_PARTICLES.tick(); + } + ScreenParticleHandler.renderParticles(TRANSMUTATION_PARTICLES); + } + } + @Override public void renderLeft(Minecraft minecraft, PoseStack poseStack, EntryScreen screen, int mouseX, int mouseY, float partialTicks) { int guiLeft = guiLeft(); int guiTop = guiTop(); Component component = new TranslatableComponent(headlineTranslationKey()); renderText(poseStack, component, guiLeft + 75 - minecraft.font.width(component.getString()) / 2, guiTop + 10); - List copy = new ArrayList<>(itemTree); - renderComponent(screen, poseStack, copy.remove(0), guiLeft + 67, guiTop + 44, mouseX, mouseY); - renderComponent(screen, poseStack, copy.remove(copy.size() - 1), guiLeft + 67, guiTop + 126, mouseX, mouseY); - renderComponents(screen, poseStack, copy, guiLeft + 65, guiTop + 82, mouseX, mouseY, false); + renderComponent(screen, poseStack, itemTree.get(0), guiLeft + 67, guiTop + 44, mouseX, mouseY); + renderComponent(screen, poseStack, itemTree.get(itemTree.size() - 1), guiLeft + 67, guiTop + 126, mouseX, mouseY); + + int leftStart = guiLeft + 77 - (itemTree.size())*10; + for (int i = 1; i < itemTree.size()-1; i++) { + WrappedIngredient wrappedIngredient = itemTree.get(i); + renderComponent(screen, poseStack, wrappedIngredient, leftStart+i*20, guiTop + 85, mouseX, mouseY); + } + spawnParticles(guiLeft + 75, guiTop + 94, false); } @Override @@ -67,9 +93,31 @@ public void renderRight(Minecraft minecraft, PoseStack poseStack, EntryScreen sc int guiTop = guiTop(); Component component = new TranslatableComponent(headlineTranslationKey()); renderText(poseStack, component, guiLeft + 218 - minecraft.font.width(component.getString()) / 2, guiTop + 10); - List copy = new ArrayList<>(itemTree); - renderComponent(screen, poseStack, copy.remove(0), guiLeft + 209, guiTop + 44, mouseX, mouseY); - renderComponent(screen, poseStack, copy.remove(copy.size() - 1), guiLeft + 209, guiTop + 126, mouseX, mouseY); - renderComponents(screen, poseStack, DataHelper.reverseOrder(new ArrayList<>(), copy), guiLeft + 207, guiTop + 82, mouseX, mouseY, false); + renderComponent(screen, poseStack, itemTree.get(0), guiLeft + 209, guiTop + 44, mouseX, mouseY); + renderComponent(screen, poseStack, itemTree.get(itemTree.size() - 1), guiLeft + 209, guiTop + 126, mouseX, mouseY); + int leftStart = guiLeft + 199 + (itemTree.size())*10; + for (int i = 1; i < itemTree.size()-1; i++) { + WrappedIngredient wrappedIngredient = itemTree.get(itemTree.size() - i); + renderComponent(screen, poseStack, wrappedIngredient, leftStart-i*20, guiTop + 85, mouseX, mouseY); + } + spawnParticles(guiLeft + 218, guiTop + 94, true); + } + + public void spawnParticles(float x,float y, boolean rightSide) { + if (ScreenParticleHandler.canSpawnParticles) { + Random rand = Minecraft.getInstance().level.random; + float scale = RandomHelper.randomBetween(rand, 0.2f, 0.4f); + float spin = RandomHelper.randomBetween(rand, 0.2f, 0.4f); + final double xOffset = Math.sin(((rightSide ? -1 : 1) *Minecraft.getInstance().level.getGameTime() % 320) / 320f * Math.PI * 2) * 46; + final double yOffset = Math.sin((Minecraft.getInstance().level.getGameTime() % 80) / 80f * Math.PI * 2) * 6; + ScreenParticleBuilder.create(LodestoneScreenParticleRegistry.WISP, TRANSMUTATION_PARTICLES) + .setTransparencyData(GenericParticleData.create(0.2f, 0.4f, 0.2f).build()) + .setSpinData(SpinParticleData.create(spin).build()) + .setScaleData(GenericParticleData.create(0, scale, 0).build()) + .setColorData(SpiritTypeRegistry.ELDRITCH_SPIRIT.createMainColorData().setCoefficient(0.25f).build()) + .setLifetime(80) + .setDiscardFunction(SimpleParticleOptions.ParticleDiscardFunctionType.ENDING_CURVE_INVISIBLE) + .spawn(x-xOffset, y+yOffset); + } } } \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/data/recipe/MalumSpiritInfusionRecipes.java b/src/main/java/com/sammy/malum/data/recipe/MalumSpiritInfusionRecipes.java index b8294ddfc..0f50b5a43 100644 --- a/src/main/java/com/sammy/malum/data/recipe/MalumSpiritInfusionRecipes.java +++ b/src/main/java/com/sammy/malum/data/recipe/MalumSpiritInfusionRecipes.java @@ -273,7 +273,7 @@ protected void buildCraftingRecipes(Consumer consumer) { new SpiritInfusionRecipeBuilder(ItemRegistry.ORNATE_NECKLACE.get(), 1, ItemRegistry.NECKLACE_OF_THE_MYSTIC_MIRROR.get(), 1) .addExtraItem(ItemRegistry.RUNEWOOD_PLANKS.get(), 8) - .addExtraItem(ItemRegistry.SPECTRAL_OPTIC.get(), 4) + .addExtraItem(ItemRegistry.SPECTRAL_OPTIC.get(), 1) .addExtraItem(Items.ENDER_EYE, 1) .addSpirit(SACRED_SPIRIT, 24) .build(consumer); diff --git a/src/main/resources/assets/malum/textures/gui/book/pages/spirit_transmutation_page.png b/src/main/resources/assets/malum/textures/gui/book/pages/spirit_transmutation_page.png index 1463f328f4647faaf7b8b717a97765a5d6c55e29..1c60ad313f0d1433e9bcfd19f6bd2a0452cfaac5 100644 GIT binary patch literal 12537 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 Lk&;80OW^+i$LHxu literal 12165 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