Skip to content

Commit

Permalink
More menu work
Browse files Browse the repository at this point in the history
  • Loading branch information
Fureniku committed Jan 21, 2024
1 parent 0093924 commit a709765
Show file tree
Hide file tree
Showing 9 changed files with 109 additions and 71 deletions.

This file was deleted.

6 changes: 6 additions & 0 deletions src/main/java/com/fureniku/roads/blockentities/BlockType.java
@@ -0,0 +1,6 @@
package com.fureniku.roads.blockentities;

public enum BlockType {
CRUSHER,
FABRICATOR
}
Expand Up @@ -2,12 +2,13 @@

import com.fureniku.metropolis.blockentity.MetroBlockEntity;
import com.fureniku.roads.FurenikusRoads;
import com.fureniku.roads.blocks.entityblock.CrusherEntityBlock;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.state.BlockState;

public class CrusherBlockEntity extends MetroBlockEntity {

public CrusherBlockEntity(BlockPos pos, BlockState state) {
super(FurenikusRoads.INSTANCE.registration._registrationMachines.getCrusherEntity().get(), pos, state);
super(CrusherEntityBlock.ENTITY.get(), pos, state);
}
}
Expand Up @@ -2,12 +2,13 @@

import com.fureniku.metropolis.blockentity.MetroBlockEntity;
import com.fureniku.roads.FurenikusRoads;
import com.fureniku.roads.blocks.entityblock.FabricatorEntityBlock;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.state.BlockState;

public class FabricatorBlockEntity extends MetroBlockEntity {

public FabricatorBlockEntity(BlockPos pos, BlockState state) {
super(FurenikusRoads.INSTANCE.registration._registrationMachines.getFabricatorEntity().get(), pos, state);
super(FabricatorEntityBlock.ENTITY.get(), pos, state);
}
}
@@ -1,24 +1,24 @@
package com.fureniku.roads.blockentities.menus;

import com.fureniku.metropolis.menus.MetroMenu;
import com.fureniku.roads.registrations.RoadMenuTypes;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.ContainerLevelAccess;
import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.Nullable;

