fix: preserve handler in block placement rule neighbor updates

This commit is contained in:
mworzala 2024-06-27 09:29:30 -04:00
parent 5cb192157c
commit 2c73b4b8f0
No known key found for this signature in database
GPG Key ID: B148F922E64797C7
2 changed files with 36 additions and 4 deletions

View File

@ -641,8 +641,8 @@ public class InstanceContainer extends Instance {
final int neighborZ = blockPosition.blockZ() + direction.normalZ();
if (neighborY < getCachedDimensionType().minY() || neighborY > getCachedDimensionType().height())
continue;
final Block neighborBlock = cache.getBlock(neighborX, neighborY, neighborZ, Condition.TYPE);
if (neighborBlock == null)
final Block neighborBlock = cache.getBlock(neighborX, neighborY, neighborZ, Condition.NONE);
if (neighborBlock == null || neighborBlock.isAir())
continue;
final BlockPlacementRule neighborBlockPlacementRule = MinecraftServer.getBlockManager().getBlockPlacementRule(neighborBlock);
if (neighborBlockPlacementRule == null || updateDistance >= neighborBlockPlacementRule.maxUpdateDistance()) continue;

View File

@ -1,12 +1,18 @@
package net.minestom.server.instance;
import net.minestom.testing.Env;
import net.minestom.testing.EnvTest;
import net.minestom.server.coordinate.Vec;
import net.minestom.server.instance.block.Block;
import net.minestom.server.instance.block.SuspiciousGravelBlockHandler;
import net.minestom.server.instance.block.rule.BlockPlacementRule;
import net.minestom.server.tag.Tag;
import net.minestom.testing.Env;
import net.minestom.testing.EnvTest;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.junit.jupiter.api.Test;
import java.util.concurrent.atomic.AtomicReference;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
@ -73,4 +79,30 @@ public class InstanceBlockIntegrationTest {
instance.setBlock(point, Block.GRASS_BLOCK.withTag(tag, 8));
assertEquals(8, instance.getBlock(point).getTag(tag));
}
@Test
public void handlerPresentInPlacementRuleUpdate(Env env) {
AtomicReference<Block> currentBlock = new AtomicReference<>();
env.process().block().registerHandler(SuspiciousGravelBlockHandler.INSTANCE.getNamespaceId(), () -> SuspiciousGravelBlockHandler.INSTANCE);
env.process().block().registerBlockPlacementRule(new BlockPlacementRule(Block.SUSPICIOUS_GRAVEL) {
@Override
public @Nullable Block blockPlace(@NotNull PlacementState placementState) {
return block;
}
@Override
public @NotNull Block blockUpdate(@NotNull UpdateState updateState) {
currentBlock.set(updateState.currentBlock());
return super.blockUpdate(updateState);
}
});
var instance = env.createFlatInstance();
var theBlock = Block.SUSPICIOUS_GRAVEL.withHandler(SuspiciousGravelBlockHandler.INSTANCE);
instance.setBlock(0, 50, 0, theBlock);
instance.setBlock(1, 50, 0, theBlock);
assertEquals(theBlock, currentBlock.get());
}
}