From 585869412d3a3dcfe26113ddaa1db2fc194f65dd Mon Sep 17 00:00:00 2001 From: Gabriel Harris-Rouquette Date: Sat, 18 Jan 2025 17:56:59 -0800 Subject: [PATCH] feat: inline boolean checks to block change flags This ought to improve a bit of performance where these flags are being constantly evaluated. --- .../common/block/SpongeBlockSnapshot.java | 2 +- .../tracking/BlockChangeFlagManager.java | 4 +- .../effect/NotifyClientEffect.java | 2 +- .../effect/UpdateConnectingBlocksEffect.java | 2 +- .../common/world/SpongeBlockChangeFlag.java | 107 +++++------------- .../world/level/LevelAccessorMixin_API.java | 2 +- .../world/level/LevelWriterMixin_API.java | 2 +- .../tracking/BlockChangeFlagManagerTest.java | 10 +- 8 files changed, 42 insertions(+), 89 deletions(-) diff --git a/src/main/java/org/spongepowered/common/block/SpongeBlockSnapshot.java b/src/main/java/org/spongepowered/common/block/SpongeBlockSnapshot.java index b508e0bab40..390443b5fc4 100644 --- a/src/main/java/org/spongepowered/common/block/SpongeBlockSnapshot.java +++ b/src/main/java/org/spongepowered/common/block/SpongeBlockSnapshot.java @@ -194,7 +194,7 @@ public boolean restore(final boolean force, final BlockChangeFlag flag) { if (!current.is(((net.minecraft.world.level.block.state.BlockState) this.blockState).getBlock())) { world.removeBlockEntity(pos); } - world.setBlock(pos, replaced, BlockChangeFlagManager.andNotifyClients(flag).getRawFlag()); + world.setBlock(pos, replaced, BlockChangeFlagManager.andNotifyClients(flag).rawFlag()); if (this.compound != null) { @Nullable BlockEntity te = world.getBlockEntity(pos); if (te != null) { diff --git a/src/main/java/org/spongepowered/common/event/tracking/BlockChangeFlagManager.java b/src/main/java/org/spongepowered/common/event/tracking/BlockChangeFlagManager.java index 17c0624f1b9..dd21890d987 100644 --- a/src/main/java/org/spongepowered/common/event/tracking/BlockChangeFlagManager.java +++ b/src/main/java/org/spongepowered/common/event/tracking/BlockChangeFlagManager.java @@ -54,7 +54,7 @@ public static SpongeBlockChangeFlag fromNativeInt(final int flag) { } public static SpongeBlockChangeFlag andNotifyClients(final BlockChangeFlag flag) { - final int rawFlag = ((SpongeBlockChangeFlag) flag).getRawFlag(); + final int rawFlag = ((SpongeBlockChangeFlag) flag).rawFlag(); if ((rawFlag & Constants.BlockChangeFlags.NOTIFY_CLIENTS) != 0){ return (SpongeBlockChangeFlag) flag; // We don't need to rerun the flag } @@ -65,7 +65,7 @@ private BlockChangeFlagManager() { // basically run through all possible permutations to our custom flags for (int i = 0; i < (1 << 9 + 1); i++) { final SpongeBlockChangeFlag flag = new SpongeBlockChangeFlag(i); - this.maskedFlags.put(flag.getRawFlag(), flag); + this.maskedFlags.put(flag.rawFlag(), flag); } } diff --git a/src/main/java/org/spongepowered/common/event/tracking/context/transaction/effect/NotifyClientEffect.java b/src/main/java/org/spongepowered/common/event/tracking/context/transaction/effect/NotifyClientEffect.java index 5ce7d8ec413..7407c9f6825 100644 --- a/src/main/java/org/spongepowered/common/event/tracking/context/transaction/effect/NotifyClientEffect.java +++ b/src/main/java/org/spongepowered/common/event/tracking/context/transaction/effect/NotifyClientEffect.java @@ -59,7 +59,7 @@ public static NotifyClientEffect getInstance() { // if ((flags & 2) != 0 && (!this.isClientSide || (flags & 4) == 0) && (this.isClientSide || chunk.getLocationType() != null && chunk.getLocationType().isAtLeast(ChunkHolder.LocationType.TICKING))) { if (flag.notifyClients() && (chunk.getFullStatus().isOrAfter(FullChunkStatus.BLOCK_TICKING))) { // this.notifyBlockUpdate(pos, blockstate, newWorldState, flags); - world.sendBlockUpdated(oldState.pos(), oldState.state(), newState, flag.getRawFlag()); + world.sendBlockUpdated(oldState.pos(), oldState.state(), newState, flag.rawFlag()); } return EffectResult.nullPass(); } diff --git a/src/main/java/org/spongepowered/common/event/tracking/context/transaction/effect/UpdateConnectingBlocksEffect.java b/src/main/java/org/spongepowered/common/event/tracking/context/transaction/effect/UpdateConnectingBlocksEffect.java index 127b1ef7444..1d39d93e23b 100644 --- a/src/main/java/org/spongepowered/common/event/tracking/context/transaction/effect/UpdateConnectingBlocksEffect.java +++ b/src/main/java/org/spongepowered/common/event/tracking/context/transaction/effect/UpdateConnectingBlocksEffect.java @@ -54,7 +54,7 @@ public static UpdateConnectingBlocksEffect getInstance() { final var limit = args.limit(); if (flag.updateNeighboringShapes() && limit > 0) { // int i = p_241211_3_ & -34; // Vanilla negates 34 to flip neighbor notification and and "state drops" - final int withoutNeighborDropsAndNestedNeighborUpdates = flag.asNestedNeighborUpdates().getRawFlag(); + final int withoutNeighborDropsAndNestedNeighborUpdates = flag.asNestedNeighborUpdates().rawFlag(); // blockstate.updateIndirectNeighbourShapes(this, p_241211_1_, i, p_241211_4_ - 1); oldState.state().updateIndirectNeighbourShapes(world, pos, withoutNeighborDropsAndNestedNeighborUpdates, limit - 1); // p_241211_2_.updateNeighbourShapes(this, p_241211_1_, i, p_241211_4_ - 1); diff --git a/src/main/java/org/spongepowered/common/world/SpongeBlockChangeFlag.java b/src/main/java/org/spongepowered/common/world/SpongeBlockChangeFlag.java index f4968fdd17a..d738678b995 100644 --- a/src/main/java/org/spongepowered/common/world/SpongeBlockChangeFlag.java +++ b/src/main/java/org/spongepowered/common/world/SpongeBlockChangeFlag.java @@ -35,61 +35,36 @@ * interactions, such as notifying neighboring blocks, performing block physics * on placement, etc. */ -public record SpongeBlockChangeFlag(int rawFlag) implements BlockChangeFlag { - - @Override - public boolean updateNeighbors() { - return (this.rawFlag & Constants.BlockChangeFlags.BLOCK_UPDATED) != 0; // 1; - } - - @Override - public boolean notifyClients() { - return (this.rawFlag & Constants.BlockChangeFlags.NOTIFY_CLIENTS) != 0; // 2; - } - - @Override - public boolean performBlockPhysics() { - return (this.rawFlag & Constants.BlockChangeFlags.PHYSICS_MASK) == 0; // sponge - } - - @Override - public boolean updateNeighboringShapes() { - return (this.rawFlag & Constants.BlockChangeFlags.DENY_NEIGHBOR_SHAPE_UPDATE) == 0; // 16 - } - - @Override - public boolean updateLighting() { - return (this.rawFlag & Constants.BlockChangeFlags.LIGHTING_UPDATES) == 0; // 128 vanilla check - } - - @Override - public boolean notifyPathfinding() { - return (this.rawFlag & Constants.BlockChangeFlags.PATHFINDING_UPDATES) == 0; // sponge - } - - @Override - public boolean ignoreRender() { - return (this.rawFlag & Constants.BlockChangeFlags.IGNORE_RENDER) != 0; // 4 - } - - @Override - public boolean forceClientRerender() { - return (this.rawFlag & Constants.BlockChangeFlags.FORCE_RE_RENDER) != 0; // 8 - } - - @Override - public boolean movingBlocks() { - return (this.rawFlag & Constants.BlockChangeFlags.BLOCK_MOVING) != 0; // 64 - } - - @Override - public boolean neighborDropsAllowed() { - return (this.rawFlag & Constants.BlockChangeFlags.NEIGHBOR_DROPS) == 0; // 32 - } - - @Override - public boolean performBlockDestruction() { - return (this.rawFlag & Constants.BlockChangeFlags.PERFORM_BLOCK_DESTRUCTION) == 0; // sponge +public record SpongeBlockChangeFlag( + boolean updateNeighbors, + boolean notifyClients, + boolean ignoreRender, + boolean forceClientRerender, + boolean updateNeighboringShapes, + boolean neighborDropsAllowed, + boolean movingBlocks, + boolean updateLighting, + boolean performBlockPhysics, + boolean notifyPathfinding, + boolean performBlockDestruction, + int rawFlag +) implements BlockChangeFlag { + + public SpongeBlockChangeFlag(int rawFlag) { + this( + (rawFlag & Constants.BlockChangeFlags.BLOCK_UPDATED) != 0, // updateNeighbors + (rawFlag & Constants.BlockChangeFlags.NOTIFY_CLIENTS) != 0, // notifyClients + (rawFlag & Constants.BlockChangeFlags.IGNORE_RENDER) != 0, // forceClientRerender + (rawFlag & Constants.BlockChangeFlags.FORCE_RE_RENDER) != 0, // neighborDropsAllowed + (rawFlag & Constants.BlockChangeFlags.DENY_NEIGHBOR_SHAPE_UPDATE) == 0, // updateNeighboringShapes + (rawFlag & Constants.BlockChangeFlags.NEIGHBOR_DROPS) == 0, // neighborDrops + (rawFlag & Constants.BlockChangeFlags.BLOCK_MOVING) != 0, // block moving + (rawFlag & Constants.BlockChangeFlags.LIGHTING_UPDATES) == 0, // updateLighting + (rawFlag & Constants.BlockChangeFlags.PHYSICS_MASK) == 0, // performBlockPhysics + (rawFlag & Constants.BlockChangeFlags.PATHFINDING_UPDATES) == 0, // pathfindingUpdates + (rawFlag & Constants.BlockChangeFlags.PERFORM_BLOCK_DESTRUCTION) == 0, // performBlockDestruction + rawFlag + ); } @Override @@ -219,28 +194,6 @@ public SpongeBlockChangeFlag andNotFlag(final BlockChangeFlag flag) { return BlockChangeFlagManager.fromNativeInt(this.rawFlag & ~o.rawFlag); } - public int getRawFlag() { - return this.rawFlag; - } - - @Override - public String toString() { - return new StringJoiner(", ", SpongeBlockChangeFlag.class.getSimpleName() + "[", "]") - .add("rawFlag=" + this.rawFlag) - .add("notifyNeighbors=" + this.updateNeighbors()) - .add("notifyClients=" + this.notifyClients()) - .add("performBlockPhysics=" + this.performBlockPhysics()) - .add("updateNeighboringShapes=" + this.updateNeighboringShapes()) - .add("updateLighting=" + this.updateLighting()) - .add("notifyPathfinding=" + this.notifyPathfinding()) - .add("ignoreRender=" + this.ignoreRender()) - .add("forceClientRerender=" + this.forceClientRerender()) - .add("movingBlocks=" + this.movingBlocks()) - .add("neighborDropsAllowed=" + this.neighborDropsAllowed()) - .add("performBlockDestruction=" + this.performBlockDestruction()) - .toString(); - } - public SpongeBlockChangeFlag asNestedNeighborUpdates() { return BlockChangeFlagManager.fromNativeInt(this.rawFlag & ~(Constants.BlockChangeFlags.BLOCK_UPDATED | Constants.BlockChangeFlags.NEIGHBOR_DROPS)); } diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/LevelAccessorMixin_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/LevelAccessorMixin_API.java index d09d59cc265..7671fc7c8ba 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/LevelAccessorMixin_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/LevelAccessorMixin_API.java @@ -175,7 +175,7 @@ default boolean setBlock(final int x, final int y, final int z, final org.sponge if (context != null) { context.buildAndSwitch(); } - return ((LevelAccessor) this).setBlock(new BlockPos(x, y, z), (BlockState) blockState, ((SpongeBlockChangeFlag) flag).getRawFlag()); + return ((LevelAccessor) this).setBlock(new BlockPos(x, y, z), (BlockState) blockState, ((SpongeBlockChangeFlag) flag).rawFlag()); } } diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/LevelWriterMixin_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/LevelWriterMixin_API.java index 6763d969619..79d6e9107b4 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/LevelWriterMixin_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/LevelWriterMixin_API.java @@ -47,7 +47,7 @@ public interface LevelWriterMixin_API extends MutableGameVolume { @Override default boolean setBlock(final int x, final int y, final int z, final org.spongepowered.api.block.BlockState state, final BlockChangeFlag flag) { - return this.shadow$setBlock(new BlockPos(x, y, z), (BlockState) state, ((SpongeBlockChangeFlag) flag).getRawFlag()); + return this.shadow$setBlock(new BlockPos(x, y, z), (BlockState) state, ((SpongeBlockChangeFlag) flag).rawFlag()); } @Override diff --git a/src/test/java/org/spongepowered/common/event/tracking/BlockChangeFlagManagerTest.java b/src/test/java/org/spongepowered/common/event/tracking/BlockChangeFlagManagerTest.java index b2dcc241e94..07002e8b4d2 100644 --- a/src/test/java/org/spongepowered/common/event/tracking/BlockChangeFlagManagerTest.java +++ b/src/test/java/org/spongepowered/common/event/tracking/BlockChangeFlagManagerTest.java @@ -279,8 +279,8 @@ void verifyEmptyToInverse() { void verifyNestedNeighborPhysics() { final SpongeBlockChangeFlag flag = BlockChangeFlagManagerTest.createDefaultFlag(); assertTrue(flag.updateNeighboringShapes()); // 16 - assertTrue(flag.getRawFlag() != 0); - assertEquals((flag.getRawFlag() & 32), 0); + assertTrue(flag.rawFlag() != 0); + assertEquals((flag.rawFlag() & 32), 0); assertTrue(flag.neighborDropsAllowed()); final SpongeBlockChangeFlag nestedNeighbor = flag.asNestedNeighborUpdates(); assertFalse(nestedNeighbor.updateNeighbors()); @@ -294,7 +294,7 @@ void verifyNestedNeighborPhysics() { assertTrue(nestedNeighbor.performBlockPhysics()); assertTrue(nestedNeighbor.notifyPathfinding()); assertTrue(nestedNeighbor.performBlockDestruction()); - assertEquals(3 & -34, nestedNeighbor.getRawFlag()); + assertEquals(3 & -34, nestedNeighbor.rawFlag()); final int overloadedFlag = Constants.BlockChangeFlags.BLOCK_UPDATED @@ -308,7 +308,7 @@ void verifyNestedNeighborPhysics() { | Constants.BlockChangeFlags.PATHFINDING_UPDATES; final SpongeBlockChangeFlag otherFlag = BlockChangeFlagManager.fromNativeInt(overloadedFlag); assertTrue(otherFlag.updateNeighboringShapes()); // 16 - assertTrue(otherFlag.getRawFlag() != 0); + assertTrue(otherFlag.rawFlag() != 0); assertFalse(otherFlag.neighborDropsAllowed()); final SpongeBlockChangeFlag nestedOther = otherFlag.asNestedNeighborUpdates(); assertFalse(nestedOther.updateNeighbors()); // 1 @@ -324,7 +324,7 @@ void verifyNestedNeighborPhysics() { assertTrue(nestedOther.performBlockDestruction()); // Finally, verify that with mojang's flag logic, we're still abiding by it. - assertEquals(overloadedFlag & -34, nestedOther.getRawFlag()); + assertEquals(overloadedFlag & -34, nestedOther.rawFlag()); }