Skip to content

Commit 445d798

Browse files
committed
Partially implement mapped item handling
1 parent 66896d2 commit 445d798

File tree

7 files changed

+157
-113
lines changed

7 files changed

+157
-113
lines changed
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
/*
2+
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
3+
* Copyright (C) 2016-2024 ViaVersion and contributors
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU General Public License as published by
7+
* the Free Software Foundation, either version 3 of the License, or
8+
* (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU General Public License
16+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17+
*/
18+
package com.viaversion.viabackwards.api.rewriters;
19+
20+
import com.viaversion.viabackwards.api.BackwardsProtocol;
21+
import com.viaversion.viabackwards.api.data.BackwardsMappings;
22+
import com.viaversion.viabackwards.api.data.MappedItem;
23+
import com.viaversion.viaversion.api.minecraft.data.StructuredData;
24+
import com.viaversion.viaversion.api.minecraft.data.StructuredDataContainer;
25+
import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey;
26+
import com.viaversion.viaversion.api.minecraft.item.Item;
27+
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
28+
import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType;
29+
import com.viaversion.viaversion.api.type.Type;
30+
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
31+
import com.viaversion.viaversion.libs.opennbt.tag.builtin.IntTag;
32+
import com.viaversion.viaversion.libs.opennbt.tag.builtin.NumberTag;
33+
import com.viaversion.viaversion.libs.opennbt.tag.builtin.Tag;
34+
import org.checkerframework.checker.nullness.qual.Nullable;
35+
36+
public class BackwardsStructuredItemRewriter<C extends ClientboundPacketType, S extends ServerboundPacketType,
37+
T extends BackwardsProtocol<C, ?, ?, S>> extends ItemRewriter<C, S, T> {
38+
39+
public BackwardsStructuredItemRewriter(final T protocol, final Type<Item> itemType, final Type<Item[]> itemArrayType) {
40+
super(protocol, itemType, itemArrayType);
41+
}
42+
43+
public BackwardsStructuredItemRewriter(final T protocol, final Type<Item> itemType, final Type<Item[]> itemArrayType, final Type<Item> mappedItemType, final Type<Item[]> mappedItemArrayType) {
44+
super(protocol, itemType, itemArrayType, mappedItemType, mappedItemArrayType);
45+
}
46+
47+
@Override
48+
public @Nullable Item handleItemToClient(@Nullable final Item item) {
49+
if (item == null) {
50+
return null;
51+
}
52+
53+
final StructuredDataContainer data = item.structuredData();
54+
data.setIdLookup(protocol, true);
55+
56+
// TODO Translatable rewriter on name and lore
57+
58+
final BackwardsMappings mappingData = protocol.getMappingData();
59+
final MappedItem mappedItem = mappingData != null ? mappingData.getMappedItem(item.identifier()) : null;
60+
if (mappedItem == null) {
61+
// Just rewrite the id
62+
if (mappingData != null && mappingData.getItemMappings() != null) {
63+
item.setIdentifier(mappingData.getNewItemId(item.identifier()));
64+
}
65+
return item;
66+
}
67+
68+
// Save original id, set remapped id
69+
final CompoundTag tag = createCustomTag(item);
70+
tag.putInt(nbtTagName + "|id", item.identifier());
71+
item.setIdentifier(mappedItem.getId());
72+
73+
// Add custom model data
74+
if (mappedItem.customModelData() != null && !data.contains(StructuredDataKey.CUSTOM_MODEL_DATA)) {
75+
data.add(StructuredDataKey.CUSTOM_MODEL_DATA, mappedItem.customModelData());
76+
}
77+
78+
// TODO custom name
79+
return item;
80+
}
81+
82+
@Override
83+
public @Nullable Item handleItemToServer(@Nullable final Item item) {
84+
if (item == null) {
85+
return null;
86+
}
87+
88+
final BackwardsMappings mappingData = protocol.getMappingData();
89+
if (mappingData != null && mappingData.getItemMappings() != null) {
90+
item.setIdentifier(mappingData.getOldItemId(item.identifier()));
91+
}
92+
93+
final StructuredDataContainer data = item.structuredData();
94+
data.setIdLookup(protocol, false);
95+
96+
final CompoundTag tag = customTag(item);
97+
if (tag != null) {
98+
final Tag originalId = tag.remove(nbtTagName + "|id");
99+
if (originalId instanceof IntTag) {
100+
item.setIdentifier(((NumberTag) originalId).asInt());
101+
}
102+
}
103+
104+
restoreDisplayTag(item);
105+
return item;
106+
}
107+
108+
protected @Nullable CompoundTag customTag(final Item item) {
109+
final StructuredData<CompoundTag> customData = item.structuredData().getNonEmpty(StructuredDataKey.CUSTOM_DATA);
110+
return customData != null ? customData.value() : null;
111+
}
112+
113+
protected CompoundTag createCustomTag(final Item item) {
114+
final StructuredDataContainer data = item.structuredData();
115+
final StructuredData<CompoundTag> customData = data.getNonEmpty(StructuredDataKey.CUSTOM_DATA);
116+
if (customData != null) {
117+
return customData.value();
118+
}
119+
120+
final CompoundTag tag = new CompoundTag();
121+
data.add(StructuredDataKey.CUSTOM_DATA, tag);
122+
return tag;
123+
}
124+
125+
@Override
126+
protected void restoreDisplayTag(final Item item) {
127+
// TODO
128+
}
129+
}

