Skip to content

Commit 7e87c90

Browse files
committed
Add method to create wrapped block data from the spigot api
Fixes #525
1 parent 6fdf0f8 commit 7e87c90

File tree

2 files changed

+53
-7
lines changed

2 files changed

+53
-7
lines changed

modules/API/src/main/java/com/comphenix/protocol/wrappers/WrappedBlockData.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.comphenix.protocol.utility.MinecraftVersion;
2727

2828
import org.bukkit.Material;
29+
import org.bukkit.block.data.BlockData;
2930

3031
/**
3132
* Represents a wrapper around IBlockData.
@@ -45,6 +46,7 @@ private static class NewBlockData extends WrappedBlockData {
4546
private static MethodAccessor BLOCK_FROM_MATERIAL;
4647
private static MethodAccessor GET_BLOCK_DATA;
4748
private static MethodAccessor FROM_LEGACY_DATA;
49+
private static MethodAccessor GET_HANDLE;
4850

4951
static {
5052
if (MinecraftVersion.atOrAbove(MinecraftVersion.AQUATIC_UPDATE)) {
@@ -98,6 +100,15 @@ private static class NewBlockData extends WrappedBlockData {
98100
.returnTypeExact(IBLOCK_DATA)
99101
.build();
100102
GET_BLOCK_DATA = Accessors.getMethodAccessor(fuzzy.getMethod(contract));
103+
104+
fuzzy = FuzzyReflection.fromClass(MinecraftReflection.getCraftBukkitClass("block.data.CraftBlockData"));
105+
contract = FuzzyMethodContract
106+
.newBuilder()
107+
.banModifier(Modifier.STATIC)
108+
.parameterCount(0)
109+
.returnTypeExact(IBLOCK_DATA)
110+
.build();
111+
GET_HANDLE = Accessors.getMethodAccessor(fuzzy.getMethod(contract));
101112
}
102113
}
103114

@@ -145,6 +156,10 @@ private static WrappedBlockData createNewData(Material material) {
145156
private static WrappedBlockData createNewData(Material material, int data) {
146157
return new NewBlockData(FROM_LEGACY_DATA.invoke(null, material, (byte) data));
147158
}
159+
160+
private static WrappedBlockData createNewData(BlockData data) {
161+
return new NewBlockData(GET_HANDLE.invoke(data));
162+
}
148163
}
149164

150165
private static class OldBlockData extends WrappedBlockData {
@@ -304,6 +319,15 @@ public static WrappedBlockData fromHandle(Object handle) {
304319
: new OldBlockData(handle);
305320
}
306321

322+
/**
323+
* Creates a new Wrapped Block Data instance from a given Spigot Block Data
324+
* @param data Spigot block data
325+
* @return The new Wrapped Block Data
326+
*/
327+
public static WrappedBlockData createData(BlockData data) {
328+
return NewBlockData.createNewData(data);
329+
}
330+
307331
@Override
308332
public String toString() {
309333
return "WrappedBlockData[handle=" + handle + "]";
@@ -320,9 +344,12 @@ public int hashCode() {
320344

321345
@Override
322346
public boolean equals(Object o) {
347+
if (o == this) return true;
348+
323349
if (o instanceof WrappedBlockData) {
324350
WrappedBlockData that = (WrappedBlockData) o;
325-
return this.getType() == that.getType() && getData() == that.getData();
351+
return this.handle.equals(that.handle)
352+
|| (this.getType() == that.getType() && this.getData() == that.getData());
326353
}
327354

328355
return false;

modules/ProtocolLib/src/test/java/com/comphenix/protocol/wrappers/WrappedBlockDataTest.java

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,20 @@
1616
*/
1717
package com.comphenix.protocol.wrappers;
1818

19-
import static org.junit.Assert.assertEquals;
19+
import com.comphenix.protocol.BukkitInitialization;
20+
21+
import net.minecraft.server.v1_13_R2.IBlockData;
2022

21-
import org.bukkit.DyeColor;
2223
import org.bukkit.Material;
24+
import org.bukkit.block.BlockFace;
25+
import org.bukkit.block.data.type.GlassPane;
26+
import org.bukkit.craftbukkit.v1_13_R2.block.data.CraftBlockData;
27+
import org.bukkit.craftbukkit.v1_13_R2.block.impl.CraftGlassPane;
28+
import org.bukkit.craftbukkit.v1_13_R2.util.CraftMagicNumbers;
2329
import org.junit.BeforeClass;
2430
import org.junit.Test;
2531

26-
import com.comphenix.protocol.BukkitInitialization;
27-
import com.comphenix.protocol.utility.MinecraftReflection;
32+
import static org.junit.Assert.assertEquals;
2833

2934
/**
3035
* @author dmulloy2
@@ -33,12 +38,12 @@
3338
public class WrappedBlockDataTest {
3439

3540
@BeforeClass
36-
public static void initializeBukkit() throws IllegalAccessException {
41+
public static void initializeBukkit() {
3742
BukkitInitialization.initializeItemMeta();
3843
}
3944

4045
@Test
41-
public void test() {
46+
public void testMaterialCreation() {
4247
Material type = Material.BLUE_WOOL;
4348

4449
WrappedBlockData wrapper = WrappedBlockData.createData(type);
@@ -52,4 +57,18 @@ public void test() {
5257
assertEquals(wrapper.getType(), back.getType());
5358
assertEquals(wrapper.getData(), back.getData());
5459
}
60+
61+
@Test
62+
public void testDataCreation() {
63+
IBlockData nmsData = CraftMagicNumbers.getBlock(Material.CYAN_STAINED_GLASS_PANE).getBlockData();
64+
GlassPane data = (GlassPane) CraftBlockData.fromData(nmsData);
65+
data.setFace(BlockFace.EAST, true);
66+
67+
WrappedBlockData wrapper = WrappedBlockData.createData(data);
68+
assertEquals(wrapper.getType(), Material.CYAN_STAINED_GLASS_PANE);
69+
70+
GlassPane back = new CraftGlassPane((IBlockData) wrapper.getHandle());
71+
assertEquals(back.hasFace(BlockFace.EAST), data.hasFace(BlockFace.EAST));
72+
assertEquals(back.hasFace(BlockFace.SOUTH), data.hasFace(BlockFace.SOUTH));
73+
}
5574
}

0 commit comments

Comments
 (0)