32
32
import com .comphenix .protocol .reflect .accessors .ConstructorAccessor ;
33
33
import com .comphenix .protocol .reflect .fuzzy .FuzzyMethodContract ;
34
34
import com .comphenix .protocol .reflect .instances .DefaultInstances ;
35
- import com .comphenix .protocol .reflect .instances .PacketCreator ;
35
+ import com .comphenix .protocol .reflect .instances .InstanceCreator ;
36
36
import com .comphenix .protocol .utility .ByteBuddyFactory ;
37
37
import com .comphenix .protocol .utility .MinecraftMethods ;
38
38
import com .comphenix .protocol .utility .MinecraftReflection ;
57
57
public class StructureCache {
58
58
59
59
// Structure modifiers
60
- private static final Map <Class <?>, Supplier <Object >> PACKET_INSTANCE_CREATORS = new ConcurrentHashMap <>();
60
+ private static final Map <Class <?>, Supplier <Object >> CACHED_INSTANCE_CREATORS = new ConcurrentHashMap <>();
61
61
private static final Map <PacketType , StructureModifier <Object >> STRUCTURE_MODIFIER_CACHE = new ConcurrentHashMap <>();
62
62
63
63
// packet data serializer which always returns an empty nbt tag compound
@@ -67,80 +67,90 @@ public class StructureCache {
67
67
private static Supplier <Object > TRICKED_DATA_SERIALIZER_BASE ;
68
68
private static Supplier <Object > TRICKED_DATA_SERIALIZER_JSON ;
69
69
70
+ /**
71
+ * @deprecated Renamed to {@link #newInstance(Class)}.
72
+ */
73
+ @ Deprecated
70
74
public static Object newPacket (Class <?> packetClass ) {
71
- Supplier <Object > packetConstructor = PACKET_INSTANCE_CREATORS .computeIfAbsent (packetClass , packetClassKey -> {
72
- try {
73
- PacketCreator creator = PacketCreator .forPacket (packetClassKey );
74
- if (creator .get () != null ) {
75
- return creator ;
76
- }
77
- } catch (Exception ignored ) {
75
+ return newInstance (packetClass );
76
+ }
77
+
78
+ public static Object newInstance (Class <?> clazz ) {
79
+ Supplier <Object > creator = CACHED_INSTANCE_CREATORS .computeIfAbsent (clazz , StructureCache ::determineBestCreator );
80
+ return creator .get ();
81
+ }
82
+
83
+ static Supplier <Object > determineBestCreator (Class <?> clazz ) {
84
+ try {
85
+ InstanceCreator creator = InstanceCreator .forClass (clazz );
86
+ if (creator .get () != null ) {
87
+ return creator ;
78
88
}
89
+ } catch (Exception ignored ) {
90
+ }
91
+
92
+ WrappedStreamCodec streamCodec = PacketRegistry .getStreamCodec (clazz );
79
93
80
- WrappedStreamCodec streamCodec = PacketRegistry .getStreamCodec (packetClassKey );
94
+ // use the new stream codec for versions above 1.20.5 if possible
95
+ if (streamCodec != null && tryInitTrickDataSerializer ()) {
96
+ try {
97
+ // first try with the base accessor
98
+ Object serializer = TRICKED_DATA_SERIALIZER_BASE .get ();
99
+ streamCodec .decode (serializer ); // throwaway instance, for testing
81
100
82
- // use the new stream codec for versions above 1.20.5 if possible
83
- if (streamCodec != null && tryInitTrickDataSerializer ()) {
101
+ // method is working
102
+ return () -> streamCodec .decode (serializer );
103
+ } catch (Exception ignored ) {
84
104
try {
85
- // first try with the base accessor
86
- Object serializer = TRICKED_DATA_SERIALIZER_BASE .get ();
105
+ // try with the json accessor
106
+ Object serializer = TRICKED_DATA_SERIALIZER_JSON .get ();
87
107
streamCodec .decode (serializer ); // throwaway instance, for testing
88
108
89
109
// method is working
90
110
return () -> streamCodec .decode (serializer );
91
- } catch (Exception ignored ) {
92
- try {
93
- // try with the json accessor
94
- Object serializer = TRICKED_DATA_SERIALIZER_JSON .get ();
95
- streamCodec .decode (serializer ); // throwaway instance, for testing
96
-
97
- // method is working
98
- return () -> streamCodec .decode (serializer );
99
- } catch (Exception ignored1 ) {
100
- // shrug, fall back to default behaviour
101
- }
111
+ } catch (Exception ignored1 ) {
112
+ // shrug, fall back to default behaviour
102
113
}
103
114
}
115
+ }
116
+
117
+ // prefer construction via PacketDataSerializer constructor on 1.17 and above
118
+ if (MinecraftVersion .CAVES_CLIFFS_1 .atOrAbove ()) {
119
+ ConstructorAccessor serializerAccessor = Accessors .getConstructorAccessorOrNull (
120
+ clazz ,
121
+ MinecraftReflection .getPacketDataSerializerClass ());
122
+ if (serializerAccessor != null ) {
123
+ // check if the method is possible
124
+ if (tryInitTrickDataSerializer ()) {
125
+ try {
126
+ // first try with the base accessor
127
+ Object serializer = TRICKED_DATA_SERIALIZER_BASE .get ();
128
+ serializerAccessor .invoke (serializer ); // throwaway instance, for testing
104
129
105
- // prefer construction via PacketDataSerializer constructor on 1.17 and above
106
- if (MinecraftVersion .CAVES_CLIFFS_1 .atOrAbove ()) {
107
- ConstructorAccessor serializerAccessor = Accessors .getConstructorAccessorOrNull (
108
- packetClassKey ,
109
- MinecraftReflection .getPacketDataSerializerClass ());
110
- if (serializerAccessor != null ) {
111
- // check if the method is possible
112
- if (tryInitTrickDataSerializer ()) {
130
+ // method is working
131
+ return () -> serializerAccessor .invoke (serializer );
132
+ } catch (Exception ignored ) {
113
133
try {
114
- // first try with the base accessor
115
- Object serializer = TRICKED_DATA_SERIALIZER_BASE .get ();
134
+ // try with the json accessor
135
+ Object serializer = TRICKED_DATA_SERIALIZER_JSON .get ();
116
136
serializerAccessor .invoke (serializer ); // throwaway instance, for testing
117
137
118
138
// method is working
119
139
return () -> serializerAccessor .invoke (serializer );
120
- } catch (Exception ignored ) {
121
- try {
122
- // try with the json accessor
123
- Object serializer = TRICKED_DATA_SERIALIZER_JSON .get ();
124
- serializerAccessor .invoke (serializer ); // throwaway instance, for testing
125
-
126
- // method is working
127
- return () -> serializerAccessor .invoke (serializer );
128
- } catch (Exception ignored1 ) {
129
- // shrug, fall back to default behaviour
130
- }
140
+ } catch (Exception ignored1 ) {
141
+ // shrug, fall back to default behaviour
131
142
}
132
143
}
133
144
}
134
145
}
146
+ }
135
147
136
- // try via DefaultInstances as fallback
137
- return () -> {
138
- Object packetInstance = DefaultInstances .DEFAULT .create (packetClassKey );
139
- Objects .requireNonNull (packetInstance , "Unable to create packet instance for class " + packetClassKey + " - " + tryInitTrickDataSerializer () + " - " + streamCodec );
140
- return packetInstance ;
141
- };
142
- });
143
- return packetConstructor .get ();
148
+ // try via DefaultInstances as fallback
149
+ return () -> {
150
+ Object packetInstance = DefaultInstances .DEFAULT .create (clazz );
151
+ Objects .requireNonNull (packetInstance , "Unable to create instance for class " + clazz + " - " + tryInitTrickDataSerializer () + " - " + streamCodec );
152
+ return packetInstance ;
153
+ };
144
154
}
145
155
146
156
/**
0 commit comments