package net.momirealms.customcrops.api.example;
import net.momirealms.customcrops.api.BukkitCustomCropsPlugin;
import net.momirealms.customcrops.api.core.block.AbstractCustomCropsBlock;
import net.momirealms.customcrops.api.core.world.CustomCropsBlockState;
import net.momirealms.customcrops.api.core.world.CustomCropsWorld;
import net.momirealms.customcrops.api.core.world.Pos3;
import net.momirealms.customcrops.api.core.wrapper.WrappedBreakEvent;
import net.momirealms.customcrops.api.misc.NamedTextColor;
import net.momirealms.customcrops.api.util.LocationUtils;
import net.momirealms.customcrops.common.util.Key;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.Collection;
import java.util.Optional;
public class SugarCaneBlock extends AbstractCustomCropsBlock {
private static SugarCaneBlock instance;
private SugarCaneBlock() {
super(Key.key("customcrops", "sugarcane_block"));
}
@Override
public boolean isBlockInstance(String id) {
return id.equals("customcrops:sugarcane_block_id");
}
public static SugarCaneBlock instance() {
if (instance == null) {
instance = new SugarCaneBlock();
}
return instance;
}
@Override
public void randomTick(CustomCropsBlockState state, CustomCropsWorld<?> world, Pos3 location, boolean offlineTick) {
// 首先检查是否是顶层方块
Pos3 upper = location.add(0,1,0);
Optional<CustomCropsBlockState> upperState = world.getBlockState(upper);
if (upperState.isPresent() && upperState.get().type() instanceof SugarCaneBlock) {
return;
}
// 获取当前高度
int height = 1;
for (int i = 1; i < 4; i++) {
Pos3 under = location.add(0,-i,0);
Optional<CustomCropsBlockState> optionalState = world.getBlockState(under);
if (optionalState.isPresent() && optionalState.get().type() instanceof SugarCaneBlock) {
height++;
} else {
break;
}
}
if (height >= 4) return;
// 检查是否有足够的空间生长
Location upperBukkitLocation = upper.toLocation(world.bukkitWorld());
// 切换到主线程
BukkitCustomCropsPlugin.getInstance().getScheduler().sync().run(() -> {
if (!suitableForGrow(upperBukkitLocation)) {
return;
}
// 放置上层方块
BukkitCustomCropsPlugin.getInstance().getItemManager().placeBlock(upperBukkitLocation, "customcrops:sugarcane_block_id");
world.addBlockState(upper, createBlockState());
}, upperBukkitLocation);
}
private boolean suitableForGrow(Location location) {
Block block = location.getBlock();
if (block.getType() != Material.AIR) return false;
Location center = LocationUtils.toBlockCenterLocation(location);
Collection<Entity> entities = center.getWorld().getNearbyEntities(center, 0.5,0.5,0.5);
entities.removeIf(entity -> (entity instanceof Player || entity instanceof Item));
return entities.isEmpty();
}
@Override
public void onBreak(WrappedBreakEvent event) {
Location location = event.location();
Pos3 pos3 = Pos3.from(location);
CustomCropsWorld<?> world = event.world();
// 构建物品
ItemStack itemToDrop = BukkitCustomCropsPlugin.getInstance().getItemManager().build(null, "customcrops:sugarcane_item_id");
// 破坏上层方块
for (int i = 0; i < 4; i++) {
Pos3 upper = pos3.add(0, i,0);
Optional<CustomCropsBlockState> optionalState = world.getBlockState(upper);
if (optionalState.isPresent() && optionalState.get().type() instanceof SugarCaneBlock) {
world.removeBlockState(upper);
Location temp = upper.toLocation(world.bukkitWorld());
BukkitCustomCropsPlugin.getInstance().getItemManager().removeBlock(temp);
temp.getWorld().dropItemNaturally(temp, itemToDrop);
} else {
break;
}
}
}
@Override
public NamedTextColor insightColor() {
return NamedTextColor.YELLOW;
}
}