9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-20 07:29:17 +00:00

修复世界生成阶段的获取流体状态

This commit is contained in:
XiaoMoMi
2025-07-14 02:01:59 +08:00
parent d88c8a8e55
commit d2b46c5463
17 changed files with 30 additions and 36 deletions

View File

@@ -53,7 +53,7 @@ public abstract class AbstractCanSurviveBlockBehavior extends BukkitBlockBehavio
public void onPlace(Object thisBlock, Object[] args, Callable<Object> superMethod) { public void onPlace(Object thisBlock, Object[] args, Callable<Object> superMethod) {
Object world = args[1]; Object world = args[1];
Object blockPos = args[2]; Object blockPos = args[2];
FastNMS.INSTANCE.method$LevelAccessor$scheduleBlockTick(world, blockPos, thisBlock, 2); FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(world, blockPos, thisBlock, 2);
} }
@Override @Override
@@ -66,7 +66,7 @@ public abstract class AbstractCanSurviveBlockBehavior extends BukkitBlockBehavio
return state; return state;
} }
if (this.delay != 0) { if (this.delay != 0) {
FastNMS.INSTANCE.method$LevelAccessor$scheduleBlockTick(level, blockPos, thisBlock, this.delay); FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(level, blockPos, thisBlock, this.delay);
return state; return state;
} }
if (!canSurvive(thisBlock, new Object[] {state, level, blockPos}, () -> true)) { if (!canSurvive(thisBlock, new Object[] {state, level, blockPos}, () -> true)) {

View File

@@ -155,7 +155,7 @@ public class BukkitBlockBehavior extends AbstractBlockBehavior {
Object fluidType = FastNMS.INSTANCE.method$FluidState$getType(args[3]); Object fluidType = FastNMS.INSTANCE.method$FluidState$getType(args[3]);
if (!immutableBlockState.get(this.waterloggedProperty) && fluidType == MFluids.WATER) { if (!immutableBlockState.get(this.waterloggedProperty) && fluidType == MFluids.WATER) {
FastNMS.INSTANCE.method$LevelWriter$setBlock(args[0], args[1], immutableBlockState.with(this.waterloggedProperty, true).customBlockState().handle(), 3); FastNMS.INSTANCE.method$LevelWriter$setBlock(args[0], args[1], immutableBlockState.with(this.waterloggedProperty, true).customBlockState().handle(), 3);
FastNMS.INSTANCE.method$LevelAccessor$scheduleFluidTick(args[0], args[1], fluidType, 5); FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleFluidTick(args[0], args[1], fluidType, 5);
return true; return true;
} }
return false; return false;

View File

@@ -37,14 +37,14 @@ public class FallingBlockBehavior extends BukkitBlockBehavior {
public void onPlace(Object thisBlock, Object[] args, Callable<Object> superMethod) { public void onPlace(Object thisBlock, Object[] args, Callable<Object> superMethod) {
Object world = args[1]; Object world = args[1];
Object blockPos = args[2]; Object blockPos = args[2];
FastNMS.INSTANCE.method$LevelAccessor$scheduleBlockTick(world, blockPos, thisBlock, 2); FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(world, blockPos, thisBlock, 2);
} }
@Override @Override
public Object updateShape(Object thisBlock, Object[] args, Callable<Object> superMethod) { public Object updateShape(Object thisBlock, Object[] args, Callable<Object> superMethod) {
Object world = args[updateShape$level]; Object world = args[updateShape$level];
Object blockPos = args[updateShape$blockPos]; Object blockPos = args[updateShape$blockPos];
FastNMS.INSTANCE.method$LevelAccessor$scheduleBlockTick(world, blockPos, thisBlock, 2); FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(world, blockPos, thisBlock, 2);
return args[0]; return args[0];
} }

View File

@@ -59,7 +59,7 @@ public class LampBlockBehavior extends BukkitBlockBehavior {
boolean lit = customState.get(this.litProperty); boolean lit = customState.get(this.litProperty);
if (lit != FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(world, blockPos)) { if (lit != FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(world, blockPos)) {
if (lit) { if (lit) {
FastNMS.INSTANCE.method$LevelAccessor$scheduleBlockTick(world, blockPos, thisBlock, 4); FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(world, blockPos, thisBlock, 4);
} else { } else {
if (FastNMS.INSTANCE.method$CraftEventFactory$callRedstoneChange(world, blockPos, 0, 15).getNewCurrent() != 15) { if (FastNMS.INSTANCE.method$CraftEventFactory$callRedstoneChange(world, blockPos, 0, 15).getNewCurrent() != 15) {
return; return;

View File

@@ -66,7 +66,7 @@ public class LeavesBlockBehavior extends BukkitBlockBehavior {
LeavesBlockBehavior behavior = optionalBehavior.get(); LeavesBlockBehavior behavior = optionalBehavior.get();
int distance = behavior.getDistanceAt(neighborState) + 1; int distance = behavior.getDistanceAt(neighborState) + 1;
if (distance != 1 || behavior.getDistance(optionalCustomState.get()) != distance) { if (distance != 1 || behavior.getDistance(optionalCustomState.get()) != distance) {
FastNMS.INSTANCE.method$LevelAccessor$scheduleBlockTick(world, blockPos, thisBlock, 1); FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(world, blockPos, thisBlock, 1);
} }
} }
} }

View File

@@ -86,8 +86,8 @@ public class NearLiquidBlockBehavior extends AbstractCanSurviveBlockBehavior {
} }
protected boolean mayPlaceOn(Object belowState, Object world, Object belowPos) { protected boolean mayPlaceOn(Object belowState, Object world, Object belowPos) {
Object fluidState = FastNMS.INSTANCE.method$Level$getFluidState(world, belowPos); Object fluidState = FastNMS.INSTANCE.method$BlockGetter$getFluidState(world, belowPos);
Object fluidStateAbove = FastNMS.INSTANCE.method$Level$getFluidState(world, LocationUtils.above(belowPos)); Object fluidStateAbove = FastNMS.INSTANCE.method$BlockGetter$getFluidState(world, LocationUtils.above(belowPos));
if (FastNMS.INSTANCE.method$FluidState$getType(fluidStateAbove) != MFluids.EMPTY) { if (FastNMS.INSTANCE.method$FluidState$getType(fluidStateAbove) != MFluids.EMPTY) {
return false; return false;
} }

View File

@@ -65,8 +65,8 @@ public class OnLiquidBlockBehavior extends AbstractCanSurviveBlockBehavior {
return true; return true;
} }
} }
Object fluidState = FastNMS.INSTANCE.method$Level$getFluidState(world, belowPos); Object fluidState = FastNMS.INSTANCE.method$BlockGetter$getFluidState(world, belowPos);
Object fluidStateAbove = FastNMS.INSTANCE.method$Level$getFluidState(world, LocationUtils.above(belowPos)); Object fluidStateAbove = FastNMS.INSTANCE.method$BlockGetter$getFluidState(world, LocationUtils.above(belowPos));
if (FastNMS.INSTANCE.method$FluidState$getType(fluidStateAbove) != MFluids.EMPTY) { if (FastNMS.INSTANCE.method$FluidState$getType(fluidStateAbove) != MFluids.EMPTY) {
return false; return false;
} }

View File

@@ -106,7 +106,7 @@ public class PressurePlateBlockBehavior extends BukkitBlockBehavior {
this.checkPressed(args[3], args[1], args[2], state, signalForState, thisBlock); this.checkPressed(args[3], args[1], args[2], state, signalForState, thisBlock);
} else { } else {
// todo 为什么 // todo 为什么
FastNMS.INSTANCE.method$LevelAccessor$scheduleBlockTick(args[1], args[2], thisBlock, this.pressedTime); FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(args[1], args[2], thisBlock, this.pressedTime);
} }
} }
@@ -150,7 +150,7 @@ public class PressurePlateBlockBehavior extends BukkitBlockBehavior {
} }
if (isActive) { if (isActive) {
FastNMS.INSTANCE.method$LevelAccessor$scheduleBlockTick(level, pos, thisBlock, this.pressedTime); FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(level, pos, thisBlock, this.pressedTime);
} }
} }

