/* * 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.template.protocols.rewriter; 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; import com.viaversion.viaversion.api.type.types.version.Types1_20_3; import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundConfigurationPackets1_20_3; import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundPackets1_20_3; import com.viaversion.viaversion.rewriter.EntityRewriter; import com.viaversion.viaversion.template.protocols.Protocol1_99To_98; // Replace if needed // Types1_OLD // Types1_20_3 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_3.SPAWN_ENTITY, EntityTypes1_20_3.FALLING_BLOCK); registerMetadataRewriter(ClientboundPackets1_20_3.ENTITY_METADATA, /*Types1_OLD.METADATA_LIST, */Types1_20_3.METADATA_LIST); // Specify old and new metadata list if changed registerRemoveEntities(ClientboundPackets1_20_3.REMOVE_ENTITIES); protocol.registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_3.REGISTRY_DATA, new PacketHandlers() { @Override protected void register() { map(Type.COMPOUND_TAG); // Registry data handler(configurationDimensionDataHandler()); // Caches dimensions to access data like height later handler(configurationBiomeSizeTracker()); // Tracks the amount of biomes sent for chunk data } }); protocol.registerClientbound(ClientboundPackets1_20_3.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.STRING); // Dimension key map(Type.STRING); // World handler(worldDataTrackerHandlerByKey()); // Tracks world height and name for chunk data and entity (un)tracking } }); protocol.registerClientbound(ClientboundPackets1_20_3.RESPAWN, new PacketHandlers() { @Override public void register() { map(Type.STRING); // Dimension map(Type.STRING); // World handler(worldDataTrackerHandlerByKey()); // Tracks world height and name for chunk data and entity (un)tracking } }); } @Override protected void registerRewrites() { /* Uncomment if metatype classes changed filter().handler((event, meta) -> { int id = meta.metaType().typeId(); if (id >= SomeAddedIndex) { id++; } meta.setMetaType(Types1_20_3.META_TYPES.byId(id)); });*/ // Registers registry type id changes registerMetaTypeHandler( Types1_20_3.META_TYPES.itemType, Types1_20_3.META_TYPES.blockStateType, Types1_20_3.META_TYPES.optionalBlockStateType, Types1_20_3.META_TYPES.particleType ); // Minecarts are special 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() { // 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_3.getTypeFromId(type); } }