Merge pull request #1703 from KennyTV/1.16

20w14a, entity name fixes, abstract tag rewriter
This commit is contained in:
Myles 2020-04-02 21:40:42 +01:00 committed by GitHub
commit 8ef0221d43
12 changed files with 390 additions and 235 deletions

View File

@ -29,21 +29,21 @@ public class Entity1_16Types {
ENTITY(-1), ENTITY(-1),
AREA_EFFECT_CLOUD(0, ENTITY), AREA_EFFECT_CLOUD(0, ENTITY),
ENDER_CRYSTAL(18, ENTITY), END_CRYSTAL(18, ENTITY),
EVOCATION_FANGS(22, ENTITY), EVOKER_FANGS(22, ENTITY),
XP_ORB(24, ENTITY), EXPERIENCE_ORB(24, ENTITY),
EYE_OF_ENDER_SIGNAL(25, ENTITY), EYE_OF_ENDER(25, ENTITY),
FALLING_BLOCK(26, ENTITY), FALLING_BLOCK(26, ENTITY),
FIREWORKS_ROCKET(27, ENTITY), FIREWORK_ROCKET(27, ENTITY),
ITEM(35, ENTITY), ITEM(35, ENTITY),
LLAMA_SPIT(40, ENTITY), LLAMA_SPIT(40, ENTITY),
TNT(59, ENTITY), TNT(58, ENTITY),
SHULKER_BULLET(64, ENTITY), SHULKER_BULLET(63, ENTITY),
FISHING_BOBBER(105, ENTITY), FISHING_BOBBER(106, ENTITY),
LIVINGENTITY(-1, ENTITY), LIVINGENTITY(-1, ENTITY),
ARMOR_STAND(1, LIVINGENTITY), ARMOR_STAND(1, LIVINGENTITY),
PLAYER(104, LIVINGENTITY), PLAYER(105, LIVINGENTITY),
ABSTRACT_INSENTIENT(-1, LIVINGENTITY), ABSTRACT_INSENTIENT(-1, LIVINGENTITY),
ENDER_DRAGON(19, ABSTRACT_INSENTIENT), ENDER_DRAGON(19, ABSTRACT_INSENTIENT),
@ -53,8 +53,8 @@ public class Entity1_16Types {
ABSTRACT_CREATURE(-1, ABSTRACT_INSENTIENT), ABSTRACT_CREATURE(-1, ABSTRACT_INSENTIENT),
ABSTRACT_AGEABLE(-1, ABSTRACT_CREATURE), ABSTRACT_AGEABLE(-1, ABSTRACT_CREATURE),
VILLAGER(85, ABSTRACT_AGEABLE), VILLAGER(84, ABSTRACT_AGEABLE),
WANDERING_TRADER(89, ABSTRACT_AGEABLE), WANDERING_TRADER(88, ABSTRACT_AGEABLE),
// Animals // Animals
ABSTRACT_ANIMAL(-1, ABSTRACT_AGEABLE), ABSTRACT_ANIMAL(-1, ABSTRACT_AGEABLE),
@ -64,16 +64,16 @@ public class Entity1_16Types {
MOOSHROOM(50, COW), MOOSHROOM(50, COW),
PANDA(53, ABSTRACT_INSENTIENT), PANDA(53, ABSTRACT_INSENTIENT),
PIG(55, ABSTRACT_ANIMAL), PIG(55, ABSTRACT_ANIMAL),
POLAR_BEAR(58, ABSTRACT_ANIMAL), POLAR_BEAR(57, ABSTRACT_ANIMAL),
RABBIT(60, ABSTRACT_ANIMAL), RABBIT(59, ABSTRACT_ANIMAL),
SHEEP(62, ABSTRACT_ANIMAL), SHEEP(61, ABSTRACT_ANIMAL),
TURTLE(78, ABSTRACT_ANIMAL), TURTLE(77, ABSTRACT_ANIMAL),
FOX(28, ABSTRACT_ANIMAL), FOX(28, ABSTRACT_ANIMAL),
ABSTRACT_TAMEABLE_ANIMAL(-1, ABSTRACT_ANIMAL), ABSTRACT_TAMEABLE_ANIMAL(-1, ABSTRACT_ANIMAL),
CAT(7, ABSTRACT_TAMEABLE_ANIMAL), CAT(7, ABSTRACT_TAMEABLE_ANIMAL),
OCELOT(51, ABSTRACT_TAMEABLE_ANIMAL), OCELOT(51, ABSTRACT_TAMEABLE_ANIMAL),
WOLF(94, ABSTRACT_TAMEABLE_ANIMAL), WOLF(93, ABSTRACT_TAMEABLE_ANIMAL),
ABSTRACT_PARROT(-1, ABSTRACT_TAMEABLE_ANIMAL), ABSTRACT_PARROT(-1, ABSTRACT_TAMEABLE_ANIMAL),
PARROT(54, ABSTRACT_PARROT), PARROT(54, ABSTRACT_PARROT),
@ -84,23 +84,23 @@ public class Entity1_16Types {
DONKEY(13, CHESTED_HORSE), DONKEY(13, CHESTED_HORSE),
MULE(49, CHESTED_HORSE), MULE(49, CHESTED_HORSE),
LLAMA(39, CHESTED_HORSE), LLAMA(39, CHESTED_HORSE),
TRADER_LLAMA(76, CHESTED_HORSE), TRADER_LLAMA(75, CHESTED_HORSE),
HORSE(32, ABSTRACT_HORSE), HORSE(32, ABSTRACT_HORSE),
SKELETON_HORSE(67, ABSTRACT_HORSE), SKELETON_HORSE(66, ABSTRACT_HORSE),
ZOMBIE_HORSE(96, ABSTRACT_HORSE), ZOMBIE_HORSE(96, ABSTRACT_HORSE),
// Golem // Golem
ABSTRACT_GOLEM(-1, ABSTRACT_CREATURE), ABSTRACT_GOLEM(-1, ABSTRACT_CREATURE),
SNOWMAN(70, ABSTRACT_GOLEM), SNOW_GOLEM(69, ABSTRACT_GOLEM),
VILLAGER_GOLEM(86, ABSTRACT_GOLEM), IRON_GOLEM(85, ABSTRACT_GOLEM),
SHULKER(63, ABSTRACT_GOLEM), SHULKER(62, ABSTRACT_GOLEM),
// Fish // Fish
ABSTRACT_FISHES(-1, ABSTRACT_CREATURE), ABSTRACT_FISHES(-1, ABSTRACT_CREATURE),
COD(10, ABSTRACT_FISHES), COD(10, ABSTRACT_FISHES),
PUFFER_FISH(56, ABSTRACT_FISHES), PUFFERFISH(56, ABSTRACT_FISHES),
SALMON_MOB(61, ABSTRACT_FISHES), SALMON(60, ABSTRACT_FISHES),
TROPICAL_FISH(77, ABSTRACT_FISHES), TROPICAL_FISH(76, ABSTRACT_FISHES),
// Monsters // Monsters
ABSTRACT_MONSTER(-1, ABSTRACT_CREATURE), ABSTRACT_MONSTER(-1, ABSTRACT_CREATURE),
@ -109,43 +109,44 @@ public class Entity1_16Types {
ENDERMITE(21, ABSTRACT_MONSTER), ENDERMITE(21, ABSTRACT_MONSTER),
ENDERMAN(20, ABSTRACT_MONSTER), ENDERMAN(20, ABSTRACT_MONSTER),
GIANT(30, ABSTRACT_MONSTER), GIANT(30, ABSTRACT_MONSTER),
SILVERFISH(65, ABSTRACT_MONSTER), SILVERFISH(64, ABSTRACT_MONSTER),
VEX(84, ABSTRACT_MONSTER), VEX(83, ABSTRACT_MONSTER),
WITCH(90, ABSTRACT_MONSTER), WITCH(89, ABSTRACT_MONSTER),
WITHER(91, ABSTRACT_MONSTER), WITHER(90, ABSTRACT_MONSTER),
RAVAGER(99, ABSTRACT_MONSTER), RAVAGER(99, ABSTRACT_MONSTER),
PIGLIN(101, ABSTRACT_MONSTER), PIGLIN(101, ABSTRACT_MONSTER),
HOGLIN(100, ABSTRACT_ANIMAL), HOGLIN(100, ABSTRACT_ANIMAL),
STRIDER(102, ABSTRACT_ANIMAL), STRIDER(102, ABSTRACT_ANIMAL),
ZOGLIN(103, ABSTRACT_MONSTER),
// Illagers // Illagers
ABSTRACT_ILLAGER_BASE(-1, ABSTRACT_MONSTER), ABSTRACT_ILLAGER_BASE(-1, ABSTRACT_MONSTER),
ABSTRACT_EVO_ILLU_ILLAGER(-1, ABSTRACT_ILLAGER_BASE), ABSTRACT_EVO_ILLU_ILLAGER(-1, ABSTRACT_ILLAGER_BASE),
EVOCATION_ILLAGER(23, ABSTRACT_EVO_ILLU_ILLAGER), EVOKER(23, ABSTRACT_EVO_ILLU_ILLAGER),
ILLUSION_ILLAGER(34, ABSTRACT_EVO_ILLU_ILLAGER), ILLUSIONER(34, ABSTRACT_EVO_ILLU_ILLAGER),
VINDICATION_ILLAGER(87, ABSTRACT_ILLAGER_BASE), VINDICATOR(86, ABSTRACT_ILLAGER_BASE),
PILLAGER(88, ABSTRACT_ILLAGER_BASE), PILLAGER(87, ABSTRACT_ILLAGER_BASE),
// Skeletons // Skeletons
ABSTRACT_SKELETON(-1, ABSTRACT_MONSTER), ABSTRACT_SKELETON(-1, ABSTRACT_MONSTER),
SKELETON(66, ABSTRACT_SKELETON), SKELETON(65, ABSTRACT_SKELETON),
STRAY(75, ABSTRACT_SKELETON), STRAY(74, ABSTRACT_SKELETON),
WITHER_SKELETON(92, ABSTRACT_SKELETON), WITHER_SKELETON(91, ABSTRACT_SKELETON),
// Guardians // Guardians
GUARDIAN(31, ABSTRACT_MONSTER), GUARDIAN(31, ABSTRACT_MONSTER),
ELDER_GUARDIAN(17, GUARDIAN), ELDER_GUARDIAN(17, GUARDIAN),
// Spiders // Spiders
SPIDER(73, ABSTRACT_MONSTER), SPIDER(72, ABSTRACT_MONSTER),
CAVE_SPIDER(8, SPIDER), CAVE_SPIDER(8, SPIDER),
// Zombies // Zombies
ZOMBIE(95, ABSTRACT_MONSTER), ZOMBIE(94, ABSTRACT_MONSTER),
DROWNED(16, ZOMBIE), DROWNED(16, ZOMBIE),
HUSK(33, ZOMBIE), HUSK(33, ZOMBIE),
ZOMBIFIED_PIGLIN(57, ZOMBIE), ZOMBIFIED_PIGLIN(95, ZOMBIE),
ZOMBIE_VILLAGER(97, ZOMBIE), ZOMBIE_VILLAGER(97, ZOMBIE),
// Flying entities // Flying entities
@ -157,10 +158,10 @@ public class Entity1_16Types {
BAT(3, ABSTRACT_AMBIENT), BAT(3, ABSTRACT_AMBIENT),
ABSTRACT_WATERMOB(-1, ABSTRACT_INSENTIENT), ABSTRACT_WATERMOB(-1, ABSTRACT_INSENTIENT),
SQUID(74, ABSTRACT_WATERMOB), SQUID(73, ABSTRACT_WATERMOB),
// Slimes // Slimes
SLIME(68, ABSTRACT_INSENTIENT), SLIME(67, ABSTRACT_INSENTIENT),
MAGMA_CUBE(41, SLIME), MAGMA_CUBE(41, SLIME),
// Hangable objects // Hangable objects
@ -170,28 +171,28 @@ public class Entity1_16Types {
PAINTING(52, ABSTRACT_HANGING), PAINTING(52, ABSTRACT_HANGING),
ABSTRACT_LIGHTNING(-1, ENTITY), ABSTRACT_LIGHTNING(-1, ENTITY),
LIGHTNING_BOLT(103, ABSTRACT_LIGHTNING), LIGHTNING_BOLT(104, ABSTRACT_LIGHTNING),
// Arrows // Arrows
ABSTRACT_ARROW(-1, ENTITY), ABSTRACT_ARROW(-1, ENTITY),
ARROW(2, ABSTRACT_ARROW), ARROW(2, ABSTRACT_ARROW),
SPECTRAL_ARROW(72, ABSTRACT_ARROW), SPECTRAL_ARROW(71, ABSTRACT_ARROW),
TRIDENT(83, ABSTRACT_ARROW), TRIDENT(82, ABSTRACT_ARROW),
// Fireballs // Fireballs
ABSTRACT_FIREBALL(-1, ENTITY), ABSTRACT_FIREBALL(-1, ENTITY),
DRAGON_FIREBALL(15, ABSTRACT_FIREBALL), DRAGON_FIREBALL(15, ABSTRACT_FIREBALL),
FIREBALL(37, ABSTRACT_FIREBALL), FIREBALL(37, ABSTRACT_FIREBALL),
SMALL_FIREBALL(69, ABSTRACT_FIREBALL), SMALL_FIREBALL(68, ABSTRACT_FIREBALL),
WITHER_SKULL(93, ABSTRACT_FIREBALL), WITHER_SKULL(92, ABSTRACT_FIREBALL),
// Projectiles // Projectiles
PROJECTILE_ABSTRACT(-1, ENTITY), PROJECTILE_ABSTRACT(-1, ENTITY),
SNOWBALL(71, PROJECTILE_ABSTRACT), SNOWBALL(70, PROJECTILE_ABSTRACT),
ENDER_PEARL(80, PROJECTILE_ABSTRACT), ENDER_PEARL(79, PROJECTILE_ABSTRACT),
EGG(79, PROJECTILE_ABSTRACT), EGG(78, PROJECTILE_ABSTRACT),
POTION(82, PROJECTILE_ABSTRACT), POTION(81, PROJECTILE_ABSTRACT),
XP_BOTTLE(81, PROJECTILE_ABSTRACT), EXPERIENCE_BOTTLE(80, PROJECTILE_ABSTRACT),
// Vehicles // Vehicles
MINECART_ABSTRACT(-1, ENTITY), MINECART_ABSTRACT(-1, ENTITY),
@ -200,7 +201,7 @@ public class Entity1_16Types {
HOPPER_MINECART(46, CHESTED_MINECART_ABSTRACT), HOPPER_MINECART(46, CHESTED_MINECART_ABSTRACT),
MINECART(42, MINECART_ABSTRACT), MINECART(42, MINECART_ABSTRACT),
FURNACE_MINECART(45, MINECART_ABSTRACT), FURNACE_MINECART(45, MINECART_ABSTRACT),
COMMANDBLOCK_MINECART(44, MINECART_ABSTRACT), COMMAND_BLOCK_MINECART(44, MINECART_ABSTRACT),
TNT_MINECART(48, MINECART_ABSTRACT), TNT_MINECART(48, MINECART_ABSTRACT),
SPAWNER_MINECART(47, MINECART_ABSTRACT), SPAWNER_MINECART(47, MINECART_ABSTRACT),
BOAT(6, ENTITY); BOAT(6, ENTITY);

View File

@ -80,7 +80,7 @@ public class ProtocolVersion {
register(v1_15 = new ProtocolVersion(573, "1.15")); register(v1_15 = new ProtocolVersion(573, "1.15"));
register(v1_15_1 = new ProtocolVersion(575, "1.15.1")); register(v1_15_1 = new ProtocolVersion(575, "1.15.1"));
register(v1_15_2 = new ProtocolVersion(578, "1.15.2")); register(v1_15_2 = new ProtocolVersion(578, "1.15.2"));
register(v1_16 = new ProtocolVersion(709, "1.16")); register(v1_16 = new ProtocolVersion(710, "1.16"));
register(unknown = new ProtocolVersion(-1, "UNKNOWN")); register(unknown = new ProtocolVersion(-1, "UNKNOWN"));
} }

View File

@ -242,7 +242,7 @@ public abstract class MetadataRewriter {
return getTypeFromId(type); return getTypeFromId(type);
} }
protected int getNewEntityId(int oldId) { public int getNewEntityId(int oldId) {
return oldId; return oldId;
} }

View File

@ -0,0 +1,94 @@
package us.myles.ViaVersion.api.rewriters;
import us.myles.ViaVersion.api.PacketWrapper;
import us.myles.ViaVersion.api.protocol.Protocol;
import us.myles.ViaVersion.api.remapper.PacketRemapper;
import us.myles.ViaVersion.api.type.Type;
import us.myles.ViaVersion.packets.State;
import java.util.ArrayList;
import java.util.List;
public class TagRewriter {
public static final int[] EMPTY_ARRAY = {};
private final Protocol protocol;
private final IdRewriteFunction blockRewriter;
private final IdRewriteFunction itemRewriter;
private final IdRewriteFunction entityRewriter;
private final List<TagData> newBlockTags = new ArrayList<>();
// add item, fluid, or entity tag lists if needed at some point
public TagRewriter(Protocol protocol, IdRewriteFunction blockRewriter, IdRewriteFunction itemRewriter, IdRewriteFunction entityRewriter) {
this.protocol = protocol;
this.blockRewriter = blockRewriter;
this.itemRewriter = itemRewriter;
this.entityRewriter = entityRewriter;
}
public void addEmptyBlockTag(String id) {
newBlockTags.add(new TagData(id, EMPTY_ARRAY));
}
public void addBlockTag(String id, int... oldBlockIds) {
for (int i = 0; i < oldBlockIds.length; i++) {
int oldBlockId = oldBlockIds[i];
oldBlockIds[i] = blockRewriter.rewrite(oldBlockId);
}
newBlockTags.add(new TagData(id, oldBlockIds));
}
public void register(int oldId, int newId) {
protocol.registerOutgoing(State.PLAY, oldId, newId, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> {
handle(wrapper, blockRewriter, newBlockTags);
handle(wrapper, itemRewriter, null);
if (entityRewriter == null) return;
int fluidTagsSize = wrapper.passthrough(Type.VAR_INT);
for (int i = 0; i < fluidTagsSize; i++) {
wrapper.passthrough(Type.STRING);
wrapper.passthrough(Type.VAR_INT_ARRAY_PRIMITIVE);
}
handle(wrapper, entityRewriter, null);
});
}
});
}
private void handle(PacketWrapper wrapper, IdRewriteFunction rewriteFunction, List<TagData> newTags) throws Exception {
int tagsSize = wrapper.read(Type.VAR_INT);
wrapper.write(Type.VAR_INT, newTags != null ? tagsSize + newTags.size() : tagsSize); // add new tags count
for (int i = 0; i < tagsSize; i++) {
wrapper.passthrough(Type.STRING);
int[] ids = wrapper.passthrough(Type.VAR_INT_ARRAY_PRIMITIVE);
if (rewriteFunction != null) {
for (int j = 0; j < ids.length; j++) {
ids[j] = rewriteFunction.rewrite(ids[j]);
}
}
}
// Send new tags if present
if (newTags != null) {
for (TagData tag : newTags) {
wrapper.write(Type.STRING, tag.identifier);
wrapper.write(Type.VAR_INT_ARRAY_PRIMITIVE, tag.entries);
}
}
}
private static final class TagData {
private final String identifier;
private final int[] entries;
private TagData(String identifier, int[] entries) {
this.identifier = identifier;
this.entries = entries;
}
}
}

View File

@ -101,7 +101,7 @@ public class MetadataRewriter1_13To1_12_2 extends MetadataRewriter {
} }
@Override @Override
protected int getNewEntityId(final int oldId) { public int getNewEntityId(final int oldId) {
return EntityTypeRewriter.getNewId(oldId).orElse(oldId); return EntityTypeRewriter.getNewId(oldId).orElse(oldId);
} }

View File

@ -169,7 +169,7 @@ public class MetadataRewriter1_14To1_13_2 extends MetadataRewriter {
} }
@Override @Override
protected int getNewEntityId(final int oldId) { public int getNewEntityId(final int oldId) {
return EntityTypeRewriter.getNewId(oldId).orElse(oldId); return EntityTypeRewriter.getNewId(oldId).orElse(oldId);
} }

View File

@ -51,7 +51,7 @@ public class MetadataRewriter1_15To1_14_4 extends MetadataRewriter {
} }
@Override @Override
protected int getNewEntityId(final int oldId) { public int getNewEntityId(final int oldId) {
return EntityPackets.getNewEntityId(oldId); return EntityPackets.getNewEntityId(oldId);
} }

