From 6c4b2cb173bb5e36396a3ee031286ee2ab3f8ed4 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Wed, 15 May 2024 13:40:57 -0400 Subject: [PATCH] Don't create a property manager if an entity has no properties --- .../geysermc/geyser/entity/type/Entity.java | 4 +- .../java/JavaSelectKnownPacksTranslator.java | 62 +++++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaSelectKnownPacksTranslator.java diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/Entity.java b/core/src/main/java/org/geysermc/geyser/entity/type/Entity.java index fecd72f67..da9a28451 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/Entity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/Entity.java @@ -134,7 +134,7 @@ public class Entity implements GeyserEntity { this.valid = false; - this.propertyManager = new GeyserEntityPropertyManager(definition.registeredProperties()); + this.propertyManager = definition.registeredProperties() == null ? null : new GeyserEntityPropertyManager(definition.registeredProperties()); setPosition(position); setAirSupply(getMaxAir()); @@ -361,7 +361,7 @@ public class Entity implements GeyserEntity { return; } - if (propertyManager.hasProperties()) { + if (propertyManager != null && propertyManager.hasProperties()) { SetEntityDataPacket entityDataPacket = new SetEntityDataPacket(); entityDataPacket.setRuntimeEntityId(geyserId); propertyManager.applyIntProperties(entityDataPacket.getProperties().getIntProperties()); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaSelectKnownPacksTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaSelectKnownPacksTranslator.java new file mode 100644 index 000000000..6b1c8c645 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaSelectKnownPacksTranslator.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2019-2024 GeyserMC. http://geysermc.org + * + * 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. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.translator.protocol.java; + +import org.geysermc.geyser.network.GameProtocol; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.protocol.PacketTranslator; +import org.geysermc.geyser.translator.protocol.Translator; +import org.geysermc.mcprotocollib.protocol.data.game.KnownPack; +import org.geysermc.mcprotocollib.protocol.packet.configuration.clientbound.ClientboundSelectKnownPacks; +import org.geysermc.mcprotocollib.protocol.packet.configuration.serverbound.ServerboundSelectKnownPacks; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +@Translator(packet = ClientboundSelectKnownPacks.class) +public class JavaSelectKnownPacksTranslator extends PacketTranslator { + // todo: dump from client? + private static final Set KNOWN_PACK_IDS = Set.of("core", "update_1_21", "bundle", "trade_rebalance"); + + @Override + public void translate(GeyserSession session, ClientboundSelectKnownPacks packet) { + List knownPacks = new ArrayList<>(1); + for (KnownPack pack : packet.getKnownPacks()) { + if ("minecraft".equals(pack.getNamespace()) && GameProtocol.getJavaMinecraftVersion().equals(pack.getVersion())) { + // Implementation note: these won't always necessarily be equal. + // 1.20.5 versus 1.20.6 for example - same protocol version. A vanilla server for either version will gracefully accept either. + // If the versions mismatch, the registry will be sent over the network, though. + // For vanilla compliancy, to minimize network traffic, and for potential future behavior, + // We'll implement how the Java client does it. + if (KNOWN_PACK_IDS.contains(pack.getId())) { + knownPacks.add(pack); + } + } + } + session.sendDownstreamPacket(new ServerboundSelectKnownPacks(knownPacks)); + } +}