Skip to content

Commit 371905d

Browse files
Add dispenser and cauldron interactivity
Dispensers can now interact with any type of cauldron as a player does As a result, coffee production can now be fully automated when combined with civets
1 parent 25b2880 commit 371905d

File tree

4 files changed

+66
-0
lines changed

4 files changed

+66
-0
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package net.chikorita_lover.caffeinated.block;
2+
3+
import net.chikorita_lover.caffeinated.Caffeinated;
4+
import net.fabricmc.fabric.api.entity.FakePlayer;
5+
import net.minecraft.block.AbstractCauldronBlock;
6+
import net.minecraft.block.BlockState;
7+
import net.minecraft.block.DispenserBlock;
8+
import net.minecraft.block.dispenser.FallibleItemDispenserBehavior;
9+
import net.minecraft.item.ItemStack;
10+
import net.minecraft.server.world.ServerWorld;
11+
import net.minecraft.util.Hand;
12+
import net.minecraft.util.ItemActionResult;
13+
import net.minecraft.util.hit.BlockHitResult;
14+
import net.minecraft.util.math.BlockPointer;
15+
import net.minecraft.util.math.BlockPos;
16+
import net.minecraft.util.math.Direction;
17+
18+
public class CauldronDispenserBehavior extends FallibleItemDispenserBehavior {
19+
public static final CauldronDispenserBehavior INSTANCE = new CauldronDispenserBehavior();
20+
21+
@Override
22+
protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) {
23+
ServerWorld world = pointer.world();
24+
Direction facing = pointer.state().get(DispenserBlock.FACING);
25+
BlockPos pos = pointer.pos().offset(facing);
26+
BlockState state = world.getBlockState(pos);
27+
if (state.getBlock() instanceof AbstractCauldronBlock) {
28+
FakePlayer player = FakePlayer.get(world);
29+
player.getInventory().clear();
30+
player.setStackInHand(Hand.MAIN_HAND, stack);
31+
ItemActionResult result = state.onUseWithItem(stack, world, player, Hand.MAIN_HAND, new BlockHitResult(pos.toCenterPos(), facing.getOpposite(), pos, false));
32+
this.setSuccess(result.isAccepted());
33+
if (this.isSuccess()) {
34+
stack = player.getStackInHand(Hand.MAIN_HAND);
35+
player.setStackInHand(Hand.MAIN_HAND, ItemStack.EMPTY);
36+
player.getInventory().main.forEach(stackx -> this.addStackOrSpawn(pointer, stackx));
37+
}
38+
}
39+
return stack;
40+
}
41+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package net.chikorita_lover.caffeinated.mixin;
2+
3+
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
4+
import net.chikorita_lover.caffeinated.block.CauldronDispenserBehavior;
5+
import net.minecraft.block.AbstractCauldronBlock;
6+
import net.minecraft.block.BlockState;
7+
import net.minecraft.block.DispenserBlock;
8+
import net.minecraft.block.dispenser.DispenserBehavior;
9+
import net.minecraft.server.world.ServerWorld;
10+
import net.minecraft.util.math.BlockPos;
11+
import org.spongepowered.asm.mixin.Mixin;
12+
import org.spongepowered.asm.mixin.injection.At;
13+
14+
@Mixin(DispenserBlock.class)
15+
public class DispenserBlockMixin {
16+
@ModifyExpressionValue(method = "dispense", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/DispenserBlock;getBehaviorForItem(Lnet/minecraft/world/World;Lnet/minecraft/item/ItemStack;)Lnet/minecraft/block/dispenser/DispenserBehavior;"))
17+
private DispenserBehavior getCauldronBehavior(DispenserBehavior behavior, ServerWorld world, BlockState state, BlockPos pos) {
18+
if (world.getBlockState(pos.offset(state.get(DispenserBlock.FACING))).getBlock() instanceof AbstractCauldronBlock) {
19+
return CauldronDispenserBehavior.INSTANCE;
20+
}
21+
return behavior;
22+
}
23+
}

src/main/resources/caffeinated.accesswidener

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ accessible field net/minecraft/loot/entry/ItemEntry item Lnet/minecraft/registry
99
accessible field net/minecraft/loot/LootPool$Builder entries Lcom/google/common/collect/ImmutableList$Builder;
1010
mutable field net/minecraft/loot/LootPool$Builder entries Lcom/google/common/collect/ImmutableList$Builder;
1111
accessible method net/minecraft/block/AbstractCauldronBlock getFluidHeight (Lnet/minecraft/block/BlockState;)D
12+
accessible method net/minecraft/block/dispenser/ItemDispenserBehavior addStackOrSpawn (Lnet/minecraft/util/math/BlockPointer;Lnet/minecraft/item/ItemStack;)V

src/main/resources/caffeinated.mixins.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"package": "net.chikorita_lover.caffeinated.mixin",
55
"compatibilityLevel": "JAVA_21",
66
"mixins": [
7+
"DispenserBlockMixin",
78
"GrowCropsGoalMixin",
89
"HungerManagerMixin",
910
"ItemMixin",

0 commit comments

Comments
 (0)