mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-28 11:29:17 +00:00
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user