common/src/main/java/com/viaversion/viabackwards/api/rewriters/ItemRewriter.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,9 @@ public void register() {
155155
translatableRewriter.processText(description);
156156
}
157157

158-
handleItemToClient(wrapper.passthrough(getItemType())); // Icon
158+
final Item icon = handleItemToClient(wrapper.read(itemType()));
159+
wrapper.write(mappedItemType(), icon);
160+
159161
wrapper.passthrough(Type.VAR_INT); // Frame type
160162
int flags = wrapper.passthrough(Type.INT); // Flags
161163
if ((flags & 1) != 0) {
@@ -201,7 +203,9 @@ public void registerAdvancements1_20_3(final C packetType) {
201203
translatableRewriter.processTag(description);
202204
}
203205

204-
handleItemToClient(wrapper.passthrough(Type.ITEM1_20_2)); // Icon
206+
final Item icon = handleItemToClient(wrapper.read(itemType()));
207+
wrapper.write(mappedItemType(), icon);
208+
205209
wrapper.passthrough(Type.VAR_INT); // Frame type
206210
final int flags = wrapper.passthrough(Type.INT);
207211
if ((flags & 1) != 0) {

common/src/main/java/com/viaversion/viabackwards/api/rewriters/StructuredItemRewriter.java

Lines changed: 0 additions & 79 deletions
This file was deleted.

common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_12_2to1_13/packets/BlockItemPackets1_13.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,12 @@ public void register() {
256256
map(Type.UNSIGNED_BYTE);
257257
map(Type.ITEM1_13_SHORT_ARRAY, Type.ITEM1_8_SHORT_ARRAY);
258258

259-
handler(itemArrayToClientHandler(Type.ITEM1_8_SHORT_ARRAY));
259+
handler(wrapper -> {
260+
final Item[] items = wrapper.get(Type.ITEM1_8_SHORT_ARRAY, 0);
261+
for (Item item : items) {
262+
handleItemToClient(item);
263+
}
264+
});
260265
}
261266
});
262267

common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_20_3to1_20_5/rewriter/BlockItemPacketRewriter1_20_5.java

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
*/
1818
package com.viaversion.viabackwards.protocol.protocol1_20_3to1_20_5.rewriter;
1919

20-
import com.viaversion.viabackwards.api.rewriters.ItemRewriter;
21-
import com.viaversion.viabackwards.api.rewriters.StructuredItemRewriter;
20+
import com.viaversion.viabackwards.api.rewriters.BackwardsStructuredItemRewriter;
2221
import com.viaversion.viabackwards.protocol.protocol1_20_3to1_20_5.Protocol1_20_3To1_20_5;
22+
import com.viaversion.viaversion.api.Via;
2323
import com.viaversion.viaversion.api.minecraft.Particle;
2424
import com.viaversion.viaversion.api.minecraft.item.Item;
2525
import com.viaversion.viaversion.api.type.Type;
@@ -29,13 +29,16 @@
2929
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ServerboundPacket1_20_3;
3030
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ServerboundPackets1_20_3;
3131
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.rewriter.RecipeRewriter1_20_3;
32+
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.Protocol1_20_5To1_20_3;
3233
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ClientboundPacket1_20_5;
3334
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ClientboundPackets1_20_5;
3435
import com.viaversion.viaversion.rewriter.BlockRewriter;
3536
import com.viaversion.viaversion.util.Key;
3637
import org.checkerframework.checker.nullness.qual.Nullable;
3738

