diff --git a/verification/src/changes/accepted-bukkit-public-api-changes.json b/verification/src/changes/accepted-bukkit-public-api-changes.json index fd21c268d8..1c50324290 100644 --- a/verification/src/changes/accepted-bukkit-public-api-changes.json +++ b/verification/src/changes/accepted-bukkit-public-api-changes.json @@ -8,5 +8,15 @@ "ANNOTATION_REMOVED" ] } + ], + "Replaced by default method": [ + { + "type": "com.sk89q.worldedit.bukkit.BukkitBlockRegistry", + "member": "Method com.sk89q.worldedit.bukkit.BukkitBlockRegistry.getMaterial(com.sk89q.worldedit.world.block.BlockType)", + "changes": [ + "METHOD_REMOVED", + "ANNOTATION_REMOVED" + ] + } ] } diff --git a/verification/src/changes/accepted-core-public-api-changes.json b/verification/src/changes/accepted-core-public-api-changes.json index 4876c13d16..bf1117def7 100644 --- a/verification/src/changes/accepted-core-public-api-changes.json +++ b/verification/src/changes/accepted-core-public-api-changes.json @@ -23,5 +23,14 @@ "METHOD_REMOVED" ] } + ], + "Why on earth is this even an issue?": [ + { + "type": "com.sk89q.worldedit.world.registry.BlockMaterial", + "member": "Method com.sk89q.worldedit.world.registry.BlockMaterial.isFullCube()", + "changes": [ + "METHOD_ABSTRACT_NOW_DEFAULT" + ] + } ] } diff --git a/verification/src/changes/accepted-sponge-public-api-changes.json b/verification/src/changes/accepted-sponge-public-api-changes.json index 2c63c08510..3afedbaad5 100644 --- a/verification/src/changes/accepted-sponge-public-api-changes.json +++ b/verification/src/changes/accepted-sponge-public-api-changes.json @@ -1,2 +1,18 @@ { + "Replaced by default method": [ + { + "type": "com.sk89q.worldedit.sponge.SpongeBlockRegistry", + "member": "Method com.sk89q.worldedit.sponge.SpongeBlockRegistry.getMaterial(com.sk89q.worldedit.world.block.BlockType)", + "changes": [ + "METHOD_REMOVED" + ] + }, + { + "type": "com.sk89q.worldedit.sponge.SpongeBlockMaterial", + "member": "Method com.sk89q.worldedit.sponge.SpongeBlockMaterial.isFullCube()", + "changes": [ + "METHOD_REMOVED" + ] + } + ] } diff --git a/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightAdapter.java index 816930823e..05eedcc971 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightAdapter.java @@ -586,6 +586,11 @@ public BlockMaterial getBlockMaterial(BlockType blockType) { return new PaperweightBlockMaterial(mcBlockState); } + @Override + public BlockMaterial getBlockMaterial(BlockState blockState) { + return new PaperweightBlockMaterial(adapt(blockState)); + } + @SuppressWarnings({ "unchecked", "rawtypes" }) private static final LoadingCache> PROPERTY_CACHE = CacheBuilder.newBuilder().build(new CacheLoader<>() { @Override diff --git a/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightBlockMaterial.java b/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightBlockMaterial.java index 2113b1ee1d..1d25507427 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightBlockMaterial.java +++ b/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightBlockMaterial.java @@ -19,7 +19,8 @@ package com.sk89q.worldedit.bukkit.adapter.impl.v1_21_11; -import com.sk89q.worldedit.world.registry.BlockMaterial; +import com.sk89q.worldedit.blocks.ShapeType; +import com.sk89q.worldedit.internal.block.AbstractBlockMaterial; import net.minecraft.core.BlockPos; import net.minecraft.world.Clearable; import net.minecraft.world.level.EmptyBlockGetter; @@ -27,8 +28,10 @@ import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; -public class PaperweightBlockMaterial implements BlockMaterial { +public class PaperweightBlockMaterial extends AbstractBlockMaterial { private final BlockState block; @@ -42,8 +45,16 @@ public boolean isAir() { } @Override - public boolean isFullCube() { - return Block.isShapeFullBlock(block.getShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO)); + protected VoxelShape getShape(ShapeType shapeType) { + return switch (shapeType) { + case SHAPE -> block.getShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO, CollisionContext.empty()); + case VISUAL_SHAPE -> block.getVisualShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO, CollisionContext.empty()); + }; + } + + @Override + protected boolean isShapeFullBlock(VoxelShape shape) { + return Block.isShapeFullBlock(shape); } @Override diff --git a/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightAdapter.java index fcf1579cea..f6df427ea9 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightAdapter.java @@ -567,6 +567,11 @@ public BlockMaterial getBlockMaterial(BlockType blockType) { return new PaperweightBlockMaterial(mcBlockState); } + @Override + public BlockMaterial getBlockMaterial(BlockState blockState) { + return new PaperweightBlockMaterial(adapt(blockState)); + } + @SuppressWarnings({ "unchecked", "rawtypes" }) private static final LoadingCache> PROPERTY_CACHE = CacheBuilder.newBuilder().build(new CacheLoader<>() { @Override diff --git a/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightBlockMaterial.java b/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightBlockMaterial.java index 10c1f7d222..a51a9ea50a 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightBlockMaterial.java +++ b/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightBlockMaterial.java @@ -19,7 +19,8 @@ package com.sk89q.worldedit.bukkit.adapter.impl.v1_21_4; -import com.sk89q.worldedit.world.registry.BlockMaterial; +import com.sk89q.worldedit.blocks.ShapeType; +import com.sk89q.worldedit.internal.block.AbstractBlockMaterial; import net.minecraft.core.BlockPos; import net.minecraft.world.Clearable; import net.minecraft.world.level.EmptyBlockGetter; @@ -27,8 +28,10 @@ import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; -public class PaperweightBlockMaterial implements BlockMaterial { +public class PaperweightBlockMaterial extends AbstractBlockMaterial { private final BlockState block; @@ -42,8 +45,16 @@ public boolean isAir() { } @Override - public boolean isFullCube() { - return Block.isShapeFullBlock(block.getShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO)); + protected VoxelShape getShape(ShapeType shapeType) { + return switch (shapeType) { + case SHAPE -> block.getShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO, CollisionContext.empty()); + case VISUAL_SHAPE -> block.getVisualShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO, CollisionContext.empty()); + }; + } + + @Override + protected boolean isShapeFullBlock(VoxelShape shape) { + return Block.isShapeFullBlock(shape); } @Override diff --git a/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightAdapter.java index 4d48915dee..2a9d773be9 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightAdapter.java @@ -565,6 +565,11 @@ public BlockMaterial getBlockMaterial(BlockType blockType) { return new PaperweightBlockMaterial(mcBlockState); } + @Override + public BlockMaterial getBlockMaterial(BlockState blockState) { + return new PaperweightBlockMaterial(adapt(blockState)); + } + @SuppressWarnings({ "unchecked", "rawtypes" }) private static final LoadingCache> PROPERTY_CACHE = CacheBuilder.newBuilder().build(new CacheLoader<>() { @Override diff --git a/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightBlockMaterial.java b/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightBlockMaterial.java index bb44cd3fec..242b18fdca 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightBlockMaterial.java +++ b/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightBlockMaterial.java @@ -19,7 +19,8 @@ package com.sk89q.worldedit.bukkit.adapter.impl.v1_21_5; -import com.sk89q.worldedit.world.registry.BlockMaterial; +import com.sk89q.worldedit.blocks.ShapeType; +import com.sk89q.worldedit.internal.block.AbstractBlockMaterial; import net.minecraft.core.BlockPos; import net.minecraft.world.Clearable; import net.minecraft.world.level.EmptyBlockGetter; @@ -27,8 +28,10 @@ import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; -public class PaperweightBlockMaterial implements BlockMaterial { +public class PaperweightBlockMaterial extends AbstractBlockMaterial { private final BlockState block; @@ -42,8 +45,16 @@ public boolean isAir() { } @Override - public boolean isFullCube() { - return Block.isShapeFullBlock(block.getShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO)); + protected VoxelShape getShape(ShapeType shapeType) { + return switch (shapeType) { + case SHAPE -> block.getShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO, CollisionContext.empty()); + case VISUAL_SHAPE -> block.getVisualShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO, CollisionContext.empty()); + }; + } + + @Override + protected boolean isShapeFullBlock(VoxelShape shape) { + return Block.isShapeFullBlock(shape); } @Override diff --git a/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightAdapter.java index b7fb495d5f..cc665289eb 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightAdapter.java @@ -587,6 +587,11 @@ public BlockMaterial getBlockMaterial(BlockType blockType) { return new PaperweightBlockMaterial(mcBlockState); } + @Override + public BlockMaterial getBlockMaterial(BlockState blockState) { + return new PaperweightBlockMaterial(adapt(blockState)); + } + @SuppressWarnings({ "unchecked", "rawtypes" }) private static final LoadingCache> PROPERTY_CACHE = CacheBuilder.newBuilder().build(new CacheLoader<>() { @Override diff --git a/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightBlockMaterial.java b/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightBlockMaterial.java index 8042660f50..ae4c7c8d82 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightBlockMaterial.java +++ b/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightBlockMaterial.java @@ -19,7 +19,8 @@ package com.sk89q.worldedit.bukkit.adapter.impl.v1_21_6; -import com.sk89q.worldedit.world.registry.BlockMaterial; +import com.sk89q.worldedit.blocks.ShapeType; +import com.sk89q.worldedit.internal.block.AbstractBlockMaterial; import net.minecraft.core.BlockPos; import net.minecraft.world.Clearable; import net.minecraft.world.level.EmptyBlockGetter; @@ -27,8 +28,10 @@ import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; -public class PaperweightBlockMaterial implements BlockMaterial { +public class PaperweightBlockMaterial extends AbstractBlockMaterial { private final BlockState block; @@ -42,8 +45,16 @@ public boolean isAir() { } @Override - public boolean isFullCube() { - return Block.isShapeFullBlock(block.getShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO)); + protected VoxelShape getShape(ShapeType shapeType) { + return switch (shapeType) { + case SHAPE -> block.getShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO, CollisionContext.empty()); + case VISUAL_SHAPE -> block.getVisualShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO, CollisionContext.empty()); + }; + } + + @Override + protected boolean isShapeFullBlock(VoxelShape shape) { + return Block.isShapeFullBlock(shape); } @Override diff --git a/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightAdapter.java index 65692f02f5..13bccc7fe9 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightAdapter.java @@ -586,6 +586,11 @@ public BlockMaterial getBlockMaterial(BlockType blockType) { return new PaperweightBlockMaterial(mcBlockState); } + @Override + public BlockMaterial getBlockMaterial(BlockState blockState) { + return new PaperweightBlockMaterial(adapt(blockState)); + } + @SuppressWarnings({ "unchecked", "rawtypes" }) private static final LoadingCache> PROPERTY_CACHE = CacheBuilder.newBuilder().build(new CacheLoader<>() { @Override diff --git a/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightBlockMaterial.java b/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightBlockMaterial.java index 1df238afb7..3c209aa5ef 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightBlockMaterial.java +++ b/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightBlockMaterial.java @@ -19,7 +19,8 @@ package com.sk89q.worldedit.bukkit.adapter.impl.v1_21_9; -import com.sk89q.worldedit.world.registry.BlockMaterial; +import com.sk89q.worldedit.blocks.ShapeType; +import com.sk89q.worldedit.internal.block.AbstractBlockMaterial; import net.minecraft.core.BlockPos; import net.minecraft.world.Clearable; import net.minecraft.world.level.EmptyBlockGetter; @@ -27,8 +28,10 @@ import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; -public class PaperweightBlockMaterial implements BlockMaterial { +public class PaperweightBlockMaterial extends AbstractBlockMaterial { private final BlockState block; @@ -42,8 +45,16 @@ public boolean isAir() { } @Override - public boolean isFullCube() { - return Block.isShapeFullBlock(block.getShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO)); + protected VoxelShape getShape(ShapeType shapeType) { + return switch (shapeType) { + case SHAPE -> block.getShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO, CollisionContext.empty()); + case VISUAL_SHAPE -> block.getVisualShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO, CollisionContext.empty()); + }; + } + + @Override + protected boolean isShapeFullBlock(VoxelShape shape) { + return Block.isShapeFullBlock(shape); } @Override diff --git a/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightAdapter.java index 60f922d154..a3dbb4aa8f 100644 --- a/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightAdapter.java @@ -603,6 +603,11 @@ public BlockMaterial getBlockMaterial(BlockType blockType) { return new PaperweightBlockMaterial(mcBlockState); } + @Override + public BlockMaterial getBlockMaterial(BlockState blockState) { + return new PaperweightBlockMaterial(adapt(blockState)); + } + @SuppressWarnings({ "unchecked", "rawtypes" }) private static final LoadingCache> PROPERTY_CACHE = CacheBuilder.newBuilder().build(new CacheLoader<>() { @Override diff --git a/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightBlockMaterial.java b/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightBlockMaterial.java index 157d92e47f..3bce6dd911 100644 --- a/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightBlockMaterial.java +++ b/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightBlockMaterial.java @@ -19,7 +19,8 @@ package com.sk89q.worldedit.bukkit.adapter.impl.v26_1; -import com.sk89q.worldedit.world.registry.BlockMaterial; +import com.sk89q.worldedit.blocks.ShapeType; +import com.sk89q.worldedit.internal.block.AbstractBlockMaterial; import net.minecraft.core.BlockPos; import net.minecraft.world.Clearable; import net.minecraft.world.level.EmptyBlockGetter; @@ -27,8 +28,10 @@ import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; -public class PaperweightBlockMaterial implements BlockMaterial { +public class PaperweightBlockMaterial extends AbstractBlockMaterial { private final BlockState block; @@ -42,8 +45,16 @@ public boolean isAir() { } @Override - public boolean isFullCube() { - return Block.isShapeFullBlock(block.getShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO)); + protected VoxelShape getShape(ShapeType shapeType) { + return switch (shapeType) { + case SHAPE -> block.getShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO, CollisionContext.empty()); + case VISUAL_SHAPE -> block.getVisualShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO, CollisionContext.empty()); + }; + } + + @Override + protected boolean isShapeFullBlock(VoxelShape shape) { + return Block.isShapeFullBlock(shape); } @Override diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockRegistry.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockRegistry.java index 70cd562329..9147712967 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockRegistry.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockRegistry.java @@ -35,7 +35,7 @@ import javax.annotation.Nullable; public class BukkitBlockRegistry implements BlockRegistry { - private final Map materialMap = new HashMap<>(); + private final Map materialMap = new HashMap<>(); @Override public Component getRichName(BlockType blockType) { @@ -47,15 +47,16 @@ public Component getRichName(BlockType blockType) { @Nullable @Override - public BlockMaterial getMaterial(BlockType blockType) { - Material mat = BukkitAdapter.adapt(blockType); - if (mat == null) { - return null; - } - return materialMap.computeIfAbsent(mat, material -> { + public BlockMaterial getMaterial(BlockState blockState) { + return materialMap.computeIfAbsent(blockState, _ -> { + Material material = BukkitAdapter.adapt(blockState.getBlockType()); + if (material == null) { + // return null means create no mapping + return null; + } BlockMaterial platformMaterial = null; if (WorldEditPlugin.getInstance().getBukkitImplAdapter() != null) { - platformMaterial = WorldEditPlugin.getInstance().getBukkitImplAdapter().getBlockMaterial(blockType); + platformMaterial = WorldEditPlugin.getInstance().getBukkitImplAdapter().getBlockMaterial(blockState); } return new BukkitBlockMaterial(platformMaterial, material); }); diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java index 041b4872a9..daed9fafb8 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java @@ -161,6 +161,17 @@ default void tickWatchdog() { @Nullable BlockMaterial getBlockMaterial(BlockType blockType); + /** + * Gets the block material for the given block state. + * + * @param blockState the block state + * @return the material + */ + @Nullable + default BlockMaterial getBlockMaterial(BlockState blockState) { + return getBlockMaterial(blockState.getBlockType()); + } + /** * Get a map of {@code string -> property}. * diff --git a/worldedit-core-mc/src/main/java/com/sk89q/worldedit/coremc/internal/CoreMcBlockMaterial.java b/worldedit-core-mc/src/main/java/com/sk89q/worldedit/coremc/internal/CoreMcBlockMaterial.java index 16c5f731b5..92db91f309 100644 --- a/worldedit-core-mc/src/main/java/com/sk89q/worldedit/coremc/internal/CoreMcBlockMaterial.java +++ b/worldedit-core-mc/src/main/java/com/sk89q/worldedit/coremc/internal/CoreMcBlockMaterial.java @@ -19,7 +19,8 @@ package com.sk89q.worldedit.coremc.internal; -import com.sk89q.worldedit.world.registry.BlockMaterial; +import com.sk89q.worldedit.blocks.ShapeType; +import com.sk89q.worldedit.internal.block.AbstractBlockMaterial; import net.minecraft.core.BlockPos; import net.minecraft.world.Clearable; import net.minecraft.world.level.EmptyBlockGetter; @@ -27,12 +28,14 @@ import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; /** * Minecraft block material implementation for platforms sharing native code. * Pulls as much info as possible from the Minecraft BlockState. */ -public final class CoreMcBlockMaterial implements BlockMaterial { +public final class CoreMcBlockMaterial extends AbstractBlockMaterial { private final BlockState block; @@ -46,8 +49,16 @@ public boolean isAir() { } @Override - public boolean isFullCube() { - return Block.isShapeFullBlock(block.getShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO)); + protected VoxelShape getShape(ShapeType shapeType) { + return switch (shapeType) { + case SHAPE -> block.getShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO, CollisionContext.empty()); + case VISUAL_SHAPE -> block.getVisualShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO, CollisionContext.empty()); + }; + } + + @Override + protected boolean isShapeFullBlock(VoxelShape shape) { + return Block.isShapeFullBlock(shape); } @Override diff --git a/worldedit-core-mc/src/main/java/com/sk89q/worldedit/coremc/internal/CoreMcBlockRegistry.java b/worldedit-core-mc/src/main/java/com/sk89q/worldedit/coremc/internal/CoreMcBlockRegistry.java index 6d6119d0a4..cacae6e1c6 100644 --- a/worldedit-core-mc/src/main/java/com/sk89q/worldedit/coremc/internal/CoreMcBlockRegistry.java +++ b/worldedit-core-mc/src/main/java/com/sk89q/worldedit/coremc/internal/CoreMcBlockRegistry.java @@ -52,10 +52,9 @@ public Component getRichName(BlockType blockType) { } @Override - public BlockMaterial getMaterial(BlockType blockType) { - Block block = platform.getAdapter().toNativeBlock(blockType); + public BlockMaterial getMaterial(BlockState blockState) { return materialMap.computeIfAbsent( - block.defaultBlockState(), + platform.getAdapter().toNativeBlockState(blockState), CoreMcBlockMaterial::new ); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/ShapeType.java b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/ShapeType.java new file mode 100644 index 0000000000..726aada042 --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/ShapeType.java @@ -0,0 +1,25 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.blocks; + +public enum ShapeType { + SHAPE, + VISUAL_SHAPE, +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/FullCubeMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/FullCubeMaskParser.java index 410ff005c6..8121f69612 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/FullCubeMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/FullCubeMaskParser.java @@ -20,6 +20,7 @@ package com.sk89q.worldedit.extension.factory.parser.mask; import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.blocks.ShapeType; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.function.mask.FullCubeMask; @@ -30,7 +31,7 @@ public class FullCubeMaskParser extends SimpleInputParser { - private static final List aliases = List.of("#fullcube"); + private static final List aliases = List.of("#fullcube", "#visualfullcube"); public FullCubeMaskParser(WorldEdit worldEdit) { super(worldEdit); @@ -43,6 +44,11 @@ public List getMatchedAliases() { @Override public Mask parseFromSimpleInput(String input, ParserContext context) throws InputParseException { - return new FullCubeMask(context.requireExtent()); + ShapeType shapeType = switch (input) { + case "#fullcube" -> ShapeType.SHAPE; + case "#visualfullcube" -> ShapeType.VISUAL_SHAPE; + default -> throw new IllegalStateException("Unexpected value: " + input); + }; + return new FullCubeMask(context.requireExtent(), shapeType); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/FullCubeMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/FullCubeMask.java index d7a8a8165b..31d4b85a25 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/FullCubeMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/FullCubeMask.java @@ -19,21 +19,32 @@ package com.sk89q.worldedit.function.mask; +import com.google.errorprone.annotations.InlineMe; +import com.sk89q.worldedit.blocks.ShapeType; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.block.BlockState; public final class FullCubeMask extends AbstractExtentMask { + private final ShapeType shapeType; + + @Deprecated + @InlineMe(replacement = "this(extent, ShapeType.SHAPE)", imports = "com.sk89q.worldedit.blocks.ShapeType") public FullCubeMask(Extent extent) { + this(extent, ShapeType.SHAPE); + } + + public FullCubeMask(Extent extent, ShapeType shapeType) { super(extent); + this.shapeType = shapeType; } @Override public boolean test(BlockVector3 vector) { Extent extent = getExtent(); BlockState block = extent.getBlock(vector); - return block.getBlockType().getMaterial().isFullCube(); + return block.getMaterial().isFullCube(shapeType); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/block/AbstractBlockMaterial.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/block/AbstractBlockMaterial.java new file mode 100644 index 0000000000..7a4fbbb55a --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/block/AbstractBlockMaterial.java @@ -0,0 +1,49 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.internal.block; + +import com.sk89q.worldedit.blocks.ShapeType; +import com.sk89q.worldedit.util.concurrency.LazyReference; +import com.sk89q.worldedit.world.registry.BlockMaterial; + +import java.util.EnumSet; + +public abstract class AbstractBlockMaterial implements BlockMaterial { + @SuppressWarnings("this-escape") + public LazyReference> isFullCube = LazyReference.from(() -> { + EnumSet enumSet = EnumSet.noneOf(ShapeType.class); + for (ShapeType shapeType : ShapeType.values()) { + if (isShapeFullBlock(getShape(shapeType))) { + enumSet.add(shapeType); + } + } + + return enumSet; + }); + + @Override + public boolean isFullCube(ShapeType shapeType) { + return isFullCube.getValue().contains(shapeType); + } + + protected abstract VS getShape(ShapeType shapeType); + + protected abstract boolean isShapeFullBlock(VS shape); +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java index cb94239af9..b11f207ad0 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java @@ -19,9 +19,12 @@ package com.sk89q.worldedit.world.block; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.internal.block.BlockStateIdAccess; import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.util.concurrency.LazyReference; +import com.sk89q.worldedit.world.registry.BlockMaterial; import org.enginehub.linbus.tree.LinCompoundTag; import java.util.HashSet; @@ -74,6 +77,11 @@ public BlockType getBlockType() { return this.blockType; } + public BlockMaterial getMaterial() { + return WorldEdit.getInstance().getPlatformManager() + .queryCapability(Capability.GAME_HOOKS).getRegistries().getBlockRegistry().getMaterial(this); + } + @Override public BlockState with(final Property property, final V value) { if (this.stateListIndex == -1) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java index 66fa710d4c..d5a4dc80b3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java @@ -72,7 +72,7 @@ public class BlockType implements Keyed { @SuppressWarnings("this-escape") private final LazyReference blockMaterial = LazyReference.from(() -> WorldEdit.getInstance().getPlatformManager() - .queryCapability(Capability.GAME_HOOKS).getRegistries().getBlockRegistry().getMaterial(this)); + .queryCapability(Capability.GAME_HOOKS).getRegistries().getBlockRegistry().getMaterial(getDefaultState())); @SuppressWarnings("this-escape") @Deprecated private final LazyReference name = LazyReference.from(() -> WorldEdit.getInstance().getPlatformManager() diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockMaterial.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockMaterial.java index d280f2cc0e..c038845a5a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockMaterial.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockMaterial.java @@ -19,6 +19,8 @@ package com.sk89q.worldedit.world.registry; +import com.sk89q.worldedit.blocks.ShapeType; + /** * Describes the material for a block. */ @@ -36,7 +38,17 @@ public interface BlockMaterial { * * @return the value of the test */ - boolean isFullCube(); + default boolean isFullCube() { + return isFullCube(ShapeType.SHAPE); + } + + /** + * Get whether this block is a full sized cube. + * + * @param shapeType which shape of the block to test + * @return the value of the test + */ + boolean isFullCube(ShapeType shapeType); /** * Get whether this block is opaque. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockRegistry.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockRegistry.java index 12f6b51ca1..92692f1de9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockRegistry.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockRegistry.java @@ -19,6 +19,7 @@ package com.sk89q.worldedit.world.registry; +import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.world.block.BlockState; @@ -59,9 +60,30 @@ default String getName(BlockType blockType) { * * @param blockType the block * @return the material, or null if the material information is not known + * @deprecated Use {@link BlockRegistry#getMaterial(BlockState)} instead. */ + @Deprecated @Nullable - BlockMaterial getMaterial(BlockType blockType); + default BlockMaterial getMaterial(BlockType blockType) { + return getMaterial(blockType.getDefaultState()); + } + + /** + * Get the material for the given block state. + * + * @param blockState the block state + * @return the material, or null if the material information is not known + * @apiNote This must be overridden by new subclasses. See {@link NonAbstractForCompatibility} + * for details + */ + @NonAbstractForCompatibility( + delegateName = "getMaterial", + delegateParams = { BlockType.class } + ) + @Nullable + default BlockMaterial getMaterial(BlockState blockState) { + return getMaterial(blockState.getBlockType()); + } /** * Get an unmodifiable map of states for this block. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java index 714fb50839..9e91177761 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java @@ -69,8 +69,8 @@ public String getName(BlockType blockType) { @Nullable @Override - public BlockMaterial getMaterial(BlockType blockType) { - return new PassthroughBlockMaterial(BundledBlockData.getInstance().getMaterialById(blockType.id())); + public BlockMaterial getMaterial(BlockType blockState) { + return new PassthroughBlockMaterial(BundledBlockData.getInstance().getMaterialById(blockState.id())); } @Nullable diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/PassthroughBlockMaterial.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/PassthroughBlockMaterial.java index e868276a63..a601bd362d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/PassthroughBlockMaterial.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/PassthroughBlockMaterial.java @@ -19,6 +19,8 @@ package com.sk89q.worldedit.world.registry; +import com.sk89q.worldedit.blocks.ShapeType; + import javax.annotation.Nullable; import static com.sk89q.worldedit.util.GuavaUtil.firstNonNull; @@ -49,8 +51,8 @@ public boolean isAir() { } @Override - public boolean isFullCube() { - return blockMaterial.isFullCube(); + public boolean isFullCube(ShapeType shapeType) { + return blockMaterial.isFullCube(shapeType); } @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/SimpleBlockMaterial.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/SimpleBlockMaterial.java index de70a38619..d2cc6c92d1 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/SimpleBlockMaterial.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/SimpleBlockMaterial.java @@ -19,6 +19,8 @@ package com.sk89q.worldedit.world.registry; +import com.sk89q.worldedit.blocks.ShapeType; + class SimpleBlockMaterial implements BlockMaterial { private boolean isAir; @@ -51,7 +53,7 @@ public void setIsAir(boolean isAir) { } @Override - public boolean isFullCube() { + public boolean isFullCube(ShapeType shapeType) { return fullCube; } diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockMaterial.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockMaterial.java index 4dd6622de4..177dc0d2c5 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockMaterial.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockMaterial.java @@ -19,7 +19,8 @@ package com.sk89q.worldedit.sponge; -import com.sk89q.worldedit.world.registry.BlockMaterial; +import com.sk89q.worldedit.blocks.ShapeType; +import com.sk89q.worldedit.internal.block.AbstractBlockMaterial; import net.minecraft.core.BlockPos; import net.minecraft.world.Clearable; import net.minecraft.world.level.EmptyBlockGetter; @@ -27,13 +28,15 @@ import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; /** * Sponge block material that pulls as much info as possible from the Minecraft * Material, and passes the rest to another implementation, typically the * bundled block info. */ -public class SpongeBlockMaterial implements BlockMaterial { +public class SpongeBlockMaterial extends AbstractBlockMaterial { private final BlockState block; @@ -47,8 +50,16 @@ public boolean isAir() { } @Override - public boolean isFullCube() { - return Block.isShapeFullBlock(block.getShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO)); + protected VoxelShape getShape(ShapeType shapeType) { + return switch (shapeType) { + case SHAPE -> block.getShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO, CollisionContext.empty()); + case VISUAL_SHAPE -> block.getVisualShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO, CollisionContext.empty()); + }; + } + + @Override + protected boolean isShapeFullBlock(VoxelShape shape) { + return Block.isShapeFullBlock(shape); } @Override diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockRegistry.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockRegistry.java index 5c0434d36a..f304d8ac53 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockRegistry.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockRegistry.java @@ -50,19 +50,16 @@ public Component getRichName(BlockType blockType) { } @Override - public BlockMaterial getMaterial(BlockType blockType) { - org.spongepowered.api.block.BlockType spongeBlockType = - Sponge.game().registry(RegistryTypes.BLOCK_TYPE) - .value(ResourceKey.resolve(blockType.id())); + public BlockMaterial getMaterial(BlockState blockState) { return materialMap.computeIfAbsent( - spongeBlockType.defaultState(), - m -> { - net.minecraft.world.level.block.state.BlockState blockState = - (net.minecraft.world.level.block.state.BlockState) m; - return new SpongeBlockMaterial( - blockState - ); - } + SpongeAdapter.adapt(blockState), + m -> { + net.minecraft.world.level.block.state.BlockState mcBlockState = + (net.minecraft.world.level.block.state.BlockState) m; + return new SpongeBlockMaterial( + mcBlockState + ); + } ); }