Skip to content

Commit

Permalink
Merge pull request #10 from skyinr/add_copping_board
Browse files Browse the repository at this point in the history
feat: 添加菜板
  • Loading branch information
qyl27 authored Aug 9, 2023
2 parents a36bbb0 + 8208e93 commit 7bffe69
Show file tree
Hide file tree
Showing 8 changed files with 176 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
/**
* @author luqin2007
*/
@Deprecated
public class BlockInteractRecipe extends SimpleRecipe<BlockInteractRecipeContainer, BlockInteractRecipe, BlockInteractRecipeSerializer> {

final Ingredient tool;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import games.moegirl.sinocraft.sinofeast.block.SFBlockItems;
import games.moegirl.sinocraft.sinofeast.block.SFBlocks;
import games.moegirl.sinocraft.sinofeast.block.entity.SFBlockEntities;
import games.moegirl.sinocraft.sinofeast.item.SFItems;
import games.moegirl.sinocraft.sinofeast.networking.SFNetworking;
import net.minecraftforge.fml.common.Mod;
Expand Down Expand Up @@ -30,6 +31,7 @@ public SinoFeast() {
SFBlockItems.register(bus);
SFItems.register(bus);

SFBlockEntities.register(bus);
}

public static SinoFeast getInstance() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package games.moegirl.sinocraft.sinofeast.block;

import games.moegirl.sinocraft.sinocore.block.AbstractEntityBlock;
import games.moegirl.sinocraft.sinofeast.block.entity.ChoppingBoardBlockEntity;
import games.moegirl.sinocraft.sinofeast.block.entity.SFBlockEntities;
import games.moegirl.sinocraft.sinofeast.item.SFItems;
import games.moegirl.sinocraft.sinofeast.utility.IFood;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.ByteTag;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraftforge.common.capabilities.ForgeCapabilities;
import net.minecraftforge.items.IItemHandler;

public class ChoppingBoardBlock extends AbstractEntityBlock<ChoppingBoardBlockEntity> {
public static final VoxelShape SHAPE = Block.box(2, 0, 2, 14, 2, 14);

public ChoppingBoardBlock() {
super(Properties.of(), SFBlockEntities.CHOPPING_BOARD_BLOCK_ENTITY);
}

@Override
public VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
return SHAPE;
}

@Override
public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
//TODO WIP
if (hand == InteractionHand.MAIN_HAND) {

ItemStack itemInHand = player.getItemInHand(hand);
if (state.getBlock() instanceof ChoppingBoardBlock choppingBoardBlock) {
ChoppingBoardBlockEntity blockEntity = choppingBoardBlock.getBlockEntity(level, pos);
IItemHandler iItemHandler = blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER).orElseThrow(RuntimeException::new);
ItemStack inFood = iItemHandler.getStackInSlot(ChoppingBoardBlockEntity.INPUT);
if (itemInHand.is(SFItems.KITCHEN_KNIFE.get())) {

ItemStack copy = inFood.copy();
inFood.setCount(inFood.getCount() - 1);
copy.setCount(1);
copy.addTagElement("shred", ByteTag.valueOf(true));
iItemHandler.insertItem(ChoppingBoardBlockEntity.OUTPUT, copy, false);

} else if (itemInHand.isEmpty()) {
if (player.isShiftKeyDown()) {
ItemStack outItem = iItemHandler.extractItem(ChoppingBoardBlockEntity.OUTPUT, 64, false);
if (!outItem.isEmpty()) {
level.addFreshEntity(new ItemEntity(level, pos.getX(), pos.getY() + 0.5, pos.getZ(), outItem));
}
} else {
ItemStack inItem = iItemHandler.extractItem(ChoppingBoardBlockEntity.INPUT, 64, false);
if (!inItem.isEmpty()) {
level.addFreshEntity(new ItemEntity(level, pos.getX(), pos.getY() + 0.5, pos.getZ(), inItem));
}
}


} else if (itemInHand.getItem() instanceof IFood){
player.setItemInHand(hand, iItemHandler.insertItem(ChoppingBoardBlockEntity.INPUT, itemInHand, false));
}
}
}
return super.use(state, level, pos, player, hand, hit);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemNameBlockItem;
import net.minecraft.world.level.block.Block;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
Expand All @@ -20,7 +19,11 @@ public static void register(IEventBus bus) {

TabsRegistry.items(SinoSeriesTabs.AGRICULTURE)
.addItem(TEA_TREE);

TabsRegistry.items(SinoSeriesTabs.FUNCTIONAL_BLOCKS)
.addItem(CHOPPING_BOARD);
}

