diff --git a/gradle.properties b/gradle.properties index 7b2df9e6c..c8d40547b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.daemon=false # Dependency Version minecraftVersion=1.18.2 forgeVersion=40.2.0 -lodestoneVersion=1.4.2.484 +lodestoneVersion=1.4.2.486 forgegradleVersion=5.1.53 mixingradleVersion=0.7-SNAPSHOT librarianVersion=1.+ diff --git a/src/main/java/com/sammy/malum/client/renderer/block/MalumItemHolderRenderer.java b/src/main/java/com/sammy/malum/client/renderer/block/MalumItemHolderRenderer.java index 96996350b..311b53324 100644 --- a/src/main/java/com/sammy/malum/client/renderer/block/MalumItemHolderRenderer.java +++ b/src/main/java/com/sammy/malum/client/renderer/block/MalumItemHolderRenderer.java @@ -27,7 +27,7 @@ public void render(MalumItemHolderBlockEntity blockEntityIn, float partialTicks, ItemStack stack = blockEntityIn.inventory.getStackInSlot(0); if (!stack.isEmpty()) { poseStack.pushPose(); - Vec3 itemOffset = blockEntityIn.getItemOffset(); + Vec3 itemOffset = blockEntityIn.getItemOffset(partialTicks); poseStack.translate(itemOffset.x(), itemOffset.y(), itemOffset.z()); poseStack.mulPose(Vector3f.YP.rotationDegrees(((level.getGameTime() % 360) + partialTicks) * 3)); poseStack.scale(0.6f, 0.6f, 0.6f); diff --git a/src/main/java/com/sammy/malum/client/renderer/block/SpiritAltarRenderer.java b/src/main/java/com/sammy/malum/client/renderer/block/SpiritAltarRenderer.java index 141f11f70..2d3896513 100644 --- a/src/main/java/com/sammy/malum/client/renderer/block/SpiritAltarRenderer.java +++ b/src/main/java/com/sammy/malum/client/renderer/block/SpiritAltarRenderer.java @@ -2,7 +2,9 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Vector3f; +import com.sammy.malum.client.renderer.entity.*; import com.sammy.malum.common.block.curiosities.spirit_altar.SpiritAltarBlockEntity; +import com.sammy.malum.registry.common.*; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransforms; @@ -26,6 +28,11 @@ public void render(SpiritAltarBlockEntity blockEntityIn, float partialTicks, Pos ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer(); LodestoneBlockEntityInventory inventory = blockEntityIn.spiritInventory; + poseStack.translate(0, 2, 0); + FloatingItemEntityRenderer.renderSpiritGlimmer(poseStack, SpiritTypeRegistry.SACRED_SPIRIT, partialTicks); + poseStack.translate(0, -2, 0); + + int spiritsRendered = 0; for (int i = 0; i < inventory.slotCount; i++) { ItemStack item = inventory.getStackInSlot(i); diff --git a/src/main/java/com/sammy/malum/client/renderer/entity/FloatingItemEntityRenderer.java b/src/main/java/com/sammy/malum/client/renderer/entity/FloatingItemEntityRenderer.java index 75fe6dec2..e00a31e57 100644 --- a/src/main/java/com/sammy/malum/client/renderer/entity/FloatingItemEntityRenderer.java +++ b/src/main/java/com/sammy/malum/client/renderer/entity/FloatingItemEntityRenderer.java @@ -3,6 +3,7 @@ import com.mojang.blaze3d.vertex.*; import com.mojang.math.*; import com.sammy.malum.common.entity.*; +import com.sammy.malum.core.systems.spirit.*; import net.minecraft.client.*; import net.minecraft.client.multiplayer.*; import net.minecraft.client.renderer.*; @@ -10,9 +11,12 @@ import net.minecraft.client.renderer.entity.*; import net.minecraft.client.renderer.texture.*; import net.minecraft.client.resources.model.*; +import net.minecraft.network.chat.*; +import net.minecraft.network.chat.TextComponent; import net.minecraft.resources.*; import net.minecraft.util.*; import net.minecraft.world.item.*; +import net.minecraft.world.level.*; import net.minecraft.world.phys.*; import team.lodestar.lodestone.helpers.*; import team.lodestar.lodestone.setup.*; @@ -21,9 +25,7 @@ import team.lodestar.lodestone.systems.rendering.trail.*; import java.awt.*; -import java.util.*; import java.util.List; -import java.util.stream.*; import static com.sammy.malum.MalumMod.*; import static team.lodestar.lodestone.LodestoneLib.*; @@ -40,7 +42,7 @@ public FloatingItemEntityRenderer(EntityRendererProvider.Context context) { } private static final ResourceLocation LIGHT_TRAIL = malumPath("textures/vfx/concentrated_trail.png"); - private static final RenderType LIGHT_TYPE = LodestoneRenderTypeRegistry.ADDITIVE_TEXTURE_TRIANGLE.apply(LIGHT_TRAIL); + private static final RenderType TRAIL_TYPE = LodestoneRenderTypeRegistry.ADDITIVE_TEXTURE_TRIANGLE.apply(LIGHT_TRAIL); @Override public void render(FloatingItemEntity entity, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource bufferIn, int packedLightIn) { List trailPoints = entity.trailPointBuilder.getTrailPoints(partialTicks); @@ -52,7 +54,7 @@ public void render(FloatingItemEntity entity, float entityYaw, float partialTick trailPoints.add(new TrailPoint(new Vec3(x, y + entity.getYOffset(partialTicks) + 0.25F, z).add(entity.getDeltaMovement().scale(1+partialTicks)))); poseStack.translate(-x, -y, -z); VFXBuilders.WorldVFXBuilder builder = VFXBuilders.createWorld().setPosColorTexLightmapDefaultFormat(); - VertexConsumer lightBuffer = DELAYED_RENDER.getBuffer(LIGHT_TYPE); + VertexConsumer lightBuffer = DELAYED_RENDER.getBuffer(TRAIL_TYPE); final Color primaryColor = entity.spiritType.getPrimaryColor(); final Color secondaryColor = entity.spiritType.getSecondaryColor(); for (int i = 0; i < 2; i++) { @@ -73,7 +75,6 @@ public void render(FloatingItemEntity entity, float entityYaw, float partialTick public static void renderSpirit(FloatingItemEntity entity, ItemRenderer itemRenderer, float partialTicks, PoseStack poseStack, MultiBufferSource bufferIn, int packedLightIn) { ItemStack itemStack = entity.getItem(); BakedModel model = itemRenderer.getModel(itemStack, entity.level, null, entity.getItem().getCount()); - VFXBuilders.WorldVFXBuilder builder = VFXBuilders.createWorld().setPosColorTexLightmapDefaultFormat().setColor(entity.spiritType.getPrimaryColor()); float yOffset = entity.getYOffset(partialTicks); float scale = model.getTransforms().getTransform(ItemTransforms.TransformType.GROUND).scale.y(); float rotation = entity.getRotation(partialTicks); @@ -84,27 +85,35 @@ public static void renderSpirit(FloatingItemEntity entity, ItemRenderer itemRend poseStack.popPose(); poseStack.pushPose(); poseStack.translate(0.0D, (yOffset + 0.5F * scale), 0.0D); - renderSpiritGlimmer(poseStack, builder, partialTicks); + renderSpiritGlimmer(poseStack, entity.spiritType, partialTicks); poseStack.popPose(); } - public static void renderSpiritGlimmer(PoseStack poseStack, VFXBuilders.WorldVFXBuilder builder, float partialTicks) { - ClientLevel level = Minecraft.getInstance().level; - float v = level.getGameTime() + partialTicks; - float time = (float) ((Math.sin(v) + v % 15f) / 15f); - if (time >= 0.5f) { - time = 1f - time; - } - float multiplier = 1 + Easing.BOUNCE_IN_OUT.ease(time*2f, 0, 0.25f, 1); + public static void renderSpiritItem(PoseStack poseStack, MultiBufferSource bufferIn, ItemRenderer itemRenderer, ItemStack stack, float yOffset, float rotation, int packedLightIn) { + Level level = Minecraft.getInstance().level; + BakedModel model = itemRenderer.getModel(stack, level, null, stack.getCount()); + float scale = model.getTransforms().getTransform(ItemTransforms.TransformType.GROUND).scale.y(); + poseStack.pushPose(); + poseStack.translate(0.0D, (yOffset + 0.25F * scale), 0.0D); + poseStack.mulPose(Vector3f.YP.rotation(rotation)); + itemRenderer.render(stack, ItemTransforms.TransformType.GROUND, false, poseStack, bufferIn, packedLightIn, OverlayTexture.NO_OVERLAY, model); + poseStack.popPose(); + } + public static void renderSpiritGlimmer(PoseStack poseStack, MalumSpiritType spiritType, float partialTicks) { + Level level = Minecraft.getInstance().level; + VertexConsumer bloom = DELAYED_RENDER.getBuffer(LodestoneRenderTypeRegistry.ADDITIVE_TEXTURE.applyAndCache(lodestonePath("textures/particle/twinkle.png"))); + VertexConsumer star = DELAYED_RENDER.getBuffer(LodestoneRenderTypeRegistry.ADDITIVE_TEXTURE.applyAndCache(malumPath("textures/particle/star.png"))); + VFXBuilders.WorldVFXBuilder builder = VFXBuilders.createWorld().setPosColorTexLightmapDefaultFormat().setColor(spiritType.getPrimaryColor()); + float gameTime = level.getGameTime() + partialTicks; + float sine = (float) Math.abs(((Math.sin((gameTime / 80f) % 360)) * 0.2f)); + float bounce = EasingHelper.weightedEasingLerp(Easing.BOUNCE_IN_OUT, (gameTime % 20)/20f, 0.025f, 0.05f, 0.025f); + float scale = 0.1f + sine + bounce; + poseStack.pushPose(); poseStack.mulPose(Minecraft.getInstance().getEntityRenderDispatcher().cameraOrientation()); poseStack.mulPose(Vector3f.YP.rotationDegrees(180f)); - for (int i = 0; i < 3; i++) { - float size = (0.125f + i * 0.13f) * multiplier; - float alpha = (0.75f - i * 0.3f); - builder.setAlpha(alpha * 0.6f).renderQuad(DELAYED_RENDER.getBuffer(LodestoneRenderTypeRegistry.ADDITIVE_TEXTURE.applyAndCache(lodestonePath("textures/particle/wisp.png"))), poseStack, size * 0.75f); - builder.setAlpha(alpha).renderQuad(DELAYED_RENDER.getBuffer(LodestoneRenderTypeRegistry.ADDITIVE_TEXTURE.applyAndCache(lodestonePath("textures/particle/twinkle.png"))), poseStack, size); - } + builder.setAlpha(0.45f).renderQuad(bloom, poseStack, scale); + builder.setAlpha(0.75f).renderQuad(star, poseStack, scale*1.25f); poseStack.popPose(); } diff --git a/src/main/java/com/sammy/malum/common/block/curiosities/spirit_altar/SpiritAltarBlockEntity.java b/src/main/java/com/sammy/malum/common/block/curiosities/spirit_altar/SpiritAltarBlockEntity.java index 9e7ca8ed3..29885cd47 100644 --- a/src/main/java/com/sammy/malum/common/block/curiosities/spirit_altar/SpiritAltarBlockEntity.java +++ b/src/main/java/com/sammy/malum/common/block/curiosities/spirit_altar/SpiritAltarBlockEntity.java @@ -6,7 +6,6 @@ import com.sammy.malum.common.recipe.*; import com.sammy.malum.core.systems.particle_effects.*; import com.sammy.malum.core.systems.recipe.*; -import com.sammy.malum.core.systems.spirit.*; import com.sammy.malum.registry.common.*; import com.sammy.malum.registry.common.block.*; import com.sammy.malum.visual_effects.*; @@ -28,20 +27,14 @@ import net.minecraftforge.network.*; import org.jetbrains.annotations.*; import team.lodestar.lodestone.helpers.*; -import team.lodestar.lodestone.setup.*; import team.lodestar.lodestone.systems.blockentity.*; 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.recipe.*; import javax.annotation.Nullable; import javax.annotation.*; -import java.awt.*; import java.util.List; import java.util.*; -import java.util.function.*; import java.util.stream.*; import static com.sammy.malum.registry.common.PacketRegistry.*; diff --git a/src/main/java/com/sammy/malum/common/block/curiosities/tablet/TwistedTabletBlockEntity.java b/src/main/java/com/sammy/malum/common/block/curiosities/tablet/TwistedTabletBlockEntity.java index af1f0ddd2..8894bb0a4 100644 --- a/src/main/java/com/sammy/malum/common/block/curiosities/tablet/TwistedTabletBlockEntity.java +++ b/src/main/java/com/sammy/malum/common/block/curiosities/tablet/TwistedTabletBlockEntity.java @@ -15,10 +15,11 @@ public TwistedTabletBlockEntity(BlockPos pos, BlockState state) { } @Override - public Vec3 getItemOffset() { + public Vec3 getItemOffset(float partialTicks) { Direction direction = getBlockState().getValue(BlockStateProperties.FACING); + float gameTime = level.getGameTime() + partialTicks; float xOffset = direction.getStepX() * 0.25f; - float yOffset = direction.getStepY() * 0.4f + (inventory.getStackInSlot(0).getItem() instanceof SpiritShardItem ? (float)Math.sin((level.getGameTime() % 360) / 20f) * 0.05f : 0); + float yOffset = direction.getStepY() * 0.4f + (inventory.getStackInSlot(0).getItem() instanceof SpiritShardItem ? (float)Math.sin((gameTime % 360) / 20f) * 0.05f : 0); float zOffset = direction.getStepY() * 0.25f; return new Vec3(0.5f - xOffset, 0.5f - yOffset, 0.5f - zOffset); } diff --git a/src/main/java/com/sammy/malum/common/block/storage/IMalumSpecialItemAccessPoint.java b/src/main/java/com/sammy/malum/common/block/storage/IMalumSpecialItemAccessPoint.java index 7ee16a4c2..d9f715522 100644 --- a/src/main/java/com/sammy/malum/common/block/storage/IMalumSpecialItemAccessPoint.java +++ b/src/main/java/com/sammy/malum/common/block/storage/IMalumSpecialItemAccessPoint.java @@ -7,7 +7,10 @@ public interface IMalumSpecialItemAccessPoint { LodestoneBlockEntityInventory getSuppliedInventory(); - Vec3 getItemCenterPos(); - Vec3 getItemOffset(); + default Vec3 getItemCenterPos() { + return getItemCenterPos(0); + } + Vec3 getItemCenterPos(float partialTicks); + Vec3 getItemOffset(float partialTicks); BlockPos getAccessPointBlockPos(); } diff --git a/src/main/java/com/sammy/malum/common/block/storage/MalumItemHolderBlockEntity.java b/src/main/java/com/sammy/malum/common/block/storage/MalumItemHolderBlockEntity.java index c1a7b53ad..a3c1d3b65 100644 --- a/src/main/java/com/sammy/malum/common/block/storage/MalumItemHolderBlockEntity.java +++ b/src/main/java/com/sammy/malum/common/block/storage/MalumItemHolderBlockEntity.java @@ -1,12 +1,9 @@ package com.sammy.malum.common.block.storage; import com.sammy.malum.common.item.spirit.*; -import com.sammy.malum.core.helper.*; import com.sammy.malum.core.systems.spirit.*; import com.sammy.malum.visual_effects.*; import net.minecraft.core.*; -import net.minecraft.world.entity.monster.*; -import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; @@ -32,9 +29,9 @@ public LodestoneBlockEntityInventory getSuppliedInventory() { } @Override - public Vec3 getItemCenterPos() { + public Vec3 getItemCenterPos(float partialTicks) { final BlockPos blockPos = getBlockPos(); - final Vec3 offset = getItemOffset(); + final Vec3 offset = getItemOffset(partialTicks); return new Vec3(blockPos.getX()+offset.x, blockPos.getY()+offset.y, blockPos.getZ()+offset.z); } diff --git a/src/main/java/com/sammy/malum/common/block/storage/pedestal/ItemPedestalBlockEntity.java b/src/main/java/com/sammy/malum/common/block/storage/pedestal/ItemPedestalBlockEntity.java index f564f640a..a8f06d5bf 100644 --- a/src/main/java/com/sammy/malum/common/block/storage/pedestal/ItemPedestalBlockEntity.java +++ b/src/main/java/com/sammy/malum/common/block/storage/pedestal/ItemPedestalBlockEntity.java @@ -3,12 +3,10 @@ import com.sammy.malum.common.block.storage.*; import com.sammy.malum.common.item.spirit.*; import com.sammy.malum.registry.common.block.*; -import com.sammy.malum.visual_effects.*; import net.minecraft.core.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import team.lodestar.lodestone.helpers.*; public class ItemPedestalBlockEntity extends MalumItemHolderBlockEntity { @@ -23,9 +21,10 @@ public ItemPedestalBlockEntity(BlockPos pos, BlockState state) { } @Override - public Vec3 getItemOffset() { + public Vec3 getItemOffset(float partialTicks) { if (inventory.getStackInSlot(0).getItem() instanceof SpiritShardItem) { - return PEDESTAL_ITEM_OFFSET.add(0, (float)Math.sin((level.getGameTime() % 360) / 20f) * 0.05f, 0); + float gameTime = level.getGameTime() + partialTicks; + return PEDESTAL_ITEM_OFFSET.add(0, (float)Math.sin((gameTime % 360) / 20f) * 0.05f, 0); } return PEDESTAL_ITEM_OFFSET; } diff --git a/src/main/java/com/sammy/malum/common/block/storage/stand/ItemStandBlockEntity.java b/src/main/java/com/sammy/malum/common/block/storage/stand/ItemStandBlockEntity.java index 9813feece..13d14abb5 100644 --- a/src/main/java/com/sammy/malum/common/block/storage/stand/ItemStandBlockEntity.java +++ b/src/main/java/com/sammy/malum/common/block/storage/stand/ItemStandBlockEntity.java @@ -25,10 +25,11 @@ public ItemStandBlockEntity(BlockPos pos, BlockState state) { } @Override - public Vec3 getItemOffset() { + public Vec3 getItemOffset(float partialTicks) { Direction direction = getBlockState().getValue(BlockStateProperties.FACING); + float gameTime = level.getGameTime() + partialTicks; float xOffset = direction.getStepX() * 0.25f; - float yOffset = direction.getStepY() * 0.1f + (inventory.getStackInSlot(0).getItem() instanceof SpiritShardItem ? (float)Math.sin((level.getGameTime() % 360) / 20f) * 0.05f : 0); + float yOffset = direction.getStepY() * 0.1f + (inventory.getStackInSlot(0).getItem() instanceof SpiritShardItem ? (float)Math.sin((gameTime % 360) / 20f) * 0.05f : 0); float zOffset = direction.getStepZ() * 0.25f; return new Vec3(0.5f - xOffset, 0.5f - yOffset, 0.5f - zOffset); } diff --git a/src/main/java/com/sammy/malum/visual_effects/SpiritAltarParticleEffects.java b/src/main/java/com/sammy/malum/visual_effects/SpiritAltarParticleEffects.java index 6d9b5600a..230f66aff 100644 --- a/src/main/java/com/sammy/malum/visual_effects/SpiritAltarParticleEffects.java +++ b/src/main/java/com/sammy/malum/visual_effects/SpiritAltarParticleEffects.java @@ -92,25 +92,6 @@ public static void craftItemParticles(SpiritAltarBlockEntity altar) { BlockPos altarPos = altar.getBlockPos(); Vec3 targetPos = altar.getCentralItemOffset().add(altarPos.getX(),altarPos.getY(), altarPos.getZ()); - for (int i = 0; i < 8; i++) { - int finalI = i; - Vec3 offsetPosition = DataHelper.rotatingRadialOffset(targetPos, 0.6f, i, 8, gameTime, 160); - - var lightSpecs = spiritLightSpecs(level, offsetPosition, activeSpiritType); - lightSpecs.getBuilder().act(b -> b - .modifyColorData(d -> d.multiplyCoefficient(0.35f)) - .modifyData(b::getScaleData, d -> d.multiplyValue(2f).multiplyCoefficient(0.9f)) - .modifyData(b::getTransparencyData, d -> d.multiplyCoefficient(0.9f)) - .multiplyLifetime(1.5f) - .setLifetime(b.getParticleOptions().lifetimeSupplier.get() + finalI * 2)); - lightSpecs.getBloomBuilder().act(b -> b - .modifyColorData(d -> d.multiplyCoefficient(0.35f)) - .modifyData(b::getScaleData, d -> d.multiplyValue(1.6f).multiplyCoefficient(0.9f)) - .modifyData(b::getTransparencyData, d -> d.multiplyCoefficient(0.9f)) - .setLifetime((int) (b.getParticleOptions().lifetimeSupplier.get() + finalI * 2.5f))); - lightSpecs.spawnParticles(); - } - for (int i = 0; i < 8; i++) { int finalI = i; Vec3 offsetPosition = DataHelper.rotatingRadialOffset(targetPos, 0.6f, i, 8, gameTime, 160); diff --git a/src/main/java/com/sammy/malum/visual_effects/SpiritLightSpecs.java b/src/main/java/com/sammy/malum/visual_effects/SpiritLightSpecs.java index 5dad0d2ca..ba9e6391e 100644 --- a/src/main/java/com/sammy/malum/visual_effects/SpiritLightSpecs.java +++ b/src/main/java/com/sammy/malum/visual_effects/SpiritLightSpecs.java @@ -6,6 +6,7 @@ import net.minecraft.world.phys.Vec3; import team.lodestar.lodestone.helpers.*; import team.lodestar.lodestone.setup.LodestoneParticleRegistry; +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.color.ColorParticleData; @@ -80,7 +81,7 @@ public static WorldParticleBuilder spiritBloom(Level level, MalumSpiritType spir return WorldParticleBuilder.create(LodestoneParticleRegistry.WISP_PARTICLE) .setTransparencyData(GenericParticleData.create(0.35f, 0f).build()) .setSpinData(spinData) - .setScaleData(GenericParticleData.create(0.04f, RandomHelper.randomBetween(rand, 0.08f, 0.15f), 0).setCoefficient(1.15f).build()) + .setScaleData(GenericParticleData.create(0.04f, RandomHelper.randomBetween(rand, 0.08f, 0.14f), 0).setEasing(Easing.SINE_IN, Easing.SINE_IN_OUT).build()) .setColorData(spiritType.createBloomColorData().build()) .setLifetime(lifetime) .enableNoClip();