Skip to content

Commit 206a5b4

Browse files
committed
Pass new item and entity names as translatable
This removes the itemnames and entitynames sections from mapping data and instead allows for easier changes via resource packs. For 1.20.5+ clients, entities use the `vb.entity.<type>` translate key; items use `vg.item.<type>`. The old-style string (e.g. "26.2 Sulfur" is added into the `fallback` field). For clients below 1.20.5, the old style string is put directly into the `translate` field.
1 parent 9e8a958 commit 206a5b4

41 files changed

Lines changed: 268 additions & 89 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

common/src/main/java/com/viaversion/viabackwards/api/ViaBackwardsPlatform.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@
8181

8282
public interface ViaBackwardsPlatform {
8383

84-
String MINIMUM_VV_VERSION = "5.9.2";
84+
String MINIMUM_VV_VERSION = "5.11.0";
8585

8686
default void init(final File configFile) {
8787
init(new ViaBackwardsConfig(configFile, getLogger()));

common/src/main/java/com/viaversion/viabackwards/api/data/BackwardsMappingData.java

Lines changed: 20 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectArrayMap;
3535
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectMap;
3636
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectOpenHashMap;
37-
import java.util.HashMap;
37+
import com.viaversion.viaversion.util.Key;
3838
import java.util.Map;
3939
import java.util.logging.Level;
4040
import java.util.logging.Logger;
@@ -44,7 +44,6 @@ public class BackwardsMappingData extends MappingDataBase {
4444

4545
private final Class<? extends Protocol<?, ?, ?, ?>> vvProtocolClass;
4646
protected Int2ObjectMap<MappedItem> backwardsItemMappings;
47-
private Map<String, String> entityNames;
4847
private Int2ObjectMap<String> enchantmentNames;
4948

5049
public BackwardsMappingData(final String unmappedVersion, final String mappedVersion) {
@@ -59,42 +58,23 @@ public BackwardsMappingData(final String unmappedVersion, final String mappedVer
5958

6059
@Override
6160
protected void loadExtras(final CompoundTag data) {
62-
final CompoundTag itemNames = data.getCompoundTag("itemnames");
63-
if (itemNames != null) {
61+
final CompoundTag itemCustomModelDatas = data.getCompoundTag("custom_model_data");
62+
if (itemCustomModelDatas != null) {
6463
Preconditions.checkNotNull(itemMappings);
65-
backwardsItemMappings = new Int2ObjectOpenHashMap<>(itemNames.size());
66-
67-
final CompoundTag extraItemData = data.getCompoundTag("itemdata");
68-
for (final Map.Entry<String, Tag> entry : itemNames.entrySet()) {
69-
final StringTag name = (StringTag) entry.getValue();
70-
final int id = Integer.parseInt(entry.getKey());
71-
Integer customModelData = null;
72-
if (extraItemData != null && extraItemData.contains(entry.getKey())) {
73-
final CompoundTag entryTag = extraItemData.getCompoundTag(entry.getKey());
74-
final NumberTag customModelDataTag = entryTag.getNumberTag("custom_model_data");
75-
customModelData = customModelDataTag != null ? customModelDataTag.asInt() : null;
76-
}
77-
78-
backwardsItemMappings.put(id, new MappedItem(getNewItemId(id), name.getValue(), customModelData));
79-
}
64+
backwardsItemMappings = new Int2ObjectOpenHashMap<>(itemCustomModelDatas.size());
65+
loadBackwardsItemMappings(itemCustomModelDatas);
8066
}
81-
82-
this.entityNames = loadNameByStringMappings(data, "entitynames");
8367
this.enchantmentNames = loadNameByIdMappings(data, "enchantmentnames");
8468
}
8569

86-
private @Nullable Map<String, String> loadNameByStringMappings(final CompoundTag data, final String key) {
87-
final CompoundTag nameMappings = data.getCompoundTag(key);
88-
if (nameMappings == null) {
89-
return null;
70+
protected void loadBackwardsItemMappings(final CompoundTag itemCustomModelDatas) {
71+
for (final Map.Entry<String, Tag> entry : itemCustomModelDatas.entrySet()) {
72+
final int id = Integer.parseInt(entry.getKey());
73+
final int customModelData = ((NumberTag) entry.getValue()).asInt();
74+
final String identifier = getFullItemMappings().identifier(id);
75+
final String fallbackName = unmappedVersion + " " + nameFromIdentifier(identifier);
76+
backwardsItemMappings.put(id, new MappedItem(getNewItemId(id), identifier, fallbackName, customModelData));
9077
}
91-
92-
final Map<String, String> map = new HashMap<>(nameMappings.size());
93-
for (final Map.Entry<String, Tag> entry : nameMappings.entrySet()) {
94-
final StringTag mappedTag = (StringTag) entry.getValue();
95-
map.put(entry.getKey(), mappedTag.getValue());
96-
}
97-
return map;
9878
}
9979

10080
private @Nullable Int2ObjectMap<String> loadNameByIdMappings(final CompoundTag data, final String key) {
@@ -161,14 +141,6 @@ public int getNewAttributeId(final int id) {
161141
return getFullSoundMappings().mappedIdentifier(id);
162142
}
163143

164-
public @Nullable String mappedEntityName(final String entityName) {
165-
if (entityNames == null) {
166-
getLogger().log(Level.SEVERE, "No entity mappings found when requesting them for " + entityName, new RuntimeException());
167-
return null;
168-
}
169-
return entityNames.get(entityName);
170-
}
171-
172144
public @Nullable String mappedEnchantmentName(final int enchantmentId) {
173145
if (enchantmentNames == null) {
174146
ViaBackwards.getPlatform().getLogger().log(Level.SEVERE, "No enchantment name mappings found when requesting " + enchantmentId, new RuntimeException());
@@ -194,4 +166,12 @@ protected Logger getLogger() {
194166
protected @Nullable CompoundTag readMappingsFile(final String name) {
195167
return BackwardsMappingDataLoader.INSTANCE.loadNBTFromDir(name);
196168
}
169+
170+
public static String nameFromIdentifier(final String identifier) {
171+
final StringBuilder result = new StringBuilder();
172+
for (final String split : Key.stripMinecraftNamespace(identifier).split("_")) {
173+
result.append(' ').append(Character.toUpperCase(split.charAt(0))).append(split.substring(1));
174+
}
175+
return result.substring(1);
176+
}
197177
}

common/src/main/java/com/viaversion/viabackwards/api/data/MappedItem.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,38 +20,38 @@
2020
import com.viaversion.nbt.tag.CompoundTag;
2121
import com.viaversion.nbt.tag.Tag;
2222
import com.viaversion.viaversion.libs.gson.JsonPrimitive;
23-
import org.checkerframework.checker.nullness.qual.Nullable;
23+
import com.viaversion.viaversion.util.Key;
2424

2525
public class MappedItem {
2626

2727
private final int id;
2828
private final String jsonName;
2929
private final Tag tagName;
30-
private final Integer customModelData;
30+
private final int customModelData;
3131

32-
public MappedItem(final int id, final String name) {
33-
this(id, name, null);
34-
}
35-
36-
public MappedItem(final int id, final String name, @Nullable final Integer customModelData) {
32+
public MappedItem(final int id, String identifier, final String fallbackName, final int customModelData) {
3733
this.id = id;
38-
this.jsonName = itemJsonName(name);
39-
this.tagName = itemTagName(name);
34+
identifier = Key.stripMinecraftNamespace(identifier);
35+
final String translateKey = "vb.item." + identifier;
36+
this.jsonName = itemJsonName(fallbackName);
37+
this.tagName = itemTagName(translateKey, fallbackName);
4038
this.customModelData = customModelData;
4139
}
4240

4341
// Make explicitly non-italic and white to override default item formatting.
4442
// Properly parsing is expensive...
45-
private String itemJsonName(final String name) {
43+
private static String itemJsonName(final String name) {
4644
return """
47-
{"italic":false,"color":"white","translate":%s}
45+
{"italic":false,"color":"white","text":%s}
4846
""".formatted(new JsonPrimitive(name).toString());
4947
}
5048

51-
private Tag itemTagName(final String name) {
49+
private static Tag itemTagName(final String translateKey, final String fallbackName) {
50+
// Proper translate with fallback field (valid for 1.19.4+ clients)
5251
final CompoundTag tag = new CompoundTag();
5352
tag.putString("color", "white");
54-
tag.putString("translate", name);
53+
tag.putString("translate", translateKey);
54+
tag.putString("fallback", fallbackName);
5555
tag.putBoolean("italic", false);
5656
return tag;
5757
}
@@ -65,10 +65,10 @@ public String jsonName() {
6565
}
6666

6767
public Tag tagName() {
68-
return tagName;
68+
return tagName.copy();
6969
}
7070

71-
public @Nullable Integer customModelData() {
71+
public int customModelData() {
7272
return customModelData;
7373
}
7474
}

common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityReplacement.java

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818

1919
package com.viaversion.viabackwards.api.entities.storage;
2020

21+
import com.viaversion.nbt.tag.CompoundTag;
2122
import com.viaversion.nbt.tag.StringTag;
2223
import com.viaversion.viabackwards.api.BackwardsProtocol;
24+
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
2325
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
2426
import com.viaversion.viaversion.util.ComponentUtil;
2527
import java.util.Locale;
@@ -30,18 +32,22 @@ public class EntityReplacement {
3032
private final int id;
3133
private final int replacementId;
3234
private final String key;
35+
private final String translateKey;
36+
private final String fallbackName;
3337
private ComponentType componentType = ComponentType.NONE;
3438
private EntityDataCreator defaultData;
3539

3640
public EntityReplacement(BackwardsProtocol<?, ?, ?, ?> protocol, EntityType type, int replacementId) {
37-
this(protocol, type.name(), type.getId(), replacementId);
41+
this(protocol, type.name().toLowerCase(Locale.ROOT), type.getId(), replacementId);
3842
}
3943

4044
public EntityReplacement(BackwardsProtocol<?, ?, ?, ?> protocol, String key, int id, int replacementId) {
4145
this.protocol = protocol;
4246
this.id = id;
4347
this.replacementId = replacementId;
44-
this.key = key.toLowerCase(Locale.ROOT);
48+
this.key = key;
49+
this.translateKey = "vb.entity." + key;
50+
this.fallbackName = BackwardsMappingData.nameFromIdentifier(this.key);
4551
}
4652

4753
public EntityReplacement jsonName() {
@@ -82,17 +88,17 @@ public int typeId() {
8288
return null;
8389
}
8490

85-
final String name = protocol.getMappingData().mappedEntityName(key);
86-
if (name == null) {
87-
return null;
88-
}
89-
9091
if (componentType == ComponentType.JSON) {
91-
return ComponentUtil.plainToJson(name); // Pass on as plain, with or without section symbols
92+
return ComponentUtil.plainToJson(fallbackName); // Pass on as plain, with or without section symbols
9293
} else if (componentType == ComponentType.TAG) {
93-
return new StringTag(name);
94+
final CompoundTag tag = new CompoundTag();
95+
tag.putString("color", "white");
96+
tag.putString("translate", translateKey);
97+
tag.putString("fallback", fallbackName);
98+
tag.putBoolean("italic", false);
99+
return tag;
94100
}
95-
return name;
101+
return fallbackName;
96102
}
97103

98104
public int replacementId() {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.viaversion.nbt.tag.NumberTag;
2525
import com.viaversion.nbt.tag.StringTag;
2626
import com.viaversion.nbt.tag.Tag;
27+
import com.viaversion.viabackwards.ViaBackwards;
2728
import com.viaversion.viabackwards.api.BackwardsProtocol;
2829
import com.viaversion.viabackwards.api.data.MappedItem;
2930
import com.viaversion.viabackwards.item.DataItemWithExtras;
@@ -114,7 +115,7 @@ public BackwardsItemRewriter(T protocol, Type<Item> itemType, Type<Item[]> itemA
114115
item.setIdentifier(data.id());
115116

116117
// Add custom model data
117-
if (data.customModelData() != null && !item.tag().contains("CustomModelData")) {
118+
if (ViaBackwards.getConfig().passOriginalItemNameToResourcePacks() && !item.tag().contains("CustomModelData")) {
118119
item.tag().putInt("CustomModelData", data.customModelData());
119120
}
120121

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

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,10 @@ protected void backupInconvertibleData(final UserConnection connection, final It
7777
customTag.putInt(nbtTagName("id"), item.identifier()); // Save original id
7878

7979
// Add custom model data
80-
final boolean addOriginalIdentifier = ViaBackwards.getConfig().passOriginalItemNameToResourcePacks();
81-
if (mappedItem.customModelData() != null || addOriginalIdentifier) {
80+
if (ViaBackwards.getConfig().passOriginalItemNameToResourcePacks()) {
8281
if (connection.getProtocolInfo().protocolVersion().newerThanOrEqualTo(ProtocolVersion.v1_21_4)) {
83-
addCustomModelData(item, addOriginalIdentifier, mappedItem, customTag);
84-
} else if (mappedItem.customModelData() != null && !dataContainer.has(StructuredDataKey.CUSTOM_MODEL_DATA1_20_5)) {
82+
addCustomModelData(item, mappedItem, customTag);
83+
} else if (!dataContainer.has(StructuredDataKey.CUSTOM_MODEL_DATA1_20_5)) {
8584
dataContainer.set(StructuredDataKey.CUSTOM_MODEL_DATA1_20_5, mappedItem.customModelData());
8685
}
8786
}
@@ -93,24 +92,22 @@ protected void backupInconvertibleData(final UserConnection connection, final It
9392
}
9493
}
9594

96-
private void addCustomModelData(final Item item, final boolean addOriginalIdentifier, final MappedItem mappedItem, final CompoundTag customTag) {
95+
private void addCustomModelData(final Item item, final MappedItem mappedItem, final CompoundTag customTag) {
9796
final StructuredDataContainer dataContainer = item.dataContainer();
9897
CustomModelData1_21_4 customModelData = dataContainer.get(StructuredDataKey.CUSTOM_MODEL_DATA1_21_4);
9998
if (customModelData == null) {
100-
final String[] strings = addOriginalIdentifier
101-
? new String[]{protocol.getMappingData().getFullItemMappings().identifier(item.identifier())}
102-
: new String[0];
99+
// Add both the identifier string and custom model data
103100
customModelData = new CustomModelData1_21_4(
104-
mappedItem.customModelData() != null ? new float[]{mappedItem.customModelData().floatValue()} : new float[0],
101+
new float[]{mappedItem.customModelData()},
105102
new boolean[0],
106-
strings,
103+
new String[]{protocol.getMappingData().getFullItemMappings().identifier(item.identifier())},
107104
EMPTY_INT_ARRAY
108105
);
109106
dataContainer.set(StructuredDataKey.CUSTOM_MODEL_DATA1_21_4, customModelData);
110107
// Add one global marker and one for this specific version, so it is removed at the correct protocol
111108
customTag.putBoolean(GLOBAL_MODEL_DATA_MARKER, true);
112109
customTag.putBoolean(nbtTagName("added_custom_model_data"), true);
113-
} else if (addOriginalIdentifier && !customTag.contains(GLOBAL_MODEL_DATA_MARKER)) {
110+
} else if (!customTag.contains(GLOBAL_MODEL_DATA_MARKER)) {
114111
final String identifier = protocol.getMappingData().getFullItemMappings().identifier(item.identifier());
115112
dataContainer.set(StructuredDataKey.CUSTOM_MODEL_DATA1_21_4, new CustomModelData1_21_4(
116113
customModelData.floats(), customModelData.booleans(), ArrayUtil.add(customModelData.strings(), identifier), customModelData.colors()

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.viaversion.viaversion.api.type.Types;
3636
import java.util.HashMap;
3737
import java.util.List;
38+
import java.util.Locale;
3839
import java.util.Map;
3940
import org.checkerframework.checker.nullness.qual.Nullable;
4041

@@ -50,7 +51,7 @@ protected LegacyEntityRewriter(T protocol, EntityDataType displayType, EntityDat
5051
}
5152

5253
protected EntityObjectData mapObjectType(ObjectType oldObjectType, ObjectType replacement, int data) {
53-
EntityObjectData entData = new EntityObjectData(protocol, oldObjectType.getType().name(), oldObjectType.getId(), replacement.getId(), data);
54+
EntityObjectData entData = new EntityObjectData(protocol, oldObjectType.getType().name().toLowerCase(Locale.ROOT), oldObjectType.getId(), replacement.getId(), data);
5455
objectTypes.put(oldObjectType, entData);
5556
return entData;
5657
}

0 commit comments

Comments
 (0)