Skip to content

Commit e96cd4f

Browse files
committed
Add Mechanical Furnace block, menu, and associated functionalities
1 parent e0eaafa commit e96cd4f

22 files changed

+1926
-9
lines changed

src/main/java/net/roboxgamer/modernutils/ModernUtilsMod.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import net.roboxgamer.modernutils.block.entity.custom.renderer.MechanicalCrafterBlockEntityRenderer;
1515
import net.roboxgamer.modernutils.client.screen.MagicBlockScreen;
1616
import net.roboxgamer.modernutils.client.screen.MechanicalCrafterScreen;
17+
import net.roboxgamer.modernutils.client.screen.MechanicalFurnaceScreen;
1718
import net.roboxgamer.modernutils.client.screen.MiniChestScreen;
1819
import net.roboxgamer.modernutils.item.ModCreativeModTabs;
1920
import net.roboxgamer.modernutils.item.ModCustomDataComponents;
@@ -90,6 +91,7 @@ private void registerScreens(RegisterMenuScreensEvent event) {
9091
event.register(ModMenuTypes.MECHANICAL_CRAFTER_MENU.get(), MechanicalCrafterScreen::new);
9192
event.register(ModMenuTypes.MINI_CHEST_MENU.get(), MiniChestScreen::new);
9293
event.register(ModMenuTypes.MAGIC_BLOCK_MENU.get(), MagicBlockScreen::new);
94+
event.register(ModMenuTypes.MECHANICAL_FURNACE_MENU.get(), MechanicalFurnaceScreen::new);
9395
}
9496

9597
@SubscribeEvent
@@ -157,6 +159,10 @@ private void registerCapabilities(RegisterCapabilitiesEvent event) {
157159
Capabilities.EnergyStorage.BLOCK,
158160
ModBlockEntities.BATTERY_BLOCK_ENTITY.get(),
159161
(be, side) -> be.getEnergyStorage());
162+
event.registerBlockEntity(
163+
Capabilities.ItemHandler.BLOCK,
164+
ModBlockEntities.MECHANICAL_FURNACE_BE.get(),
165+
(be, side) -> be.getCapabilityHandler(side));
160166
}
161167

162168
@EventBusSubscriber(modid = MODID, bus = EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)

src/main/java/net/roboxgamer/modernutils/block/ModBlocks.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ public class ModBlocks {
4040

4141
public static final DeferredBlock<BatteryBlock> BATTERY_BLOCK = registerWIPBlock("battery_block", ()->
4242
new BatteryBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.OAK_PLANKS)));
43+
44+
public static final DeferredBlock<MechanicalFurnaceBlock> MECHANICAL_FURNACE_BLOCK = registerBlock("mechanical_furnace_block", ()->
45+
new MechanicalFurnaceBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.FURNACE)));
4346

