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

Revert "fix(block): 修复错误的tick方块方式"

This reverts commit 1d500a580d.
This commit is contained in:
jhqwqmc
2025-09-19 10:42:57 +08:00
parent 1d500a580d
commit 09c60273be
3 changed files with 36 additions and 41 deletions

View File

@@ -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);

View File

@@ -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);
}
}

View File

@@ -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<HumanEntity> 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<Boolean> 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<HumanEntity> 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);
}
}