38-
public final class BlockItemPacketRewriter1_20_5 extends StructuredItemRewriter<ClientboundPacket1_20_5, ServerboundPacket1_20_3, Protocol1_20_3To1_20_5> {
39+
public final class BlockItemPacketRewriter1_20_5 extends BackwardsStructuredItemRewriter<ClientboundPacket1_20_5, ServerboundPacket1_20_3, Protocol1_20_3To1_20_5> {
40+
41+
private final Protocol1_20_5To1_20_3 vvProtocol = Via.getManager().getProtocolManager().getProtocol(Protocol1_20_5To1_20_3.class);
3942

4043
public BlockItemPacketRewriter1_20_5(final Protocol1_20_3To1_20_5 protocol) {
4144
super(protocol, Types1_20_5.ITEM, Types1_20_5.ITEM_ARRAY, Type.ITEM1_20_2, Type.ITEM1_20_2_ARRAY);
@@ -135,27 +138,7 @@ public void registerPackets() {
135138
}
136139
});
137140

138-
final RecipeRewriter1_20_3<ClientboundPacket1_20_5> recipeRewriter = new RecipeRewriter1_20_3<ClientboundPacket1_20_5>(protocol) {
139-
@Override
140-
protected Type<Item> itemType() {
141-
return Types1_20_5.ITEM;
142-
}
143-
144-
@Override
145-
protected Type<Item[]> itemArrayType() {
146-
return Types1_20_5.ITEM_ARRAY;
147-
}
148-
149-
@Override
150-
protected Type<Item> mappedItemType() {
151-
return Type.ITEM1_20_2;
152-
}
153-
154-
@Override
155-
protected Type<Item[]> mappedItemArrayType() {
156-
return Type.ITEM1_20_2_ARRAY;
157-
}
158-
};
141+
final RecipeRewriter1_20_3<ClientboundPacket1_20_5> recipeRewriter = new RecipeRewriter1_20_3<>(protocol);
159142
protocol.registerClientbound(ClientboundPackets1_20_5.DECLARE_RECIPES, wrapper -> {
160143
final int size = wrapper.passthrough(Type.VAR_INT);
161144
for (int i = 0; i < size; i++) {
@@ -175,15 +158,15 @@ protected Type<Item[]> mappedItemArrayType() {
175158
if (item == null) return null;
176159

177160
super.handleItemToClient(item);
178-
return com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.rewriter.BlockItemPacketRewriter1_20_5.toOldItem(item);
161+
return vvProtocol.getItemRewriter().toOldItem(item);
179162
}
180163

181164
@Override
182165
public @Nullable Item handleItemToServer(@Nullable final Item item) {
183166
if (item == null) return null;
184167

185168
// Convert to structured item first
186-
final Item structuredItem = com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.rewriter.BlockItemPacketRewriter1_20_5.toStructuredItem(item);
169+
final Item structuredItem = vvProtocol.getItemRewriter().toStructuredItem(item);
187170
return super.handleItemToServer(structuredItem);
188171
}
189172
}

common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_20_3to1_20_5/rewriter/EntityPacketRewriter1_20_5.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.viaversion.viaversion.api.minecraft.RegistryEntry;
2727
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
2828
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_20_5;
29+
import com.viaversion.viaversion.api.minecraft.item.Item;
2930
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
3031
import com.viaversion.viaversion.api.type.Type;
3132
import com.viaversion.viaversion.api.type.types.version.Types1_20_3;
@@ -67,7 +68,9 @@ public void registerPackets() {
6768
}
6869

6970
wrapper.write(Type.BYTE, slot);
70-
protocol.getItemRewriter().handleItemToClient(wrapper.passthrough(Type.ITEM1_20_2));
71+
72+
final Item item = protocol.getItemRewriter().handleItemToClient(wrapper.read(Types1_20_5.ITEM));
73+
wrapper.write(Type.ITEM1_20_2, item);
7174
} while (slot < 0);
7275
});
7376

template/src/main/java/com/viaversion/viabackwards/template/protocol/rewriter/BlockItemPacketRewriter1_99.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@
1717
*/
1818
package com.viaversion.viabackwards.template.protocol.rewriter;
1919

20-
import com.viaversion.viabackwards.api.rewriters.ItemRewriter;
20+
import com.viaversion.viabackwards.api.rewriters.BackwardsStructuredItemRewriter;
2121
import com.viaversion.viabackwards.template.protocol.Protocol1_98To1_99;
22-
import com.viaversion.viaversion.api.type.Type;
2322
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2;
2423
import com.viaversion.viaversion.api.type.types.version.Types1_20_5;
2524
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.rewriter.RecipeRewriter1_20_3;
@@ -32,10 +31,10 @@
3231
// To replace if needed:
3332
// ChunkType1_20_2
3433
// RecipeRewriter1_20_3
35-
public final class BlockItemPacketRewriter1_99 extends ItemRewriter<ClientboundPacket1_20_5, ServerboundPacket1_20_5, Protocol1_98To1_99> {
34+
public final class BlockItemPacketRewriter1_99 extends BackwardsStructuredItemRewriter<ClientboundPacket1_20_5, ServerboundPacket1_20_5, Protocol1_98To1_99> {
3635

3736
public BlockItemPacketRewriter1_99(final Protocol1_98To1_99 protocol) {
38-
super(protocol, Type.ITEM1_20_2, Type.ITEM1_20_2_ARRAY);
37+
super(protocol, /*old types*/Types1_20_5.ITEM, Types1_20_5.ITEM_ARRAY);
3938
}
4039

4140
@Override

0 commit comments

Comments
 (0)