22
33import com .sammy .malum .common .block .MalumBlockItemStackHandler ;
44import com .sammy .malum .common .block .storage .IMalumSpecialItemAccessPoint ;
5+ import com .sammy .malum .common .block .storage .ItemHolderItemDisplayData ;
56import com .sammy .malum .common .recipe .SpiritInfusionRecipe ;
67import com .sammy .malum .core .systems .recipe .SpiritBasedRecipeInput ;
78import com .sammy .malum .registry .common .MalumParticleEffectTypes ;
1718import net .minecraft .nbt .CompoundTag ;
1819import net .minecraft .server .level .ServerLevel ;
1920import net .minecraft .sounds .SoundSource ;
20- import net .minecraft .util .Mth ;
2121import net .minecraft .world .InteractionHand ;
2222import net .minecraft .world .ItemInteractionResult ;
2323import net .minecraft .world .entity .item .ItemEntity ;
2424import net .minecraft .world .entity .player .Player ;
2525import net .minecraft .world .item .ItemStack ;
2626import net .minecraft .world .level .*;
2727import net .minecraft .world .level .block .entity .BlockEntity ;
28- import net .minecraft .world .level .block .entity .BlockEntityType ;
2928import net .minecraft .world .level .block .state .BlockState ;
3029import net .minecraft .world .phys .*;
3130import net .neoforged .neoforge .common .crafting .SizedIngredient ;
3433import team .lodestar .lodestone .helpers .*;
3534import team .lodestar .lodestone .helpers .block .*;
3635import team .lodestar .lodestone .modules .toolkit .blockentity .*;
37- import team .lodestar .lodestone .modules .core .easing .Easing ;
3836import team .lodestar .lodestone .modules .toolkit .inventory .ItemStackMultiHandler ;
39- import team .lodestar .lodestone .modules .toolkit .inventory .LodestoneItemStackHandler ;
4037import team .lodestar .lodestone .modules .toolkit .recipe .LodestoneRecipeSearch ;
41- import team .lodestar .lodestone .modules .toolkit .recipe .LodestoneRecipeType ;
4238
4339import javax .annotation .Nullable ;
4440import java .util .*;
4541
42+ @ SuppressWarnings ("NullableProblems" )
4643public 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}
0 commit comments