View File

@ -4,6 +4,7 @@ import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.api.protocol.Protocol;
import us.myles.ViaVersion.api.remapper.PacketRemapper; import us.myles.ViaVersion.api.remapper.PacketRemapper;
import us.myles.ViaVersion.api.rewriters.TagRewriter;
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.protocol1_16to1_15_2.data.MappingData; import us.myles.ViaVersion.protocols.protocol1_16to1_15_2.data.MappingData;
@ -20,13 +21,23 @@ public class Protocol1_16To1_15_2 extends Protocol {
@Override @Override
protected void registerPackets() { protected void registerPackets() {
new MetadataRewriter1_16To1_15_2(this); MetadataRewriter1_16To1_15_2 metadataRewriter = new MetadataRewriter1_16To1_15_2(this);
MappingData.init(); MappingData.init();
EntityPackets.register(this); EntityPackets.register(this);
WorldPackets.register(this); WorldPackets.register(this);
InventoryPackets.register(this); InventoryPackets.register(this);
TagRewriter tagRewriter = new TagRewriter(this, Protocol1_16To1_15_2::getNewBlockId, InventoryPackets::getNewItemId, metadataRewriter::getNewEntityId);
tagRewriter.addBlockTag("minecraft:beacon_base_blocks", 133, 134, 148, 265);
tagRewriter.addBlockTag("minecraft:climbable", 160, 241, 658);
// The client crashes if we don't send these tags
tagRewriter.addEmptyBlockTag("minecraft:soul_speed_blocks");
tagRewriter.addEmptyBlockTag("minecraft:soul_fire_base_blocks");
tagRewriter.addEmptyBlockTag("minecraft:fire");
tagRewriter.addEmptyBlockTag("minecraft:beacon_payment_items");
tagRewriter.register(0x5C, 0x5C);
// Login Success // Login Success
registerOutgoing(State.LOGIN, 0x02, 0x02, new PacketRemapper() { registerOutgoing(State.LOGIN, 0x02, 0x02, new PacketRemapper() {
@Override @Override
@ -104,40 +115,6 @@ public class Protocol1_16To1_15_2 extends Protocol {
} }
}); });
// Tags
registerOutgoing(State.PLAY, 0x5C, 0x5C, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> {
int blockTagsSize = wrapper.read(Type.VAR_INT);
wrapper.write(Type.VAR_INT, blockTagsSize + 2); // new tag(s)
for (int i = 0; i < blockTagsSize; i++) {
wrapper.passthrough(Type.STRING);
int[] blockIds = wrapper.passthrough(Type.VAR_INT_ARRAY_PRIMITIVE);
for (int j = 0; j < blockIds.length; j++) {
blockIds[j] = getNewBlockId(blockIds[j]);
}
}
// Only send the necessary new tags
wrapper.write(Type.STRING, "minecraft:beacon_base_blocks");
wrapper.write(Type.VAR_INT_ARRAY_PRIMITIVE, new int[]{getNewBlockId(133), getNewBlockId(134), getNewBlockId(148), getNewBlockId(265)});
wrapper.write(Type.STRING, "minecraft:climbable");
wrapper.write(Type.VAR_INT_ARRAY_PRIMITIVE, new int[]{getNewBlockId(160), getNewBlockId(241), getNewBlockId(658)});
int itemTagsSize = wrapper.passthrough(Type.VAR_INT);
for (int i = 0; i < itemTagsSize; i++) {
wrapper.passthrough(Type.STRING);
int[] itemIds = wrapper.passthrough(Type.VAR_INT_ARRAY_PRIMITIVE);
for (int j = 0; j < itemIds.length; j++) {
itemIds[j] = InventoryPackets.getNewItemId(itemIds[j]);
}
}
});
}
});
registerOutgoing(State.PLAY, 0x43, 0x44); registerOutgoing(State.PLAY, 0x43, 0x44);
registerOutgoing(State.PLAY, 0x45, 0x46); registerOutgoing(State.PLAY, 0x45, 0x46);

