Skip to content

Commit e542f3c

Browse files
committed
Add back a missing data watcher constructor
Also bolstered some of the unit tests Fixes #191
1 parent 87c56d0 commit e542f3c

File tree

4 files changed

+81
-45
lines changed

4 files changed

+81
-45
lines changed

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

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package com.comphenix.protocol.wrappers;
1818

1919
import java.lang.reflect.Field;
20-
import java.lang.reflect.Method;
2120
import java.lang.reflect.Modifier;
2221
import java.lang.reflect.ParameterizedType;
2322
import java.lang.reflect.Type;
@@ -39,6 +38,7 @@
3938
import com.comphenix.protocol.reflect.accessors.ConstructorAccessor;
4039
import com.comphenix.protocol.reflect.accessors.FieldAccessor;
4140
import com.comphenix.protocol.reflect.accessors.MethodAccessor;
41+
import com.comphenix.protocol.reflect.fuzzy.FuzzyFieldContract;
4242
import com.comphenix.protocol.reflect.fuzzy.FuzzyMethodContract;
4343
import com.comphenix.protocol.utility.MinecraftReflection;
4444
import com.comphenix.protocol.wrappers.collection.ConvertedMap;
@@ -99,6 +99,20 @@ public WrappedDataWatcher(Entity entity) {
9999
this(newHandle(BukkitUnwrapper.getInstance().unwrapItem(entity)));
100100
}
101101