4447
private static <T extends Block> DeferredBlock<T> registerWIPBlock(String name, Supplier<T> block) {
4548
DeferredBlock<T> toReturn = WIP_BLOCKS.register(name, block);
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package net.roboxgamer.modernutils.block.custom;
2+
3+
import net.minecraft.core.BlockPos;
4+
import net.minecraft.core.Direction;
5+
import net.minecraft.server.level.ServerPlayer;
6+
import net.minecraft.world.InteractionHand;
7+
import net.minecraft.world.InteractionResult;
8+
import net.minecraft.world.entity.player.Player;
9+
import net.minecraft.world.item.context.BlockPlaceContext;
10+
import net.minecraft.world.level.Level;
11+
import net.minecraft.world.level.block.Block;
12+
import net.minecraft.world.level.block.EntityBlock;
13+
import net.minecraft.world.level.block.RenderShape;
14+
import net.minecraft.world.level.block.entity.BlockEntity;
15+
import net.minecraft.world.level.block.entity.BlockEntityTicker;
16+
import net.minecraft.world.level.block.entity.BlockEntityType;
17+
import net.minecraft.world.level.block.state.BlockState;
18+
import net.minecraft.world.level.block.state.StateDefinition;
19+
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
20+
import net.minecraft.world.level.block.state.properties.BooleanProperty;
21+
import net.minecraft.world.level.block.state.properties.DirectionProperty;
22+
import net.minecraft.world.phys.BlockHitResult;
23+
import org.jetbrains.annotations.NotNull;
24+
import org.jetbrains.annotations.Nullable;
25+
26+
import net.roboxgamer.modernutils.block.entity.custom.MechanicalFurnaceBlockEntity;
27+
28+
public class MechanicalFurnaceBlock extends Block implements EntityBlock {
29+
public static final BooleanProperty LIT = BlockStateProperties.LIT;
30+
public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING;
31+
32+
public MechanicalFurnaceBlock(Properties properties) {
33+
super(properties);
34+
this.registerDefaultState(this.stateDefinition.any()
35+
.setValue(LIT, Boolean.FALSE)
36+
.setValue(FACING, Direction.NORTH));
37+
}
38+
39+
@Override
40+
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
41+
builder.add(LIT);
42+
builder.add(FACING);
43+
}
44+
45+
@Override
46+
public @Nullable BlockState getStateForPlacement(BlockPlaceContext context) {
47+
return this.defaultBlockState()
48+
.setValue(FACING, context.getHorizontalDirection().getOpposite());
49+
}
50+
51+
@Override
52+
public RenderShape getRenderShape(BlockState state) {
53+
return RenderShape.MODEL;
54+
}
55+
56+
@Override
57+
public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) {
58+
if (state.getBlock() != newState.getBlock()) {
59+
BlockEntity blockEntity = level.getBlockEntity(pos);
60+
if (blockEntity instanceof MechanicalFurnaceBlockEntity) {
61+
((MechanicalFurnaceBlockEntity) blockEntity).drops();
62+
}
63+
}
64+
super.onRemove(state, level, pos, newState, isMoving);
65+
}
66+
67+
@Override
68+
protected @NotNull InteractionResult useWithoutItem(@NotNull BlockState state, @NotNull Level level, @NotNull BlockPos pos,
69+
@NotNull Player player, @NotNull BlockHitResult hitResult) {
70+
if (level.isClientSide) {
71+
return InteractionResult.SUCCESS;
72+
}
73+
var hand = player.getUsedItemHand();
74+
if (hand != InteractionHand.MAIN_HAND) return InteractionResult.PASS;
75+
76+
BlockEntity be = level.getBlockEntity(pos);
77+
if (!(be instanceof MechanicalFurnaceBlockEntity blockEntity)) return InteractionResult.PASS;
78+
79+
if (!level.isClientSide() && player instanceof ServerPlayer serverPlayer) {
80+
serverPlayer.openMenu(blockEntity, pos);
81+
}
82+
return InteractionResult.CONSUME;
83+
}
84+
85+
@Nullable
86+
@Override
87+
public BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
88+
return new MechanicalFurnaceBlockEntity(pos, state);
89+
}
90+
91+
@Override
92+
public @Nullable <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, @NotNull BlockState blockState, @NotNull BlockEntityType<T> blockEntityType) {
93+
return level.isClientSide ? null : ((level1, pos, state, blockEntity) -> ((MechanicalFurnaceBlockEntity) blockEntity).tick(level1, pos, state,((MechanicalFurnaceBlockEntity) blockEntity)));
94+
}
95+
}

src/main/java/net/roboxgamer/modernutils/block/entity/ModBlockEntities.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import net.roboxgamer.modernutils.block.entity.custom.ExampleInventoryBlockEntity;
1212
import net.roboxgamer.modernutils.block.entity.custom.MagicBlockBlockEntity;
1313
import net.roboxgamer.modernutils.block.entity.custom.MechanicalCrafterBlockEntity;
14+
import net.roboxgamer.modernutils.block.entity.custom.MechanicalFurnaceBlockEntity;
1415
import net.roboxgamer.modernutils.block.entity.custom.MiniChestBlockEntity;
1516

1617
import java.util.function.Supplier;
@@ -48,6 +49,12 @@ public class ModBlockEntities {
4849
of(BatteryBlockEntity::new,
4950
ModBlocks.BATTERY_BLOCK.get())
5051
.build(null));
52+
53+
public static final Supplier<BlockEntityType<MechanicalFurnaceBlockEntity>> MECHANICAL_FURNACE_BE =
54+
BLOCK_ENTITIES.register("mechanical_furnace_be", () -> BlockEntityType.Builder.
55+
of(MechanicalFurnaceBlockEntity::new,
56+
ModBlocks.MECHANICAL_FURNACE_BLOCK.get())
57+
.build(null));
5158

5259

5360
public static void register(IEventBus eventBus) {

0 commit comments

Comments
 (0)