33import com .github .aechtrob .prehistoricnature .PrehistoricNatureConfig ;
44import com .github .aechtrob .prehistoricnature .block .BlockDNARecombinerCentrifuge ;
55import com .github .aechtrob .prehistoricnature .block .ModBlocks ;
6+ import com .github .aechtrob .prehistoricnature .gui .modgui .CentrifugeGUI ;
7+ import com .github .aechtrob .prehistoricnature .item .ModItems ;
68import com .github .aechtrob .prehistoricnature .util .PNTags ;
79import net .minecraft .core .BlockPos ;
810import net .minecraft .core .Direction ;
911import net .minecraft .core .HolderLookup ;
1012import net .minecraft .core .NonNullList ;
1113import net .minecraft .nbt .CompoundTag ;
1214import net .minecraft .network .Connection ;
15+ import net .minecraft .network .chat .Component ;
1316import net .minecraft .network .protocol .Packet ;
1417import net .minecraft .network .protocol .game .ClientGamePacketListener ;
1518import net .minecraft .network .protocol .game .ClientboundBlockEntityDataPacket ;
19+ import net .minecraft .sounds .SoundEvent ;
1620import net .minecraft .sounds .SoundEvents ;
1721import net .minecraft .sounds .SoundSource ;
1822import net .minecraft .world .Container ;
1923import net .minecraft .world .ContainerHelper ;
20- import net .minecraft .world .entity . Entity ;
21- import net .minecraft .world .entity .EntitySelector ;
24+ import net .minecraft .world .MenuProvider ;
25+ import net .minecraft .world .entity .player . Inventory ;
2226import net .minecraft .world .entity .player .Player ;
27+ import net .minecraft .world .inventory .AbstractContainerMenu ;
2328import net .minecraft .world .item .ItemStack ;
2429import net .minecraft .world .level .Level ;
30+ import net .minecraft .world .level .block .Block ;
2531import net .minecraft .world .level .block .entity .BlockEntity ;
32+ import net .minecraft .world .level .block .entity .ContainerOpenersCounter ;
2633import net .minecraft .world .level .block .state .BlockState ;
2734import net .minecraft .world .level .storage .ValueInput ;
2835import net .minecraft .world .level .storage .ValueOutput ;
29- import net .minecraft .world .phys .AABB ;
3036import net .neoforged .neoforge .capabilities .Capabilities ;
3137import net .neoforged .neoforge .capabilities .ICapabilityProvider ;
3238import net .neoforged .neoforge .energy .IEnergyStorage ;
39+ import org .jetbrains .annotations .Nullable ;
3340
3441import java .util .Iterator ;
3542
36- public class BlockEntityDNARecombinerCentrifuge extends BlockEntity implements Container , IEnergyStorage {
37- private NonNullList <ItemStack > centrifugeContents ;
43+ public class BlockEntityDNARecombinerCentrifuge extends BlockEntity implements Container , IEnergyStorage , MenuProvider {
44+ public NonNullList <ItemStack > centrifugeContents ;
45+ private final ContainerOpenersCounter openersCounter = new ContainerOpenersCounter () {
46+ @ Override
47+ protected void onOpen (Level level , BlockPos pos , BlockState state ) {
48+ BlockEntityDNARecombinerCentrifuge .playSound (level , pos , state , SoundEvents .CHEST_OPEN );
49+ }
50+
51+ @ Override
52+ protected void onClose (Level level , BlockPos pos , BlockState state ) {
53+ BlockEntityDNARecombinerCentrifuge .playSound (level , pos , state , SoundEvents .CHEST_CLOSE );
54+ }
55+
56+ @ Override
57+ protected void openerCountChanged (Level level , BlockPos pos , BlockState state , int p_155364_ , int p_155365_ ) {
58+ BlockEntityDNARecombinerCentrifuge .this .signalOpenCount (level , pos , state , p_155364_ , p_155365_ );
59+ }
3860
61+ @ Override
62+ protected boolean isOwnContainer (Player player ) {
63+ if (!(player .containerMenu instanceof CentrifugeGUI )) {
64+ return false ;
65+ } else {
66+ Container container = ((CentrifugeGUI )player .containerMenu ).getContainer ();
67+ return container == BlockEntityDNARecombinerCentrifuge .this ;
68+ }
69+ }
70+ };
71+
3972 protected boolean isLocked ;
4073 protected boolean isProcessing ;
4174 public int processTick ;
@@ -56,14 +89,42 @@ public class BlockEntityDNARecombinerCentrifuge extends BlockEntity implements C
5689
5790 public BlockEntityDNARecombinerCentrifuge (BlockPos pos , BlockState blockState ) {
5891 super (ModBlockEntities .CENTRIFUGE .get (), pos , blockState );
59- this .centrifugeContents = NonNullList .withSize (this .getContainerSize (), ItemStack .EMPTY );
92+ this .centrifugeContents = net . minecraft . core . NonNullList .withSize (this .getContainerSize (), ItemStack .EMPTY );
6093 }
6194
6295 @ Override
6396 public int getContainerSize () {
6497 return 4 ;
6598 }
99+
100+ @ Override
101+ public void startOpen (Player player ) {
102+ if (!this .remove && !player .isSpectator ()) {
103+ this .openersCounter .incrementOpeners (player , this .getLevel (), this .getBlockPos (), this .getBlockState ());
104+ }
105+ }
106+
107+ @ Override
108+ public void stopOpen (Player player ) {
109+ if (!this .remove && !player .isSpectator ()) {
110+ this .openersCounter .decrementOpeners (player , this .getLevel (), this .getBlockPos (), this .getBlockState ());
111+ }
112+ }
113+
114+ public void updateOpeners () {
115+ this .numPlayersUsing = this .openersCounter .getOpenerCount ();
116+ }
117+
118+ static void playSound (Level level , BlockPos pos , BlockState state , SoundEvent sound ) {
119+ level .playSound (null , pos .getX () + 0.5 , pos .getY (), pos .getZ () + 0.5 , sound , SoundSource .BLOCKS , 0.5F , level .random .nextFloat () * 0.1F + 0.9F );
120+ }
66121
122+ protected void signalOpenCount (Level level , BlockPos pos , BlockState state , int eventId , int eventParam ) {
123+ Block block = state .getBlock ();
124+ level .blockEvent (pos , block , 1 , eventParam );
125+ this .numPlayersUsing = openersCounter .getOpenerCount ();
126+ }
127+
67128 public double getHatchVal () {
68129 return this .hatchVal ;
69130 }
@@ -121,6 +182,14 @@ public void setItem(int index, ItemStack stack) {
121182 this .setChanged ();
122183 }
123184
185+ @ Override
186+ public boolean canPlaceItem (int slot , ItemStack stack ) {
187+ if (stack .getItem () != ModItems .PHIAL .get ()) {
188+ return false ;
189+ }
190+ return Container .super .canPlaceItem (slot , stack );
191+ }
192+
124193 @ Override
125194 public boolean stillValid (Player player ) {
126195 return true ;
@@ -167,7 +236,7 @@ protected void loadAdditional(ValueInput input) {
167236 this .hatchVal = input .getDoubleOr ("hatchVal" , 0.0D );
168237 this .isProcessing = input .getBooleanOr ("isProcessing" , false );
169238 this .startTick = input .getLongOr ("startTick" , 0L );
170- this .centrifugeContents = NonNullList .<ItemStack >withSize (this .getContainerSize (), ItemStack .EMPTY );
239+ this .centrifugeContents = net . minecraft . core . NonNullList .<ItemStack >withSize (this .getContainerSize (), ItemStack .EMPTY );
171240 ContainerHelper .loadAllItems (input , this .centrifugeContents );
172241 }
173242
@@ -239,22 +308,22 @@ public static <T extends BlockEntity> void tick(Level level, BlockPos blockPos,
239308 int k = blockPos .getZ ();
240309 ++entity .ticksSinceSync ;
241310 if (!entity .isLocked ) {
242- if (!level .isClientSide && entity .numPlayersUsing != 0 && (entity .ticksSinceSync + i + j + k ) % 200 == 0 ) {
243- entity .numPlayersUsing = 0 ;
244- float f = 5.0F ;
245-
246- for (Entity entityplayer : level .getEntities ((Entity )null , new AABB ((double ) ((float ) i - 5.0F ), (double ) ((float ) j - 5.0F ), (double ) ((float ) k - 5.0F ), (double ) ((float ) (i + 1 ) + 5.0F ), (double ) ((float ) (j + 1 ) + 5.0F ), (double ) ((float ) (k + 1 ) + 5.0F )),
247- EntitySelector .CONTAINER_ENTITY_SELECTOR )) {
248- // if (entityplayer.openContainer instanceof GUIDNACentrifuge.GUILepidodendronDNACentrifuge) {
249- // IInventory iinventory = ((GUIDNACentrifuge.GUILepidodendronDNACentrifuge) entityplayer.openContainer).getLowerChestInventory();
311+ // if (!level.isClientSide && entity.numPlayersUsing != 0 && (entity.ticksSinceSync + i + j + k) % 200 == 0) {
312+ // entity.numPlayersUsing = 0;
313+ //// float f = 5.0F;
314+ ////
315+ //// for (Entity entityOpener : level.getEntities((Entity)null, new AABB((double) ((float) i - 5.0F), (double) ((float) j - 5.0F), (double) ((float) k - 5.0F), (double) ((float) (i + 1) + 5.0F), (double) ((float) (j + 1) + 5.0F), (double) ((float) (k + 1) + 5.0F)),
316+ //// EntitySelector.CONTAINER_ENTITY_SELECTOR)) {
317+ //// if (entityOpener. .container .openContainer instanceof GUIDNACentrifuge.GUILepidodendronDNACentrifuge) {
318+ //// IInventory iinventory = ((GUIDNACentrifuge.GUILepidodendronDNACentrifuge) entityOpener.openContainer).getLowerChestInventory();
319+ ////
320+ //// if (iinventory == entity) {
321+ //// ++entity.numPlayersUsing;
322+ //// }
323+ //// }
324+ //// }
250325//
251- // if (iinventory == entity) {
252- // ++entity.numPlayersUsing;
253- // }
254- // }
255- }
256-
257- }
326+ // }
258327
259328 entity .prevLidAngle = entity .lidAngle ;
260329 float f1 = 0.1F ;
@@ -596,4 +665,13 @@ public double getEnergyFraction() {
596665 return 0 ;
597666 }
598667
668+ @ Override
669+ public Component getDisplayName () {
670+ return Component .literal ("centrifuge" );
671+ }
672+
673+ @ Override
674+ public @ Nullable AbstractContainerMenu createMenu (int i , Inventory inventory , Player player ) {
675+ return new CentrifugeGUI (i , inventory , this );
676+ }
599677}
0 commit comments