Skip to content

Commit 162ea29

Browse files
Merge pull request #1 from Frostbite-time/main
Complete the sink's capacity
2 parents 85e08fe + fec04e0 commit 162ea29

File tree

3 files changed

+72
-10
lines changed

3 files changed

+72
-10
lines changed

src/main/java/dev/mangojellypudding/independenttech/IndependentTech.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.mangojellypudding.independenttech;
22

33
import com.mojang.logging.LogUtils;
4+
import dev.mangojellypudding.independenttech.cookingforblockheads.block.entity.SinkBlockEntity;
45
import dev.mangojellypudding.independenttech.register.ITBlockEntityTypes;
56
import dev.mangojellypudding.independenttech.register.ITBlocks;
67
import dev.mangojellypudding.independenttech.register.ITCreativeModeTabs;
@@ -20,5 +21,7 @@ public IndependentTech(IEventBus modEventBus, ModContainer modContainer) {
2021
ITItems.ITEMS.register(modEventBus);
2122
ITCreativeModeTabs.CREATIVE_MODE_TABS.register(modEventBus);
2223
ITBlockEntityTypes.BLOCK_ENTITY_TYPES.register(modEventBus);
24+
25+
modEventBus.addListener(SinkBlockEntity::registerCapability); // 注册方块实体能力
2326
}
2427
}

src/main/java/dev/mangojellypudding/independenttech/cookingforblockheads/block/SinkBlock.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ protected ItemInteractionResult useItemOn(ItemStack itemStack, BlockState state,
8484
return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION;
8585
}
8686

87-
FluidActionResult result = FluidUtil.tryFillContainerAndStow(itemStack, sink.sinkTank, new InvWrapper(player.getInventory()), Integer.MAX_VALUE, player, true);
87+
FluidActionResult result = FluidUtil.tryFillContainerAndStow(itemStack, SinkBlockEntity.fluidHandler, new InvWrapper(player.getInventory()), Integer.MAX_VALUE, player, true);
8888

8989
// if (result.success) {
9090
//

src/main/java/dev/mangojellypudding/independenttech/cookingforblockheads/block/entity/SinkBlockEntity.java

Lines changed: 68 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,93 @@
77
import net.minecraft.world.level.block.entity.BlockEntityType;
88
import net.minecraft.world.level.block.state.BlockState;
99
import net.minecraft.world.level.material.Fluids;
10+
import net.neoforged.neoforge.capabilities.Capabilities;
11+
import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent;
1012
import net.neoforged.neoforge.fluids.FluidStack;
1113
import net.neoforged.neoforge.fluids.capability.IFluidHandler;
12-
import net.neoforged.neoforge.fluids.capability.templates.FluidTank;
14+
import org.jetbrains.annotations.NotNull;
1315

1416
public class SinkBlockEntity extends BlockEntity {
1517
private static final int SYNC_INTERVAL = 10;
1618

17-
public final FluidTank sinkTank = new FluidTank(16000) {
19+
// 这里水槽不包含实际内部状态,所以提供一个静态字段即可,不需要setChange和序列化保存
20+
public static final IFluidHandler fluidHandler = new IFluidHandler()
21+
{
22+
private static FluidStack WATER_STACK = new FluidStack(Fluids.WATER, Integer.MAX_VALUE);
23+
24+
// 防止有时被外界修改
25+
private void verifyStack()
26+
{
27+
if(WATER_STACK.getFluid() != Fluids.WATER || WATER_STACK.getAmount() != Integer.MAX_VALUE)
28+
WATER_STACK = new FluidStack(Fluids.WATER, Integer.MAX_VALUE);
29+
}
30+
31+
@Override
32+
public int getTanks()
33+
{
34+
return 1;
35+
}
36+
1837
@Override
19-
public FluidStack getFluid() {
20-
return new FluidStack(Fluids.WATER, Integer.MAX_VALUE);
38+
public @NotNull FluidStack getFluidInTank(int tank)
39+
{
40+
// 每次get都返回新实例有点耗性能,所以用个静态量
41+
verifyStack();
42+
return WATER_STACK;
2143
}
2244

2345
@Override
24-
public int getCapacity() {
46+
public int getTankCapacity(int tank)
47+
{
2548
return Integer.MAX_VALUE;
2649
}
2750

2851
@Override
29-
public FluidStack drain(FluidStack resource, IFluidHandler.FluidAction action) {
30-
return this.drain(resource.getAmount(), action);
52+
public boolean isFluidValid(int tank, @NotNull FluidStack fluidStack)
53+
{
54+
return true;
55+
}
56+
57+
// 返回实际填充量
58+
// fluidAction在这里用来检查是不是模拟操作
59+
// 如果是模拟操作,则不改变容器内状态,但是此处水槽本身无实际的内部状态,因此可以不管
60+
@Override
61+
public int fill(FluidStack fluidStack, @NotNull FluidAction fluidAction)
62+
{
63+
return fluidStack.getAmount(); // 如果想把它当流体垃圾桶
64+
//return 0; 不接受任何流体输入
65+
}
66+
67+
// 返回实际排出量
68+
@Override
69+
public @NotNull FluidStack drain(FluidStack fluidStack, @NotNull FluidAction fluidAction)
70+
{
71+
if(fluidStack.getFluid() == Fluids.WATER)
72+
return fluidStack.copy(); // 总是返回请求量
73+
return FluidStack.EMPTY;
3174
}
3275

33-
public FluidStack drain(int maxDrain, IFluidHandler.FluidAction action) {
34-
return getFluid();
76+
@Override
77+
public @NotNull FluidStack drain(int amount, FluidAction fluidAction)
78+
{
79+
if(amount > 0)
80+
return new FluidStack(Fluids.WATER, amount);
81+
return FluidStack.EMPTY;
3582
}
3683
};
3784

85+
// 注册能力,这里给你放到mod主类去注册了,回头你自己整理一下就行
86+
public static void registerCapability(RegisterCapabilitiesEvent event) {
87+
event.registerBlockEntity(
88+
Capabilities.FluidHandler.BLOCK,
89+
ITBlockEntityTypes.SINK.get(),
90+
(be, side) -> SinkBlockEntity.fluidHandler
91+
);
92+
}
93+
94+
// 如果需要主动输出能力,则在tick中自己使用level.getCapability获取对面的流体能力
95+
// 然后自行操作对方的流体容器,记得最好不要直接修改getFluidInTank拿到的实例,应该用fill和drain
96+
3897
private int ticksSinceSync;
3998

4099
public SinkBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState blockState) {

0 commit comments

Comments
 (0)