9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-28 19:39:11 +00:00

feat(block): 优化作物方块行为和掉落实现

This commit is contained in:
jhqwqmc
2025-03-28 12:01:13 +08:00
parent 6c94e4f2ab
commit d98032160f
5 changed files with 29 additions and 23 deletions

View File

@@ -1,6 +1,7 @@
package net.momirealms.craftengine.bukkit.api;
import net.momirealms.craftengine.bukkit.block.BukkitBlockManager;
import net.momirealms.craftengine.bukkit.block.behavior.CropBlockBehavior;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer;
@@ -181,6 +182,9 @@ public final class CraftEngineBlocks {
builder.withParameter(LootParameters.PLAYER, serverPlayer);
builder.withOptionalParameter(LootParameters.TOOL, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND));
}
if (state.behavior() instanceof CropBlockBehavior) {
builder.withParameter(LootParameters.CROP_BLOCK, true);
}
for (Item<?> item : state.getDrops(builder, world)) {
world.dropItemNaturally(vec3d, item);
}

View File

@@ -300,6 +300,9 @@ public class BlockEventListener implements Listener {
if (yield < 1f) {
builder.withParameter(LootParameters.EXPLOSION_RADIUS, 1.0f / yield);
}
if (state.behavior() instanceof CropBlockBehavior) {
builder.withParameter(LootParameters.CROP_BLOCK, true);
}
for (Item<Object> item : state.getDrops(builder, world)) {
world.dropItemNaturally(vec3d, item);
}

View File

@@ -71,6 +71,9 @@ public class BushBlockBehavior extends AbstractBlockBehavior {
net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level));
builder.withParameter(LootParameters.LOCATION, vec3d);
builder.withParameter(LootParameters.WORLD, world);
if (this instanceof CropBlockBehavior) {
builder.withParameter(LootParameters.CROP_BLOCK, true);
}
for (Item<Object> item : previousState.getDrops(builder, world)) {
world.dropItemNaturally(vec3d, item);
}

View File

@@ -5,6 +5,7 @@ import net.momirealms.craftengine.bukkit.util.BlockStateUtils;
import net.momirealms.craftengine.bukkit.util.Reflections;
import net.momirealms.craftengine.core.block.CustomBlock;
import net.momirealms.craftengine.core.block.ImmutableBlockState;
import net.momirealms.craftengine.core.block.UpdateOption;
import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory;
import net.momirealms.craftengine.core.block.properties.IntegerProperty;
import net.momirealms.craftengine.core.block.properties.Property;
@@ -56,7 +57,7 @@ public class CropBlockBehavior extends BushBlockBehavior {
if (i > maxAge) {
i = maxAge;
}
Reflections.method$ServerLevel$sendBlockUpdated.invoke(level, pos, state, getStateForAge(state, i), 3);
Reflections.method$Level$setBlock.invoke(level, pos, getStateForAge(state, i), UpdateOption.UPDATE_NONE.flags());
}
private static int getRawBrightness(Object level, Object pos) throws InvocationTargetException, IllegalAccessException {
@@ -74,8 +75,10 @@ public class CropBlockBehavior extends BushBlockBehavior {
Object pos = args[2];
if (getRawBrightness(level, pos) >= minGrowLight) {
int age = this.getAge(state);
System.out.println("age: " + age);
if (age < this.ageProperty.max && RandomUtils.generateRandomFloat(0, 1) >= this.growSpeed) {
Reflections.method$ServerLevel$sendBlockUpdated.invoke(level, pos, state, getStateForAge(state, age + 1), 3);
System.out.println("grow");
Reflections.method$Level$setBlock.invoke(level, pos, getStateForAge(state, age + 1), UpdateOption.UPDATE_NONE.flags());
}
}
}