Skip to content

Commit bdaa843

Browse files
committed
Update to 1.16.2
Fixes #941 Fixes #944 Fixes #934
1 parent 13f5c14 commit bdaa843

25 files changed

+370
-214
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<project.fullVersion>${project.version}</project.fullVersion>
1818

1919
<powermock.version>2.0.7</powermock.version>
20-
<spigot.version>1.16.1-R0.1-SNAPSHOT</spigot.version>
20+
<spigot.version>1.16.2-R0.1-SNAPSHOT</spigot.version>
2121
</properties>
2222

2323
<build>

src/main/java/com/comphenix/protocol/PacketType.java

Lines changed: 63 additions & 62 deletions
Large diffs are not rendered by default.

src/main/java/com/comphenix/protocol/events/PacketContainer.java

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,15 @@ public StreamSerializer getByteArraySerializer() {
294294
public StructureModifier<int[]> getIntegerArrays() {
295295
return structureModifier.withType(int[].class);
296296
}
297-
297+
298+
/**
299+
* Retrieves a read/write structure for every short array field.
300+
* @return A modifier for every short array field.
301+
*/
302+
public StructureModifier<short[]> getShortArrays() {
303+
return structureModifier.withType(short[].class);
304+
}
305+
298306
/**
299307
* Retrieves a read/write structure for ItemStack.
300308
* <p>
@@ -581,7 +589,21 @@ public StructureModifier<WrappedGameProfile> getGameProfiles() {
581589
public StructureModifier<WrappedBlockData> getBlockData() {
582590
// Convert to and from our wrapper
583591
return structureModifier.withType(
584-
MinecraftReflection.getIBlockDataClass(), BukkitConverters.getWrappedBlockDataConverter());
592+
MinecraftReflection.getIBlockDataClass(),
593+
BukkitConverters.getWrappedBlockDataConverter()
594+
);
595+
}
596+
597+
/**
598+
* Retrieves a read/write structure for IBlockData arrays in Minecraft 1.16.2+
599+
* @return A modifier for IBlockData array fields
600+
*/
601+
public StructureModifier<WrappedBlockData[]> getBlockDataArrays() {
602+
// TODO we might want to make this a lazy converter and only convert indexes as needed
603+
return structureModifier.withType(
604+
MinecraftReflection.getArrayClass(MinecraftReflection.getIBlockDataClass()),
605+
Converters.array(MinecraftReflection.getIBlockDataClass(), BukkitConverters.getWrappedBlockDataConverter())
606+
);
585607
}
586608

587609
/**
@@ -596,7 +618,9 @@ public StructureModifier<MultiBlockChangeInfo[]> getMultiBlockChangeInfoArrays()
596618

597619
// Convert to and from our wrapper
598620
return structureModifier.withType(
599-
MinecraftReflection.getMultiBlockChangeInfoArrayClass(), MultiBlockChangeInfo.getArrayConverter(chunk));
621+
MinecraftReflection.getMultiBlockChangeInfoArrayClass(),
622+
Converters.array(MinecraftReflection.getMultiBlockChangeInfoClass(), MultiBlockChangeInfo.getConverter(chunk))
623+
);
600624
}
601625

602626
/**
@@ -918,14 +942,12 @@ public StructureModifier<MinecraftKey> getMinecraftKeys() {
918942
MinecraftKey.getConverter());
919943
}
920944

921-
private static final boolean NEW_DIMENSIONS = MinecraftVersion.NETHER_UPDATE.atOrAbove();
922-
923945
/**
924946
* Retrieve a read/write structure for dimension IDs in 1.13.1+
925947
* @return A modifier for dimension IDs
926948
*/
927949
public StructureModifier<Integer> getDimensions() {
928-
if (NEW_DIMENSIONS) {
950+
if (MinecraftVersion.NETHER_UPDATE.atOrAbove() && !MinecraftVersion.NETHER_UPDATE_2.atOrAbove()) {
929951
return structureModifier.withParamType(
930952
MinecraftReflection.getMinecraftClass("ResourceKey"),
931953
BukkitConverters.getDimensionIDConverter(),
@@ -984,6 +1006,17 @@ public StructureModifier<World> getWorldKeys() {
9841006
);
9851007
}
9861008

1009+
/**
1010+
* Retrieve a read/write structure for SectionPositions in 1.16.2+
1011+
* @return The Structure Modifier
1012+
*/
1013+
public StructureModifier<BlockPosition> getSectionPositions() {
1014+
return structureModifier.withType(
1015+
MinecraftReflection.getMinecraftClass("SectionPosition"),
1016+
BukkitConverters.getSectionPositionConverter()
1017+
);
1018+
}
1019+
9871020
/**
9881021
* Retrieve a read/write structure for the Map class.
9891022
* @param keyConverter Converter for map keys

src/main/java/com/comphenix/protocol/reflect/cloning/ImmutableDetector.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,13 @@ public class ImmutableDetector implements Cloner {
6464
add(MinecraftReflection::getItemClass);
6565
add("SoundEffect");
6666

67-
if (MinecraftVersion.atOrAbove(MinecraftVersion.AQUATIC_UPDATE)) {
67+
if (MinecraftVersion.AQUATIC_UPDATE.atOrAbove()) {
6868
add(MinecraftReflection::getFluidTypeClass);
6969
add(MinecraftReflection::getParticleTypeClass);
7070
add("Particle");
7171
}
7272

73-
if (MinecraftVersion.atOrAbove(MinecraftVersion.VILLAGE_UPDATE)) {
73+
if (MinecraftVersion.VILLAGE_UPDATE.atOrAbove()) {
7474
add("EntityTypes");
7575
add("VillagerType");
7676
add("VillagerProfession");
@@ -79,9 +79,13 @@ public class ImmutableDetector implements Cloner {
7979
// TODO automatically detect the technically-not-an-enum enums that Mojang is so fond of
8080
// Would also probably go in tandem with having the FieldCloner use this
8181

82-
if (MinecraftVersion.atOrAbove(MinecraftVersion.NETHER_UPDATE)) {
82+
if (MinecraftVersion.NETHER_UPDATE.atOrAbove()) {
8383
add("IRegistry");
8484
}
85+
86+
if (MinecraftVersion.NETHER_UPDATE_2.atOrAbove()) {
87+
add("ResourceKey");
88+
}
8589
}
8690

8791
private static void add(Supplier<Class<?>> getClass) {

src/main/java/com/comphenix/protocol/utility/Constants.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@
2121
*/
2222

2323
public final class Constants {
24-
public static final String PACKAGE_VERSION = "v1_16_R1";
24+
public static final String PACKAGE_VERSION = "v1_16_R2";
2525
public static final String NMS = "net.minecraft.server." + PACKAGE_VERSION;
2626
public static final String OBC = "org.bukkit.craftbukkit." + PACKAGE_VERSION;
27-
public static final MinecraftVersion CURRENT_VERSION = MinecraftVersion.NETHER_UPDATE;
27+
public static final MinecraftVersion CURRENT_VERSION = MinecraftVersion.NETHER_UPDATE_2;
2828

2929
public static void init() {
3030
MinecraftReflection.setMinecraftPackage(NMS, OBC);

src/main/java/com/comphenix/protocol/utility/MinecraftProtocolVersion.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ private static NavigableMap<MinecraftVersion, Integer> createLookup() {
6969

7070
map.put(new MinecraftVersion(1, 16, 0), 735);
7171
map.put(new MinecraftVersion(1, 16, 1), 736);
72+
map.put(new MinecraftVersion(1, 16, 2), 751);
7273
return map;
7374
}
7475

src/main/java/com/comphenix/protocol/utility/MinecraftVersion.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,12 @@ public class MinecraftVersion implements Comparable<MinecraftVersion>, Serializa
4545
private static final Pattern VERSION_PATTERN = Pattern.compile(".*\\(.*MC.\\s*([a-zA-z0-9\\-.]+).*");
4646

4747
/**
48-
* Version 1.16 - the nether update
48+
* Version 1.16.2 - breaking change to the nether update
49+
*/
50+
public static final MinecraftVersion NETHER_UPDATE_2 = new MinecraftVersion("1.16.2");
51+
52+
/**
53+
* Version 1.16.0 - the nether update
4954
*/
5055
public static final MinecraftVersion NETHER_UPDATE = new MinecraftVersion("1.16");
5156

@@ -117,6 +122,7 @@ public class MinecraftVersion implements Comparable<MinecraftVersion>, Serializa
117122
private final int major;
118123
private final int minor;
119124
private final int build;
125+
private Boolean atLeast;
120126

121127
// The development stage
122128
private final String development;
@@ -270,7 +276,11 @@ public boolean isSnapshot() {
270276
}
271277

272278
public boolean atOrAbove() {
273-
return MinecraftVersion.getCurrentVersion().isAtLeast(this);
279+
if (atLeast == null) {
280+
atLeast = MinecraftVersion.atOrAbove(this);
281+
}
282+
283+
return atLeast;
274284
}
275285

276286
/**

src/main/java/com/comphenix/protocol/wrappers/BukkitConverters.java

Lines changed: 99 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1164,9 +1164,9 @@ public PotionEffectType getSpecific(Object generic) {
11641164
});
11651165
}
11661166

1167-
private static final boolean NEW_DIMENSION = MinecraftVersion.NETHER_UPDATE.atOrAbove();
11681167
private static Class<?> dimensionManager;
11691168
private static FauxEnumConverter<Dimension> dimensionConverter;
1169+
private static FauxEnumConverter<DimensionImpl> dimensionImplConverter;
11701170

11711171
private static MethodAccessor dimensionFromId = null;
11721172
private static MethodAccessor idFromDimension = null;
@@ -1224,6 +1224,26 @@ public Class<World> getSpecificType() {
12241224
});
12251225
}
12261226

1227+
enum DimensionImpl {
1228+
OVERWORLD_IMPL(0),
1229+
THE_NETHER_IMPL(-1),
1230+
THE_END_IMPL(1);
1231+
1232+
int id;
1233+
DimensionImpl(int id) {
1234+
this.id = id;
1235+
}
1236+
1237+
static DimensionImpl fromId(int id) {
1238+
switch (id) {
1239+
case 0: return OVERWORLD_IMPL;
1240+
case -1: return THE_NETHER_IMPL;
1241+
case 1: return THE_END_IMPL;
1242+
default: throw new IllegalArgumentException("Invalid dimension " + id);
1243+
}
1244+
}
1245+
}
1246+
12271247
public static EquivalentConverter<Integer> getDimensionIDConverter() {
12281248
return ignoreNull(new EquivalentConverter<Integer>() {
12291249
@Override
@@ -1232,27 +1252,34 @@ public Object getGeneric(Integer specific) {
12321252
dimensionManager = MinecraftReflection.getNullableNMS("DimensionManager");
12331253
}
12341254

1235-
if (NEW_DIMENSION) {
1255+
if (MinecraftVersion.NETHER_UPDATE_2.atOrAbove()) {
1256+
if (dimensionImplConverter == null) {
1257+
dimensionImplConverter = new FauxEnumConverter<>(DimensionImpl.class, dimensionManager);
1258+
}
1259+
1260+
DimensionImpl dimension = DimensionImpl.fromId(specific);
1261+
return dimensionImplConverter.getGeneric(dimension);
1262+
} else if (MinecraftVersion.NETHER_UPDATE.atOrAbove()) {
12361263
if (dimensionConverter == null) {
12371264
dimensionConverter = new FauxEnumConverter<>(Dimension.class, dimensionManager);
12381265
}
12391266

12401267
Dimension dimension = Dimension.fromId(specific);
12411268
return dimensionConverter.getGeneric(dimension);
1242-
}
1269+
} else {
1270+
if (dimensionFromId == null) {
1271+
FuzzyReflection reflection = FuzzyReflection.fromClass(dimensionManager, false);
1272+
FuzzyMethodContract contract = FuzzyMethodContract
1273+
.newBuilder()
1274+
.requireModifier(Modifier.STATIC)
1275+
.parameterExactType(int.class)
1276+
.returnTypeExact(dimensionManager)
1277+
.build();
1278+
dimensionFromId = Accessors.getMethodAccessor(reflection.getMethod(contract));
1279+
}
12431280

1244-
if (dimensionFromId == null) {
1245-
FuzzyReflection reflection = FuzzyReflection.fromClass(dimensionManager, false);
1246-
FuzzyMethodContract contract = FuzzyMethodContract
1247-
.newBuilder()
1248-
.requireModifier(Modifier.STATIC)
1249-
.parameterExactType(int.class)
1250-
.returnTypeExact(dimensionManager)
1251-
.build();
1252-
dimensionFromId = Accessors.getMethodAccessor(reflection.getMethod(contract));
1281+
return dimensionFromId.invoke(null, specific);
12531282
}
1254-
1255-
return dimensionFromId.invoke(null, specific);
12561283
}
12571284

12581285
@Override
@@ -1261,27 +1288,34 @@ public Integer getSpecific(Object generic) {
12611288
dimensionManager = MinecraftReflection.getNullableNMS("DimensionManager");
12621289
}
12631290

1264-
if (NEW_DIMENSION) {
1291+
if (MinecraftVersion.NETHER_UPDATE_2.atOrAbove()) {
1292+
if (dimensionImplConverter == null) {
1293+
dimensionImplConverter = new FauxEnumConverter<>(DimensionImpl.class, dimensionManager);
1294+
}
1295+
1296+
DimensionImpl dimension = dimensionImplConverter.getSpecific(generic);
1297+
return dimension.id;
1298+
} else if (MinecraftVersion.NETHER_UPDATE.atOrAbove()) {
12651299
if (dimensionConverter == null) {
12661300
dimensionConverter = new FauxEnumConverter<>(Dimension.class, dimensionManager);
12671301
}
12681302

12691303
Dimension dimension = dimensionConverter.getSpecific(generic);
12701304
return dimension.getId();
1271-
}
1305+
} else {
1306+
if (idFromDimension == null) {
1307+
FuzzyReflection reflection = FuzzyReflection.fromClass(dimensionManager, false);
1308+
FuzzyMethodContract contract = FuzzyMethodContract
1309+
.newBuilder()
1310+
.banModifier(Modifier.STATIC)
1311+
.returnTypeExact(int.class)
1312+
.parameterCount(0)
1313+
.build();
1314+
idFromDimension = Accessors.getMethodAccessor(reflection.getMethod(contract));
1315+
}
12721316

1273-
if (idFromDimension == null) {
1274-
FuzzyReflection reflection = FuzzyReflection.fromClass(dimensionManager, false);
1275-
FuzzyMethodContract contract = FuzzyMethodContract
1276-
.newBuilder()
1277-
.banModifier(Modifier.STATIC)
1278-
.returnTypeExact(int.class)
1279-
.parameterCount(0)
1280-
.build();
1281-
idFromDimension = Accessors.getMethodAccessor(reflection.getMethod(contract));
1317+
return (Integer) idFromDimension.invoke(generic);
12821318
}
1283-
1284-
return (Integer) idFromDimension.invoke(generic);
12851319
}
12861320

12871321
@Override
@@ -1339,5 +1373,42 @@ public Class<List<MerchantRecipe>> getSpecificType() {
13391373

13401374
});
13411375
}
1342-
1376+
1377+
private static MethodAccessor sectionPositionCreate;
1378+
private static Class<?> sectionPositionClass;
1379+
1380+
public static EquivalentConverter<BlockPosition> getSectionPositionConverter() {
1381+
return ignoreNull(new EquivalentConverter<BlockPosition>() {
1382+
@Override
1383+
public Object getGeneric(BlockPosition specific) {
1384+
if (sectionPositionClass == null) {
1385+
sectionPositionClass = MinecraftReflection.getMinecraftClass("SectionPosition");
1386+
}
1387+
1388+
if (sectionPositionCreate == null) {
1389+
sectionPositionCreate = Accessors.getMethodAccessor(
1390+
FuzzyReflection.fromClass(sectionPositionClass).getMethod(FuzzyMethodContract
1391+
.newBuilder()
1392+
.requireModifier(Modifier.STATIC)
1393+
.returnTypeExact(sectionPositionClass)
1394+
.parameterExactArray(int.class, int.class, int.class)
1395+
.build())
1396+
);
1397+
}
1398+
1399+
return sectionPositionCreate.invoke(null, specific.x, specific.y, specific.z);
1400+
}
1401+
1402+
@Override
1403+
public BlockPosition getSpecific(Object generic) {
1404+
StructureModifier<Integer> modifier = new StructureModifier<>(generic.getClass()).withTarget(generic).withType(int.class);
1405+
return new BlockPosition(modifier.readSafely(0), modifier.readSafely(1), modifier.readSafely(2));
1406+
}
1407+
1408+
@Override
1409+
public Class<BlockPosition> getSpecificType() {
1410+
return BlockPosition.class;
1411+
}
1412+
});
1413+
}
13431414
}

0 commit comments

Comments
 (0)