Skip to content

Commit 62a32e5

Browse files
committed
v. 1.21.7 BlockEntity work
1 parent f97f45e commit 62a32e5

27 files changed

Lines changed: 477 additions & 31 deletions

src/main/java/com/github/aechtrob/prehistoricnature/PrehistoricNature.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import com.github.aechtrob.prehistoricnature.entity.entity.render.PNBenchEntityRenderer;
1313
import com.github.aechtrob.prehistoricnature.entity.entity.render.PNBoatChestRenderer;
1414
import com.github.aechtrob.prehistoricnature.entity.entity.render.PNBoatRenderer;
15+
import com.github.aechtrob.prehistoricnature.gui.ModGUIs;
16+
import com.github.aechtrob.prehistoricnature.gui.modgui.CentrifugeScreen;
1517
import com.github.aechtrob.prehistoricnature.item.ModItems;
1618
import com.github.aechtrob.prehistoricnature.util.EnvelopeStatus;
1719
import com.github.aechtrob.prehistoricnature.util.PNWoodTypes;
@@ -65,6 +67,7 @@
6567
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
6668
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
6769
import net.neoforged.neoforge.client.event.EntityRenderersEvent;
70+
import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent;
6871
import net.neoforged.neoforge.client.event.RegisterRangeSelectItemModelPropertyEvent;
6972
import net.neoforged.neoforge.common.NeoForge;
7073
import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent;
@@ -180,6 +183,8 @@ public PrehistoricNature(IEventBus modEventBus, ModContainer modContainer)
180183
ModConfiguredFeatures.register(modEventBus);
181184
ModFeatures.register(modEventBus);
182185

186+
ModGUIs.register(modEventBus);
187+
183188

184189
// Register the item to a creative tab
185190
modEventBus.addListener(this::addCreative);
@@ -284,5 +289,10 @@ public static void onClientSetup(EntityRenderersEvent.RegisterLayerDefinitions e
284289

285290

286291
}
292+
293+
@SubscribeEvent
294+
public static void registerGUI(RegisterMenuScreensEvent event) {
295+
event.register(ModGUIs.CENTRIFUGE_GUI.get(), CentrifugeScreen::new);
296+
}
287297
}
288298
}

src/main/java/com/github/aechtrob/prehistoricnature/block/BlockDNARecombinerCentrifuge.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,13 @@
66
import com.mojang.serialization.MapCodec;
77
import net.minecraft.core.BlockPos;
88
import net.minecraft.core.Direction;
9+
import net.minecraft.network.chat.Component;
10+
import net.minecraft.server.level.ServerLevel;
11+
import net.minecraft.server.level.ServerPlayer;
912
import net.minecraft.util.RandomSource;
13+
import net.minecraft.world.InteractionResult;
14+
import net.minecraft.world.SimpleMenuProvider;
15+
import net.minecraft.world.entity.player.Player;
1016
import net.minecraft.world.item.context.BlockPlaceContext;
1117
import net.minecraft.world.level.BlockGetter;
1218
import net.minecraft.world.level.Level;
@@ -22,6 +28,7 @@
2228
import net.minecraft.world.level.block.state.properties.EnumProperty;
2329
import net.minecraft.world.level.block.state.properties.Property;
2430
import net.minecraft.world.level.material.FluidState;
31+
import net.minecraft.world.phys.BlockHitResult;
2532
import net.minecraft.world.phys.shapes.CollisionContext;
2633
import net.minecraft.world.phys.shapes.Shapes;
2734
import net.minecraft.world.phys.shapes.VoxelShape;
@@ -50,6 +57,17 @@ protected MapCodec<? extends Block> codec() {
5057
return CODEC;
5158
}
5259

