Skip to content

Commit c0f8858

Browse files
committed
feat: Add chicken feed slot to the Chicken Sink, for double egg speed
1 parent da30688 commit c0f8858

4 files changed

Lines changed: 67 additions & 45 deletions

File tree

common/src/main/java/net/blay09/mods/cookingforblockheads/block/entity/ChickenSinkBlockEntity.java

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import net.blay09.mods.balm.world.BalmContainerProvider;
44
import net.blay09.mods.balm.world.BalmMenuProvider;
5+
import net.blay09.mods.balm.world.ContainerUtils;
56
import net.blay09.mods.balm.world.DefaultContainer;
7+
import net.blay09.mods.balm.world.SubContainer;
68
import net.blay09.mods.balm.world.level.block.entity.BalmBlockEntityUtils;
79
import net.blay09.mods.cookingforblockheads.api.KitchenItemProvider;
810
import net.blay09.mods.cookingforblockheads.block.entity.util.TransferableBlockEntity;
@@ -26,6 +28,7 @@
2628
import net.minecraft.server.level.ServerPlayer;
2729
import net.minecraft.sounds.SoundEvents;
2830
import net.minecraft.sounds.SoundSource;
31+
import net.minecraft.tags.ItemTags;
2932
import net.minecraft.util.Mth;
3033
import net.minecraft.util.RandomSource;
3134
import net.minecraft.util.Unit;
@@ -49,13 +52,15 @@ public class ChickenSinkBlockEntity extends BlockEntity implements BalmMenuProvi
4952

5053
private static final int SYNC_INTERVAL = 10;
5154

