26
26
import com .comphenix .protocol .utility .MinecraftVersion ;
27
27
28
28
import org .bukkit .Material ;
29
+ import org .bukkit .block .data .BlockData ;
29
30
30
31
/**
31
32
* Represents a wrapper around IBlockData.
@@ -45,6 +46,7 @@ private static class NewBlockData extends WrappedBlockData {
45
46
private static MethodAccessor BLOCK_FROM_MATERIAL ;
46
47
private static MethodAccessor GET_BLOCK_DATA ;
47
48
private static MethodAccessor FROM_LEGACY_DATA ;
49
+ private static MethodAccessor GET_HANDLE ;
48
50
49
51
static {
50
52
if (MinecraftVersion .atOrAbove (MinecraftVersion .AQUATIC_UPDATE )) {
@@ -98,6 +100,15 @@ private static class NewBlockData extends WrappedBlockData {
98
100
.returnTypeExact (IBLOCK_DATA )
99
101
.build ();
100
102
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 ));
101
112
}
102
113
}
103
114
@@ -145,6 +156,10 @@ private static WrappedBlockData createNewData(Material material) {
145
156
private static WrappedBlockData createNewData (Material material , int data ) {
146
157
return new NewBlockData (FROM_LEGACY_DATA .invoke (null , material , (byte ) data ));
147
158
}
159
+
160
+ private static WrappedBlockData createNewData (BlockData data ) {
161
+ return new NewBlockData (GET_HANDLE .invoke (data ));
162
+ }
148
163
}
149
164
150
165
private static class OldBlockData extends WrappedBlockData {
@@ -304,6 +319,15 @@ public static WrappedBlockData fromHandle(Object handle) {
304
319
: new OldBlockData (handle );
305
320
}
306
321
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
+
307
331
@ Override
308
332
public String toString () {
309
333
return "WrappedBlockData[handle=" + handle + "]" ;
@@ -320,9 +344,12 @@ public int hashCode() {
320
344
321
345
@ Override
322
346
public boolean equals (Object o ) {
347
+ if (o == this ) return true ;
348
+
323
349
if (o instanceof WrappedBlockData ) {
324
350
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 ());
326
353
}
327
354
328
355
return false ;
0 commit comments