Skip to content

Commit 283c8b0

Browse files
Graaaaah
1 parent 26d2bac commit 283c8b0

File tree

8 files changed

+131
-109
lines changed

8 files changed

+131
-109
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ mod_authors=Sammy Semicolon
2222
mod_description=A dark magic mod focused on soul and spirit magic.
2323

2424
# Mandatory
25-
lodestone_version=1.8.3.669
25+
lodestone_version=1.8.3.677
2626
lodestone_version_range=[1.8.3,)
2727
curios_version=9.3.1+1.21.1
2828

src/main/java/com/sammy/malum/client/renderer/block/SpiritAltarRenderer.java

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import net.minecraft.world.phys.AABB;
1717
import net.minecraft.world.phys.Vec3;
1818
import org.joml.Vector3f;
19+
import team.lodestar.lodestone.modules.toolkit.client.ItemStackDisplayDataRenderer;
1920
import team.lodestar.lodestone.modules.toolkit.inventory.LodestoneItemStackHandler;
2021

2122
import static net.minecraft.client.renderer.texture.OverlayTexture.NO_OVERLAY;
@@ -26,35 +27,10 @@ public SpiritAltarRenderer(BlockEntityRendererProvider.Context context) {
2627

2728
@Override
2829
public void render(SpiritAltarBlockEntity blockEntityIn, float partialTicks, PoseStack poseStack, MultiBufferSource bufferIn, int combinedLightIn, int combinedOverlayIn) {
29-
Level level = Minecraft.getInstance().level;
30-
ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer();
31-
LodestoneItemStackHandler inventory = blockEntityIn.spiritInventory;
32-
int spiritsRendered = 0;
33-
if (!inventory.isEmpty()) {
34-
for (int i = 0; i < inventory.getSlotCount(); i++) {
35-
ItemStack item = inventory.getStackInSlot(i);
36-
if (item.getItem() instanceof SpiritShardItem shardItem) {
37-
poseStack.pushPose();
38-
Vector3f offset = blockEntityIn.getSpiritItemOffset(spiritsRendered++, partialTicks).toVector3f();
39-
poseStack.translate(offset.x(), offset.y(), offset.z());
40-
FloatingItemRenderer.renderSpiritGlimmer(poseStack, shardItem.getSpiritHolder(), partialTicks);
41-
poseStack.mulPose(Axis.YP.rotationDegrees(((level.getGameTime() % 360) + partialTicks) * 3));
42-
poseStack.scale(0.5f, 0.5f, 0.5f);
43-
itemRenderer.renderStatic(item, ItemDisplayContext.FIXED, combinedLightIn, NO_OVERLAY, poseStack, bufferIn, level, 0);
44-
poseStack.popPose();
45-
}
46-
}
47-
}
48-
ItemStack stack = blockEntityIn.inventory.getStackInSlot(0);
49-
if (!stack.isEmpty()) {
50-
poseStack.pushPose();
51-
Vec3 offset = SpiritAltarBlockEntity.ALTAR_ITEM_OFFSET;
52-
poseStack.translate(offset.x, offset.y, offset.z);
53-
poseStack.mulPose(Axis.YP.rotationDegrees((((level.getGameTime() + partialTicks) * 3) % 360)));
54-
poseStack.scale(0.45f, 0.45f, 0.45f);
55-
itemRenderer.renderStatic(stack, ItemDisplayContext.FIXED, combinedLightIn, NO_OVERLAY, poseStack, bufferIn, level, 0);
56-
poseStack.popPose();
57-
}
30+
var renderer = new ItemStackDisplayDataRenderer();
31+
renderer.setItemScale(0.45f).render(blockEntityIn.inventory, poseStack, bufferIn, combinedLightIn, partialTicks);
32+
renderer.setItemScale(0.5f).render(blockEntityIn.spiritInventory, poseStack, bufferIn, combinedLightIn, partialTicks);
33+
// FloatingItemRenderer.renderSpiritGlimmer(poseStack, shardItem.getSpiritHolder(), partialTicks);
5834
}
5935

6036
@Override

src/main/java/com/sammy/malum/common/block/MalumBlockItemStackHandler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import team.lodestar.lodestone.helpers.*;
1616
import team.lodestar.lodestone.modules.toolkit.blockentity.LodestoneBlockEntity;
1717
import team.lodestar.lodestone.modules.toolkit.inventory.InventoryInteractionResult;
18+
import team.lodestar.lodestone.modules.toolkit.inventory.ItemStackHandlerItemDisplayData;
1819
import team.lodestar.lodestone.modules.toolkit.inventory.LodestoneItemStackBlockHandler;
1920
import team.lodestar.lodestone.modules.toolkit.inventory.LodestoneItemStackHandler;
2021

src/main/java/com/sammy/malum/common/block/MalumBlockItemStackHandlerBuilder.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@
44
import net.minecraft.world.item.ItemStack;
55
import net.minecraft.world.level.Level;
66
import team.lodestar.lodestone.modules.toolkit.blockentity.LodestoneBlockEntity;
7-
import team.lodestar.lodestone.modules.toolkit.inventory.LodestoneItemStackBlockHandler;
8-
import team.lodestar.lodestone.modules.toolkit.inventory.LodestoneItemStackBlockHandlerBuilder;
9-
import team.lodestar.lodestone.modules.toolkit.inventory.LodestoneItemStackHandler;
10-
import team.lodestar.lodestone.modules.toolkit.inventory.LodestoneItemStackHandlerBuilder;
7+
import team.lodestar.lodestone.modules.toolkit.inventory.*;
118

129
import java.util.function.Consumer;
1310
import java.util.function.Predicate;

src/main/java/com/sammy/malum/common/block/curiosities/spirit_altar/SpiritAltarBlockEntity.java

Lines changed: 19 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.sammy.malum.common.block.MalumBlockItemStackHandler;
44
import com.sammy.malum.common.block.storage.IMalumSpecialItemAccessPoint;
5+
import com.sammy.malum.common.block.storage.ItemHolderItemDisplayData;
56
import com.sammy.malum.common.recipe.SpiritInfusionRecipe;
67
import com.sammy.malum.core.systems.recipe.SpiritBasedRecipeInput;
78
import com.sammy.malum.registry.common.MalumParticleEffectTypes;
@@ -17,15 +18,13 @@
1718
import net.minecraft.nbt.CompoundTag;
1819
import net.minecraft.server.level.ServerLevel;
1920
import net.minecraft.sounds.SoundSource;
20-
import net.minecraft.util.Mth;
2121
import net.minecraft.world.InteractionHand;
2222
import net.minecraft.world.ItemInteractionResult;
2323
import net.minecraft.world.entity.item.ItemEntity;
2424
import net.minecraft.world.entity.player.Player;
2525
import net.minecraft.world.item.ItemStack;
2626
import net.minecraft.world.level.*;
2727
import net.minecraft.world.level.block.entity.BlockEntity;
28-
import net.minecraft.world.level.block.entity.BlockEntityType;
2928
import net.minecraft.world.level.block.state.BlockState;
3029
import net.minecraft.world.phys.*;
3130
import net.neoforged.neoforge.common.crafting.SizedIngredient;
@@ -34,30 +33,22 @@
3433
import team.lodestar.lodestone.helpers.*;
3534
import team.lodestar.lodestone.helpers.block.*;
3635
import team.lodestar.lodestone.modules.toolkit.blockentity.*;
37-
import team.lodestar.lodestone.modules.core.easing.Easing;
3836
import team.lodestar.lodestone.modules.toolkit.inventory.ItemStackMultiHandler;
39-
import team.lodestar.lodestone.modules.toolkit.inventory.LodestoneItemStackHandler;
4037
import team.lodestar.lodestone.modules.toolkit.recipe.LodestoneRecipeSearch;
41-
import team.lodestar.lodestone.modules.toolkit.recipe.LodestoneRecipeType;
4238

4339
import javax.annotation.Nullable;
4440
import java.util.*;
4541

42+
@SuppressWarnings("NullableProblems")
4643
public class SpiritAltarBlockEntity extends LodestoneBlockEntity implements IInventoryCapabilityProvider {
4744

48-
public static final Vec3 ALTAR_ITEM_OFFSET = new Vec3(0.5f, 1.25f, 0.5f);
4945
public static final int HORIZONTAL_RANGE = 4;
5046
public static final int VERTICAL_RANGE = 3;
51-
private static final int WARMUP_DURATION = 30;
5247

5348
public float speed = 1f;
5449
public int progress;
5550
public int idleProgress;
5651
public boolean isCrafting;
57-
public float warmupTimer;
58-
59-
public float spiritAmount;
60-
public float spiritSpin;
6152

6253
public List<BlockPos> acceleratorPositions = new ArrayList<>();
6354
public List<IAltarAccelerator> accelerators = new ArrayList<>();
@@ -75,6 +66,9 @@ public SpiritAltarBlockEntity(LodestoneBlockEntityType<? extends SpiritAltarBloc
7566
inventory = MalumBlockItemStackHandler.create(this, 1).noSpirits().onContentsChanged(this::recalculateRecipes).build();
7667
extrasInventory = MalumBlockItemStackHandler.create(this, 32).noSpirits().build();
7768
spiritInventory = MalumBlockItemStackHandler.create(this, 9).onlySpirits().onContentsChanged(this::recalculateRecipes).build();
69+
70+
inventory.attachDisplayData(ItemHolderItemDisplayData::new);
71+
spiritInventory.attachDisplayData(SpiritAltarSpiritDisplayData::new);
7872
inventoryHandler = new ItemStackMultiHandler(inventory, spiritInventory);
7973
}
8074

@@ -88,24 +82,23 @@ public IItemHandler getInventory(Direction direction) {
8882
}
8983

9084
@Override
91-
protected void saveAdditional(CompoundTag compound, HolderLookup.Provider pRegistries) {
92-
super.saveAdditional(compound, pRegistries);
93-
compound.putFloat("speed", speed);
94-
compound.putInt("progress", progress);
95-
compound.putInt("idleProgress", idleProgress);
96-
compound.putBoolean("isCrafting", isCrafting);
97-
compound.putFloat("warmupTimer", warmupTimer);
85+
protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) {
86+
super.saveAdditional(tag, registries);
87+
tag.putFloat("speed", speed);
88+
tag.putInt("progress", progress);
89+
tag.putInt("idleProgress", idleProgress);
90+
tag.putBoolean("isCrafting", isCrafting);
9891

9992
var acceleratorData = new CompoundTag();
10093
acceleratorData.putInt("acceleratorAmount", acceleratorPositions.size());
10194
for (int i = 0; i < acceleratorPositions.size(); i++) {
10295
acceleratorData.put("acceleratorPosition_" + i, NBTHelper.saveBlockPos(acceleratorPositions.get(i)));
10396
}
104-
compound.put("acceleratorData", acceleratorData);
97+
tag.put("acceleratorData", acceleratorData);
10598

106-
inventory.save(pRegistries, compound);
107-
spiritInventory.save(pRegistries, compound, "spiritInventory");
108-
extrasInventory.save(pRegistries, compound, "extrasInventory");
99+
inventory.save(registries, tag);
100+
spiritInventory.save(registries, tag, "spiritInventory");
101+
extrasInventory.save(registries, tag, "extrasInventory");
109102
}
110103

111104
@Override
@@ -114,7 +107,6 @@ public void loadAdditional(CompoundTag compound, HolderLookup.Provider pRegistri
114107
progress = compound.getInt("progress");
115108
idleProgress = compound.getInt("idleProgress");
116109
isCrafting = compound.getBoolean("isCrafting");
117-
warmupTimer = compound.getFloat("warmupTimer");
118110

119111
acceleratorPositions.clear();
120112
accelerators.clear();
@@ -196,19 +188,14 @@ public void serverTick(ServerLevel level) {
196188

197189
@Override
198190
public void clientTick(Level level) {
199-
spiritAmount = Math.max(1, Mth.lerp(0.1f, spiritAmount, spiritInventory.getFilledSlotCount()));
200-
spiritSpin += 1 + getSpinUp(Easing.SINE_IN_OUT) * 0.05f + speed * 0.5f;
201191
SpiritAltarParticleEffects.passiveSpiritAltarParticles(this);
202192
}
203193

204194
@Override
205195
public void commonTick(Level level) {
206-
if (!possibleRecipes.isEmpty()) {
207-
warmupTimer++;
208-
} else {
196+
if (possibleRecipes.isEmpty()) {
209197
isCrafting = false;
210198
progress = 0;
211-
warmupTimer = Mth.clamp(warmupTimer - 1, 0, WARMUP_DURATION);
212199
}
213200
}
214201

@@ -280,9 +267,9 @@ public boolean consume(ServerLevel level) {
280267
}
281268

282269
public void craft(ServerLevel level) {
283-
ItemStack stack = inventory.getStackInSlot(0);
284-
ItemStack outputStack = recipe.getOutput(level, stack);
285-
Vec3 itemPos = getItemPos();
270+
var stack = inventory.getStackInSlot(0);
271+
var outputStack = recipe.getOutput(level, stack);
272+
var itemPos = inventory.getDisplayData().getDisplayCenter(0);
286273
progress -= (int) (progress * 0.2f);
287274
stack.shrink(recipe.input.count());
288275
level.addFreshEntity(new ItemEntity(level, itemPos.x, itemPos.y, itemPos.z, outputStack));
@@ -321,30 +308,4 @@ public void recalibrateAccelerators() {
321308
}
322309
}
323310
}
324-
325-
public Vec3 getCentralItemOffset() {
326-
return ALTAR_ITEM_OFFSET;
327-
}
328-
329-
public Vec3 getItemPos() {
330-
final BlockPos blockPos = getBlockPos();
331-
final Vec3 offset = getCentralItemOffset();
332-
return new Vec3(blockPos.getX() + offset.x, blockPos.getY() + offset.y, blockPos.getZ() + offset.z);
333-
}
334-
335-
public Vec3 getSpiritItemOffset(int slot, float partialTicks) {
336-
float projectedSpiritSpin = spiritSpin + getSpinUp(Easing.SINE_IN_OUT) * 0.05f + speed * 0.5f;
337-
float lerpSpiritSpin = spiritSpin + partialTicks * (projectedSpiritSpin - spiritSpin);
338-
float distanceOscillation = Mth.sin((lerpSpiritSpin / 20f) % 6.28f) * 0.025f;
339-
float distance = 1 - getSpinUp(Easing.SINE_OUT) * 0.25f + distanceOscillation;
340-
float height = 0.75f + getSpinUp(Easing.QUARTIC_OUT) * getSpinUp(Easing.BACK_OUT) * 0.5f;
341-
return VecHelper.rotatingRadialOffset(new Vec3(0.5f, height, 0.5f), distance, slot, spiritAmount, lerpSpiritSpin, 360);
342-
}
343-
344-
public float getSpinUp(Easing easing) {
345-
if (warmupTimer > WARMUP_DURATION) {
346-
return 1;
347-
}
348-
return easing.ease(warmupTimer / WARMUP_DURATION, 0, 1, 1);
349-
}
350311
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.sammy.malum.common.block.curiosities.spirit_altar;
2+
3+
import dev.kosmx.playerAnim.core.util.MathHelper;
4+
import net.minecraft.core.BlockPos;
5+
import net.minecraft.util.Mth;
6+
import net.minecraft.world.level.Level;
7+
import net.minecraft.world.level.block.state.BlockState;
8+
import net.minecraft.world.phys.Vec3;
9+
import team.lodestar.lodestone.helpers.DataHelper;
10+
import team.lodestar.lodestone.helpers.VecHelper;
11+
import team.lodestar.lodestone.modules.core.easing.Easing;
12+
import team.lodestar.lodestone.modules.toolkit.blockentity.LodestoneBlockEntity;
13+
import team.lodestar.lodestone.modules.toolkit.inventory.ItemStackHandlerItemDisplayData;
14+
import team.lodestar.lodestone.modules.toolkit.inventory.LodestoneItemStackBlockHandler;
15+
16+
public class SpiritAltarSpiritDisplayData extends ItemStackHandlerItemDisplayData {
17+
18+
protected static final int WARMUP_DURATION = 30;
19+
20+
protected final SpiritAltarBlockEntity altar;
21+
public int warmupTicks;
22+
23+
public SpiritAltarSpiritDisplayData(LodestoneItemStackBlockHandler parent) {
24+
super(parent, 2f, 0.2f, 0.01f, 0.025f);
25+
altar = (SpiritAltarBlockEntity) parent.getParent();
26+
}
27+
28+
@Override
29+
public void tick(LodestoneBlockEntity parent, Level level, BlockPos pos, BlockState state) {
30+
int target = altar.possibleRecipes.isEmpty() ? 0 : WARMUP_DURATION;
31+
warmupTicks = DataHelper.approach(warmupTicks, target, 1);
32+
super.tick(parent, level, pos, state);
33+
turn += getSpinUp(Easing.SINE_IN_OUT) * 0.05f + altar.speed * 0.5f;
34+
}
35+
36+
@Override
37+
public float getDistanceForItem(ItemDisplayDataEntry item, int index, float total) {
38+
float angle = item.getAngle(0);
39+
float distanceOscillation = Mth.sin(angle) * 0.025f;
40+
return 1 - getSpinUp(Easing.SINE_OUT) * 0.25f + distanceOscillation;
41+
}
42+
43+
@Override
44+
public float getLiftForItem(ItemDisplayDataEntry item, int index, float total) {
45+
return 0.75f + getSpinUp(Easing.QUARTIC_OUT) * getSpinUp(Easing.BACK_OUT) * 0.5f;
46+
}
47+
48+
@Override
49+
public Vec3 getDisplayCenter(LodestoneBlockEntity parent, float partialTicks) {
50+
return super.getDisplayCenter(parent, partialTicks);
51+
}
52+
53+
public float getSpinUp(Easing easing) {
54+
return easing.ease(warmupTicks / (float)WARMUP_DURATION, 0, 1, 1);
55+
}
56+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.sammy.malum.common.block.storage;
2+
3+
import com.sammy.malum.common.block.curiosities.spirit_altar.SpiritAltarBlockEntity;
4+
import net.minecraft.core.BlockPos;
5+
import net.minecraft.util.Mth;
6+
import net.minecraft.world.level.Level;
7+
import net.minecraft.world.level.block.state.BlockState;
8+
import net.minecraft.world.phys.Vec3;
9+
import team.lodestar.lodestone.helpers.DataHelper;
10+
import team.lodestar.lodestone.modules.core.easing.Easing;
11+
import team.lodestar.lodestone.modules.toolkit.blockentity.LodestoneBlockEntity;
12+
import team.lodestar.lodestone.modules.toolkit.inventory.ItemStackHandlerItemDisplayData;
13+
import team.lodestar.lodestone.modules.toolkit.inventory.LodestoneItemStackBlockHandler;
14+
15+
public class ItemHolderItemDisplayData extends ItemStackHandlerItemDisplayData {
16+
17+
public ItemHolderItemDisplayData(LodestoneItemStackBlockHandler parent) {
18+
super(parent, 16f, 0.2f, 0.01f, 0.025f);
19+
}
20+
21+
@Override
22+
public float getDistanceForItem(ItemDisplayDataEntry item, int index, float total) {
23+
return (1 - (item.getAge() / 40f)) * 0.25f;
24+
}
25+
26+
@Override
27+
public Vec3 getDisplayCenter(LodestoneBlockEntity parent, float partialTicks) {
28+
BlockPos pos = parent.getBlockPos();
29+
return new Vec3(pos.getX() + 0.5f, pos.getY() + 1.25f, pos.getZ() + 0.5f);
30+
}
31+
}

0 commit comments

Comments
 (0)