/* * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion * Copyright (C) 2016-2024 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.template.protocols.rewriter; import com.viaversion.viaversion.api.minecraft.entities.EntityType; import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_20_5; import com.viaversion.viaversion.api.protocol.packet.State; import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers; import com.viaversion.viaversion.api.type.Type; import com.viaversion.viaversion.api.type.types.version.Types1_20_5; import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundConfigurationPackets1_20_3; import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ClientboundPackets1_20_5; import com.viaversion.viaversion.rewriter.EntityRewriter; import com.viaversion.viaversion.template.protocols.Protocol1_99To_98; // Replace if needed // Types1_OLD // Types1_20_5 public final class EntityPacketRewriter1_99 extends EntityRewriter { public EntityPacketRewriter1_99(final Protocol1_99To_98 protocol) { super(protocol); } @Override public void registerPackets() { // Tracks entities, applies metadata rewrites registered below, untracks entities registerTrackerWithData1_19(ClientboundPackets1_20_5.SPAWN_ENTITY, EntityTypes1_20_5.FALLING_BLOCK); registerMetadataRewriter(ClientboundPackets1_20_5.ENTITY_METADATA, /*Types1_OLD.METADATA_LIST, */Types1_20_5.METADATA_LIST); // Specify old and new metadata list if changed registerRemoveEntities(ClientboundPackets1_20_5.REMOVE_ENTITIES); protocol.registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_3.REGISTRY_DATA, new PacketHandlers() { @Override protected void register() { map(Type.STRING); // Registry map(Type.REGISTRY_ENTRY_ARRAY); // Data handler(registryDataHandler1_20_5()); // Caches dimensions to access data like height later and tracks the amount of biomes sent for chunk data } }); protocol.registerClientbound(ClientboundPackets1_20_5.JOIN_GAME, new PacketHandlers() { @Override public void register() { map(Type.INT); // Entity id map(Type.BOOLEAN); // Hardcore map(Type.STRING_ARRAY); // World List map(Type.VAR_INT); // Max players map(Type.VAR_INT); // View distance map(Type.VAR_INT); // Simulation distance map(Type.BOOLEAN); // Reduced debug info map(Type.BOOLEAN); // Show death screen map(Type.BOOLEAN); // Limited crafting map(Type.VAR_INT); // Dimension id map(Type.STRING); // World handler(worldDataTrackerHandlerByKey1_20_5(3)); // Tracks world height and name for chunk data and entity (un)tracking } }); protocol.registerClientbound(ClientboundPackets1_20_5.RESPAWN, new PacketHandlers() { @Override public void register() { map(Type.VAR_INT); // Dimension map(Type.STRING); // World handler(worldDataTrackerHandlerByKey1_20_5(0)); // Tracks world height and name for chunk data and entity (un)tracking } }); } @Override protected void registerRewrites() { /* Uncomment if metatype classes changed filter().mapMetaType(typeId -> { final int id = typeId; if (id >= SomeAddedIndex) { id++; } return Types1_20_5.META_TYPES.byId(id); });*/ // Registers registry type id changes registerMetaTypeHandler( Types1_20_5.META_TYPES.itemType, Types1_20_5.META_TYPES.blockStateType, Types1_20_5.META_TYPES.optionalBlockStateType, Types1_20_5.META_TYPES.particleType ); // Minecarts are special filter().type(EntityTypes1_20_5.MINECART_ABSTRACT).index(11).handler((event, meta) -> { final int blockState = meta.value(); meta.setValue(protocol.getMappingData().getNewBlockStateId(blockState)); }); } @Override public void onMappingDataLoaded() { // IF ENTITY TYPES CHANGED: Automatically map entity id changes AFTER entity ids have been loaded mapTypes(); } @Override public EntityType typeFromId(final int type) { return EntityTypes1_20_5.getTypeFromId(type); } }