17
17
*/
18
18
package com .viaversion .viabackwards .protocol .v1_21_6to1_21_5 ;
19
19
20
+ import com .viaversion .nbt .tag .CompoundTag ;
21
+ import com .viaversion .nbt .tag .Tag ;
20
22
import com .viaversion .viabackwards .api .BackwardsProtocol ;
21
23
import com .viaversion .viabackwards .api .data .BackwardsMappingData ;
22
24
import com .viaversion .viabackwards .api .rewriters .SoundRewriter ;
23
25
import com .viaversion .viabackwards .api .rewriters .text .NBTComponentRewriter ;
26
+ import com .viaversion .viabackwards .protocol .v1_21_6to1_21_5 .data .Dialog ;
27
+ import com .viaversion .viabackwards .protocol .v1_21_6to1_21_5 .provider .ChestDialogViewProvider ;
28
+ import com .viaversion .viabackwards .protocol .v1_21_6to1_21_5 .provider .DialogViewProvider ;
24
29
import com .viaversion .viabackwards .protocol .v1_21_6to1_21_5 .rewriter .BlockItemPacketRewriter1_21_6 ;
25
30
import com .viaversion .viabackwards .protocol .v1_21_6to1_21_5 .rewriter .ComponentRewriter1_21_6 ;
26
31
import com .viaversion .viabackwards .protocol .v1_21_6to1_21_5 .rewriter .EntityPacketRewriter1_21_6 ;
32
+ import com .viaversion .viabackwards .protocol .v1_21_6to1_21_5 .storage .ChestDialogStorage ;
33
+ import com .viaversion .viabackwards .protocol .v1_21_6to1_21_5 .storage .ClickEvents ;
34
+ import com .viaversion .viabackwards .protocol .v1_21_6to1_21_5 .storage .RegistryAndTags ;
35
+ import com .viaversion .viabackwards .protocol .v1_21_6to1_21_5 .storage .ServerLinks ;
36
+ import com .viaversion .viaversion .api .Via ;
27
37
import com .viaversion .viaversion .api .connection .UserConnection ;
28
38
import com .viaversion .viaversion .api .minecraft .entities .EntityTypes1_21_6 ;
39
+ import com .viaversion .viaversion .api .platform .providers .ViaProviders ;
29
40
import com .viaversion .viaversion .api .protocol .packet .PacketWrapper ;
30
41
import com .viaversion .viaversion .api .protocol .packet .provider .PacketTypesProvider ;
31
42
import com .viaversion .viaversion .api .protocol .packet .provider .SimplePacketTypesProvider ;
52
63
import com .viaversion .viaversion .rewriter .ParticleRewriter ;
53
64
import com .viaversion .viaversion .rewriter .StatisticsRewriter ;
54
65
import com .viaversion .viaversion .rewriter .TagRewriter ;
66
+ import com .viaversion .viaversion .util .Key ;
55
67
import com .viaversion .viaversion .util .SerializerVersion ;
56
68
57
69
import static com .viaversion .viaversion .util .ProtocolUtil .packetTypeMap ;
@@ -73,9 +85,8 @@ public Protocol1_21_6To1_21_5() {
73
85
protected void registerPackets () {
74
86
super .registerPackets ();
75
87
76
- tagRewriter .removeTags ("dialog" );
77
- tagRewriter .registerGeneric (ClientboundPackets1_21_6 .UPDATE_TAGS );
78
- tagRewriter .registerGeneric (ClientboundConfigurationPackets1_21_6 .UPDATE_TAGS );
88
+ registerClientbound (ClientboundPackets1_21_6 .UPDATE_TAGS , this ::updateTags );
89
+ registerClientbound (ClientboundConfigurationPackets1_21_6 .UPDATE_TAGS , this ::updateTags );
79
90
80
91
final SoundRewriter <ClientboundPacket1_21_6 > soundRewriter = new SoundRewriter <>(this );
81
92
soundRewriter .registerSound1_19_3 (ClientboundPackets1_21_6 .SOUND );
@@ -121,17 +132,180 @@ public void handleArgument(final PacketWrapper wrapper, final String argumentTyp
121
132
wrapper .write (Types .VAR_INT , (int ) difficulty );
122
133
});
123
134
135
+ // Are you sure you want to see this? This is your last chance to turn back.
136
+ registerClientbound (ClientboundPackets1_21_6 .SHOW_DIALOG , null , wrapper -> {
137
+ wrapper .cancel ();
138
+
139
+ final RegistryAndTags registryAndTags = wrapper .user ().get (RegistryAndTags .class );
140
+ final ServerLinks serverLinks = wrapper .user ().get (ServerLinks .class );
141
+ final int id = wrapper .read (Types .VAR_INT ) - 1 ;
142
+ CompoundTag tag ;
143
+ if (id == -1 ) {
144
+ tag = (CompoundTag ) wrapper .read (Types .TAG );
145
+ } else {
146
+ tag = registryAndTags .fromRegistry (id );
147
+ }
148
+
149
+ final DialogViewProvider provider = Via .getManager ().getProviders ().get (DialogViewProvider .class );
150
+ provider .openDialog (wrapper .user (), new Dialog (registryAndTags , serverLinks , tag ));
151
+ });
152
+ registerClientbound (ClientboundConfigurationPackets1_21_6 .SHOW_DIALOG , null , wrapper -> {
153
+ wrapper .cancel ();
154
+
155
+ final RegistryAndTags registryAndTags = wrapper .user ().get (RegistryAndTags .class );
156
+ final ServerLinks serverLinks = wrapper .user ().get (ServerLinks .class );
157
+ final CompoundTag tag = (CompoundTag ) wrapper .read (Types .TAG );
158
+
159
+ final DialogViewProvider provider = Via .getManager ().getProviders ().get (DialogViewProvider .class );
160
+ provider .openDialog (wrapper .user (), new Dialog (registryAndTags , serverLinks , tag ));
161
+ });
162
+ registerClientbound (ClientboundPackets1_21_6 .CLEAR_DIALOG , null , this ::clearDialog );
163
+ registerClientbound (ClientboundConfigurationPackets1_21_6 .CLEAR_DIALOG , null , this ::clearDialog );
164
+
165
+ registerClientbound (ClientboundPackets1_21_6 .SERVER_LINKS , this ::storeServerLinks );
166
+ registerClientbound (ClientboundConfigurationPackets1_21_6 .SERVER_LINKS , this ::storeServerLinks );
167
+
168
+ registerServerbound (ServerboundPackets1_21_5 .CHAT_COMMAND , wrapper -> {
169
+ final String command = wrapper .passthrough (Types .STRING );
170
+
171
+ final ClickEvents clickEvents = wrapper .user ().get (ClickEvents .class );
172
+ if (clickEvents .handleChatCommand (wrapper .user (), command )) {
173
+ wrapper .cancel ();
174
+ }
175
+ });
176
+
177
+ // The ones below are specific to the chest dialog view provider
178
+ registerServerbound (ServerboundPackets1_21_5 .CONTAINER_CLOSE , wrapper -> {
179
+ final ChestDialogStorage storage = wrapper .user ().get (ChestDialogStorage .class );
180
+ if (storage == null ) {
181
+ return ;
182
+ }
183
+
184
+ final ChestDialogViewProvider provider = (ChestDialogViewProvider ) Via .getManager ().getProviders ().get (DialogViewProvider .class );
185
+
186
+ if (storage .phase () == ChestDialogStorage .Phase .ANVIL_VIEW ) {
187
+ wrapper .cancel ();
188
+
189
+ provider .openChestView (wrapper .user (), storage , ChestDialogStorage .Phase .DIALOG_VIEW );
190
+ return ;
191
+ }
192
+
193
+ if (storage .phase () == ChestDialogStorage .Phase .WAITING_FOR_RESPONSE ) {
194
+ wrapper .cancel ();
195
+ if (storage .closeButtonEnabled ()) {
196
+ provider .openChestView (wrapper .user (), storage , ChestDialogStorage .Phase .DIALOG_VIEW );
197
+ } else {
198
+ provider .openChestView (wrapper .user (), storage , ChestDialogStorage .Phase .WAITING_FOR_RESPONSE );
199
+ }
200
+ return ;
201
+ }
202
+
203
+ final boolean allowClosing = storage .allowClosing ();
204
+ if (!allowClosing ) {
205
+ wrapper .cancel ();
206
+ if (storage .dialog ().canCloseWithEscape ()) {
207
+ provider .clickButton (wrapper .user (), Dialog .AfterAction .CLOSE , storage .dialog ().actionButton ());
208
+ } else {
209
+ provider .openChestView (wrapper .user (), storage , ChestDialogStorage .Phase .DIALOG_VIEW );
210
+ }
211
+ }
212
+ storage .setAllowClosing (false );
213
+ });
214
+ registerServerbound (ServerboundPackets1_21_5 .RENAME_ITEM , wrapper -> {
215
+ final ChestDialogStorage storage = wrapper .user ().get (ChestDialogStorage .class );
216
+ if (storage == null || storage .phase () != ChestDialogStorage .Phase .ANVIL_VIEW ) {
217
+ return ;
218
+ }
219
+
220
+ wrapper .cancel ();
221
+ final String name = wrapper .read (Types .STRING );
222
+
223
+ final ChestDialogViewProvider provider = (ChestDialogViewProvider ) Via .getManager ().getProviders ().get (DialogViewProvider .class );
224
+ provider .updateAnvilText (wrapper .user (), name );
225
+ });
226
+ appendServerbound (ServerboundPackets1_21_5 .CONTAINER_CLICK , wrapper -> {
227
+ final ChestDialogViewProvider provider = (ChestDialogViewProvider ) Via .getManager ().getProviders ().get (DialogViewProvider .class );
228
+ if (provider == null ) {
229
+ return ;
230
+ }
231
+
232
+ final int containerId = wrapper .get (Types .VAR_INT , 0 );
233
+ final int slot = wrapper .get (Types .SHORT , 0 );
234
+ final byte button = wrapper .get (Types .BYTE , 0 );
235
+ final int mode = wrapper .get (Types .VAR_INT , 2 );
236
+ if (provider .clickDialog (wrapper .user (), containerId , slot , button , mode )) {
237
+ wrapper .cancel ();
238
+ }
239
+ });
240
+
124
241
cancelClientbound (ClientboundPackets1_21_6 .TRACKED_WAYPOINT );
125
- cancelClientbound (ClientboundPackets1_21_6 .CLEAR_DIALOG );
126
- cancelClientbound (ClientboundPackets1_21_6 .SHOW_DIALOG );
127
- cancelClientbound (ClientboundConfigurationPackets1_21_6 .CLEAR_DIALOG );
128
- cancelClientbound (ClientboundConfigurationPackets1_21_6 .SHOW_DIALOG );
242
+ }
243
+
244
+ private void clearDialog (final PacketWrapper wrapper ) {
245
+ wrapper .cancel ();
246
+ final DialogViewProvider provider = Via .getManager ().getProviders ().get (DialogViewProvider .class );
247
+ provider .closeDialog (wrapper .user ());
248
+ }
249
+
250
+ private void updateTags (final PacketWrapper wrapper ) {
251
+ tagRewriter .handleGeneric (wrapper );
252
+ wrapper .resetReader ();
253
+
254
+ final RegistryAndTags registryAndTags = wrapper .user ().get (RegistryAndTags .class );
255
+ final int length = wrapper .passthrough (Types .VAR_INT );
256
+ for (int i = 0 ; i < length ; i ++) {
257
+ final String registryKey = wrapper .read (Types .STRING );
258
+ final boolean dialog = "dialog" .equals (Key .stripMinecraftNamespace (registryKey ));
259
+ if (dialog ) {
260
+ final int tagsSize = wrapper .read (Types .VAR_INT );
261
+ for (int j = 0 ; j < tagsSize ; j ++) {
262
+ final String key = wrapper .read (Types .STRING );
263
+ final int [] ids = wrapper .read (Types .VAR_INT_ARRAY_PRIMITIVE );
264
+ registryAndTags .storeTags (key , ids );
265
+ }
266
+ } else {
267
+ wrapper .write (Types .STRING , registryKey ); // Write back
268
+ final int tagsSize = wrapper .passthrough (Types .VAR_INT );
269
+ for (int j = 0 ; j < tagsSize ; j ++) {
270
+ wrapper .passthrough (Types .STRING );
271
+ wrapper .passthrough (Types .VAR_INT_ARRAY_PRIMITIVE );
272
+ }
273
+ }
274
+ }
275
+
276
+ if (registryAndTags .tagsSent ()) {
277
+ wrapper .set (Types .VAR_INT , 0 , length - 1 ); // Dialog tags have been read, remove from size
278
+ }
279
+ }
280
+
281
+ private void storeServerLinks (final PacketWrapper wrapper ) {
282
+ final ServerLinks serverLinks = new ServerLinks ();
283
+ final int length = wrapper .passthrough (Types .VAR_INT );
284
+ for (int i = 0 ; i < length ; i ++) {
285
+ if (wrapper .passthrough (Types .BOOLEAN )) {
286
+ final int id = wrapper .passthrough (Types .VAR_INT );
287
+ final String url = wrapper .passthrough (Types .STRING );
288
+ serverLinks .storeLink (id , url );
289
+ } else {
290
+ final Tag tag = wrapper .passthrough (Types .COMPOUND_TAG );
291
+ final String url = wrapper .passthrough (Types .STRING );
292
+ serverLinks .storeLink (tag , url );
293
+ }
294
+ }
295
+ wrapper .user ().put (serverLinks );
129
296
}
130
297
131
298
@ Override
132
299
public void init (final UserConnection user ) {
133
300
addEntityTracker (user , new EntityTrackerBase (user , EntityTypes1_21_6 .PLAYER ));
134
301
addItemHasher (user , new ItemHasherBase (this , user , SerializerVersion .V1_21_5 , SerializerVersion .V1_21_5 ));
302
+ user .put (new RegistryAndTags ());
303
+ user .put (new ClickEvents ());
304
+ }
305
+
306
+ @ Override
307
+ public void register (final ViaProviders providers ) {
308
+ providers .register (DialogViewProvider .class , new ChestDialogViewProvider (this ));
135
309
}
136
310
137
311
@ Override
0 commit comments