diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/Particle.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/Particle.java index 3e4e200ee..e1baeba1b 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/Particle.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/Particle.java @@ -44,9 +44,14 @@ public final class Particle { this.id = id; } - public ParticleData getArgument(final int id) { + public ParticleData getArgument(final int index) { //noinspection unchecked - return (ParticleData) arguments.get(id); + return (ParticleData) arguments.get(index); + } + + public ParticleData removeArgument(final int index) { + //noinspection unchecked + return (ParticleData) arguments.remove(index); } public List> getArguments() { @@ -57,6 +62,10 @@ public final class Particle { arguments.add(new ParticleData<>(type, value)); } + public void add(final int index, final Type type, final T value) { + arguments.add(index, new ParticleData<>(type, value)); + } + public static final class ParticleData { private final Type type; private T value; diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/EntityTypes1_20_3.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/EntityTypes1_20_3.java new file mode 100644 index 000000000..911bfceb1 --- /dev/null +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/EntityTypes1_20_3.java @@ -0,0 +1,283 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2023 ViaVersion and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.viaversion.viaversion.api.minecraft.entities; + +import com.google.common.base.Preconditions; +import com.viaversion.viaversion.api.protocol.Protocol; +import com.viaversion.viaversion.util.EntityTypeUtil; +import java.util.Locale; +import org.checkerframework.checker.nullness.qual.Nullable; + +public enum EntityTypes1_20_3 implements EntityType { + + ENTITY(null, null), + + AREA_EFFECT_CLOUD(ENTITY), + END_CRYSTAL(ENTITY), + EVOKER_FANGS(ENTITY), + EXPERIENCE_ORB(ENTITY), + EYE_OF_ENDER(ENTITY), + FALLING_BLOCK(ENTITY), + FIREWORK_ROCKET(ENTITY), + ITEM(ENTITY), + LLAMA_SPIT(ENTITY), + TNT(ENTITY), + SHULKER_BULLET(ENTITY), + FISHING_BOBBER(ENTITY), + + LIVINGENTITY(ENTITY, null), + ARMOR_STAND(LIVINGENTITY), + MARKER(ENTITY), + PLAYER(LIVINGENTITY), + + DISPLAY(ENTITY, null), + BLOCK_DISPLAY(DISPLAY), + ITEM_DISPLAY(DISPLAY), + TEXT_DISPLAY(DISPLAY), + INTERACTION(ENTITY), + + ABSTRACT_INSENTIENT(LIVINGENTITY, null), + ENDER_DRAGON(ABSTRACT_INSENTIENT), + + BEE(ABSTRACT_INSENTIENT), + + ABSTRACT_CREATURE(ABSTRACT_INSENTIENT, null), + + ABSTRACT_AGEABLE(ABSTRACT_CREATURE, null), + VILLAGER(ABSTRACT_AGEABLE), + WANDERING_TRADER(ABSTRACT_AGEABLE), + + // Animals + ABSTRACT_ANIMAL(ABSTRACT_AGEABLE, null), + AXOLOTL(ABSTRACT_ANIMAL), + DOLPHIN(ABSTRACT_INSENTIENT), + CHICKEN(ABSTRACT_ANIMAL), + COW(ABSTRACT_ANIMAL), + MOOSHROOM(COW), + PANDA(ABSTRACT_INSENTIENT), + PIG(ABSTRACT_ANIMAL), + POLAR_BEAR(ABSTRACT_ANIMAL), + RABBIT(ABSTRACT_ANIMAL), + SHEEP(ABSTRACT_ANIMAL), + TURTLE(ABSTRACT_ANIMAL), + FOX(ABSTRACT_ANIMAL), + FROG(ABSTRACT_ANIMAL), + GOAT(ABSTRACT_ANIMAL), + SNIFFER(ABSTRACT_ANIMAL), + + ABSTRACT_TAMEABLE_ANIMAL(ABSTRACT_ANIMAL, null), + CAT(ABSTRACT_TAMEABLE_ANIMAL), + OCELOT(ABSTRACT_TAMEABLE_ANIMAL), + WOLF(ABSTRACT_TAMEABLE_ANIMAL), + + ABSTRACT_PARROT(ABSTRACT_TAMEABLE_ANIMAL, null), + PARROT(ABSTRACT_PARROT), + + // Horses + ABSTRACT_HORSE(ABSTRACT_ANIMAL, null), + CHESTED_HORSE(ABSTRACT_HORSE, null), + DONKEY(CHESTED_HORSE), + MULE(CHESTED_HORSE), + LLAMA(CHESTED_HORSE), + TRADER_LLAMA(CHESTED_HORSE), + HORSE(ABSTRACT_HORSE), + SKELETON_HORSE(ABSTRACT_HORSE), + ZOMBIE_HORSE(ABSTRACT_HORSE), + CAMEL(ABSTRACT_HORSE), + + // Golem + ABSTRACT_GOLEM(ABSTRACT_CREATURE, null), + SNOW_GOLEM(ABSTRACT_GOLEM), + IRON_GOLEM(ABSTRACT_GOLEM), + SHULKER(ABSTRACT_GOLEM), + + // Fish + ABSTRACT_FISHES(ABSTRACT_CREATURE, null), + COD(ABSTRACT_FISHES), + PUFFERFISH(ABSTRACT_FISHES), + SALMON(ABSTRACT_FISHES), + TROPICAL_FISH(ABSTRACT_FISHES), + + // Monsters + ABSTRACT_MONSTER(ABSTRACT_CREATURE, null), + BLAZE(ABSTRACT_MONSTER), + CREEPER(ABSTRACT_MONSTER), + ENDERMITE(ABSTRACT_MONSTER), + ENDERMAN(ABSTRACT_MONSTER), + GIANT(ABSTRACT_MONSTER), + SILVERFISH(ABSTRACT_MONSTER), + VEX(ABSTRACT_MONSTER), + WITCH(ABSTRACT_MONSTER), + WITHER(ABSTRACT_MONSTER), + RAVAGER(ABSTRACT_MONSTER), + BREEZE(ABSTRACT_MONSTER), + + ABSTRACT_PIGLIN(ABSTRACT_MONSTER, null), + + PIGLIN(ABSTRACT_PIGLIN), + PIGLIN_BRUTE(ABSTRACT_PIGLIN), + + HOGLIN(ABSTRACT_ANIMAL), + STRIDER(ABSTRACT_ANIMAL), + TADPOLE(ABSTRACT_FISHES), + ZOGLIN(ABSTRACT_MONSTER), + WARDEN(ABSTRACT_MONSTER), + + // Illagers + ABSTRACT_ILLAGER_BASE(ABSTRACT_MONSTER, null), + ABSTRACT_EVO_ILLU_ILLAGER(ABSTRACT_ILLAGER_BASE, null), + EVOKER(ABSTRACT_EVO_ILLU_ILLAGER), + ILLUSIONER(ABSTRACT_EVO_ILLU_ILLAGER), + VINDICATOR(ABSTRACT_ILLAGER_BASE), + PILLAGER(ABSTRACT_ILLAGER_BASE), + + // Skeletons + ABSTRACT_SKELETON(ABSTRACT_MONSTER, null), + SKELETON(ABSTRACT_SKELETON), + STRAY(ABSTRACT_SKELETON), + WITHER_SKELETON(ABSTRACT_SKELETON), + + // Guardians + GUARDIAN(ABSTRACT_MONSTER), + ELDER_GUARDIAN(GUARDIAN), + + // Spiders + SPIDER(ABSTRACT_MONSTER), + CAVE_SPIDER(SPIDER), + + // Zombies + ZOMBIE(ABSTRACT_MONSTER), + DROWNED(ZOMBIE), + HUSK(ZOMBIE), + ZOMBIFIED_PIGLIN(ZOMBIE), + ZOMBIE_VILLAGER(ZOMBIE), + + // Flying entities + ABSTRACT_FLYING(ABSTRACT_INSENTIENT, null), + GHAST(ABSTRACT_FLYING), + PHANTOM(ABSTRACT_FLYING), + + ABSTRACT_AMBIENT(ABSTRACT_INSENTIENT, null), + BAT(ABSTRACT_AMBIENT), + ALLAY(ABSTRACT_CREATURE), + + ABSTRACT_WATERMOB(ABSTRACT_INSENTIENT, null), + SQUID(ABSTRACT_WATERMOB), + GLOW_SQUID(SQUID), + + // Slimes + SLIME(ABSTRACT_INSENTIENT), + MAGMA_CUBE(SLIME), + + // Hangable objects + ABSTRACT_HANGING(ENTITY, null), + LEASH_KNOT(ABSTRACT_HANGING), + ITEM_FRAME(ABSTRACT_HANGING), + GLOW_ITEM_FRAME(ITEM_FRAME), + PAINTING(ABSTRACT_HANGING), + + ABSTRACT_LIGHTNING(ENTITY, null), + LIGHTNING_BOLT(ABSTRACT_LIGHTNING), + + // Arrows + ABSTRACT_ARROW(ENTITY, null), + ARROW(ABSTRACT_ARROW), + SPECTRAL_ARROW(ABSTRACT_ARROW), + TRIDENT(ABSTRACT_ARROW), + + // Fireballs + ABSTRACT_FIREBALL(ENTITY, null), + DRAGON_FIREBALL(ABSTRACT_FIREBALL), + FIREBALL(ABSTRACT_FIREBALL), + SMALL_FIREBALL(ABSTRACT_FIREBALL), + WITHER_SKULL(ABSTRACT_FIREBALL), + + // Projectiles + PROJECTILE_ABSTRACT(ENTITY, null), + SNOWBALL(PROJECTILE_ABSTRACT), + ENDER_PEARL(PROJECTILE_ABSTRACT), + EGG(PROJECTILE_ABSTRACT), + POTION(PROJECTILE_ABSTRACT), + EXPERIENCE_BOTTLE(PROJECTILE_ABSTRACT), + WIND_CHARGE(PROJECTILE_ABSTRACT), + + // Vehicles + MINECART_ABSTRACT(ENTITY, null), + CHESTED_MINECART_ABSTRACT(MINECART_ABSTRACT, null), + CHEST_MINECART(CHESTED_MINECART_ABSTRACT), + HOPPER_MINECART(CHESTED_MINECART_ABSTRACT), + MINECART(MINECART_ABSTRACT), + FURNACE_MINECART(MINECART_ABSTRACT), + COMMAND_BLOCK_MINECART(MINECART_ABSTRACT), + TNT_MINECART(MINECART_ABSTRACT), + SPAWNER_MINECART(MINECART_ABSTRACT), + BOAT(ENTITY), + CHEST_BOAT(BOAT); + + private static final EntityType[] TYPES = EntityTypeUtil.createSizedArray(values()); + private final EntityType parent; + private final String identifier; + private int id = -1; + + EntityTypes1_20_3(final EntityType parent) { + this.parent = parent; + this.identifier = "minecraft:" + name().toLowerCase(Locale.ROOT); + } + + EntityTypes1_20_3(final EntityType parent, @Nullable final String identifier) { + this.parent = parent; + this.identifier = identifier; + } + + @Override + public int getId() { + if (id == -1) { + throw new IllegalStateException("Ids have not been initialized yet (type " + name() + ")"); + } + return id; + } + + @Override + public String identifier() { + Preconditions.checkArgument(identifier != null, "Called identifier method on abstract type"); + return identifier; + } + + @Override + public @Nullable EntityType getParent() { + return parent; + } + + @Override + public boolean isAbstractType() { + return identifier == null; + } + + public static EntityType getTypeFromId(final int typeId) { + return EntityTypeUtil.getTypeFromId(TYPES, typeId, ENTITY); + } + + public static void initialize(final Protocol protocol) { + EntityTypeUtil.initialize(values(), TYPES, protocol, (type, id) -> type.id = id); + } +} diff --git a/api/src/main/java/com/viaversion/viaversion/api/protocol/version/ProtocolVersion.java b/api/src/main/java/com/viaversion/viaversion/api/protocol/version/ProtocolVersion.java index b585e855e..e7334df42 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/protocol/version/ProtocolVersion.java +++ b/api/src/main/java/com/viaversion/viaversion/api/protocol/version/ProtocolVersion.java @@ -85,7 +85,7 @@ public class ProtocolVersion { public static final ProtocolVersion v1_19_4 = register(762, "1.19.4"); public static final ProtocolVersion v1_20 = register(763, "1.20/1.20.1", new VersionRange("1.20", 0, 1)); public static final ProtocolVersion v1_20_2 = register(764, "1.20.2"); - public static final ProtocolVersion v1_20_3 = register(765, 161, "1.20.3"); + public static final ProtocolVersion v1_20_3 = register(765, 162, "1.20.3"); public static final ProtocolVersion unknown = register(-1, "UNKNOWN"); public static ProtocolVersion register(int version, String name) { diff --git a/api/src/main/java/com/viaversion/viaversion/api/type/Type.java b/api/src/main/java/com/viaversion/viaversion/api/type/Type.java index 616cdfb81..e4b4be357 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/Type.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/Type.java @@ -247,9 +247,6 @@ public abstract class Type implements ByteBufReader, ByteBufWriter { @Override public String toString() { - return "Type{" + - "outputClass=" + outputClass + - ", typeName='" + typeName + '\'' + - '}'; + return getTypeName(); } } diff --git a/api/src/main/java/com/viaversion/viaversion/api/type/types/misc/ParticleType.java b/api/src/main/java/com/viaversion/viaversion/api/type/types/misc/ParticleType.java index 577f7d776..9bebe9c54 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/types/misc/ParticleType.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/types/misc/ParticleType.java @@ -83,8 +83,9 @@ public class ParticleType extends Type { public static final ParticleReader BLOCK = (buf, particle) -> { particle.add(Type.VAR_INT, Type.VAR_INT.readPrimitive(buf)); // Flat Block }; - public static final ParticleReader ITEM = itemHandler(Type.ITEM1_13); - public static final ParticleReader VAR_INT_ITEM = itemHandler(Type.ITEM1_13_2); + public static final ParticleReader ITEM1_13 = itemHandler(Type.ITEM1_13); + public static final ParticleReader ITEM1_13_2 = itemHandler(Type.ITEM1_13_2); + public static final ParticleReader ITEM1_20_2 = itemHandler(Type.ITEM1_20_2); public static final ParticleReader DUST = (buf, particle) -> { particle.add(Type.FLOAT, Type.FLOAT.readPrimitive(buf)); // Red 0-1 particle.add(Type.FLOAT, Type.FLOAT.readPrimitive(buf)); // Green 0-1 @@ -131,6 +132,19 @@ public class ParticleType extends Type { } particle.add(Type.VAR_INT, Type.VAR_INT.readPrimitive(buf)); // Arrival in ticks }; + public static final ParticleReader VIBRATION1_20_3 = (buf, particle) -> { + final int sourceTypeId = Type.VAR_INT.readPrimitive(buf); + particle.add(Type.VAR_INT, sourceTypeId); + if (sourceTypeId == 0) { // Block + particle.add(Type.POSITION1_14, Type.POSITION1_14.read(buf)); // Target block pos + } else if (sourceTypeId == 1) { // Entity + particle.add(Type.VAR_INT, Type.VAR_INT.readPrimitive(buf)); // Target entity + particle.add(Type.FLOAT, Type.FLOAT.readPrimitive(buf)); // Y offset + } else { + Via.getPlatform().getLogger().warning("Unknown vibration path position source type: " + sourceTypeId); + } + particle.add(Type.VAR_INT, Type.VAR_INT.readPrimitive(buf)); // Arrival in ticks + }; public static final ParticleReader SCULK_CHARGE = (buf, particle) -> { particle.add(Type.FLOAT, Type.FLOAT.readPrimitive(buf)); // Roll }; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java index 60822d519..f00fa1adc 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java @@ -855,7 +855,7 @@ public class Protocol1_13To1_12_2 extends AbstractProtocol { @@ -50,8 +54,73 @@ public final class BlockItemPacketRewriter1_20_3 extends ItemRewriter(protocol).register(ClientboundPackets1_20_2.DECLARE_RECIPES); + protocol.registerClientbound(ClientboundPackets1_20_2.SPAWN_PARTICLE, new PacketHandlers() { + @Override + public void register() { + map(Type.VAR_INT); // 0 - Particle ID + map(Type.BOOLEAN); // 1 - Long Distance + map(Type.DOUBLE); // 2 - X + map(Type.DOUBLE); // 3 - Y + map(Type.DOUBLE); // 4 - Z + map(Type.FLOAT); // 5 - Offset X + map(Type.FLOAT); // 6 - Offset Y + map(Type.FLOAT); // 7 - Offset Z + map(Type.FLOAT); // 8 - Particle Data + map(Type.INT); // 9 - Particle Count + handler(wrapper -> { + final int id = wrapper.get(Type.VAR_INT, 0); + final ParticleMappings particleMappings = protocol.getMappingData().getParticleMappings(); + if (id == particleMappings.id("vibration")) { + final String resourceLocation = Key.stripMinecraftNamespace(wrapper.read(Type.STRING)); + wrapper.write(Type.VAR_INT, resourceLocation.equals("block") ? 0 : 1); + } + }); + handler(getSpawnParticleHandler(Type.VAR_INT)); + } + }); + + new RecipeRewriter1_20_2(protocol) { + @Override + public void handleCraftingShaped(final PacketWrapper wrapper) throws Exception { + // Move width and height down + final int width = wrapper.read(Type.VAR_INT); + final int height = wrapper.read(Type.VAR_INT); + + wrapper.passthrough(Type.STRING); // Group + wrapper.passthrough(Type.VAR_INT); // Crafting book category + + wrapper.write(Type.VAR_INT, width); + wrapper.write(Type.VAR_INT, height); + final int ingredients = height * width; + for (int i = 0; i < ingredients; i++) { + handleIngredient(wrapper); + } + rewrite(wrapper.passthrough(itemType())); // Result + wrapper.passthrough(Type.BOOLEAN); // Show notification + } + }.register(ClientboundPackets1_20_2.DECLARE_RECIPES); + + protocol.registerClientbound(ClientboundPackets1_20_2.EXPLOSION, wrapper -> { + wrapper.passthrough(Type.DOUBLE); // X + wrapper.passthrough(Type.DOUBLE); // Y + wrapper.passthrough(Type.DOUBLE); // Z + wrapper.passthrough(Type.FLOAT); // Power + final int blocks = wrapper.passthrough(Type.VAR_INT); + for (int i = 0; i < blocks; i++) { + wrapper.passthrough(Type.BYTE); // Relative X + wrapper.passthrough(Type.BYTE); // Relative Y + wrapper.passthrough(Type.BYTE); // Relative Z + } + wrapper.passthrough(Type.FLOAT); // Knockback X + wrapper.passthrough(Type.FLOAT); // Knockback Y + wrapper.passthrough(Type.FLOAT); // Knockback Z + + wrapper.write(Type.VAR_INT, 1); // Block interaction type - Destroy + wrapper.write(Type.VAR_INT, protocol.getMappingData().getParticleMappings().mappedId("explosion")); // Small explosion particle + wrapper.write(Type.VAR_INT, protocol.getMappingData().getParticleMappings().mappedId("explosion_emitter")); // Large explosion particle + wrapper.write(Type.STRING, "minecraft:entity.generic.explode"); // Explosion sound + wrapper.write(Type.OPTIONAL_FLOAT, null); // Sound range + }); } } \ No newline at end of file diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/EntityPacketRewriter1_20_3.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/EntityPacketRewriter1_20_3.java index 0d5292224..4fcc6c23b 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/EntityPacketRewriter1_20_3.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/EntityPacketRewriter1_20_3.java @@ -17,8 +17,10 @@ */ package com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.rewriter; +import com.viaversion.viaversion.api.data.ParticleMappings; +import com.viaversion.viaversion.api.minecraft.Particle; import com.viaversion.viaversion.api.minecraft.entities.EntityType; -import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_19_4; +import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_20_3; import com.viaversion.viaversion.api.minecraft.metadata.MetaType; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.protocol.packet.State; @@ -31,6 +33,7 @@ import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.Clientbou import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.Protocol1_20_3To1_20_2; import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundPackets1_20_3; import com.viaversion.viaversion.rewriter.EntityRewriter; +import com.viaversion.viaversion.util.Key; public final class EntityPacketRewriter1_20_3 extends EntityRewriter { @@ -40,7 +43,7 @@ public final class EntityPacketRewriter1_20_3 extends EntityRewriterremoveArgument(0).getValue(); + if (Key.stripMinecraftNamespace(resourceLocation).equals("block")) { + particle.add(0, Type.VAR_INT, 0); + } else { // Entity + particle.add(0, Type.VAR_INT, 1); + } + } + + rewriteParticle(particle); + meta.setMetaType(Types1_20_3.META_TYPES.particleType); } else { meta.setMetaType(Types1_20_3.META_TYPES.byId(type.typeId())); } @@ -114,14 +132,19 @@ public final class EntityPacketRewriter1_20_3 extends EntityRewriter { + filter().filterFamily(EntityTypes1_20_3.MINECART_ABSTRACT).index(11).handler((event, meta) -> { final int blockState = meta.value(); meta.setValue(protocol.getMappingData().getNewBlockStateId(blockState)); }); } + @Override + public void onMappingDataLoaded() { + mapTypes(); + } + @Override public EntityType typeFromId(final int type) { - return EntityTypes1_19_4.getTypeFromId(type); + return EntityTypes1_20_3.getTypeFromId(type); } } \ No newline at end of file diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/RecipeRewriter1_20_3.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/RecipeRewriter1_20_3.java new file mode 100644 index 000000000..cc09817d5 --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/RecipeRewriter1_20_3.java @@ -0,0 +1,54 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2023 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.rewriter; + +import com.viaversion.viaversion.api.minecraft.item.Item; +import com.viaversion.viaversion.api.protocol.Protocol; +import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; +import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; +import com.viaversion.viaversion.api.type.Type; +import com.viaversion.viaversion.protocols.protocol1_19_4to1_19_3.rewriter.RecipeRewriter1_19_4; + +public class RecipeRewriter1_20_3 extends RecipeRewriter1_19_4 { + + public RecipeRewriter1_20_3(final Protocol protocol) { + super(protocol); + } + + @Override + public void handleCraftingShaped(final PacketWrapper wrapper) throws Exception { + wrapper.passthrough(Type.STRING); // Group + wrapper.passthrough(Type.VAR_INT); // Crafting book category + final int ingredients = wrapper.passthrough(Type.VAR_INT) * wrapper.passthrough(Type.VAR_INT); + for (int i = 0; i < ingredients; i++) { + handleIngredient(wrapper); + } + rewrite(wrapper.passthrough(itemType())); // Result + wrapper.passthrough(Type.BOOLEAN); // Show notification + } + + @Override + protected Type itemType() { + return Type.ITEM1_20_2; + } + + @Override + protected Type itemArrayType() { + return Type.ITEM1_20_2_ARRAY; + } +} \ No newline at end of file diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20to1_19_4/Protocol1_20To1_19_4.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20to1_19_4/Protocol1_20To1_19_4.java index 1625f8c25..0917cea76 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20to1_19_4/Protocol1_20To1_19_4.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20to1_19_4/Protocol1_20To1_19_4.java @@ -76,7 +76,7 @@ public final class Protocol1_20To1_19_4 extends AbstractProtocol(protocol).register(ClientboundPackets1_20_2.DECLARE_RECIPES); + new RecipeRewriter1_20_3<>(protocol).register(ClientboundPackets1_20_2.DECLARE_RECIPES); // OR do this if serialization of recipes changed and override the relevant method // Add new serializers to RecipeRewriter, or extend the last one for changes // new RecipeRewriter1_20_2(this) {}.register(ClientboundPackets1_20_2.DECLARE_RECIPES); diff --git a/template/src/main/java/com/viaversion/viaversion/template/protocols/rewriter/EntityPacketRewriter1_99.java b/template/src/main/java/com/viaversion/viaversion/template/protocols/rewriter/EntityPacketRewriter1_99.java index ad9b21c3f..d81ab7ff7 100644 --- a/template/src/main/java/com/viaversion/viaversion/template/protocols/rewriter/EntityPacketRewriter1_99.java +++ b/template/src/main/java/com/viaversion/viaversion/template/protocols/rewriter/EntityPacketRewriter1_99.java @@ -17,8 +17,8 @@ */ package com.viaversion.viaversion.template.protocols.rewriter; -import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_19_4; import com.viaversion.viaversion.api.minecraft.entities.EntityType; +import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_20_3; import com.viaversion.viaversion.api.protocol.packet.State; import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers; import com.viaversion.viaversion.api.type.Type; @@ -40,7 +40,7 @@ public final class EntityPacketRewriter1_99 extends EntityRewriter { + filter().filterFamily(EntityTypes1_20_3.MINECART_ABSTRACT).index(11).handler((event, meta) -> { final int blockState = meta.value(); meta.setValue(protocol.getMappingData().getNewBlockStateId(blockState)); }); @@ -115,6 +115,6 @@ public final class EntityPacketRewriter1_99 extends EntityRewriter