Skip to content

Commit b6a7d5f

Browse files
committed
Fix some more Mojang mappings
1 parent f6b3af4 commit b6a7d5f

File tree

6 files changed

+114
-73
lines changed

6 files changed

+114
-73
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,12 @@ public class ImmutableDetector implements Cloner {
6262
add(MinecraftReflection::getDataWatcherSerializerClass);
6363
add(MinecraftReflection::getBlockClass);
6464
add(MinecraftReflection::getItemClass);
65-
add("sounds.SoundEffect", "sounds.SoundEvents", "SoundEffect");
65+
add(MinecraftReflection::getSoundEffectClass);
6666

6767
if (MinecraftVersion.AQUATIC_UPDATE.atOrAbove()) {
6868
add(MinecraftReflection::getFluidTypeClass);
6969
add(MinecraftReflection::getParticleTypeClass);
70-
add("core.particles.Particle","core.particles.ParticleType", "Particle");
70+
add(MinecraftReflection::getParticleClass);
7171
}
7272

7373
if (MinecraftVersion.VILLAGE_UPDATE.atOrAbove()) {

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

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,6 @@
3232
import java.util.regex.Matcher;
3333
import java.util.regex.Pattern;
3434

35-
import org.bukkit.Bukkit;
36-
import org.bukkit.Material;
37-
import org.bukkit.Server;
38-
import org.bukkit.entity.Player;
39-
import org.bukkit.inventory.ItemStack;
40-
4135
import com.comphenix.protocol.PacketType;
4236
import com.comphenix.protocol.ProtocolLogger;
4337
import com.comphenix.protocol.injector.BukkitUnwrapper;
@@ -54,6 +48,11 @@
5448

5549
import io.netty.buffer.ByteBuf;
5650
import io.netty.buffer.Unpooled;
51+
import org.bukkit.Bukkit;
52+
import org.bukkit.Material;
53+
import org.bukkit.Server;
54+
import org.bukkit.entity.Player;
55+
import org.bukkit.inventory.ItemStack;
5756

5857
/**
5958
* Methods and constants specifically used in conjuction with reflecting Minecraft object.
@@ -117,7 +116,7 @@ public final class MinecraftReflection {
117116
private static MethodAccessor asCraftMirror = null;
118117
private static MethodAccessor isEmpty = null;
119118

120-
private static boolean isMojangMapped = false;
119+
private static Boolean isMojangMapped = null;
121120

122121
private MinecraftReflection() {
123122
// No need to make this constructable.
@@ -208,9 +207,6 @@ public static String getMinecraftPackage() {
208207
}
209208
}
210209

211-
// for now, we're going to say that it's Mojang mapped if the nms world was renamed to ServerLevel
212-
isMojangMapped = getNmsWorldClass().getName().contains("ServerLevel");
213-
214210
return MINECRAFT_FULL_PACKAGE;
215211
} catch (NoSuchMethodException exception) {
216212
throw new IllegalStateException("Cannot find getHandle() in CraftEntity", exception);
@@ -685,10 +681,12 @@ public static Class<?> getChatSerializerClass() {
685681
* @return The serializer class.
686682
*/
687683
public static Class<?> getStyleSerializerClass() {
688-
return getMinecraftClass("network.chat.ChatModifier$ChatModifierSerializer", "ChatModifier$ChatModifierSerializer");
684+
return getMinecraftClass(
685+
"network.chat.Style$Serializer",
686+
"network.chat.ChatModifier$ChatModifierSerializer",
687+
"ChatModifier$ChatModifierSerializer");
689688
}
690689

691-
692690
/**
693691
* Retrieve the ServerPing class.
694692
*
@@ -1036,7 +1034,21 @@ public static Class<?> getTileEntityClass() {
10361034
* @return The team parameters class.
10371035
*/
10381036
public static Optional<Class<?>> getTeamParametersClass() {
1039-
return getOptionalNMS("network.protocol.game.PacketPlayOutScoreboardTeam$b");
1037+
Optional<Class<?>> clazz = getOptionalNMS(
1038+
"network.protocol.game.ClientboundSetPlayerTeamPacket$Parameters",
1039+
"network.protocol.game.PacketPlayOutScoreboardTeam$b"
1040+
);
1041+
1042+
if (!clazz.isPresent()) {
1043+
try {
1044+
Class<?> clazz1 = PacketType.Play.Server.SCOREBOARD_TEAM.getPacketClass().getClasses()[0];
1045+
setMinecraftClass("network.protocol.game.ClientboundSetPlayerTeamPacket$Parameters", clazz1);
1046+
return Optional.of(clazz1);
1047+
} catch (Exception ignored) {
1048+
}
1049+
}
1050+
1051+
return clazz;
10401052
}
10411053

10421054
/**
@@ -1045,7 +1057,11 @@ public static Optional<Class<?>> getTeamParametersClass() {
10451057
* @return The component style class.
10461058
*/
10471059
public static Class<?> getComponentStyleClass() {
1048-
return getMinecraftClass("network.chat.ChatModifier", "ChatModifier");
1060+
return getMinecraftClass(
1061+
"network.chat.Style",
1062+
"network.chat.ChatModifier",
1063+
"ChatModifier"
1064+
);
10491065
}
10501066

10511067
/**
@@ -1180,8 +1196,8 @@ public static Class<?> getPlayerInfoDataClass() {
11801196
}
11811197
}
11821198

1183-
static Class<?> getOrInferMinecraftClass(String className, Supplier<Class<?>> supplier) {
1184-
return getOptionalNMS(className).orElseGet(() -> {
1199+
static Class<?> getOrInferMinecraftClass(String className, Supplier<Class<?>> supplier, String... aliases) {
1200+
return getOptionalNMS(className, aliases).orElseGet(() -> {
11851201
Class<?> clazz = supplier.get();
11861202
return setMinecraftClass(className, clazz);
11871203
});
@@ -1854,6 +1870,11 @@ public static Optional<Class<?>> getRegistryFriendlyByteBufClass() {
18541870
}
18551871

18561872
public static boolean isMojangMapped() {
1873+
if (isMojangMapped == null) {
1874+
String craftServerName = Bukkit.getServer().getClass().getName();
1875+
isMojangMapped = !craftServerName.contains(".v") && !craftServerName.contains("_R");
1876+
}
1877+
18571878
return isMojangMapped;
18581879
}
18591880
}

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

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,22 @@
1616
*/
1717
package com.comphenix.protocol.wrappers;
1818

19-
import com.comphenix.protocol.events.PacketContainer;
20-
import com.comphenix.protocol.wrappers.Either.Left;
21-
import com.comphenix.protocol.wrappers.Either.Right;
22-
import com.comphenix.protocol.wrappers.WrappedProfilePublicKey.WrappedProfileKeyData;
2319
import java.lang.ref.WeakReference;
24-
import java.lang.reflect.*;
25-
import java.util.*;
20+
import java.lang.reflect.Array;
21+
import java.lang.reflect.Constructor;
22+
import java.lang.reflect.Field;
23+
import java.lang.reflect.Method;
24+
import java.lang.reflect.Modifier;
25+
import java.util.ArrayList;
26+
import java.util.Collection;
27+
import java.util.HashMap;
28+
import java.util.HashSet;
29+
import java.util.List;
30+
import java.util.Map;
2631
import java.util.Map.Entry;
32+
import java.util.NoSuchElementException;
33+
import java.util.Optional;
34+
import java.util.Set;
2735
import java.util.concurrent.ConcurrentHashMap;
2836
import java.util.function.Supplier;
2937
import java.util.stream.Collectors;
@@ -32,6 +40,7 @@
3240
import com.comphenix.protocol.ProtocolLibrary;
3341
import com.comphenix.protocol.ProtocolLogger;
3442
import com.comphenix.protocol.ProtocolManager;
43+
import com.comphenix.protocol.events.PacketContainer;
3544
import com.comphenix.protocol.injector.BukkitUnwrapper;
3645
import com.comphenix.protocol.injector.PacketConstructor;
3746
import com.comphenix.protocol.injector.PacketConstructor.Unwrapper;
@@ -47,16 +56,18 @@
4756
import com.comphenix.protocol.reflect.fuzzy.FuzzyMethodContract;
4857
import com.comphenix.protocol.utility.MinecraftReflection;
4958
import com.comphenix.protocol.utility.MinecraftVersion;
59+
import com.comphenix.protocol.wrappers.Either.Left;
60+
import com.comphenix.protocol.wrappers.Either.Right;
5061
import com.comphenix.protocol.wrappers.EnumWrappers.Dimension;
5162
import com.comphenix.protocol.wrappers.EnumWrappers.FauxEnumConverter;
63+
import com.comphenix.protocol.wrappers.WrappedProfilePublicKey.WrappedProfileKeyData;
5264
import com.comphenix.protocol.wrappers.nbt.NbtBase;
5365
import com.comphenix.protocol.wrappers.nbt.NbtFactory;
5466

5567
import com.google.common.base.Objects;
5668
import com.google.common.collect.ImmutableList;
5769
import com.google.common.collect.ImmutableMap;
5870
import com.google.common.collect.Lists;
59-
6071
import org.bukkit.Bukkit;
6172
import org.bukkit.Material;
6273
import org.bukkit.Sound;
@@ -1116,29 +1127,30 @@ public Vector getSpecific(Object generic) {
11161127
static MethodAccessor getSoundEffect = null;
11171128
static FieldAccessor soundKey = null;
11181129

1119-
static MethodAccessor getSoundEffectBySound = null;
1120-
static MethodAccessor getSoundByEffect = null;
1130+
static MethodAccessor bukkitToMinecraft = null;
1131+
static MethodAccessor minecraftToBukkit = null;
11211132

11221133
static Map<String, Sound> soundIndex = null;
11231134

11241135
public static EquivalentConverter<Sound> getSoundConverter() {
11251136
// Try to create sound converter for new versions greater 1.16.4
11261137
if (MinecraftVersion.NETHER_UPDATE_4.atOrAbove()) {
1127-
if (getSoundEffectBySound == null || getSoundByEffect == null) {
1138+
if (bukkitToMinecraft == null && minecraftToBukkit == null) {
11281139
Class<?> craftSound = MinecraftReflection.getCraftSoundClass();
1129-
FuzzyReflection fuzzy = FuzzyReflection.fromClass(craftSound, true);
1140+
Class<?> soundEvent = MinecraftReflection.getSoundEffectClass();
1141+
FuzzyReflection fuzzy = FuzzyReflection.fromClass(craftSound, false);
11301142

1131-
getSoundEffectBySound = Accessors.getMethodAccessor(fuzzy.getMethodByReturnTypeAndParameters(
1132-
"getSoundEffect",
1133-
MinecraftReflection.getSoundEffectClass(),
1134-
Sound.class
1135-
));
1143+
bukkitToMinecraft = Accessors.getMethodAccessor(fuzzy.getMethod(FuzzyMethodContract.newBuilder()
1144+
.returnTypeExact(soundEvent)
1145+
.parameterExactArray(Sound.class)
1146+
.requireModifier(Modifier.STATIC)
1147+
.build()));
11361148

1137-
getSoundByEffect = Accessors.getMethodAccessor(fuzzy.getMethodByReturnTypeAndParameters(
1138-
"getBukkit",
1139-
Sound.class,
1140-
MinecraftReflection.getSoundEffectClass()
1141-
));
1149+
minecraftToBukkit = Accessors.getMethodAccessor(fuzzy.getMethod(FuzzyMethodContract.newBuilder()
1150+
.returnTypeExact(Sound.class)
1151+
.parameterExactArray(soundEvent)
1152+
.requireModifier(Modifier.STATIC)
1153+
.build()));
11421154
}
11431155

11441156
return ignoreNull(new EquivalentConverter<Sound>() {
@@ -1150,13 +1162,13 @@ public Class<Sound> getSpecificType() {
11501162

11511163
@Override
11521164
public Object getGeneric(Sound specific) {
1153-
return getSoundEffectBySound.invoke(null, specific);
1165+
return bukkitToMinecraft.invoke(null, specific);
11541166
}
11551167

11561168
@Override
11571169
public Sound getSpecific(Object generic) {
11581170
try {
1159-
return (Sound) getSoundByEffect.invoke(null, generic);
1171+
return (Sound) minecraftToBukkit.invoke(null, generic);
11601172
} catch (IllegalStateException ex) {
11611173
if (ex.getCause() instanceof NullPointerException || ex.getCause() instanceof NoSuchElementException) {
11621174
// "null" sounds cause NPEs inside getSoundByEffect

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

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
package com.comphenix.protocol.wrappers;
22

3+
import java.lang.reflect.Field;
4+
import java.lang.reflect.Method;
5+
import java.util.EnumSet;
6+
import java.util.HashMap;
7+
import java.util.HashSet;
8+
import java.util.List;
9+
import java.util.Locale;
10+
import java.util.Map;
11+
import java.util.Set;
12+
import java.util.concurrent.ConcurrentHashMap;
13+
314
import com.comphenix.protocol.PacketType;
415
import com.comphenix.protocol.PacketType.Protocol;
516
import com.comphenix.protocol.ProtocolLogger;
@@ -11,21 +22,11 @@
1122
import com.comphenix.protocol.reflect.fuzzy.FuzzyMethodContract;
1223
import com.comphenix.protocol.utility.MinecraftReflection;
1324
import com.comphenix.protocol.utility.MinecraftVersion;
25+
1426
import org.apache.commons.lang.Validate;
1527
import org.bukkit.ChatColor;
1628
import org.bukkit.GameMode;
1729

18-
import java.lang.reflect.Field;
19-
import java.lang.reflect.Method;
20-
import java.util.EnumSet;
21-
import java.util.HashMap;
22-
import java.util.HashSet;
23-
import java.util.List;
24-
import java.util.Locale;
25-
import java.util.Map;
26-
import java.util.Set;
27-
import java.util.concurrent.ConcurrentHashMap;
28-
2930
/**
3031
* Represents a generic enum converter.
3132
* @author Kristian
@@ -737,7 +738,7 @@ private static void initialize() {
737738
ENTITY_POSE_CLASS = MinecraftReflection.getNullableNMS("world.entity.EntityPose", "world.entity.Pose", "EntityPose");
738739
DISPLAY_SLOT_CLASS = MinecraftReflection.getNullableNMS("world.scores.DisplaySlot");
739740
RENDER_TYPE_CLASS = MinecraftReflection.getNullableNMS("world.scores.criteria.IScoreboardCriteria$EnumScoreboardHealthDisplay", "IScoreboardCriteria$EnumScoreboardHealthDisplay");
740-
CHAT_FORMATTING_CLASS = MinecraftReflection.getNullableNMS("EnumChatFormat");
741+
CHAT_FORMATTING_CLASS = MinecraftReflection.getNullableNMS("ChatFormatting", "EnumChatFormat");
741742

742743
associate(PROTOCOL_CLASS, Protocol.class, getProtocolConverter());
743744
associate(CLIENT_COMMAND_CLASS, ClientCommand.class, getClientCommandConverter());

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import com.comphenix.protocol.reflect.fuzzy.FuzzyMethodContract;
1010
import com.comphenix.protocol.utility.MinecraftReflection;
1111
import com.comphenix.protocol.utility.MinecraftVersion;
12+
13+
import com.google.common.base.Preconditions;
1214
import org.bukkit.Color;
1315
import org.bukkit.Particle;
1416
import org.bukkit.block.data.BlockData;
@@ -30,22 +32,26 @@ private static void ensureMethods() {
3032
return;
3133
}
3234

35+
Class<?> particleType = MinecraftReflection.isMojangMapped()
36+
? MinecraftReflection.getParticleTypeClass()
37+
: MinecraftReflection.getParticleClass();
38+
39+
Preconditions.checkNotNull(particleType, "Cannot find ParticleType class (MojMap: " + MinecraftReflection.isMojangMapped() + ")");
40+
3341
FuzzyReflection fuzzy = FuzzyReflection.fromClass(MinecraftReflection.getCraftBukkitClass("CraftParticle"));
3442
if (MinecraftVersion.CONFIG_PHASE_PROTOCOL_UPDATE.atOrAbove()) {
3543
FuzzyMethodContract contract = FuzzyMethodContract
3644
.newBuilder()
3745
.requireModifier(Modifier.STATIC)
3846
.returnTypeExact(Particle.class)
39-
.parameterExactArray(MinecraftReflection.isMojangMapped()
40-
? MinecraftReflection.getParticleTypeClass()
41-
: MinecraftReflection.getParticleClass())
47+
.parameterExactArray(particleType)
4248
.build();
4349
toBukkit = Accessors.getMethodAccessor(fuzzy.getMethod(contract));
4450

4551
FuzzyReflection particleParam = FuzzyReflection.fromClass(MinecraftReflection.getParticleParam(), false);
4652
contract = FuzzyMethodContract
4753
.newBuilder()
48-
.returnTypeExact(MinecraftReflection.getParticleClass())
54+
.returnTypeExact(particleType)
4955
.parameterCount(0)
5056
.build();
5157
getType = Accessors.getMethodAccessor(particleParam.getMethod(contract));

src/main/java/com/comphenix/protocol/wrappers/nbt/NbtFactory.java

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,6 @@
1717

1818
package com.comphenix.protocol.wrappers.nbt;
1919

20-
import com.comphenix.protocol.reflect.FieldAccessException;
21-
import com.comphenix.protocol.reflect.FuzzyReflection;
22-
import com.comphenix.protocol.reflect.StructureModifier;
23-
import com.comphenix.protocol.reflect.fuzzy.FuzzyMethodContract;
24-
import com.comphenix.protocol.reflect.instances.DefaultInstances;
25-
import com.comphenix.protocol.utility.MinecraftReflection;
26-
import com.comphenix.protocol.utility.MinecraftVersion;
27-
import com.comphenix.protocol.wrappers.BukkitConverters;
28-
import com.comphenix.protocol.wrappers.nbt.io.NbtBinarySerializer;
29-
import com.google.common.base.Preconditions;
30-
import org.bukkit.Material;
31-
import org.bukkit.block.Block;
32-
import org.bukkit.block.BlockState;
33-
import org.bukkit.inventory.ItemStack;
34-
35-
import javax.annotation.Nonnull;
3620
import java.io.DataInputStream;
3721
import java.io.DataOutputStream;
3822
import java.io.FileInputStream;
@@ -47,6 +31,23 @@
4731
import java.util.concurrent.ConcurrentHashMap;
4832
import java.util.zip.GZIPInputStream;
4933
import java.util.zip.GZIPOutputStream;
34+
import javax.annotation.Nonnull;
35+
36+
import com.comphenix.protocol.reflect.FieldAccessException;
37+
import com.comphenix.protocol.reflect.FuzzyReflection;
38+
import com.comphenix.protocol.reflect.StructureModifier;
39+
import com.comphenix.protocol.reflect.fuzzy.FuzzyMethodContract;
40+
import com.comphenix.protocol.reflect.instances.DefaultInstances;
41+
import com.comphenix.protocol.utility.MinecraftReflection;
42+
import com.comphenix.protocol.utility.MinecraftVersion;
43+
import com.comphenix.protocol.wrappers.BukkitConverters;
44+
import com.comphenix.protocol.wrappers.nbt.io.NbtBinarySerializer;
45+
46+
import com.google.common.base.Preconditions;
47+
import org.bukkit.Material;
48+
import org.bukkit.block.Block;
49+
import org.bukkit.block.BlockState;
50+
import org.bukkit.inventory.ItemStack;
5051

5152
/**
5253
* Factory methods for creating NBT elements, lists and compounds.

0 commit comments

Comments
 (0)