52-
private final DefaultContainer container = new DefaultContainer(5) {
55+
private final DefaultContainer container = new DefaultContainer(6) {
5356
@Override
5457
public void setChanged() {
5558
ChickenSinkBlockEntity.this.setChanged();
5659
}
5760
};
58-
private final KitchenItemProvider itemProvider = new ContainerKitchenItemProvider(container);
61+
private final SubContainer feedContainer = new SubContainer(container, 0, 1);
62+
private final SubContainer eggContainer = new SubContainer(container, 1, 5);
63+
private final KitchenItemProvider itemProvider = new ContainerKitchenItemProvider(eggContainer);
5964

6065
private boolean isDirty;
6166
private int ticksSinceSync;
@@ -99,7 +104,7 @@ public void loadAdditional(ValueInput input) {
99104
input.child("ItemHandler").ifPresent(it -> ContainerHelper.loadAllItems(it, container.getItems()));
100105
customName = input.read("CustomName", ComponentSerialization.CODEC).orElse(null);
101106
eggLayTime = input.getIntOr("EggLayTime", 0);
102-
eggLayTimeTarget = input.getIntOr("EggLayTimeTarget", resolveEggLayTimeTarget());
107+
eggLayTimeTarget = input.getIntOr("EggLayTimeTarget", resolveEggLayTimeTarget(false));
103108
}
104109

105110
@Override
@@ -121,7 +126,7 @@ public void serverTick(Level level) {
121126
setChanged();
122127
} else if (CookingForBlockheadsRules.chickenSinkMayLayEgg.getOrDefault(this) && tryProduceEgg()) {
123128
eggLayTime = 0;
124-
eggLayTimeTarget = resolveEggLayTimeTarget();
129+
eggLayTimeTarget = resolveEggLayTimeTarget(true);
125130
setChanged();
126131
level.playSound(null, worldPosition, SoundEvents.CHICKEN_EGG, SoundSource.BLOCKS, 0.75f, Mth.nextFloat(level.getRandom(), 0.9f, 1.1f));
127132
}
@@ -137,29 +142,33 @@ public void serverTick(Level level) {
137142
}
138143

139144
private boolean tryProduceEgg() {
140-
for (int i = 0; i < container.getContainerSize(); i++) {
141-
final var slotStack = container.getItem(i);
142-
if (slotStack.isEmpty()) {
143-
container.setItem(i, new ItemStack(Items.EGG));
144-
return true;
145-
}
146-
if (slotStack.is(Items.EGG) && slotStack.getCount() < slotStack.getMaxStackSize()) {
147-
slotStack.grow(1);
148-
container.setChanged();
149-
return true;
150-
}
151-
}
152-
return false;
145+
return ContainerUtils.insertItemStacked(eggContainer, new ItemStack(Items.EGG), false).isEmpty();
153146
}
154147

155148
public int defaultEggLayTime() {
156-
final int minTime = 6000;
157-
final int maxTime = 12000;
149+
final int minTime = 12000;
150+
final int maxTime = 24000;
158151
return minTime + levelRandom().nextInt(maxTime - minTime + 1);
159152
}
160153

161-
private int resolveEggLayTimeTarget() {
162-
return Math.max(1, CookingForBlockheadsRules.chickenSinkEggLayTime.getOrDefault(this));
154+
private int resolveEggLayTimeTarget(boolean consumeFeed) {
155+
final var baseEggLayTime = Math.max(1, CookingForBlockheadsRules.chickenSinkEggLayTime.getOrDefault(this));
156+
if (consumeFeed && tryConsumeFeed()) {
157+
return Mth.ceil(baseEggLayTime / 2f);
158+
}
159+
160+
return baseEggLayTime;
161+
}
162+
163+
private boolean tryConsumeFeed() {
164+
final var seedStack = feedContainer.getItem(0);
165+
if (seedStack.is(ItemTags.CHICKEN_FOOD)) {
166+
seedStack.shrink(1);
167+
feedContainer.setChanged();
168+
return true;
169+
}
170+
171+
return false;
163172
}
164173

165174
private RandomSource levelRandom() {

common/src/main/java/net/blay09/mods/cookingforblockheads/menu/ChickenSinkMenu.java

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package net.blay09.mods.cookingforblockheads.menu;
22

3+
import net.blay09.mods.balm.world.inventory.QuickMove;
34
import net.blay09.mods.cookingforblockheads.block.ModBlocks;
5+
import net.minecraft.resources.Identifier;
6+
import net.minecraft.tags.ItemTags;
47
import net.minecraft.world.Container;
58
import net.minecraft.world.SimpleContainer;
69
import net.minecraft.world.entity.player.Inventory;
@@ -9,13 +12,17 @@
912
import net.minecraft.world.inventory.ContainerLevelAccess;
1013
import net.minecraft.world.inventory.Slot;
1114
import net.minecraft.world.item.ItemStack;
15+
import net.minecraft.world.item.Items;
16+
import org.jspecify.annotations.Nullable;
1217

1318
public class ChickenSinkMenu extends AbstractContainerMenu {
1419

15-
private static final int SLOT_COUNT = 5;
20+
private static final Identifier WHEAT_SEEDS_SLOT_ICON = Identifier.withDefaultNamespace("container/slot/wheat_seeds");
21+
private static final int SLOT_COUNT = 6;
1622

1723
private final Container container;
1824
private final ContainerLevelAccess access;
25+
private final QuickMove.Routing quickMove;
1926

2027
public ChickenSinkMenu(int windowId, Inventory playerInventory) {
2128
this(windowId, playerInventory, new SimpleContainer(SLOT_COUNT), ContainerLevelAccess.NULL);
@@ -28,8 +35,25 @@ public ChickenSinkMenu(int windowId, Inventory playerInventory, Container contai
2835
this.access = access;
2936
container.startOpen(playerInventory.player);
3037

31-
for (int i = 0; i < 5; i++) {
32-
addSlot(new Slot(container, i, 44 + i * 18, 20));
38+
addSlot(new Slot(container, 0, 26, 20) {
39+
@Override
40+
public boolean mayPlace(ItemStack itemStack) {
41+
return itemStack.is(ItemTags.CHICKEN_FOOD);
42+
}
43+
44+
@Override
45+
public Identifier getNoItemIcon() {
46+
return WHEAT_SEEDS_SLOT_ICON;
47+
}
48+
});
49+
50+
for (int i = 1; i < SLOT_COUNT; i++) {
51+
addSlot(new Slot(container, i, 62 + i * 18, 20) {
52+
@Override
53+
public boolean mayPlace(ItemStack itemStack) {
54+
return itemStack.is(Items.EGG);
55+
}
56+
});
3357
}
3458

3559

@@ -42,31 +66,20 @@ public ChickenSinkMenu(int windowId, Inventory playerInventory, Container contai
4266
for (int i = 0; i < 9; i++) {
4367
addSlot(new Slot(playerInventory, i, 8 + i * 18, 109));
4468
}
69+
70+
quickMove = QuickMove.create(this, this::moveItemStackTo)
71+
.slot("chicken_food", 0)
72+
.slotRange("eggs", 1, SLOT_COUNT)
73+
.disableDefaultRoutes()
74+
.route(QuickMove.CONTAINER, QuickMove.PLAYER, true)
75+
.route(it -> it.is(ItemTags.CHICKEN_FOOD), QuickMove.PLAYER, "chicken_food")
76+
.route(it -> it.is(Items.EGG), QuickMove.PLAYER, "eggs")
77+
.build();
4578
}
4679

4780
@Override
4881
public ItemStack quickMoveStack(Player player, int slotIndex) {
49-
ItemStack itemStack = ItemStack.EMPTY;
50-
Slot slot = slots.get(slotIndex);
51-
if (slot != null && slot.hasItem()) {
52-
ItemStack slotStack = slot.getItem();
53-
itemStack = slotStack.copy();
54-
if (slotIndex < 5) {
55-
if (!moveItemStackTo(slotStack, 5, slots.size(), true)) {
56-
return ItemStack.EMPTY;
57-
}
58-
} else if (!moveItemStackTo(slotStack, 0, 5, false)) {
59-
return ItemStack.EMPTY;
60-
}
61-
62-
if (slotStack.isEmpty()) {
63-
slot.set(ItemStack.EMPTY);
64-
} else {
65-
slot.setChanged();
66-
}
67-
}
68-
69-
return itemStack;
82+
return quickMove.transfer(this, player, slotIndex);
7083
}
7184

7285
@Override
4.37 KB
Loading
631 Bytes
Loading

0 commit comments

Comments
 (0)