View File

@ -7,8 +7,12 @@ import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.data.MappingDataLoader; import us.myles.ViaVersion.api.data.MappingDataLoader;
import us.myles.ViaVersion.api.data.Mappings; import us.myles.ViaVersion.api.data.Mappings;
import java.util.HashMap;
import java.util.Map;
public class MappingData { public class MappingData {
public static BiMap<Integer, Integer> oldToNewItems = HashBiMap.create(); public static BiMap<Integer, Integer> oldToNewItems = HashBiMap.create();
public static Map<String, String> attributeMappings = new HashMap<>();
public static Mappings blockMappings; public static Mappings blockMappings;
public static Mappings blockStateMappings; public static Mappings blockStateMappings;
public static Mappings soundMappings; public static Mappings soundMappings;
@ -26,5 +30,17 @@ public class MappingData {
MappingDataLoader.mapIdentifiers(oldToNewItems, mapping1_15.getAsJsonObject("items"), mapping1_16.getAsJsonObject("items"), diffmapping.getAsJsonObject("items")); MappingDataLoader.mapIdentifiers(oldToNewItems, mapping1_15.getAsJsonObject("items"), mapping1_16.getAsJsonObject("items"), diffmapping.getAsJsonObject("items"));
Via.getPlatform().getLogger().info("Loading 1.15 -> 1.16 sound mapping..."); Via.getPlatform().getLogger().info("Loading 1.15 -> 1.16 sound mapping...");
soundMappings = new Mappings(mapping1_15.getAsJsonArray("sounds"), mapping1_16.getAsJsonArray("sounds"), diffmapping.getAsJsonObject("sounds")); soundMappings = new Mappings(mapping1_15.getAsJsonArray("sounds"), mapping1_16.getAsJsonArray("sounds"), diffmapping.getAsJsonObject("sounds"));
attributeMappings.put("generic.maxHealth", "minecraft:generic.max_health");
attributeMappings.put("zombie.spawnReinforcements", "minecraft:zombie.spawn_reinforcements");
attributeMappings.put("horse.jumpStrength", "minecraft:horse.jump_strength");
attributeMappings.put("generic.followRange", "minecraft:generic.follow_range");
attributeMappings.put("generic.knockbackResistance", "minecraft:generic.knockback_resistance");
attributeMappings.put("generic.movementSpeed", "minecraft:generic.movement_speed");
attributeMappings.put("generic.flyingSpeed", "minecraft:generic.flying_speed");
attributeMappings.put("generic.attackDamage", "minecraft:generic.attack_damage");
attributeMappings.put("generic.attackKnockback", "minecraft:generic.attack_knockback");
attributeMappings.put("generic.attackSpeed", "minecraft:generic.attack_speed");
attributeMappings.put("generic.armorToughness", "minecraft:generic.armor_toughness");
} }
} }

