Skip to content

Commit

Permalink
feat: implement wheat seed drops & dirt drop
Browse files Browse the repository at this point in the history
  • Loading branch information
smartcmd committed Jun 15, 2024
1 parent 7af11ad commit e6fae94
Show file tree
Hide file tree
Showing 8 changed files with 144 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,9 @@ boolean place(

void onScheduledUpdate(BlockStateWithPos blockState);

default ItemStack[] getDrops(ItemStack itemStack) {
// TODO: needs more works
default ItemStack[] getDrops(BlockState blockState, ItemStack usedItem) {
// TODO: 时运
// TODO: silk touch (精准采集)
if (getBlockType().getItemType() != null) {
return new ItemStack[] {getBlockType().getItemType().createItemStack()};
}
Expand Down
10 changes: 9 additions & 1 deletion Allay-API/src/main/java/org/allaymc/api/item/type/ItemType.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,15 @@ public interface ItemType<T extends ItemStack> extends Identified {
T createItemStack(ItemStackInitInfo<T> info);

default T createItemStack() {
return createItemStack(SimpleItemStackInitInfo.builder().count(1).build());
return createItemStack(1);
}

default T createItemStack(int count) {
return createItemStack(count, 0);
}

default T createItemStack(int count, int meta) {
return createItemStack(SimpleItemStackInitInfo.builder().count(count).meta(meta).build());
}

int getRuntimeId();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public void onReplace(BlockStateWithPos currentBlockState, BlockState newBlockSt
@Override
public void onBreak(BlockStateWithPos blockState, ItemStack usedItem, EntityPlayer player) {
if (!blockState.blockState().getBlockType().getMaterial().isAlwaysDestroyable() && !usedItem.isCorrectToolFor(blockState.blockState())) return;
var drops = getDrops(usedItem);
var drops = getDrops(blockState.blockState(), usedItem);
if (drops.length == 0) return;
for (var drop : drops) {
player.getDimension().dropItem(drop, new Vector3f(blockState.pos()).add(0.5f, 0.5f, 0.5f));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package org.allaymc.server.block.component.doubleplant;

import org.allaymc.api.block.BlockBehavior;
import org.allaymc.api.block.component.annotation.RequireBlockProperty;
import org.allaymc.api.block.property.type.BlockPropertyType;
import org.allaymc.api.block.type.BlockState;
import org.allaymc.api.block.type.BlockType;
import org.allaymc.api.data.VanillaBlockPropertyTypes;
import org.allaymc.api.item.ItemStack;
import org.allaymc.api.item.type.ItemTypes;
import org.allaymc.api.utils.Utils;
import org.allaymc.server.block.component.common.BlockBaseComponentImpl;

import java.util.concurrent.ThreadLocalRandom;

/**
* Allay Project 2024/6/15
*
* @author daoge_cmd
*/
@RequireBlockProperty(type = BlockPropertyType.Type.ENUM, name = "double_plant_type")
@RequireBlockProperty(type = BlockPropertyType.Type.BOOLEAN, name = "upper_block_bit")
public class BlockDoublePlantBaseComponentImpl extends BlockBaseComponentImpl {
public BlockDoublePlantBaseComponentImpl(BlockType<? extends BlockBehavior> blockType) {
super(blockType);
}

// TODO: block update

@Override
public ItemStack[] getDrops(BlockState blockState, ItemStack usedItem) {
var plantType = blockState.getPropertyValue(VanillaBlockPropertyTypes.DOUBLE_PLANT_TYPE);
return switch (plantType) {
case FERN, GRASS -> {
var rand = ThreadLocalRandom.current();
if (rand.nextInt(8) == 0) {
yield new ItemStack[]{ItemTypes.WHEAT_SEEDS_TYPE.createItemStack()};
}
yield Utils.EMPTY_ITEM_STACK_ARRAY;
}
default -> super.getDrops(blockState, usedItem);
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.allaymc.server.block.component.grassblock;

import org.allaymc.api.block.BlockBehavior;
import org.allaymc.api.block.type.BlockState;
import org.allaymc.api.block.type.BlockType;
import org.allaymc.api.item.ItemStack;
import org.allaymc.api.item.type.ItemTypes;
import org.allaymc.server.block.component.common.BlockBaseComponentImpl;

/**
* Allay Project 2024/6/15
*
* @author daoge_cmd
*/
public class BlockGrassBlockBaseComponentImpl extends BlockBaseComponentImpl {
public BlockGrassBlockBaseComponentImpl(BlockType<? extends BlockBehavior> blockType) {
super(blockType);
}

@Override
public ItemStack[] getDrops(BlockState blockState, ItemStack usedItem) {
return new ItemStack[]{ItemTypes.DIRT_TYPE.createItemStack()};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.allaymc.server.block.component.tallgrass;

import org.allaymc.api.block.BlockBehavior;
import org.allaymc.api.block.type.BlockState;
import org.allaymc.api.block.type.BlockType;
import org.allaymc.api.item.ItemStack;
import org.allaymc.api.item.type.ItemTypes;
import org.allaymc.api.utils.Utils;
import org.allaymc.server.block.component.common.BlockBaseComponentImpl;

import java.util.concurrent.ThreadLocalRandom;

/**
* Allay Project 2024/6/15
*
* @author daoge_cmd
*/
public class BlockTallgrassBaseComponentImpl extends BlockBaseComponentImpl {
public BlockTallgrassBaseComponentImpl(BlockType<? extends BlockBehavior> blockType) {
super(blockType);
}

@Override
public ItemStack[] getDrops(BlockState blockState, ItemStack usedItem) {
var rand = ThreadLocalRandom.current();
// 有1/8的几率掉落种子
if (rand.nextInt(8) == 0) {
return new ItemStack[]{ItemTypes.WHEAT_SEEDS_TYPE.createItemStack()};
}
return Utils.EMPTY_ITEM_STACK_ARRAY;
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package org.allaymc.server.block.type;

import org.allaymc.api.block.interfaces.BlockBarrelBehavior;
import org.allaymc.api.block.interfaces.BlockChestBehavior;
import org.allaymc.api.block.interfaces.BlockCraftingTableBehavior;
import org.allaymc.api.block.interfaces.*;
import org.allaymc.api.block.interfaces.stairs.*;
import org.allaymc.api.block.interfaces.torch.BlockColoredTorchBpBehavior;
import org.allaymc.api.block.interfaces.torch.BlockColoredTorchRgBehavior;
Expand All @@ -21,7 +19,10 @@
import org.allaymc.server.block.component.chest.BlockChestBaseComponentImpl;
import org.allaymc.server.block.component.common.BlockAttributeComponentImpl;
import org.allaymc.server.block.component.craftingtable.BlockCraftingTableBaseComponentImpl;
import org.allaymc.server.block.component.doubleplant.BlockDoublePlantBaseComponentImpl;
import org.allaymc.server.block.component.grassblock.BlockGrassBlockBaseComponentImpl;
import org.allaymc.server.block.component.stairs.BlockStairsBaseComponentImpl;
import org.allaymc.server.block.component.tallgrass.BlockTallgrassBaseComponentImpl;
import org.allaymc.server.block.component.torch.BlockTorchBaseComponentImpl;

/**
Expand All @@ -30,6 +31,32 @@
* @author daoge_cmd
*/
public final class BlockTypeInitializer {
public static void initGrassBlock() {
BlockTypes.GRASS_BLOCK_TYPE = BlockTypeBuilder
.builder(BlockGrassBlockBehavior.class)
.vanillaBlock(VanillaBlockId.GRASS_BLOCK)
.setBlockBaseComponentSupplier(BlockGrassBlockBaseComponentImpl::new)
.build();
}

public static void initTallgrass() {
BlockTypes.TALLGRASS_TYPE = BlockTypeBuilder
.builder(BlockTallgrassBehavior.class)
.vanillaBlock(VanillaBlockId.TALLGRASS)
.setProperties(VanillaBlockPropertyTypes.TALL_GRASS_TYPE)
.setBlockBaseComponentSupplier(BlockTallgrassBaseComponentImpl::new)
.build();
}

public static void initDoublePlant() {
BlockTypes.DOUBLE_PLANT_TYPE = BlockTypeBuilder
.builder(BlockDoublePlantBehavior.class)
.vanillaBlock(VanillaBlockId.DOUBLE_PLANT)
.setProperties(VanillaBlockPropertyTypes.DOUBLE_PLANT_TYPE, VanillaBlockPropertyTypes.UPPER_BLOCK_BIT)
.setBlockBaseComponentSupplier(BlockDoublePlantBaseComponentImpl::new)
.build();
}

public static void initBarrel() {
BlockTypes.BARREL_TYPE = BlockTypeBuilder
.builder(BlockBarrelBehavior.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,9 @@
import org.allaymc.api.entity.interfaces.EntityPlayer;
import org.allaymc.api.math.location.Location3f;
import org.allaymc.api.math.position.Position3i;
import org.allaymc.api.math.position.Position3ic;
import org.allaymc.api.network.processor.PacketProcessor;
import org.allaymc.api.utils.MathUtils;
import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.GameType;
import org.cloudburstmc.protocol.bedrock.data.LevelEvent;
import org.cloudburstmc.protocol.bedrock.data.PlayerAuthInputData;
import org.cloudburstmc.protocol.bedrock.data.PlayerBlockActionData;
import org.cloudburstmc.protocol.bedrock.data.*;
import org.cloudburstmc.protocol.bedrock.packet.BedrockPacketType;
import org.cloudburstmc.protocol.bedrock.packet.LevelEventPacket;
import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket;
Expand Down

0 comments on commit e6fae94

Please sign in to comment.