-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #10 from skyinr/add_copping_board
feat: 添加菜板
- Loading branch information
Showing
8 changed files
with
176 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
78 changes: 78 additions & 0 deletions
78
SinoFeast/src/main/java/games/moegirl/sinocraft/sinofeast/block/ChoppingBoardBlock.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
|
||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
59 changes: 59 additions & 0 deletions
59
...rc/main/java/games/moegirl/sinocraft/sinofeast/block/entity/ChoppingBoardBlockEntity.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
26 changes: 26 additions & 0 deletions
26
SinoFeast/src/main/java/games/moegirl/sinocraft/sinofeast/block/entity/SFBlockEntities.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | ||
|
||
|
||
} |
4 changes: 4 additions & 0 deletions
4
SinoFeast/src/main/java/games/moegirl/sinocraft/sinofeast/utility/IFood.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
package games.moegirl.sinocraft.sinofeast.utility; | ||
|
||
public interface IFood { | ||
} |