diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ButtonBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ButtonBlockBehavior.java index 7bca026c1..3be8fa890 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ButtonBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ButtonBlockBehavior.java @@ -53,7 +53,8 @@ public class ButtonBlockBehavior extends BukkitBlockBehavior { @Override public InteractionResult useWithoutItem(UseOnContext context, ImmutableBlockState state) { if (!state.get(this.poweredProperty)) { - press(state, context.getLevel().serverWorld(), LocationUtils.toBlockPos(context.getClickedPos()), + press(BlockStateUtils.getBlockOwner(state.customBlockState().literalObject()), + state, context.getLevel().serverWorld(), LocationUtils.toBlockPos(context.getClickedPos()), context.getPlayer() != null ? context.getPlayer().serverPlayer() : null); return InteractionResult.SUCCESS_AND_CANCEL; } @@ -65,7 +66,7 @@ public class ButtonBlockBehavior extends BukkitBlockBehavior { ImmutableBlockState blockState = BlockStateUtils.getOptionalCustomBlockState(args[0]).orElse(null); if (blockState == null) return; if (FastNMS.INSTANCE.method$Explosion$canTriggerBlocks(args[3]) && !blockState.get(this.poweredProperty)) { - press(blockState, args[1], args[2], null); + press(thisBlock, blockState, args[1], args[2], null); } } @@ -116,7 +117,7 @@ public class ButtonBlockBehavior extends BukkitBlockBehavior { ImmutableBlockState blockState = BlockStateUtils.getOptionalCustomBlockState(state).orElse(null); if (blockState == null) return; if (blockState.get(this.poweredProperty)) { - checkPressed(state, level, pos); + checkPressed(thisBlock, state, level, pos); } } @@ -128,12 +129,11 @@ public class ButtonBlockBehavior extends BukkitBlockBehavior { ImmutableBlockState blockState = BlockStateUtils.getOptionalCustomBlockState(state).orElse(null); if (blockState == null) return; if (this.canButtonBeActivatedByArrows && !blockState.get(this.poweredProperty)) { - checkPressed(state, level, pos); + checkPressed(thisBlock, state, level, pos); } } - private void checkPressed(Object state, Object level, Object pos) { - Object tickState = state; + private void checkPressed(Object thisBlock, Object state, Object level, Object pos) { Object abstractArrow = this.canButtonBeActivatedByArrows ? FastNMS.INSTANCE.method$EntityGetter$getEntitiesOfClass( level, CoreReflections.clazz$AbstractArrow, FastNMS.INSTANCE.method$AABB$move( FastNMS.INSTANCE.method$VoxelShape$bounds(FastNMS.INSTANCE.method$BlockState$getShape( @@ -144,9 +144,8 @@ public class ButtonBlockBehavior extends BukkitBlockBehavior { if (blockState == null) return; boolean poweredValue = blockState.get(this.poweredProperty); if (flag != poweredValue) { - tickState = blockState.with(this.poweredProperty, flag).customBlockState().literalObject(); - FastNMS.INSTANCE.method$LevelWriter$setBlock(level, pos, tickState, UpdateOption.UPDATE_ALL.flags()); - updateNeighbours(BlockStateUtils.getBlockOwner(tickState), blockState, level, pos); + FastNMS.INSTANCE.method$LevelWriter$setBlock(level, pos, blockState.with(this.poweredProperty, flag).customBlockState().literalObject(), UpdateOption.UPDATE_ALL.flags()); + updateNeighbours(thisBlock, blockState, level, pos); playSound(null, level, pos, flag); Object gameEvent = VersionHelper.isOrAbove1_20_5() ? FastNMS.INSTANCE.method$Holder$direct(flag ? MGameEvent.BLOCK_ACTIVATE : MGameEvent.BLOCK_DEACTIVATE) @@ -155,7 +154,7 @@ public class ButtonBlockBehavior extends BukkitBlockBehavior { } if (flag) { - FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(level, pos, BlockStateUtils.getBlockOwner(tickState), this.ticksToStayPressed); + FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(level, pos, thisBlock, this.ticksToStayPressed); } } @@ -189,10 +188,9 @@ public class ButtonBlockBehavior extends BukkitBlockBehavior { return isOn ? this.buttonClickOnSound : this.buttonClickOffSound; } - private void press(ImmutableBlockState state, Object level, Object pos, @Nullable Object player) { - Object tickState = state.with(this.poweredProperty, true).customBlockState().literalObject(); - FastNMS.INSTANCE.method$LevelWriter$setBlock(level, pos, tickState, UpdateOption.UPDATE_ALL.flags()); - FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(level, pos, BlockStateUtils.getBlockOwner(tickState), this.ticksToStayPressed); + private void press(Object thisBlock, ImmutableBlockState state, Object level, Object pos, @Nullable Object player) { + FastNMS.INSTANCE.method$LevelWriter$setBlock(level, pos, state.with(this.poweredProperty, true).customBlockState().literalObject(), UpdateOption.UPDATE_ALL.flags()); + FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(level, pos, thisBlock, this.ticksToStayPressed); playSound(player, level, pos, true); Object gameEvent = VersionHelper.isOrAbove1_20_5() ? FastNMS.INSTANCE.method$Holder$direct(MGameEvent.BLOCK_ACTIVATE) : MGameEvent.BLOCK_ACTIVATE; FastNMS.INSTANCE.method$LevelAccessor$gameEvent(level, player, gameEvent, pos); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PressurePlateBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PressurePlateBlockBehavior.java index a3e85d6ae..5ec5cc268 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PressurePlateBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PressurePlateBlockBehavior.java @@ -29,6 +29,7 @@ import javax.annotation.Nullable; import java.util.Map; import java.util.Optional; import java.util.concurrent.Callable; +import java.util.function.Predicate; public class PressurePlateBlockBehavior extends BukkitBlockBehavior { public static final Factory FACTORY = new Factory(); @@ -86,7 +87,7 @@ public class PressurePlateBlockBehavior extends BukkitBlockBehavior { Object state = args[0]; int signalForState = this.getSignalForState(state); if (signalForState > 0) { - this.checkPressed(null, args[1], args[2], state, signalForState); + this.checkPressed(null, args[1], args[2], state, signalForState, thisBlock); } } @@ -100,7 +101,9 @@ public class PressurePlateBlockBehavior extends BukkitBlockBehavior { Object state = args[0]; int signalForState = this.getSignalForState(state); if (signalForState == 0) { - this.checkPressed(args[3], args[1], args[2], state, signalForState); + this.checkPressed(args[3], args[1], args[2], state, signalForState, thisBlock); + } else { + FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(args[1], args[2], thisBlock, this.pressedTime); } } @@ -122,17 +125,16 @@ public class PressurePlateBlockBehavior extends BukkitBlockBehavior { return optionalCustomState.get().with(this.poweredProperty, strength > 0).customBlockState().literalObject(); } - private void checkPressed(@Nullable Object entity, Object level, Object pos, Object state, int currentSignal) { - Object tickState = state; + private void checkPressed(@Nullable Object entity, Object level, Object pos, Object state, int currentSignal, Object thisBlock) { int signalStrength = this.getSignalStrength(level, pos); boolean wasActive = currentSignal > 0; boolean isActive = signalStrength > 0; if (currentSignal != signalStrength) { - tickState = this.setSignalForState(state, signalStrength); - FastNMS.INSTANCE.method$LevelWriter$setBlock(level, pos, tickState, 2); - this.updateNeighbours(level, pos, BlockStateUtils.getBlockOwner(tickState)); - FastNMS.INSTANCE.method$Level$setBlocksDirty(level, pos, state, tickState); + Object blockState = this.setSignalForState(state, signalStrength); + FastNMS.INSTANCE.method$LevelWriter$setBlock(level, pos, blockState, 2); + this.updateNeighbours(level, pos, thisBlock); + FastNMS.INSTANCE.method$Level$setBlocksDirty(level, pos, state, blockState); } org.bukkit.World craftWorld = FastNMS.INSTANCE.method$Level$getCraftWorld(level); @@ -148,7 +150,7 @@ public class PressurePlateBlockBehavior extends BukkitBlockBehavior { } if (isActive) { - FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(level, pos, BlockStateUtils.getBlockOwner(tickState), this.pressedTime); + FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(level, pos, thisBlock, this.pressedTime); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/entity/SimpleStorageBlockEntity.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/entity/SimpleStorageBlockEntity.java index f889df503..fcb654c71 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/entity/SimpleStorageBlockEntity.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/entity/SimpleStorageBlockEntity.java @@ -107,8 +107,8 @@ public class SimpleStorageBlockEntity extends BlockEntity { // 有非观察者的人,那么就不触发开启音效和事件 if (!hasNoViewer(this.inventory.getViewers())) return; this.maxInteractionDistance = Math.max(player.getCachedInteractionRange(), this.maxInteractionDistance); - ImmutableBlockState state = this.setOpen(player); - FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(super.world.world().serverWorld(), LocationUtils.toBlockPos(this.pos), BlockStateUtils.getBlockOwner(state.customBlockState().literalObject()), 5); + this.setOpen(player); + FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(super.world.world().serverWorld(), LocationUtils.toBlockPos(this.pos), BlockStateUtils.getBlockOwner(this.blockState.customBlockState().literalObject()), 5); } } @@ -127,8 +127,8 @@ public class SimpleStorageBlockEntity extends BlockEntity { } } - private ImmutableBlockState setOpen(@Nullable Player player) { - ImmutableBlockState state = this.updateOpenBlockState(true); + private void setOpen(@Nullable Player player) { + this.updateOpenBlockState(true); org.bukkit.World bukkitWorld = (org.bukkit.World) super.world.world().platformWorld(); if (player != null) { bukkitWorld.sendGameEvent((org.bukkit.entity.Player) player.platformPlayer(), GameEvent.CONTAINER_OPEN, new Vector(this.pos.x(), this.pos.y(), this.pos.z())); @@ -140,11 +140,10 @@ public class SimpleStorageBlockEntity extends BlockEntity { if (soundData != null) { super.world.world().playBlockSound(Vec3d.atCenterOf(this.pos), soundData); } - return state; } - private ImmutableBlockState setClose(@Nullable Player player) { - ImmutableBlockState state = this.updateOpenBlockState(false); + private void setClose(@Nullable Player player) { + this.updateOpenBlockState(false); org.bukkit.World bukkitWorld = (org.bukkit.World) super.world.world().platformWorld(); if (player != null) { bukkitWorld.sendGameEvent((org.bukkit.entity.Player) player.platformPlayer(), GameEvent.CONTAINER_CLOSE, new Vector(this.pos.x(), this.pos.y(), this.pos.z())); @@ -156,7 +155,6 @@ public class SimpleStorageBlockEntity extends BlockEntity { if (soundData != null) { super.world.world().playBlockSound(Vec3d.atCenterOf(this.pos), soundData); } - return state; } private boolean hasNoViewer(List viewers) { @@ -172,19 +170,16 @@ public class SimpleStorageBlockEntity extends BlockEntity { return this.isValid() && this.inventory != null && this.behavior != null; } - public ImmutableBlockState updateOpenBlockState(boolean open) { + public void updateOpenBlockState(boolean open) { ImmutableBlockState state = super.world.getBlockStateAtIfLoaded(this.pos); - if (state == null || state.behavior() != this.behavior) return this.blockState; + if (state == null || state.behavior() != this.behavior) return; Property property = this.behavior.openProperty(); - if (property == null) return state; - state = state.with(property, open); - super.world.world().setBlockAt(this.pos.x(), this.pos.y(), this.pos.z(), state, UpdateOption.UPDATE_ALL.flags()); - return state; + if (property == null) return; + super.world.world().setBlockAt(this.pos.x(), this.pos.y(), this.pos.z(), state.with(property, open), UpdateOption.UPDATE_ALL.flags()); } public void checkOpeners(Object level, Object pos, Object blockState) { if (!this.isValidContainer()) return; - Object tickState = blockState; double maxInteractionDistance = 0d; List viewers = this.inventory.getViewers(); int validViewers = 0; @@ -198,14 +193,14 @@ public class SimpleStorageBlockEntity extends BlockEntity { } boolean shouldOpen = validViewers != 0; if (shouldOpen && !this.openState) { - tickState = this.setOpen(null).customBlockState().literalObject(); + this.setOpen(null); } else if (!shouldOpen && this.openState) { - tickState = this.setClose(null).customBlockState().literalObject(); + this.setClose(null); } this.maxInteractionDistance = maxInteractionDistance; if (!viewers.isEmpty()) { - FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(level, pos, BlockStateUtils.getBlockOwner(tickState), 5); + FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(level, pos, BlockStateUtils.getBlockOwner(blockState), 5); } }