60+
@Override
61+
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) {
62+
if (level.getBlockEntity(pos) instanceof BlockEntityDNARecombinerCentrifuge centrifuge) {
63+
if (level instanceof ServerLevel serverlevel) {
64+
((ServerPlayer) player).openMenu(new SimpleMenuProvider(centrifuge, Component.literal("centrifuge")), pos);
65+
}
66+
return InteractionResult.SUCCESS;
67+
}
68+
return super.useWithoutItem(state, level, pos, player, hitResult);
69+
}
70+
5371
@Override
5472
public boolean hidesNeighborFace(BlockGetter level, BlockPos pos, BlockState state, BlockState neighborState, Direction dir) {
5573
if (dir != Direction.DOWN) {

src/main/java/com/github/aechtrob/prehistoricnature/entity/blockentity/BlockEntityDNARecombinerCentrifuge.java

Lines changed: 100 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,39 +3,72 @@
33
import com.github.aechtrob.prehistoricnature.PrehistoricNatureConfig;
44
import com.github.aechtrob.prehistoricnature.block.BlockDNARecombinerCentrifuge;
55
import com.github.aechtrob.prehistoricnature.block.ModBlocks;
6+
import com.github.aechtrob.prehistoricnature.gui.modgui.CentrifugeGUI;
7+
import com.github.aechtrob.prehistoricnature.item.ModItems;
68
import com.github.aechtrob.prehistoricnature.util.PNTags;
79
import net.minecraft.core.BlockPos;
810
import net.minecraft.core.Direction;
911
import net.minecraft.core.HolderLookup;
1012
import net.minecraft.core.NonNullList;
1113
import net.minecraft.nbt.CompoundTag;
1214
import net.minecraft.network.Connection;
15+
import net.minecraft.network.chat.Component;
1316
import net.minecraft.network.protocol.Packet;
1417
import net.minecraft.network.protocol.game.ClientGamePacketListener;
1518
import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket;
19+
import net.minecraft.sounds.SoundEvent;
1620
import net.minecraft.sounds.SoundEvents;
1721
import net.minecraft.sounds.SoundSource;
1822
import net.minecraft.world.Container;
1923
import 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;
2226
import net.minecraft.world.entity.player.Player;
27+
import net.minecraft.world.inventory.AbstractContainerMenu;
2328
import net.minecraft.world.item.ItemStack;
2429
import net.minecraft.world.level.Level;
30+
import net.minecraft.world.level.block.Block;
2531
import net.minecraft.world.level.block.entity.BlockEntity;
32+
import net.minecraft.world.level.block.entity.ContainerOpenersCounter;
2633
import net.minecraft.world.level.block.state.BlockState;
2734
import net.minecraft.world.level.storage.ValueInput;
2835
import net.minecraft.world.level.storage.ValueOutput;
29-
import net.minecraft.world.phys.AABB;
3036
import net.neoforged.neoforge.capabilities.Capabilities;
3137
import net.neoforged.neoforge.capabilities.ICapabilityProvider;
3238
import net.neoforged.neoforge.energy.IEnergyStorage;
39+
import org.jetbrains.annotations.Nullable;
3340

3441
import 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
}

src/main/java/com/github/aechtrob/prehistoricnature/entity/blockentity/model/DNARecombinerCentrifugePhialModel.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ public class DNARecombinerCentrifugePhialModel<T extends BlockEntityDNARecombine
1717
public static final ModelLayerLocation LAYER_LOCATION =
1818
new ModelLayerLocation(ResourceLocation.fromNamespaceAndPath(PrehistoricNature.MODID, "dna_recombiner_centrifuge_phial"), "main");
1919

20-
private final ModelPart phial1centre;
21-
private final ModelPart phial1pivot;
20+
public final ModelPart phial1centre;
21+
public final ModelPart phial1pivot;
2222

2323
public DNARecombinerCentrifugePhialModel(ModelPart root) {
2424
super(root);
@@ -32,7 +32,7 @@ public static LayerDefinition createBodyLayer() {
3232

3333
PartDefinition phial1centre = partdefinition.addOrReplaceChild("phial1centre", CubeListBuilder.create(), PartPose.offset(0.0F, 14.5F, 0.0F));
3434

35-
PartDefinition phial1pivot = phial1centre.addOrReplaceChild("phial1pivot", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0F, -2.0F));
35+
PartDefinition phial1pivot = phial1centre.addOrReplaceChild("phial1pivot", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0F, -5.5F));
3636

3737
PartDefinition phial1b_r1 = phial1pivot.addOrReplaceChild("phial1b_r1", CubeListBuilder.create().texOffs(0, -4).addBox(0.0F, -4.0F, -2.0F, 0.0F, 8.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 3.0F, 0.0F, 0.0F, 0.7854F, 0.0F));
3838

0 commit comments

Comments
 (0)