diff --git a/platform/platform-modern/src/main/java/tc/oc/pgm/platform/modern/ModernEffects.java b/platform/platform-modern/src/main/java/tc/oc/pgm/platform/modern/ModernEffects.java index 1640a84a67..919c9d9fc7 100644 --- a/platform/platform-modern/src/main/java/tc/oc/pgm/platform/modern/ModernEffects.java +++ b/platform/platform-modern/src/main/java/tc/oc/pgm/platform/modern/ModernEffects.java @@ -5,12 +5,15 @@ import org.bukkit.Color; import org.bukkit.DyeColor; +import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.World; import org.bukkit.entity.Player; +import tc.oc.pgm.platform.modern.material.ModernBlockMaterialData; import tc.oc.pgm.util.bukkit.Effects; +import tc.oc.pgm.util.material.BlockMaterialData; import tc.oc.pgm.util.platform.Supports; @Supports(value = PAPER, minVersion = "1.20.6") @@ -69,4 +72,11 @@ public void spawnFlame(World world, Location location) { public void explosion(Player player, Location location) { player.spawnParticle(Particle.EXPLOSION, location, 1, 0d, 0d, 0d, 0, null, true); } + + @Override + public void blockBreak(Location location, BlockMaterialData material) { + location + .getWorld() + .playEffect(location, Effect.STEP_SOUND, ((ModernBlockMaterialData) material).getBlock()); + } } diff --git a/platform/platform-modern/src/main/java/tc/oc/pgm/platform/modern/material/ModernBlockMaterialData.java b/platform/platform-modern/src/main/java/tc/oc/pgm/platform/modern/material/ModernBlockMaterialData.java index d51d19e10e..dd3c024dc4 100644 --- a/platform/platform-modern/src/main/java/tc/oc/pgm/platform/modern/material/ModernBlockMaterialData.java +++ b/platform/platform-modern/src/main/java/tc/oc/pgm/platform/modern/material/ModernBlockMaterialData.java @@ -11,6 +11,7 @@ import tc.oc.pgm.util.material.MaterialMatcher; public interface ModernBlockMaterialData extends BlockMaterialData { + BlockData getBlock(); @Override @@ -30,7 +31,7 @@ default void sendBlockChange(Player player, Location location) { @Override default int encoded() { - return getItemType().ordinal(); + return ModernEncodeUtil.encode(getBlock()); } @Override diff --git a/platform/platform-modern/src/main/java/tc/oc/pgm/platform/modern/material/ModernEncodeUtil.java b/platform/platform-modern/src/main/java/tc/oc/pgm/platform/modern/material/ModernEncodeUtil.java new file mode 100644 index 0000000000..ba8b3d4011 --- /dev/null +++ b/platform/platform-modern/src/main/java/tc/oc/pgm/platform/modern/material/ModernEncodeUtil.java @@ -0,0 +1,20 @@ +package tc.oc.pgm.platform.modern.material; + +import net.minecraft.world.level.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +class ModernEncodeUtil { + private static final int ENCODED_NULL_MATERIAL = -1; + + static int encode(BlockData blockData) { + return Block.BLOCK_STATE_REGISTRY.getId(((CraftBlockData) blockData).getState()); + } + + static ModernBlockData decode(int encoded) { + if (encoded == ENCODED_NULL_MATERIAL) return null; + var vanillaBlockstate = Block.BLOCK_STATE_REGISTRY.byId(encoded); + if (vanillaBlockstate == null) return null; + return new ModernBlockData(vanillaBlockstate.createCraftBlockData()); + } +} diff --git a/platform/platform-modern/src/main/java/tc/oc/pgm/platform/modern/material/ModernMaterialUtils.java b/platform/platform-modern/src/main/java/tc/oc/pgm/platform/modern/material/ModernMaterialUtils.java index 76038ece5d..8bad424ac8 100644 --- a/platform/platform-modern/src/main/java/tc/oc/pgm/platform/modern/material/ModernMaterialUtils.java +++ b/platform/platform-modern/src/main/java/tc/oc/pgm/platform/modern/material/ModernMaterialUtils.java @@ -33,7 +33,6 @@ @Supports(value = PAPER, minVersion = "1.20.6") @SuppressWarnings("deprecation") public class ModernMaterialUtils implements MaterialUtils { - private static final int ENCODED_NULL_MATERIAL = -1; @Override public BlockMaterialData createBlockData(Material material) { @@ -83,8 +82,7 @@ public ItemMaterialData createItemData(Hanging hanging) { @Override public BlockMaterialData decode(int encoded) { - if (encoded == ENCODED_NULL_MATERIAL) return null; - return new ModernBlockData(Material.values()[encoded].createBlockData()); + return ModernEncodeUtil.decode(encoded); } @Override diff --git a/platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/SpEffects.java b/platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/SpEffects.java index 2f9cb2158a..af5944453e 100644 --- a/platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/SpEffects.java +++ b/platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/SpEffects.java @@ -10,6 +10,7 @@ import org.bukkit.World; import org.bukkit.entity.Player; import tc.oc.pgm.util.bukkit.Effects; +import tc.oc.pgm.util.material.BlockMaterialData; import tc.oc.pgm.util.platform.Supports; @Supports(SPORTPAPER) @@ -98,6 +99,11 @@ public void explosion(Player player, Location location) { player.spigot().playEffect(location, Effect.EXPLOSION_HUGE, 0, 0, 0f, 0f, 0f, 1f, 1, 256); } + @Override + public void blockBreak(Location location, BlockMaterialData material) { + location.getWorld().playEffect(location, Effect.STEP_SOUND, material.encoded()); + } + private float rgbToParticle(int rgb) { return Math.max(0.001f, (rgb / 255.0f)); } diff --git a/platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/material/BlockDataIterator.java b/platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/material/BlockDataIterator.java index 5a597c6528..117e0da373 100644 --- a/platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/material/BlockDataIterator.java +++ b/platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/material/BlockDataIterator.java @@ -100,7 +100,7 @@ public BlockVector getBlockVector() { @Override public int encoded() { - throw new UnsupportedOperationException(); + return SpEncodeUtil.encode(materialId, data); } @Override diff --git a/platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/material/SpEncodeUtil.java b/platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/material/SpEncodeUtil.java new file mode 100644 index 0000000000..d5888c8c90 --- /dev/null +++ b/platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/material/SpEncodeUtil.java @@ -0,0 +1,29 @@ +package tc.oc.pgm.platform.sportpaper.material; + +import org.bukkit.Material; + +@SuppressWarnings("deprecation") +class SpEncodeUtil { + private static final int ENCODED_NULL_MATERIAL = -1; + + static int encode(Material mat, int data) { + return encode(mat.getId(), data); + } + + static int encode(int typeId, int data) { + return typeId + (data << 12); + } + + static SpMaterialData decode(int encoded) { + if (encoded == ENCODED_NULL_MATERIAL) return null; + return new SpMaterialData(decodeMaterial(encoded), decodeData(encoded)); + } + + static Material decodeMaterial(int encoded) { + return Material.getMaterial(encoded & 0xfff); + } + + static byte decodeData(int encoded) { + return (byte) (encoded >> 12); + } +} diff --git a/platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/material/SpMaterialData.java b/platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/material/SpMaterialData.java index 903bf4a9b4..f4f4e18207 100644 --- a/platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/material/SpMaterialData.java +++ b/platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/material/SpMaterialData.java @@ -66,7 +66,7 @@ public void sendBlockChange(Player player, Location location) { @Override public int encoded() { - return material.getId() + (((int) damage) << 12); + return SpEncodeUtil.encode(material, damage); } @Override diff --git a/platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/material/SpMaterialUtils.java b/platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/material/SpMaterialUtils.java index f20c9c8144..da12491d74 100644 --- a/platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/material/SpMaterialUtils.java +++ b/platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/material/SpMaterialUtils.java @@ -82,17 +82,7 @@ public ItemMaterialData createItemData(Hanging hanging) { @Override public BlockMaterialData decode(int encoded) { - if (encoded == ENCODED_NULL_MATERIAL) return null; - Material material = Material.getMaterial(decodeTypeId(encoded)); - return new SpMaterialData(material, decodeMetadata(encoded)); - } - - static int decodeTypeId(int encoded) { - return encoded & 0xfff; - } - - static byte decodeMetadata(int encoded) { - return (byte) (encoded >> 12); + return SpEncodeUtil.decode(encoded); } @Override diff --git a/util/src/main/java/tc/oc/pgm/util/bukkit/Effects.java b/util/src/main/java/tc/oc/pgm/util/bukkit/Effects.java index e4f54d1f72..1f6a31f35d 100644 --- a/util/src/main/java/tc/oc/pgm/util/bukkit/Effects.java +++ b/util/src/main/java/tc/oc/pgm/util/bukkit/Effects.java @@ -2,7 +2,6 @@ import org.bukkit.Color; import org.bukkit.DyeColor; -import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; @@ -26,7 +25,5 @@ public interface Effects { void explosion(Player player, Location location); - default void blockBreak(Location location, BlockMaterialData material) { - location.getWorld().playEffect(location, Effect.STEP_SOUND, material.encoded()); - } + void blockBreak(Location location, BlockMaterialData material); } diff --git a/util/src/main/java/tc/oc/pgm/util/material/MaterialCounter.java b/util/src/main/java/tc/oc/pgm/util/material/MaterialCounter.java index c3c4d0b7a9..414de75893 100644 --- a/util/src/main/java/tc/oc/pgm/util/material/MaterialCounter.java +++ b/util/src/main/java/tc/oc/pgm/util/material/MaterialCounter.java @@ -6,7 +6,7 @@ import java.util.Iterator; import org.bukkit.block.BlockState; -/** Efficiently counts distinct {@link MaterialData}s */ +/** Efficiently counts distinct {@link BlockMaterialData}s */ public class MaterialCounter { private final Int2IntMap counts; @@ -14,28 +14,16 @@ public MaterialCounter() { this.counts = new Int2IntOpenHashMap(); } - public boolean contains(int encodedMaterial) { - return counts.containsKey(encodedMaterial); - } - public boolean contains(BlockMaterialData material) { - return contains(material.encoded()); - } - - public int get(int encodedMaterial) { - return counts.get(encodedMaterial); + return counts.containsKey(material.encoded()); } public int get(BlockMaterialData material) { - return get(material.encoded()); - } - - public int increment(int encodedMaterial, int count) { - return counts.merge(encodedMaterial, count, (key, v) -> v + count); + return counts.get(material.encoded()); } - public int increment(BlockState block, int count) { - return increment(MaterialData.block(block).encoded(), count); + public void increment(BlockState block, int count) { + counts.merge(MaterialData.block(block).encoded(), count, (key, v) -> v + count); } public void clear() {