3
0
Mirror von https://github.com/ViaVersion/ViaVersion.git synchronisiert 2024-12-27 00:22:51 +01:00

Enchantment and display name rewriting, use a map for new to old items

Dieser Commit ist enthalten in:
creeper123123321 2018-06-13 17:12:43 -03:00
Ursprung bef1f76e45
Commit 32ce40e19e
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: 0AC57D54786721D1
4 geänderte Dateien mit 145 neuen und 29 gelöschten Zeilen

Datei anzeigen

@ -41,6 +41,10 @@ public class ProtocolSnapshotTo1_12_2 extends Protocol {
MappingData.init(); MappingData.init();
} }
public static String jsonTextToLegacy(String value) {
return TextComponent.toLegacyText(ComponentSerializer.parse(value));
}
@Override @Override
protected void registerPackets() { protected void registerPackets() {
// Register grouped packet changes // Register grouped packet changes

Datei anzeigen

@ -1,5 +1,7 @@
package us.myles.ViaVersion.protocols.protocolsnapshotto1_12_2.data; package us.myles.ViaVersion.protocols.protocolsnapshotto1_12_2.data;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
@ -14,9 +16,11 @@ import java.util.Map;
public class MappingData { public class MappingData {
public static Map<Integer, Integer> oldToNewBlocks = new HashMap<>(); public static Map<Integer, Integer> oldToNewBlocks = new HashMap<>();
public static Map<Integer, Integer> oldToNewItems = new HashMap<>(); public static Map<Integer, Integer> oldToNewItems = new HashMap<>();
public static Map<Integer, Integer> newToOldItems = new HashMap<>();
public static Map<String, int[]> blockTags = new HashMap<>(); public static Map<String, int[]> blockTags = new HashMap<>();
public static Map<String, int[]> itemTags = new HashMap<>(); public static Map<String, int[]> itemTags = new HashMap<>();
public static Map<String, int[]> fluidTags = new HashMap<>(); public static Map<String, int[]> fluidTags = new HashMap<>();
public static BiMap<Short, String> oldEnchantmentsIds = HashBiMap.create();
public static void init() { public static void init() {
JsonObject mapping1_12 = loadData("mapping-1.12.json"); JsonObject mapping1_12 = loadData("mapping-1.12.json");
@ -27,9 +31,14 @@ public class MappingData {
mapIdentifiers(oldToNewBlocks, mapping1_12.getAsJsonObject("blocks"), mapping1_13.getAsJsonObject("blocks")); mapIdentifiers(oldToNewBlocks, mapping1_12.getAsJsonObject("blocks"), mapping1_13.getAsJsonObject("blocks"));
System.out.println("Loading item mapping..."); System.out.println("Loading item mapping...");
mapIdentifiers(oldToNewItems, mapping1_12.getAsJsonObject("items"), mapping1_13.getAsJsonObject("items")); mapIdentifiers(oldToNewItems, mapping1_12.getAsJsonObject("items"), mapping1_13.getAsJsonObject("items"));
System.out.println("Loading new to old item mapping...");
mapIdentifiers(newToOldItems, mapping1_13.getAsJsonObject("items"), mapping1_12.getAsJsonObject("items"));
System.out.println("Loading new tags...");
loadTags(blockTags, mapping1_13.getAsJsonObject("block_tags")); loadTags(blockTags, mapping1_13.getAsJsonObject("block_tags"));
loadTags(itemTags, mapping1_13.getAsJsonObject("item_tags")); loadTags(itemTags, mapping1_13.getAsJsonObject("item_tags"));
loadTags(fluidTags, mapping1_13.getAsJsonObject("fluid_tags")); loadTags(fluidTags, mapping1_13.getAsJsonObject("fluid_tags"));
System.out.println("Loading enchantments...");
loadEnchantments(oldEnchantmentsIds, mapping1_12.getAsJsonObject("enchantments"));
} }
private static void mapIdentifiers(Map<Integer, Integer> output, JsonObject oldIdentifiers, JsonObject newIdentifiers) { private static void mapIdentifiers(Map<Integer, Integer> output, JsonObject oldIdentifiers, JsonObject newIdentifiers) {
@ -64,6 +73,12 @@ public class MappingData {
} }
} }
public static void loadEnchantments(Map<Short, String> output, JsonObject enchantments) {
for (Map.Entry<String, JsonElement> enchantment : enchantments.entrySet()) {
output.put(Short.parseShort(enchantment.getKey()), enchantment.getValue().getAsString());
}
}
public static JsonObject loadData(String name) { public static JsonObject loadData(String name) {
InputStream stream = MappingData.class.getClassLoader().getResourceAsStream("assets/viaversion/data/" + name); InputStream stream = MappingData.class.getClassLoader().getResourceAsStream("assets/viaversion/data/" + name);
InputStreamReader reader = new InputStreamReader(stream); InputStreamReader reader = new InputStreamReader(stream);

Datei anzeigen

@ -1,8 +1,6 @@
package us.myles.ViaVersion.protocols.protocolsnapshotto1_12_2.packets; package us.myles.ViaVersion.protocols.protocolsnapshotto1_12_2.packets;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.*;
import com.github.steveice10.opennbt.tag.builtin.IntTag;
import com.github.steveice10.opennbt.tag.builtin.StringTag;
import com.google.common.base.Optional; import com.google.common.base.Optional;
import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.PacketWrapper;
import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.minecraft.item.Item;
@ -11,6 +9,7 @@ import us.myles.ViaVersion.api.remapper.PacketHandler;
import us.myles.ViaVersion.api.remapper.PacketRemapper; import us.myles.ViaVersion.api.remapper.PacketRemapper;
import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.api.type.Type;
import us.myles.ViaVersion.packets.State; import us.myles.ViaVersion.packets.State;
import us.myles.ViaVersion.protocols.protocolsnapshotto1_12_2.ProtocolSnapshotTo1_12_2;
import us.myles.ViaVersion.protocols.protocolsnapshotto1_12_2.data.MappingData; import us.myles.ViaVersion.protocols.protocolsnapshotto1_12_2.data.MappingData;
import us.myles.ViaVersion.protocols.protocolsnapshotto1_12_2.data.SoundSource; import us.myles.ViaVersion.protocols.protocolsnapshotto1_12_2.data.SoundSource;
import us.myles.ViaVersion.protocols.protocolsnapshotto1_12_2.data.SpawnEggRewriter; import us.myles.ViaVersion.protocols.protocolsnapshotto1_12_2.data.SpawnEggRewriter;
@ -212,6 +211,7 @@ public class InventoryPackets {
int originalId = (item.getId() << 16 | item.getData() & 0xFFFF); int originalId = (item.getId() << 16 | item.getData() & 0xFFFF);
tag.put(new IntTag(NBT_TAG_NAME, originalId)); tag.put(new IntTag(NBT_TAG_NAME, originalId));
// NBT changes
if (isDamageable(item.getId())) { if (isDamageable(item.getId())) {
tag.put(new IntTag("Damage", item.getData())); tag.put(new IntTag("Damage", item.getData()));
} }
@ -230,13 +230,45 @@ public class InventoryPackets {
} }
} }
// Display Name now uses JSON
if (tag.get("display") instanceof CompoundTag) {
if (((CompoundTag) tag.get("display")).get("Name") instanceof StringTag) {
StringTag name = ((CompoundTag) tag.get("display")).get("Name");
name.setValue(
ProtocolSnapshotTo1_12_2.legacyTextToJson(
name.getValue()
)
);
}
}
// ench is now Enchantments and now uses identifiers
if (tag.get("ench") instanceof ListTag) {
ListTag ench = tag.get("ench");
ListTag enchantments = new ListTag("Enchantments", CompoundTag.class);
for (Tag enchEntry : ench) {
if (enchEntry instanceof CompoundTag) {
CompoundTag enchantmentEntry = new CompoundTag("");
enchantmentEntry.put(new StringTag("id",
MappingData.oldEnchantmentsIds.get(
(Short) ((CompoundTag) enchEntry).get("id").getValue()
)
));
enchantmentEntry.put(new ShortTag("lvl", (Short) ((CompoundTag) enchEntry).get("lvl").getValue()));
enchantments.add(enchantmentEntry);
}
}
tag.remove("ench");
tag.put(enchantments);
}
int rawId = (item.getId() << 4 | item.getData() & 0xF); int rawId = (item.getId() << 4 | item.getData() & 0xF);
// Handle SpawnEggs // Handle SpawnEggs
if (item.getId() == 383) { if (item.getId() == 383) {
if (tag.contains("EntityTag")) { if (tag.get("EntityTag") instanceof CompoundTag) {
CompoundTag entityTag = tag.get("EntityTag"); CompoundTag entityTag = tag.get("EntityTag");
if (entityTag.contains("id") && entityTag.get("id") instanceof StringTag) { if (entityTag.get("id") instanceof StringTag) {
StringTag identifier = entityTag.get("id"); StringTag identifier = entityTag.get("id");
rawId = SpawnEggRewriter.getSpawnEggId(identifier.getValue()); rawId = SpawnEggRewriter.getSpawnEggId(identifier.getValue());
} else { } else {
@ -271,36 +303,33 @@ public class InventoryPackets {
CompoundTag tag = item.getTag(); CompoundTag tag = item.getTag();
// Use tag to get original ID and data
if (tag != null) { if (tag != null) {
// Check for valid tag // Check for valid tag
if (tag.contains(NBT_TAG_NAME)) { if (tag.get(NBT_TAG_NAME) instanceof IntTag) {
if (tag.get(NBT_TAG_NAME) instanceof IntTag) { rawId = (Integer) tag.get(NBT_TAG_NAME).getValue();
rawId = (Integer) tag.get(NBT_TAG_NAME).getValue(); // Remove the tag
// Remove the tag tag.remove(NBT_TAG_NAME);
tag.remove(NBT_TAG_NAME); gotRawIdFromTag = true;
gotRawIdFromTag = true;
}
} }
} }
if (rawId == null) { if (rawId == null) {
for (Map.Entry<Integer, Integer> entry : MappingData.oldToNewItems.entrySet()) { Integer oldId = MappingData.newToOldItems.get((int) item.getId());
if (entry.getValue() == item.getId()) { if (oldId != null) {
int oldId = entry.getKey(); // Handle spawn eggs
// Handle spawn eggs Optional<String> eggEntityId = SpawnEggRewriter.getEntityId(oldId);
Optional<String> eggEntityId = SpawnEggRewriter.getEntityId(oldId); if (eggEntityId.isPresent()) {
if (eggEntityId.isPresent()) { rawId = 383 << 16;
rawId = 383 << 16; if (tag == null)
if (tag == null) item.setTag(tag = new CompoundTag("tag"));
item.setTag(tag = new CompoundTag("tag")); if (!tag.contains("EntityTag")) {
if (!tag.contains("EntityTag")) { CompoundTag entityTag = new CompoundTag("EntityTag");
CompoundTag entityTag = new CompoundTag("EntityTag"); entityTag.put(new StringTag("id", eggEntityId.get()));
entityTag.put(new StringTag("id", eggEntityId.get())); tag.put(entityTag);
tag.put(entityTag);
}
} else {
rawId = (oldId >> 4) << 16 | oldId & 0xF;
} }
break; } else {
rawId = (oldId >> 4) << 16 | oldId & 0xF;
} }
} }
} }
@ -313,6 +342,7 @@ public class InventoryPackets {
item.setId((short) (rawId >> 16)); item.setId((short) (rawId >> 16));
item.setData((short) (rawId & 0xFFFF)); item.setData((short) (rawId & 0xFFFF));
// NBT changes
if (tag != null) { if (tag != null) {
if (isDamageable(item.getId())) { if (isDamageable(item.getId())) {
if (tag.get("Damage") instanceof IntTag) { if (tag.get("Damage") instanceof IntTag) {
@ -339,6 +369,41 @@ public class InventoryPackets {
} }
} }
} }
// Display Name now uses JSON
if (tag.get("display") instanceof CompoundTag) {
if (((CompoundTag) tag.get("display")).get("Name") instanceof StringTag) {
StringTag name = ((CompoundTag) tag.get("display")).get("Name");
name.setValue(
ProtocolSnapshotTo1_12_2.jsonTextToLegacy(
name.getValue()
)
);
}
}
// ench is now Enchantments and now uses identifiers
if (tag.get("Enchantments") instanceof ListTag) {
ListTag enchantments = tag.get("Enchantments");
ListTag ench = new ListTag("ench", CompoundTag.class);
for (Tag enchantmentEntry : enchantments) {
if (enchantmentEntry instanceof CompoundTag) {
CompoundTag enchEntry = new CompoundTag("");
enchEntry.put(
new ShortTag(
"id",
MappingData.oldEnchantmentsIds.inverse().get(
(String) ((CompoundTag) enchantmentEntry).get("id").getValue()
)
)
);
enchEntry.put(new ShortTag("lvl", (Short) ((CompoundTag) enchantmentEntry).get("lvl").getValue()));
ench.add(enchEntry);
}
}
tag.remove("Enchantment");
tag.put(ench);
}
} }
} }

Datei anzeigen

@ -2377,5 +2377,37 @@
"25100328": "minecraft:zombie_horse_spawn_egg", "25100328": "minecraft:zombie_horse_spawn_egg",
"25100329": "minecraft:zombie_pigman_spawn_egg", "25100329": "minecraft:zombie_pigman_spawn_egg",
"25100330": "minecraft:zombie_villager_spawn_egg" "25100330": "minecraft:zombie_villager_spawn_egg"
},
"enchantments": {
"0": "minecraft:protection",
"1": "minecraft:fire_protection",
"2": "minecraft:feather_falling",
"3": "minecraft:blast_protection",
"4": "minecraft:projectile_protection",
"5": "minecraft:respiration",
"6": "minecraft:aqua_affinity",
"7": "minecraft:thorns",
"8": "minecraft:depth_strider",
"9": "minecraft:frost_walker",
"10": "minecraft:binding_curse",
"16": "minecraft:sharpness",
"17": "minecraft:smite",
"18": "minecraft:bane_of_arthropods",
"19": "minecraft:knockback",
"20": "minecraft:fire_aspect",
"21": "minecraft:looting",
"22": "minecraft:sweeping",
"32": "minecraft:efficiency",
"33": "minecraft:silk_touch",
"34": "minecraft:unbreaking",
"35": "minecraft:fortune",
"48": "minecraft:power",
"49": "minecraft:punch",
"50": "minecraft:flame",
"51": "minecraft:infinity",
"61": "minecraft:luck_of_the_sea",
"62": "minecraft:lure",
"70": "minecraft:mending",
"71": "minecraft:vanishing_curse"
} }
} }