Skip to content

Commit 11ba670

Browse files
committed
feat: add animated progress arrow for recipe machines in WTHIT/WAILA tooltip
1 parent e1c0272 commit 11ba670

File tree

3 files changed

+69
-3
lines changed

3 files changed

+69
-3
lines changed

src/main/java/dev/galacticraft/machinelib/api/block/entity/BasicRecipeMachineBlockEntity.java

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@
3636
import net.minecraft.world.level.block.state.BlockState;
3737
import org.jetbrains.annotations.NotNull;
3838

39+
import java.util.ArrayList;
40+
import java.util.List;
41+
3942
/**
4043
* A machine block entity that processes recipes.
4144
*
@@ -45,6 +48,10 @@
4548
public abstract class BasicRecipeMachineBlockEntity<I extends RecipeInput, R extends Recipe<I>> extends RecipeMachineBlockEntity<I, R> {
4649
protected final SlottedStorageAccess<Item, ItemResourceSlot> inputSlots;
4750
protected final SlottedStorageAccess<Item, ItemResourceSlot> outputSlots;
51+
protected final int inputSlotsStart;
52+
protected final int outputSlotsStart;
53+
protected final int inputSlotsLen;
54+
protected final int outputSlotsLen;
4855

4956
/**
5057
* Constructs a new machine block entity that processes recipes.
@@ -90,11 +97,35 @@ protected BasicRecipeMachineBlockEntity(BlockEntityType<? extends BasicRecipeMac
9097
* @param outputSlotsLen The number of recipe output slots.
9198
*/
9299
protected BasicRecipeMachineBlockEntity(BlockEntityType<? extends BasicRecipeMachineBlockEntity<I, R>> type,
93-
BlockPos pos, BlockState state, RecipeType<R> recipeType, StorageSpec spec, int inputSlots, int inputSlotsLen, int outputSlots, int outputSlotsLen) {
100+
BlockPos pos, BlockState state, RecipeType<R> recipeType, StorageSpec spec,
101+
int inputSlots, int inputSlotsLen, int outputSlots, int outputSlotsLen) {
94102
super(type, pos, state, recipeType, spec);
95103

96104
this.inputSlots = this.itemStorage().subStorage(inputSlots, inputSlotsLen);
97105
this.outputSlots = this.itemStorage().subStorage(outputSlots, outputSlotsLen);
106+
107+
this.inputSlotsStart = inputSlots;
108+
this.inputSlotsLen = inputSlotsLen;
109+
this.outputSlotsStart = outputSlots;
110+
this.outputSlotsLen = outputSlotsLen;
111+
}
112+
113+
@Override
114+
public List<ItemStack> inputItemStacks() {
115+
List<ItemStack> items = new ArrayList<>();
116+
for (int i = 0; i < this.inputSlotsLen; i++) {
117+
items.add(this.itemStorage().getItem(this.inputSlotsStart + i));
118+
}
119+
return items;
120+
}
121+
122+
@Override
123+
public List<ItemStack> outputItemStacks() {
124+
List<ItemStack> items = new ArrayList<>();
125+
for (int i = 0; i < this.outputSlotsLen; i++) {
126+
items.add(this.itemStorage().getItem(this.outputSlotsStart + i));
127+
}
128+
return items;
98129
}
99130

100131
@Override

src/main/java/dev/galacticraft/machinelib/api/block/entity/RecipeMachineBlockEntity.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import net.minecraft.nbt.CompoundTag;
3232
import net.minecraft.server.level.ServerLevel;
3333
import net.minecraft.util.profiling.ProfilerFiller;
34+
import net.minecraft.world.item.ItemStack;
3435
import net.minecraft.world.item.crafting.Recipe;
3536
import net.minecraft.world.item.crafting.RecipeHolder;
3637
import net.minecraft.world.item.crafting.RecipeInput;
@@ -43,6 +44,8 @@
4344
import org.jetbrains.annotations.NotNull;
4445
import org.jetbrains.annotations.Nullable;
4546

47+
import java.util.List;
48+
4649
/**
4750
* A machine block entity that processes recipes.
4851
*
@@ -99,6 +102,18 @@ protected RecipeMachineBlockEntity(@NotNull BlockEntityType<? extends RecipeMach
99102
this.recipeType = recipeType;
100103
}
101104

105+
/**
106+
* {@return A list of the item stacks in the input slots.}
107+
*/
108+
@Contract(pure = true)
109+
public abstract List<ItemStack> inputItemStacks();
110+
111+
/**
112+
* {@return A list of the item stacks in the output slots.}
113+
*/
114+
@Contract(pure = true)
115+
public abstract List<ItemStack> outputItemStacks();
116+
102117
/**
103118
* An inventory for use in finding vanilla recipes for this machine.
104119
*
@@ -313,6 +328,14 @@ protected void setActiveRecipe(@Nullable RecipeHolder<R> recipe) {
313328
}
314329
}
315330

331+
/**
332+
* {@return the machine's progress from 0 to 1}
333+
*/
334+
@Contract(pure = true)
335+
public float getProgressRatio() {
336+
return ((float) this.getProgress()) / ((float) this.getProcessingTime(this.getActiveRecipe()));
337+
}
338+
316339
@Override
317340
protected void saveAdditional(CompoundTag tag, HolderLookup.Provider lookup) {
318341
super.saveAdditional(tag, lookup);

src/main/java/dev/galacticraft/machinelib/impl/compat/waila/MachineLibWailaPlugin.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@
2525
import com.mojang.authlib.GameProfile;
2626
import dev.galacticraft.machinelib.api.block.MachineBlock;
2727
import dev.galacticraft.machinelib.api.block.entity.MachineBlockEntity;
28+
import dev.galacticraft.machinelib.api.block.entity.RecipeMachineBlockEntity;
2829
import dev.galacticraft.machinelib.api.machine.configuration.RedstoneMode;
2930
import dev.galacticraft.machinelib.api.machine.configuration.SecuritySettings;
3031
import dev.galacticraft.machinelib.impl.Constant;
3132
import mcp.mobius.waila.api.*;
33+
import mcp.mobius.waila.api.data.ProgressData;
3234
import net.minecraft.network.chat.Component;
3335
import net.minecraft.world.level.block.entity.SkullBlockEntity;
3436

@@ -38,8 +40,18 @@ public class MachineLibWailaPlugin implements IWailaPlugin {
3840
@Override
3941
public void register(IRegistrar registrar) {
4042
registrar.addBlockData((IDataProvider<MachineBlockEntity>) (data, accessor, config) -> {
41-
data.raw().put("security", accessor.getTarget().getSecurity().createTag());
42-
data.raw().put("redstone", accessor.getTarget().getRedstoneMode().createTag());
43+
MachineBlockEntity machine = accessor.getTarget();
44+
data.raw().put("security", machine.getSecurity().createTag());
45+
data.raw().put("redstone", machine.getRedstoneMode().createTag());
46+
if (machine instanceof RecipeMachineBlockEntity recipeMachine) {
47+
if (recipeMachine.getActiveRecipe() != null) {
48+
data.add(ProgressData.TYPE, res -> {
49+
res.add(ProgressData.ratio(recipeMachine.getProgressRatio())
50+
.input(recipeMachine.inputItemStacks())
51+
.output(recipeMachine.outputItemStacks()));
52+
});
53+
}
54+
}
4355
}, MachineBlock.class);
4456

4557
registrar.addComponent(new IBlockComponentProvider() {

0 commit comments

Comments
 (0)