public static final RegistryObject<BlockItem> TEA_TREE = BLOCK_ITEMS.register("tea_tree", () -> new ItemNameBlockItem(SFBlocks.TEA_TREE_BLOCK.get(), new Item.Properties()));
public static final RegistryObject<BlockItem> CHOPPING_BOARD = BLOCK_ITEMS.register("chopping_board", () -> new ItemNameBlockItem(SFBlocks.CHOPPING_BOARD_BLOCK.get(), new Item.Properties()));
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,6 @@ public static void register(IEventBus bus) {
}

public static final RegistryObject<Block> TEA_TREE_BLOCK = BLOCKS.register("tea_tree", TeaTreeBlock::new);

public static final RegistryObject<Block> CHOPPING_BOARD_BLOCK = BLOCKS.register("chopping_board", ChoppingBoardBlock::new);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package games.moegirl.sinocraft.sinofeast.block.entity;

import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ForgeCapabilities;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemStackHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public class ChoppingBoardBlockEntity extends BlockEntity {
public static final int INPUT = 0;
public static final int OUTPUT = 1;
private LazyOptional<IItemHandler> foodHandler;
public static final String INPUT_FOOD = "input_food";
public static final String OUTPUT_FOOD = "output_food";
public ChoppingBoardBlockEntity(BlockPos arg2, BlockState arg3) {
super(SFBlockEntities.CHOPPING_BOARD_BLOCK_ENTITY.get(), arg2, arg3);
}

@Override
public void handleUpdateTag(CompoundTag tag) {
super.handleUpdateTag(tag);
var food = getCapability(ForgeCapabilities.ITEM_HANDLER).orElseThrow(RuntimeException::new);
food.insertItem(INPUT, ItemStack.of(tag.getCompound(INPUT_FOOD)),false);
food.insertItem(OUTPUT,ItemStack.of(tag.getCompound(OUTPUT_FOOD)),false);
}

@NotNull
@Override
public CompoundTag getUpdateTag() {
CompoundTag tag = super.getUpdateTag();
var food = getCapability(ForgeCapabilities.ITEM_HANDLER).orElseThrow(RuntimeException::new);
tag.put(INPUT_FOOD, food.getStackInSlot(INPUT).serializeNBT());
tag.put(OUTPUT_FOOD,food.getStackInSlot(OUTPUT).serializeNBT());
return tag;
}

@Override
public @NotNull <T> LazyOptional<T> getCapability(@NotNull Capability<T> cap, @Nullable Direction side) {
if (!this.remove && cap == ForgeCapabilities.ITEM_HANDLER) {
if (this.foodHandler == null) {
this.foodHandler = LazyOptional.of(this::createHandler);
}
return this.foodHandler.cast();
}
return super.getCapability(cap, side);
}

private IItemHandler createHandler(){
return new ItemStackHandler(2);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package games.moegirl.sinocraft.sinofeast.block.entity;

import games.moegirl.sinocraft.sinofeast.SinoFeast;
import games.moegirl.sinocraft.sinofeast.block.SFBlocks;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;

import java.util.function.Supplier;

public class SFBlockEntities {
public static void register(IEventBus bus) {
BLOCK_ENTITIES.register(bus);
}

public static final DeferredRegister<BlockEntityType<?>> BLOCK_ENTITIES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, SinoFeast.MODID);

public static final Supplier<BlockEntityType<ChoppingBoardBlockEntity>> CHOPPING_BOARD_BLOCK_ENTITY = BLOCK_ENTITIES.register("chopping_board", () ->
BlockEntityType
.Builder
.of(ChoppingBoardBlockEntity::new,
SFBlocks.CHOPPING_BOARD_BLOCK.get()).build(null));


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package games.moegirl.sinocraft.sinofeast.utility;

public interface IFood {
}

0 comments on commit 7bffe69

Please sign in to comment.