View File

@ -50,4 +50,18 @@ public class MetadataRewriter1_16To1_15_2 extends MetadataRewriter {
protected EntityType getTypeFromId(int type) { protected EntityType getTypeFromId(int type) {
return Entity1_16Types.getTypeFromId(type); return Entity1_16Types.getTypeFromId(type);
} }
@Override
public int getNewEntityId(final int oldId) {
if (oldId == 57) {
return 95;
}
if (oldId > 57 && oldId < 95) {
return oldId - 1;
}
if (oldId > 102) {
return oldId + 1;
}
return oldId;
}
} }

View File

@ -1,9 +1,14 @@
package us.myles.ViaVersion.protocols.protocol1_16to1_15_2.packets; package us.myles.ViaVersion.protocols.protocol1_16to1_15_2.packets;
import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.entities.Entity1_16Types; import us.myles.ViaVersion.api.entities.Entity1_16Types;
import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.api.protocol.Protocol;
import us.myles.ViaVersion.api.remapper.PacketRemapper;
import us.myles.ViaVersion.api.type.Type;
import us.myles.ViaVersion.api.type.types.version.Types1_14; import us.myles.ViaVersion.api.type.types.version.Types1_14;
import us.myles.ViaVersion.packets.State;
import us.myles.ViaVersion.protocols.protocol1_16to1_15_2.Protocol1_16To1_15_2; import us.myles.ViaVersion.protocols.protocol1_16to1_15_2.Protocol1_16To1_15_2;
import us.myles.ViaVersion.protocols.protocol1_16to1_15_2.data.MappingData;
import us.myles.ViaVersion.protocols.protocol1_16to1_15_2.metadata.MetadataRewriter1_16To1_15_2; import us.myles.ViaVersion.protocols.protocol1_16to1_15_2.metadata.MetadataRewriter1_16To1_15_2;
public class EntityPackets { public class EntityPackets {
@ -31,5 +36,45 @@ public class EntityPackets {
// Join Game // Join Game
metadataRewriter.registerJoinGame(0x26, 0x26, Entity1_16Types.EntityType.PLAYER); metadataRewriter.registerJoinGame(0x26, 0x26, Entity1_16Types.EntityType.PLAYER);
// Entity Properties
protocol.registerOutgoing(State.PLAY, 0x59, 0x59, new PacketRemapper() {
@Override
public void registerMap() {
handler(wrapper -> {
wrapper.passthrough(Type.VAR_INT);
int size = wrapper.passthrough(Type.INT);
for (int i = 0; i < size; i++) {
// Attributes have been renamed and are now namespaced identifiers
String key = wrapper.read(Type.STRING);
String attributeIdentifier = MappingData.attributeMappings.get(key);
if (attributeIdentifier == null) {
attributeIdentifier = "minecraft:" + key;
if (!us.myles.ViaVersion.protocols.protocol1_13to1_12_2.data.MappingData.isValid1_13Channel(attributeIdentifier)) {
Via.getPlatform().getLogger().warning("Invalid attribute: " + key);
wrapper.read(Type.DOUBLE);
int modifierSize = wrapper.read(Type.VAR_INT);
for (int j = 0; j < modifierSize; j++) {
wrapper.read(Type.UUID);
wrapper.read(Type.DOUBLE);
wrapper.read(Type.BYTE);
}
continue;
}
}
wrapper.write(Type.STRING, attributeIdentifier);
wrapper.passthrough(Type.DOUBLE);
int modifierSize = wrapper.passthrough(Type.VAR_INT);
for (int j = 0; j < modifierSize; j++) {
wrapper.passthrough(Type.UUID);
wrapper.passthrough(Type.DOUBLE);
wrapper.passthrough(Type.BYTE);
}
}
});
}
});
} }
} }