View File

@@ -89,7 +89,7 @@ public class SaplingBlockBehavior extends BukkitBlockBehavior {
} }
Object chunkGenerator = CoreReflections.method$ServerChunkCache$getGenerator.invoke(FastNMS.INSTANCE.method$ServerLevel$getChunkSource(world)); Object chunkGenerator = CoreReflections.method$ServerChunkCache$getGenerator.invoke(FastNMS.INSTANCE.method$ServerLevel$getChunkSource(world));
Object configuredFeature = CoreReflections.method$Holder$value.invoke(holder.get()); Object configuredFeature = CoreReflections.method$Holder$value.invoke(holder.get());
Object fluidState = FastNMS.INSTANCE.method$Level$getFluidState(world, blockPos); Object fluidState = FastNMS.INSTANCE.method$BlockGetter$getFluidState(world, blockPos);
Object legacyState = CoreReflections.method$FluidState$createLegacyBlock.invoke(fluidState); Object legacyState = CoreReflections.method$FluidState$createLegacyBlock.invoke(fluidState);
FastNMS.INSTANCE.method$LevelWriter$setBlock(world, blockPos, legacyState, UpdateOption.UPDATE_NONE.flags()); FastNMS.INSTANCE.method$LevelWriter$setBlock(world, blockPos, legacyState, UpdateOption.UPDATE_NONE.flags());
if ((boolean) CoreReflections.method$ConfiguredFeature$place.invoke(configuredFeature, world, chunkGenerator, randomSource, blockPos)) { if ((boolean) CoreReflections.method$ConfiguredFeature$place.invoke(configuredFeature, world, chunkGenerator, randomSource, blockPos)) {

View File

@@ -66,7 +66,7 @@ public class SlabBlockBehavior extends BukkitBlockBehavior {
blockState = blockState.with(super.waterloggedProperty, false); blockState = blockState.with(super.waterloggedProperty, false);
return blockState.with(this.typeProperty, SlabType.DOUBLE); return blockState.with(this.typeProperty, SlabType.DOUBLE);
} else { } else {
Object fluidState = FastNMS.INSTANCE.method$Level$getFluidState(context.getLevel().serverWorld(), LocationUtils.toBlockPos(clickedPos)); Object fluidState = FastNMS.INSTANCE.method$BlockGetter$getFluidState(context.getLevel().serverWorld(), LocationUtils.toBlockPos(clickedPos));
if (super.waterloggedProperty != null) if (super.waterloggedProperty != null)
state = state.with(super.waterloggedProperty, FastNMS.INSTANCE.method$FluidState$getType(fluidState) == MFluids.WATER); state = state.with(super.waterloggedProperty, FastNMS.INSTANCE.method$FluidState$getType(fluidState) == MFluids.WATER);
Direction clickedFace = context.getClickedFace(); Direction clickedFace = context.getClickedFace();
@@ -95,7 +95,7 @@ public class SlabBlockBehavior extends BukkitBlockBehavior {
Optional<ImmutableBlockState> optionalCustomState = BlockStateUtils.getOptionalCustomBlockState(blockState); Optional<ImmutableBlockState> optionalCustomState = BlockStateUtils.getOptionalCustomBlockState(blockState);
if (optionalCustomState.isEmpty()) return blockState; if (optionalCustomState.isEmpty()) return blockState;
if (optionalCustomState.get().get(super.waterloggedProperty)) { if (optionalCustomState.get().get(super.waterloggedProperty)) {
FastNMS.INSTANCE.method$LevelAccessor$scheduleFluidTick(VersionHelper.isOrAbove1_21_2() ? args[2] : args[3], VersionHelper.isOrAbove1_21_2() ? args[3] : args[4], MFluids.WATER, 5); FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleFluidTick(VersionHelper.isOrAbove1_21_2() ? args[2] : args[3], VersionHelper.isOrAbove1_21_2() ? args[3] : args[4], MFluids.WATER, 5);
} }
return blockState; return blockState;
} }

View File

@@ -45,7 +45,7 @@ public class StairsBlockBehavior extends BukkitBlockBehavior {
.with(this.facingProperty, context.getHorizontalDirection().toHorizontalDirection()) .with(this.facingProperty, context.getHorizontalDirection().toHorizontalDirection())
.with(this.halfProperty, clickedFace != Direction.DOWN && (clickedFace == Direction.UP || !(context.getClickLocation().y - clickedPos.y() > 0.5)) ? SingleBlockHalf.BOTTOM : SingleBlockHalf.TOP); .with(this.halfProperty, clickedFace != Direction.DOWN && (clickedFace == Direction.UP || !(context.getClickLocation().y - clickedPos.y() > 0.5)) ? SingleBlockHalf.BOTTOM : SingleBlockHalf.TOP);
if (super.waterloggedProperty != null) { if (super.waterloggedProperty != null) {
Object fluidState = FastNMS.INSTANCE.method$Level$getFluidState(context.getLevel().serverWorld(), LocationUtils.toBlockPos(clickedPos)); Object fluidState = FastNMS.INSTANCE.method$BlockGetter$getFluidState(context.getLevel().serverWorld(), LocationUtils.toBlockPos(clickedPos));
blockState = blockState.with(this.waterloggedProperty, FastNMS.INSTANCE.method$FluidState$getType(fluidState) == MFluids.WATER); blockState = blockState.with(this.waterloggedProperty, FastNMS.INSTANCE.method$FluidState$getType(fluidState) == MFluids.WATER);
} }
return blockState.with(this.shapeProperty, getStairsShape(blockState, context.getLevel().serverWorld(), clickedPos)); return blockState.with(this.shapeProperty, getStairsShape(blockState, context.getLevel().serverWorld(), clickedPos));
@@ -60,7 +60,7 @@ public class StairsBlockBehavior extends BukkitBlockBehavior {
if (optionalCustomState.isEmpty()) return blockState; if (optionalCustomState.isEmpty()) return blockState;
ImmutableBlockState customState = optionalCustomState.get(); ImmutableBlockState customState = optionalCustomState.get();
if (super.waterloggedProperty != null && customState.get(this.waterloggedProperty)) { if (super.waterloggedProperty != null && customState.get(this.waterloggedProperty)) {
FastNMS.INSTANCE.method$LevelAccessor$scheduleFluidTick(args[updateShape$level], args[updateShape$blockPos], MFluids.WATER, 5); FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleFluidTick(args[updateShape$level], args[updateShape$blockPos], MFluids.WATER, 5);
} }
Direction direction = DirectionUtils.fromNMSDirection(VersionHelper.isOrAbove1_21_2() ? args[4] : args[1]); Direction direction = DirectionUtils.fromNMSDirection(VersionHelper.isOrAbove1_21_2() ? args[4] : args[1]);
StairsShape stairsShape = getStairsShape(customState, level, LocationUtils.fromBlockPos(blockPos)); StairsShape stairsShape = getStairsShape(customState, level, LocationUtils.fromBlockPos(blockPos));

View File

@@ -77,7 +77,7 @@ public class TrapDoorBlockBehavior extends BukkitBlockBehavior {
if (super.waterloggedProperty != null) { if (super.waterloggedProperty != null) {
BlockStateUtils.getOptionalCustomBlockState(blockState).ifPresent(customState -> { BlockStateUtils.getOptionalCustomBlockState(blockState).ifPresent(customState -> {
if (customState.get(super.waterloggedProperty)) { if (customState.get(super.waterloggedProperty)) {
FastNMS.INSTANCE.method$LevelAccessor$scheduleFluidTick(args[updateShape$level], args[updateShape$blockPos], MFluids.WATER, 5); FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleFluidTick(args[updateShape$level], args[updateShape$blockPos], MFluids.WATER, 5);
} }
}); });
} }
@@ -99,7 +99,7 @@ public class TrapDoorBlockBehavior extends BukkitBlockBehavior {
if (FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(level, clickedPos)) { if (FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(level, clickedPos)) {
state = state.with(this.poweredProperty, true).with(this.openProperty, true); state = state.with(this.poweredProperty, true).with(this.openProperty, true);
} }
if (this.waterloggedProperty != null && FastNMS.INSTANCE.method$FluidState$getType(FastNMS.INSTANCE.method$Level$getFluidState(level, clickedPos)) == MFluids.WATER) { if (this.waterloggedProperty != null && FastNMS.INSTANCE.method$FluidState$getType(FastNMS.INSTANCE.method$BlockGetter$getFluidState(level, clickedPos)) == MFluids.WATER) {
state = state.with(this.waterloggedProperty, true); state = state.with(this.waterloggedProperty, true);
} }
return state; return state;
@@ -197,7 +197,7 @@ public class TrapDoorBlockBehavior extends BukkitBlockBehavior {
FastNMS.INSTANCE.method$LevelWriter$setBlock(level, blockPos, customState.with(this.poweredProperty, hasSignal).customBlockState().handle(), UpdateOption.Flags.UPDATE_CLIENTS); FastNMS.INSTANCE.method$LevelWriter$setBlock(level, blockPos, customState.with(this.poweredProperty, hasSignal).customBlockState().handle(), UpdateOption.Flags.UPDATE_CLIENTS);
if (this.waterloggedProperty != null && customState.get(this.waterloggedProperty)) { if (this.waterloggedProperty != null && customState.get(this.waterloggedProperty)) {
FastNMS.INSTANCE.method$LevelAccessor$scheduleFluidTick(level, blockPos, MFluids.WATER, 5); FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleFluidTick(level, blockPos, MFluids.WATER, 5);
} }
} }

View File

@@ -61,7 +61,7 @@ public class CompostableItemBehavior extends ItemBehavior {
context.getLevel().levelEvent(WorldEvents.COMPOSTER_COMPOSTS, context.getClickedPos(), willRaise ? 1 : 0); context.getLevel().levelEvent(WorldEvents.COMPOSTER_COMPOSTS, context.getClickedPos(), willRaise ? 1 : 0);
((World) context.getLevel().platformWorld()).sendGameEvent((Entity) context.getPlayer().platformPlayer(), GameEvent.BLOCK_CHANGE, new Vector(block.x() + 0.5, block.y() + 0.5, block.z() + 0.5)); ((World) context.getLevel().platformWorld()).sendGameEvent((Entity) context.getPlayer().platformPlayer(), GameEvent.BLOCK_CHANGE, new Vector(block.x() + 0.5, block.y() + 0.5, block.z() + 0.5));
if (currentLevel + 1 == 7) { if (currentLevel + 1 == 7) {
FastNMS.INSTANCE.method$LevelAccessor$scheduleBlockTick(context.getLevel().serverWorld(), LocationUtils.toBlockPos(context.getClickedPos()), blockOwner, 20); FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(context.getLevel().serverWorld(), LocationUtils.toBlockPos(context.getClickedPos()), blockOwner, 20);
} }
if (!context.getPlayer().canInstabuild()) { if (!context.getPlayer().canInstabuild()) {
context.getItem().shrink(1); context.getItem().shrink(1);

View File

@@ -235,16 +235,10 @@ public final class BlockGenerator {
public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) { public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate(); ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
DelegatingBlock indicator = (DelegatingBlock) thisObj; DelegatingBlock indicator = (DelegatingBlock) thisObj;
// todo chain updater // todo better chain updater
if (indicator.isNoteBlock()) { if (indicator.isNoteBlock() && CoreReflections.clazz$ServerLevel.isInstance(args[levelIndex])) {
if (CoreReflections.clazz$ServerLevel.isInstance(args[levelIndex])) {
startNoteBlockChain(args); startNoteBlockChain(args);
} }
} else if (indicator.isTripwire()) {
if (CoreReflections.clazz$ServerLevel.isInstance(args[posIndex])) {
}
}
try { try {
return holder.value().updateShape(thisObj, args, superMethod); return holder.value().updateShape(thisObj, args, superMethod);
} catch (Exception e) { } catch (Exception e) {

View File

@@ -32,7 +32,7 @@ public class BukkitBlockInWorld implements BlockInWorld {
public boolean isWaterSource(BlockPlaceContext blockPlaceContext) { public boolean isWaterSource(BlockPlaceContext blockPlaceContext) {
Location location = this.block.getLocation(); Location location = this.block.getLocation();
Object serverLevel = FastNMS.INSTANCE.field$CraftWorld$ServerLevel(this.block.getWorld()); Object serverLevel = FastNMS.INSTANCE.field$CraftWorld$ServerLevel(this.block.getWorld());
Object fluidData = FastNMS.INSTANCE.method$Level$getFluidState(serverLevel, LocationUtils.toBlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ())); Object fluidData = FastNMS.INSTANCE.method$BlockGetter$getFluidState(serverLevel, LocationUtils.toBlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()));
if (fluidData == null) return false; if (fluidData == null) return false;
return FastNMS.INSTANCE.method$FluidState$getType(fluidData) == MFluids.WATER; return FastNMS.INSTANCE.method$FluidState$getType(fluidData) == MFluids.WATER;
} }

View File

@@ -34,8 +34,8 @@ public abstract class BlockBehavior {
return superMethod.call(); return superMethod.call();
} }
// 1.20.1-1.21.1 Direction direction, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos // 1.20.1-1.21.1 BlockState state, Direction direction, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos
// 1.21.2+ LevelReader level, ScheduledTickAccess scheduledTickAccess, BlockPos pos, Direction direction, BlockPos neighborPos, BlockState neighborState, RandomSource random // 1.21.2+ BlockState state, LevelReader level, ScheduledTickAccess scheduledTickAccess, BlockPos pos, Direction direction, BlockPos neighborPos, BlockState neighborState, RandomSource random
public Object updateShape(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception { public Object updateShape(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
return args[0]; return args[0];
} }

View File

@@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G
# Project settings # Project settings
# Rule: [major update].[feature update].[bug fix] # Rule: [major update].[feature update].[bug fix]
project_version=0.0.59.10 project_version=0.0.59.11
config_version=41 config_version=41
lang_version=22 lang_version=22
project_group=net.momirealms project_group=net.momirealms
@@ -50,7 +50,7 @@ byte_buddy_version=1.17.5
ahocorasick_version=0.6.3 ahocorasick_version=0.6.3
snake_yaml_version=2.4 snake_yaml_version=2.4
anti_grief_version=0.18 anti_grief_version=0.18
nms_helper_version=1.0.33 nms_helper_version=1.0.34
evalex_version=3.5.0 evalex_version=3.5.0
reactive_streams_version=1.0.4 reactive_streams_version=1.0.4
amazon_awssdk_version=2.31.23 amazon_awssdk_version=2.31.23