102+
/**
103+
* Constructs a new DataWatcher using a fake lightning entity and a given
104+
* list of watchable objects.
105+
*
106+
* @param objects The list of objects
107+
*/
108+
public WrappedDataWatcher(List<WrappedWatchableObject> objects) {
109+
this();
110+
111+
for (WrappedWatchableObject object : objects) {
112+
setObject(object.getWatcherObject(), object);
113+
}
114+
}
115+
102116
private static Object newHandle(Object entity) {
103117
if (constructor == null) {
104118
constructor = Accessors.getConstructorAccessor(HANDLE_TYPE, MinecraftReflection.getEntityClass());
@@ -127,16 +141,10 @@ private static Object fakeEntity() {
127141
private Map<Integer, Object> getMap() {
128142
if (MAP_FIELD == null) {
129143
FuzzyReflection fuzzy = FuzzyReflection.fromClass(handleType, true);
130-
List<Field> candidates = fuzzy.getFieldListByType(Map.class);
131-
132-
for (Field candidate : candidates) {
133-
if (Modifier.isStatic(candidate.getModifiers())) {
134-
// This is the entity class to current index map, which we really don't have a use for
135-
} else {
136-
// This is the map we're looking for
137-
MAP_FIELD = Accessors.getFieldAccessor(candidate);
138-
}
139-
}
144+
MAP_FIELD = Accessors.getFieldAccessor(fuzzy.getField(FuzzyFieldContract.newBuilder()
145+
.banModifier(Modifier.STATIC)
146+
.typeDerivedOf(Map.class)
147+
.build()));
140148
}
141149

142150
if (MAP_FIELD == null) {
@@ -329,7 +337,11 @@ public Object getObject(WrappedDataWatcherObject object) {
329337
Validate.notNull(object, "Watcher object cannot be null!");
330338

331339
if (GETTER == null) {
332-
GETTER = Accessors.getMethodAccessor(handleType, "get", object.getHandleType());
340+
FuzzyReflection fuzzy = FuzzyReflection.fromClass(handleType);
341+
GETTER = Accessors.getMethodAccessor(fuzzy.getMethod(FuzzyMethodContract.newBuilder()
342+
.parameterExactType(object.getHandleType())
343+
.returnTypeExact(Object.class)
344+
.build(), "get"));
333345
}
334346

335347
Object value = GETTER.invoke(handle, object.getHandle());
@@ -392,18 +404,13 @@ public void setObject(WrappedDataWatcherObject object, Object value) {
392404

393405
if (SETTER == null || REGISTER == null) {
394406
FuzzyReflection fuzzy = FuzzyReflection.fromClass(handleType, true);
395-
List<Method> methods = fuzzy.getMethodList(FuzzyMethodContract.newBuilder()
407+
FuzzyMethodContract contract = FuzzyMethodContract.newBuilder()
396408
.banModifier(Modifier.STATIC)
397409
.requireModifier(Modifier.PUBLIC)
398410
.parameterExactArray(object.getHandleType(), Object.class)
399-
.build());
400-
for (Method method : methods) {
401-
if (method.getName().equals("set")) {
402-
SETTER = Accessors.getMethodAccessor(method);
403-
} else if (method.getName().equals("register")) {
404-
REGISTER = Accessors.getMethodAccessor(method);
405-
}
406-
}
411+
.build();
412+
SETTER = Accessors.getMethodAccessor(fuzzy.getMethod(contract, "set"));
413+
REGISTER = Accessors.getMethodAccessor(fuzzy.getMethod(contract, "register"));
407414
}
408415

409416
if (hasIndex(object.getIndex())) {
@@ -613,6 +620,19 @@ public Serializer getSerializer() {
613620
public String toString() {
614621
return "DataWatcherObject[index=" + getIndex() + ", serializer=" + getSerializer() + "]";
615622
}
623+
624+
@Override
625+
public boolean equals(Object obj) {
626+
if (obj == this) return true;
627+
if (obj == null) return false;
628+
629+
if (obj instanceof WrappedDataWatcherObject) {
630+
WrappedDataWatcherObject other = (WrappedDataWatcherObject) obj;
631+
return handle.equals(other.handle);
632+
}
633+
634+
return false;
635+
}
616636
}
617637

618638
/**

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -211,14 +211,15 @@ public void setDirtyState(boolean dirty) {
211211

212212
@Override
213213
public boolean equals(Object obj) {
214-
if (obj == this)
215-
return true;
216-
if (obj == null)
217-
return false;
214+
if (obj == this) return true;
215+
if (obj == null) return false;
218216

219217
if (obj instanceof WrappedWatchableObject) {
218+
// watcher object, value, dirty state
220219
WrappedWatchableObject other = (WrappedWatchableObject) obj;
221-
return other.handle.equals(handle);
220+
return getWatcherObject().equals(other.getWatcherObject())
221+
&& getRawValue().equals(other.getRawValue())
222+
&& getDirtyState() == other.getDirtyState();
222223
}
223224

224225
return false;

modules/ProtocolLib/src/test/java/com/comphenix/protocol/events/PacketContainerTest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -355,15 +355,19 @@ public void testGetWatchableCollectionModifier() {
355355

356356
assertNull(watchableAccessor.read(0));
357357

358-
Entity entity = new EntityLightning(null, 0, 0, 0, true);
359-
DataWatcher watcher = entity.getDataWatcher();
358+
WrappedDataWatcher watcher = new WrappedDataWatcher();
359+
watcher.setObject(0, Registry.get(String.class), "Test");
360+
watcher.setObject(1, Registry.get(Byte.class), (byte) 21);
360361

361-
WrappedDataWatcher wrapper = new WrappedDataWatcher(watcher);
362-
List<WrappedWatchableObject> list = wrapper.getWatchableObjects();
362+
List<WrappedWatchableObject> list = watcher.getWatchableObjects();
363363

364364
// Insert and read back
365365
watchableAccessor.write(0, list);
366366
assertEquals(list, watchableAccessor.read(0));
367+
368+
// Put it into a new data watcher
369+
WrappedDataWatcher newWatcher = new WrappedDataWatcher(watchableAccessor.read(0));
370+
assertEquals(newWatcher.getWatchableObjects(), list);
367371
}
368372

369373
@Test

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

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
/**
2-
* (c) 2016 dmulloy2
2+
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
3+
* Copyright (C) 2016 dmulloy2
4+
*
5+
* This program is free software; you can redistribute it and/or modify it under the terms of the
6+
* GNU General Public License as published by the Free Software Foundation; either version 2 of
7+
* the License, or (at your option) any later version.
8+
*
9+
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
10+
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11+
* See the GNU General Public License for more details.
12+
*
13+
* You should have received a copy of the GNU General Public License along with this program;
14+
* if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
15+
* 02111-1307 USA
316
*/
417
package com.comphenix.protocol.wrappers;
518

@@ -11,11 +24,11 @@
1124

1225
import java.util.UUID;
1326

14-
import net.minecraft.server.v1_9_R1.DataWatcher;
15-
import net.minecraft.server.v1_9_R1.Entity;
1627
import net.minecraft.server.v1_9_R1.EntityLightning;
1728
import net.minecraft.server.v1_9_R1.ItemStack;
1829

30+
import org.bukkit.craftbukkit.v1_9_R1.entity.CraftLightningStrike;
31+
import org.bukkit.entity.Entity;
1932
import org.junit.BeforeClass;
2033
import org.junit.Test;
2134

@@ -37,21 +50,25 @@ public static void prepare() {
3750

3851
@Test
3952
public void testBytes() {
40-
WrappedDataWatcher wrapper = create();
53+
// Create a fake lightning strike and get its watcher
54+
EntityLightning lightning = new EntityLightning(null, 0, 0, 0, true);
55+
Entity entity = new CraftLightningStrike(null, lightning);
56+
WrappedDataWatcher wrapper = WrappedDataWatcher.getEntityWatcher(entity);
57+
4158
WrappedWatchableObject watchable = wrapper.getWatchableObject(0);
4259
WrappedDataWatcherObject object = watchable.getWatcherObject();
4360

4461
// Make sure the serializers work
4562
assertEquals(object.getSerializer(), Registry.get(Byte.class));
4663

4764
// Make sure we can set existing objects
48-
wrapper.setObject(0, (byte) 1);
49-
assertTrue(wrapper.getByte(0) == 1);
65+
wrapper.setObject(0, (byte) 21);
66+
assertTrue(wrapper.getByte(0) == 21);
5067
}
5168

5269
@Test
5370
public void testStrings() {
54-
WrappedDataWatcher wrapper = create();
71+
WrappedDataWatcher wrapper = new WrappedDataWatcher();
5572

5673
// Make sure we can create watcher objects
5774
Serializer serializer = Registry.get(String.class);
@@ -63,22 +80,16 @@ public void testStrings() {
6380

6481
@Test
6582
public void testFloats() {
66-
WrappedDataWatcher wrapper = create();
83+
WrappedDataWatcher wrapper = new WrappedDataWatcher();
6784

6885
// Make sure we can add new entries
6986
Serializer serializer = Registry.get(Float.class);
7087
WrappedDataWatcherObject object = new WrappedDataWatcherObject(10, serializer);
71-
wrapper.setObject(object, 1.0F);
88+
wrapper.setObject(object, 21.0F);
7289

7390
assertTrue(wrapper.hasIndex(10));
7491
}
7592

76-
private WrappedDataWatcher create() {
77-
Entity entity = new EntityLightning(null, 0, 0, 0, true);
78-
DataWatcher handle = entity.getDataWatcher();
79-
return new WrappedDataWatcher(handle);
80-
}
81-
8293
@Test
8394
public void testSerializers() {
8495
Serializer blockPos = Registry.get(net.minecraft.server.v1_9_R1.BlockPosition.class, false);

0 commit comments

Comments
 (0)