View File

@ -17356,150 +17356,151 @@
"803": "minecraft:witch_spawn_egg", "803": "minecraft:witch_spawn_egg",
"804": "minecraft:wither_skeleton_spawn_egg", "804": "minecraft:wither_skeleton_spawn_egg",
"805": "minecraft:wolf_spawn_egg", "805": "minecraft:wolf_spawn_egg",
"806": "minecraft:zombie_spawn_egg", "806": "minecraft:zoglin_spawn_egg",
"807": "minecraft:zombie_horse_spawn_egg", "807": "minecraft:zombie_spawn_egg",
"808": "minecraft:zombified_piglin_spawn_egg", "808": "minecraft:zombie_horse_spawn_egg",
"809": "minecraft:zombie_villager_spawn_egg", "809": "minecraft:zombified_piglin_spawn_egg",
"810": "minecraft:experience_bottle", "810": "minecraft:zombie_villager_spawn_egg",
"811": "minecraft:fire_charge", "811": "minecraft:experience_bottle",
"812": "minecraft:writable_book", "812": "minecraft:fire_charge",
"813": "minecraft:written_book", "813": "minecraft:writable_book",
"814": "minecraft:emerald", "814": "minecraft:written_book",
"815": "minecraft:item_frame", "815": "minecraft:emerald",
"816": "minecraft:flower_pot", "816": "minecraft:item_frame",
"817": "minecraft:carrot", "817": "minecraft:flower_pot",
"818": "minecraft:potato", "818": "minecraft:carrot",
"819": "minecraft:baked_potato", "819": "minecraft:potato",
"820": "minecraft:poisonous_potato", "820": "minecraft:baked_potato",
"821": "minecraft:map", "821": "minecraft:poisonous_potato",
"822": "minecraft:golden_carrot", "822": "minecraft:map",
"823": "minecraft:skeleton_skull", "823": "minecraft:golden_carrot",
"824": "minecraft:wither_skeleton_skull", "824": "minecraft:skeleton_skull",
"825": "minecraft:player_head", "825": "minecraft:wither_skeleton_skull",
"826": "minecraft:zombie_head", "826": "minecraft:player_head",
"827": "minecraft:creeper_head", "827": "minecraft:zombie_head",
"828": "minecraft:dragon_head", "828": "minecraft:creeper_head",
"829": "minecraft:carrot_on_a_stick", "829": "minecraft:dragon_head",
"830": "minecraft:warped_fungus_on_a_stick", "830": "minecraft:carrot_on_a_stick",
"831": "minecraft:nether_star", "831": "minecraft:warped_fungus_on_a_stick",
"832": "minecraft:pumpkin_pie", "832": "minecraft:nether_star",
"833": "minecraft:firework_rocket", "833": "minecraft:pumpkin_pie",
"834": "minecraft:firework_star", "834": "minecraft:firework_rocket",
"835": "minecraft:enchanted_book", "835": "minecraft:firework_star",
"836": "minecraft:nether_brick", "836": "minecraft:enchanted_book",
"837": "minecraft:quartz", "837": "minecraft:nether_brick",
"838": "minecraft:tnt_minecart", "838": "minecraft:quartz",
"839": "minecraft:hopper_minecart", "839": "minecraft:tnt_minecart",
"840": "minecraft:prismarine_shard", "840": "minecraft:hopper_minecart",
"841": "minecraft:prismarine_crystals", "841": "minecraft:prismarine_shard",
"842": "minecraft:rabbit", "842": "minecraft:prismarine_crystals",
"843": "minecraft:cooked_rabbit", "843": "minecraft:rabbit",
"844": "minecraft:rabbit_stew", "844": "minecraft:cooked_rabbit",
"845": "minecraft:rabbit_foot", "845": "minecraft:rabbit_stew",
"846": "minecraft:rabbit_hide", "846": "minecraft:rabbit_foot",
"847": "minecraft:armor_stand", "847": "minecraft:rabbit_hide",
"848": "minecraft:iron_horse_armor", "848": "minecraft:armor_stand",
"849": "minecraft:golden_horse_armor", "849": "minecraft:iron_horse_armor",
"850": "minecraft:diamond_horse_armor", "850": "minecraft:golden_horse_armor",
"851": "minecraft:leather_horse_armor", "851": "minecraft:diamond_horse_armor",
"852": "minecraft:lead", "852": "minecraft:leather_horse_armor",
"853": "minecraft:name_tag", "853": "minecraft:lead",
"854": "minecraft:command_block_minecart", "854": "minecraft:name_tag",
"855": "minecraft:mutton", "855": "minecraft:command_block_minecart",
"856": "minecraft:cooked_mutton", "856": "minecraft:mutton",
"857": "minecraft:white_banner", "857": "minecraft:cooked_mutton",
"858": "minecraft:orange_banner", "858": "minecraft:white_banner",
"859": "minecraft:magenta_banner", "859": "minecraft:orange_banner",
"860": "minecraft:light_blue_banner", "860": "minecraft:magenta_banner",
"861": "minecraft:yellow_banner", "861": "minecraft:light_blue_banner",
"862": "minecraft:lime_banner", "862": "minecraft:yellow_banner",
"863": "minecraft:pink_banner", "863": "minecraft:lime_banner",
"864": "minecraft:gray_banner", "864": "minecraft:pink_banner",
"865": "minecraft:light_gray_banner", "865": "minecraft:gray_banner",
"866": "minecraft:cyan_banner", "866": "minecraft:light_gray_banner",
"867": "minecraft:purple_banner", "867": "minecraft:cyan_banner",
"868": "minecraft:blue_banner", "868": "minecraft:purple_banner",
"869": "minecraft:brown_banner", "869": "minecraft:blue_banner",
"870": "minecraft:green_banner", "870": "minecraft:brown_banner",
"871": "minecraft:red_banner", "871": "minecraft:green_banner",
"872": "minecraft:black_banner", "872": "minecraft:red_banner",
"873": "minecraft:end_crystal", "873": "minecraft:black_banner",
"874": "minecraft:chorus_fruit", "874": "minecraft:end_crystal",
"875": "minecraft:popped_chorus_fruit", "875": "minecraft:chorus_fruit",
"876": "minecraft:beetroot", "876": "minecraft:popped_chorus_fruit",
"877": "minecraft:beetroot_seeds", "877": "minecraft:beetroot",
"878": "minecraft:beetroot_soup", "878": "minecraft:beetroot_seeds",
"879": "minecraft:dragon_breath", "879": "minecraft:beetroot_soup",
"880": "minecraft:splash_potion", "880": "minecraft:dragon_breath",
"881": "minecraft:spectral_arrow", "881": "minecraft:splash_potion",
"882": "minecraft:tipped_arrow", "882": "minecraft:spectral_arrow",
"883": "minecraft:lingering_potion", "883": "minecraft:tipped_arrow",
"884": "minecraft:shield", "884": "minecraft:lingering_potion",
"885": "minecraft:elytra", "885": "minecraft:shield",
"886": "minecraft:spruce_boat", "886": "minecraft:elytra",
"887": "minecraft:birch_boat", "887": "minecraft:spruce_boat",
"888": "minecraft:jungle_boat", "888": "minecraft:birch_boat",
"889": "minecraft:acacia_boat", "889": "minecraft:jungle_boat",
"890": "minecraft:dark_oak_boat", "890": "minecraft:acacia_boat",
"891": "minecraft:totem_of_undying", "891": "minecraft:dark_oak_boat",
"892": "minecraft:shulker_shell", "892": "minecraft:totem_of_undying",
"893": "minecraft:iron_nugget", "893": "minecraft:shulker_shell",
"894": "minecraft:knowledge_book", "894": "minecraft:iron_nugget",
"895": "minecraft:debug_stick", "895": "minecraft:knowledge_book",
"896": "minecraft:music_disc_13", "896": "minecraft:debug_stick",
"897": "minecraft:music_disc_cat", "897": "minecraft:music_disc_13",
"898": "minecraft:music_disc_blocks", "898": "minecraft:music_disc_cat",
"899": "minecraft:music_disc_chirp", "899": "minecraft:music_disc_blocks",
"900": "minecraft:music_disc_far", "900": "minecraft:music_disc_chirp",
"901": "minecraft:music_disc_mall", "901": "minecraft:music_disc_far",
"902": "minecraft:music_disc_mellohi", "902": "minecraft:music_disc_mall",
"903": "minecraft:music_disc_stal", "903": "minecraft:music_disc_mellohi",
"904": "minecraft:music_disc_strad", "904": "minecraft:music_disc_stal",
"905": "minecraft:music_disc_ward", "905": "minecraft:music_disc_strad",
"906": "minecraft:music_disc_11", "906": "minecraft:music_disc_ward",
"907": "minecraft:music_disc_wait", "907": "minecraft:music_disc_11",
"908": "minecraft:trident", "908": "minecraft:music_disc_wait",
"909": "minecraft:phantom_membrane", "909": "minecraft:trident",
"910": "minecraft:nautilus_shell", "910": "minecraft:phantom_membrane",
"911": "minecraft:heart_of_the_sea", "911": "minecraft:nautilus_shell",
"912": "minecraft:crossbow", "912": "minecraft:heart_of_the_sea",
"913": "minecraft:suspicious_stew", "913": "minecraft:crossbow",
"914": "minecraft:loom", "914": "minecraft:suspicious_stew",
"915": "minecraft:flower_banner_pattern", "915": "minecraft:loom",
"916": "minecraft:creeper_banner_pattern", "916": "minecraft:flower_banner_pattern",
"917": "minecraft:skull_banner_pattern", "917": "minecraft:creeper_banner_pattern",
"918": "minecraft:mojang_banner_pattern", "918": "minecraft:skull_banner_pattern",
"919": "minecraft:globe_banner_pattern", "919": "minecraft:mojang_banner_pattern",
"920": "minecraft:composter", "920": "minecraft:globe_banner_pattern",
"921": "minecraft:barrel", "921": "minecraft:composter",
"922": "minecraft:smoker", "922": "minecraft:barrel",
"923": "minecraft:blast_furnace", "923": "minecraft:smoker",
"924": "minecraft:cartography_table", "924": "minecraft:blast_furnace",
"925": "minecraft:fletching_table", "925": "minecraft:cartography_table",
"926": "minecraft:grindstone", "926": "minecraft:fletching_table",
"927": "minecraft:lectern", "927": "minecraft:grindstone",
"928": "minecraft:smithing_table", "928": "minecraft:lectern",
"929": "minecraft:stonecutter", "929": "minecraft:smithing_table",
"930": "minecraft:bell", "930": "minecraft:stonecutter",
"931": "minecraft:lantern", "931": "minecraft:bell",
"932": "minecraft:soul_fire_lantern", "932": "minecraft:lantern",
"933": "minecraft:sweet_berries", "933": "minecraft:soul_fire_lantern",
"934": "minecraft:campfire", "934": "minecraft:sweet_berries",
"935": "minecraft:shroomlight", "935": "minecraft:campfire",
"936": "minecraft:honeycomb", "936": "minecraft:shroomlight",
"937": "minecraft:bee_nest", "937": "minecraft:honeycomb",
"938": "minecraft:beehive", "938": "minecraft:bee_nest",
"939": "minecraft:honey_bottle", "939": "minecraft:beehive",
"940": "minecraft:honey_block", "940": "minecraft:honey_bottle",
"941": "minecraft:honeycomb_block", "941": "minecraft:honey_block",
"942": "minecraft:lodestone", "942": "minecraft:honeycomb_block",
"943": "minecraft:netherite_block", "943": "minecraft:lodestone",
"944": "minecraft:ancient_debris", "944": "minecraft:netherite_block",
"945": "minecraft:netherite_ingot", "945": "minecraft:ancient_debris",
"946": "minecraft:netherite_scrap", "946": "minecraft:netherite_ingot",
"947": "minecraft:target", "947": "minecraft:netherite_scrap",
"948": "minecraft:crying_obsidian", "948": "minecraft:target",
"949": "minecraft:respawn_anchor" "949": "minecraft:crying_obsidian",
"950": "minecraft:respawn_anchor"
}, },
"sounds": [ "sounds": [
"ambient.cave", "ambient.cave",
@ -17829,6 +17830,7 @@
"entity.hoglin.ambient", "entity.hoglin.ambient",
"entity.hoglin.angry", "entity.hoglin.angry",
"entity.hoglin.attack", "entity.hoglin.attack",
"entity.hoglin.converted_to_zombified",
"entity.hoglin.death", "entity.hoglin.death",
"entity.hoglin.hurt", "entity.hoglin.hurt",
"entity.hoglin.retreat", "entity.hoglin.retreat",
@ -18426,6 +18428,12 @@
"block.wool.hit", "block.wool.hit",
"block.wool.place", "block.wool.place",
"block.wool.step", "block.wool.step",
"entity.zoglin.ambient",
"entity.zoglin.angry",
"entity.zoglin.attack",
"entity.zoglin.death",
"entity.zoglin.hurt",
"entity.zoglin.step",
"entity.zombie.ambient", "entity.zombie.ambient",
"entity.zombie.attack_wooden_door", "entity.zombie.attack_wooden_door",
"entity.zombie.attack_iron_door", "entity.zombie.attack_iron_door",