public class CrusherMenu extends MetroMenu {

//client constructor
public CrusherMenu(@Nullable MenuType<?> menuType, int containerId) {
super(menuType, containerId);
public CrusherMenu(int containerId, Inventory inventory, FriendlyByteBuf extraData) {
this(containerId, inventory, ContainerLevelAccess.NULL);
}

//server constructor
/* public CrusherMenu(int containerId, Inventory playerInv, ContainerLevelAccess access) {
super(MenuType.)
}*/
public CrusherMenu(int containerId, Inventory inventory, ContainerLevelAccess levelAccess) {
super(RoadMenuTypes.CRUSHER_MENU, containerId);
}

@Override
public ItemStack quickMoveStack(Player player, int p_38942_) {
Expand Down
@@ -1,23 +1,52 @@
package com.fureniku.roads.blocks.entityblock;

import com.fureniku.metropolis.blockentity.MetroBlockEntity;
import com.fureniku.metropolis.blocks.decorative.MetroEntityBlockDecorative;
import com.fureniku.metropolis.datagen.TextureSet;
import com.fureniku.metropolis.menus.MetroMenu;
import com.fureniku.metropolis.utils.Debug;
import com.fureniku.roads.blockentities.CrusherBlockEntity;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.MenuProvider;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.neoforged.neoforge.network.NetworkHooks;
import net.neoforged.neoforge.registries.RegistryObject;
import org.jetbrains.annotations.Nullable;

public abstract class CrusherEntityBlock extends MetroEntityBlockDecorative {

public static RegistryObject<BlockEntityType<MetroBlockEntity>> ENTITY;
public static RegistryObject<MetroMenu> MENU;

public CrusherEntityBlock(Properties props, VoxelShape shape, String modelDir, String modelName, String tag, boolean dynamicShape, TextureSet... textures) {
super(props, shape, modelDir, modelName, tag, dynamicShape, textures);
}

@Override
@Nullable
public BlockEntity createBlockEntity(BlockPos pos, BlockState state) {
Debug.Log("Overriding entity correctly");
return new CrusherBlockEntity(pos, state);
}

@Override
public MenuProvider getMenu(BlockState state, Level level, BlockPos pos) { //TODO
return null;
}

@Override
protected InteractionResult onRightClick(BlockState state, Level level, BlockPos pos, Player player) {
if (!level.isClientSide && player instanceof ServerPlayer serverPlayer) {
NetworkHooks.openScreen(serverPlayer, state.getMenuProvider(level, pos));
return InteractionResult.CONSUME;
}
return InteractionResult.PASS;
}
}
@@ -1,16 +1,23 @@
package com.fureniku.roads.blocks.entityblock;

import com.fureniku.metropolis.blockentity.MetroBlockEntity;
import com.fureniku.metropolis.blocks.decorative.MetroEntityBlockDecorative;
import com.fureniku.metropolis.datagen.TextureSet;
import com.fureniku.metropolis.menus.MetroMenu;
import com.fureniku.roads.blockentities.FabricatorBlockEntity;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.neoforged.neoforge.registries.RegistryObject;
import org.jetbrains.annotations.Nullable;

public abstract class FabricatorEntityBlock extends MetroEntityBlockDecorative {

public static RegistryObject<BlockEntityType<MetroBlockEntity>> ENTITY;
public static RegistryObject<MetroMenu> MENU;

public FabricatorEntityBlock(Properties props, VoxelShape shape, String modelDir, String modelName, String tag, boolean dynamicShape, TextureSet... textures) {
super(props, shape, modelDir, modelName, tag, dynamicShape, textures);
}
Expand Down
Expand Up @@ -3,26 +3,32 @@
import com.fureniku.metropolis.RegistrationBase;
import com.fureniku.metropolis.RegistrationGroup;
import com.fureniku.metropolis.blockentity.MetroBlockEntity;
import com.fureniku.metropolis.blocks.decorative.MetroBlockDecorativeBase;
import com.fureniku.metropolis.blocks.decorative.builders.MetroBlockDecorativeBuilder;
import com.fureniku.metropolis.blocks.decorative.helpers.HelperBase;
import com.fureniku.metropolis.blocks.decorative.helpers.OffsetHelper;
import com.fureniku.metropolis.blocks.decorative.helpers.RotationHelper;
import com.fureniku.metropolis.utils.CreativeTabSet;
import com.fureniku.metropolis.utils.Debug;
import com.fureniku.metropolis.utils.ShapeUtils;
import com.fureniku.metropolis.utils.SimpleUtils;
import com.fureniku.roads.FurenikusRoads;
import com.fureniku.roads.blockentities.BlockEntityFactoryManager;
import com.fureniku.roads.blockentities.BlockType;
import com.fureniku.roads.blockentities.CrusherBlockEntity;
import com.fureniku.roads.blockentities.FabricatorBlockEntity;
import com.fureniku.roads.blockentities.menus.CrusherMenu;
import com.fureniku.roads.blocks.entityblock.CrusherEntityBlock;
import com.fureniku.roads.blocks.entityblock.FabricatorEntityBlock;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.flag.FeatureFlags;
import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.registries.RegistryObject;

import java.util.ArrayList;
import java.util.Arrays;

public class RegistrationMachines extends RegistrationGroup {

Expand All @@ -34,49 +40,37 @@ public class RegistrationMachines extends RegistrationGroup {
private final String TAR_DISTILLER = "tar_distiller";
private final String TARMAC_CUTTER = "tarmac_cutter";

private RegistryObject<BlockEntityType<MetroBlockEntity>> CRUSHER_ENTITY;
private RegistryObject<BlockEntityType<MetroBlockEntity>> FABRICATOR_ENTITY;

private RegistryObject<BlockEntityType<MetroBlockEntity>> CRUSHER_MENU;

private CreativeTabSet _machineTab;

private BlockBehaviour.Properties _props = BlockBehaviour.Properties.of().strength(1.0f).sound(SoundType.METAL);

private BlockBehaviour.Properties _props = BlockBehaviour.Properties.of().strength(2.0f).sound(SoundType.METAL);

public RegistrationMachines(RegistrationBase registrationBase) {
super(registrationBase);
CRUSHER_ENTITY = null;
}

@Override
public void init(IEventBus iEventBus) {
Debug.Log("Initialize machines");
CrusherEntityBlock.ENTITY = registerEntity(CRUSHER, getHelpers(12, 14), BlockType.CRUSHER, CrusherBlockEntity::new);
CrusherEntityBlock.MENU = registration.registerMenuType(CRUSHER + "_menu", () -> new MenuType(CrusherMenu::new, FeatureFlags.DEFAULT_FLAGS));

RotationHelper crusherRotationHelper = new RotationHelper(ShapeUtils.makeShape(12, 14));
RotationHelper fabricatorRotationHelper = new RotationHelper(ShapeUtils.makeShape(12, 9.5f));

CRUSHER_ENTITY = registration.registerBlockEntityWithBlock(CRUSHER, () -> new MetroBlockDecorativeBuilder<CrusherEntityBlock>(_props)
.setModelDirectory("blocks/machine/")
.setModelName("crusher")
.setTextures(getLoc("crusher"))
.setHelpers(crusherRotationHelper).buildAs(BlockEntityFactoryManager.getCrusherBlockFactory(crusherRotationHelper)), CrusherBlockEntity::new);

FABRICATOR_ENTITY = registration.registerBlockEntityWithBlock(FABRICATOR, () -> new MetroBlockDecorativeBuilder<FabricatorEntityBlock>(_props)
.setModelDirectory("blocks/machine/")
.setModelName("fabricator")
.setTextures(getLoc("fabricator"))
.setHelpers(fabricatorRotationHelper).buildAs(BlockEntityFactoryManager.getFabricatorBlockFactory(fabricatorRotationHelper)), FabricatorBlockEntity::new);
FabricatorEntityBlock.ENTITY = registerEntity(FABRICATOR, getHelpers(12, 9.5f), BlockType.FABRICATOR, FabricatorBlockEntity::new);

_machineTab = new CreativeTabSet(registration.getCreativeTabDeferredRegister(),"tab_machines", getItem(CRUSHER));
}

public RegistryObject<BlockEntityType<MetroBlockEntity>> getCrusherEntity() {
return CRUSHER_ENTITY;
//Most machines are very similar beyond their size
private HelperBase[] getHelpers(float width, float height) {
return new HelperBase[] {
new RotationHelper(ShapeUtils.makeShape(width, height))
};
}

public RegistryObject<BlockEntityType<MetroBlockEntity>> getFabricatorEntity() {
return FABRICATOR_ENTITY;
private RegistryObject<BlockEntityType<MetroBlockEntity>> registerEntity(String name, HelperBase[] helpers, BlockType blockType, BlockEntityType.BlockEntitySupplier entity) {
return registration.registerBlockEntityWithBlock(name, () -> new MetroBlockDecorativeBuilder(_props)
.setModelDirectory("blocks/machine/")
.setModelName(name)
.setTextures(getLoc(name))
.setHelpers(helpers)
.buildAs(getBlockFactory(blockType, helpers)), entity);
}

@Override
Expand All @@ -96,4 +90,26 @@ public ArrayList<CreativeTabSet> getCreativeTabs() {
protected ResourceLocation getLoc(String name) {
return new ResourceLocation(FurenikusRoads.MODID, "block/machine/" + name);
}

private static MetroBlockDecorativeBase.MetroBlockStateFactory getBlockFactory(BlockType type, HelperBase... helpersIn) {
switch (type) {
case CRUSHER:
return (props, shape, modelDir, modelName, tag, dynamicShape, textures) -> new CrusherEntityBlock(props, shape, modelDir, modelName, tag, SimpleUtils.containsType(OffsetHelper.class, helpersIn), textures) {
@Override
public ArrayList<HelperBase> getHelpers() {
return new ArrayList<>(Arrays.asList(helpersIn));
}
};
case FABRICATOR:
return (props, shape, modelDir, modelName, tag, dynamicShape, textures) -> new FabricatorEntityBlock(props, shape, modelDir, modelName, tag, SimpleUtils.containsType(OffsetHelper.class, helpersIn), textures) {
@Override
public ArrayList<HelperBase> getHelpers() {
return new ArrayList<>(Arrays.asList(helpersIn));
}
};
}
return null;
}
}


10 changes: 10 additions & 0 deletions src/main/java/com/fureniku/roads/registrations/RoadMenuTypes.java
@@ -0,0 +1,10 @@
package com.fureniku.roads.registrations;

import com.fureniku.roads.blockentities.menus.CrusherMenu;
import net.minecraft.world.inventory.MenuType;
import net.neoforged.neoforge.common.extensions.IMenuTypeExtension;

public class RoadMenuTypes {

public static final MenuType<CrusherMenu> CRUSHER_MENU = IMenuTypeExtension.create((windowId, inv, data) -> new CrusherMenu(windowId, inv, data));
}

0 comments on commit a709765

Please sign in to comment.