22
33import net .blay09 .mods .balm .world .BalmContainerProvider ;
44import net .blay09 .mods .balm .world .BalmMenuProvider ;
5+ import net .blay09 .mods .balm .world .ContainerUtils ;
56import net .blay09 .mods .balm .world .DefaultContainer ;
7+ import net .blay09 .mods .balm .world .SubContainer ;
68import net .blay09 .mods .balm .world .level .block .entity .BalmBlockEntityUtils ;
79import net .blay09 .mods .cookingforblockheads .api .KitchenItemProvider ;
810import net .blay09 .mods .cookingforblockheads .block .entity .util .TransferableBlockEntity ;
2628import net .minecraft .server .level .ServerPlayer ;
2729import net .minecraft .sounds .SoundEvents ;
2830import net .minecraft .sounds .SoundSource ;
31+ import net .minecraft .tags .ItemTags ;
2932import net .minecraft .util .Mth ;
3033import net .minecraft .util .RandomSource ;
3134import 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 () {
0 commit comments