diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java index 86f283329..e58abc3b4 100644 --- a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java +++ b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java @@ -70,6 +70,8 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap { private GeyserImpl geyser; + private static boolean INITIALIZED = false; + @Override public void onLoad() { GeyserLocale.init(this); @@ -133,7 +135,12 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap { // Big hack - Bungee does not provide us an event to listen to, so schedule a repeating // task that waits for a field to be filled which is set after the plugin enable // process is complete - this.awaitStartupCompletion(0); + if (!INITIALIZED) { + this.awaitStartupCompletion(0); + } else { + // No need to "wait" for startup completion, just start Geyser - we're reloading. + this.postStartup(); + } } @SuppressWarnings("unchecked") @@ -166,8 +173,10 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap { private void postStartup() { GeyserImpl.start(); - this.geyserInjector = new GeyserBungeeInjector(this); - this.geyserInjector.initializeLocalChannel(this); + if (!INITIALIZED) { + this.geyserInjector = new GeyserBungeeInjector(this); + this.geyserInjector.initializeLocalChannel(this); + } this.geyserCommandManager = new GeyserCommandManager(geyser); this.geyserCommandManager.init(); @@ -187,6 +196,8 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap { } else { this.geyserBungeePingPassthrough = new GeyserBungeePingPassthrough(getProxy()); } + + INITIALIZED = true; } @Override diff --git a/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityPlugin.java b/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityPlugin.java index dbbd30c41..93b57d712 100644 --- a/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityPlugin.java +++ b/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityPlugin.java @@ -64,6 +64,11 @@ import java.util.UUID; @Plugin(id = "geyser", name = GeyserImpl.NAME + "-Velocity", version = GeyserImpl.VERSION, url = "https://geysermc.org", authors = "GeyserMC") public class GeyserVelocityPlugin implements GeyserBootstrap { + /** + * Determines if the plugin has been ran once before, including before /geyser reload. + */ + private static boolean INITIALIZED = false; + @Inject private Logger logger; @@ -114,13 +119,20 @@ public class GeyserVelocityPlugin implements GeyserBootstrap { GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger); this.geyser = GeyserImpl.load(PlatformType.VELOCITY, this); + + // Hack: Normally triggered by ListenerBoundEvent, but that doesn't fire on /geyser reload + if (INITIALIZED) { + this.postStartup(); + } } private void postStartup() { GeyserImpl.start(); - this.geyserInjector = new GeyserVelocityInjector(proxyServer); - // Will be initialized after the proxy has been bound + if (!INITIALIZED) { + this.geyserInjector = new GeyserVelocityInjector(proxyServer); + // Will be initialized after the proxy has been bound + } this.geyserCommandManager = new GeyserCommandManager(geyser); this.geyserCommandManager.init(); @@ -195,6 +207,8 @@ public class GeyserVelocityPlugin implements GeyserBootstrap { geyserInjector.initializeLocalChannel(this); } } + + INITIALIZED = true; } @Override diff --git a/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java b/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java index a88eff111..e9d49fbd8 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java +++ b/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java @@ -299,8 +299,9 @@ public final class EntityDefinitions { .build(); EntityDefinition displayBase = EntityDefinition.inherited(entityBase.factory(), entityBase) - .addTranslator(null) // Interpolation start ticks - .addTranslator(null) // Interpolation duration ID + .addTranslator(null) // Interpolation delay + .addTranslator(null) // Transformation interpolation duration + .addTranslator(null) // Position/Rotation interpolation duration .addTranslator(null) // Translation .addTranslator(null) // Scale .addTranslator(null) // Left rotation @@ -318,6 +319,10 @@ public final class EntityDefinitions { .type(EntityType.TEXT_DISPLAY) .identifier("minecraft:armor_stand") .addTranslator(MetadataType.CHAT, TextDisplayEntity::setText) + .addTranslator(null) // Line width + .addTranslator(null) // Background color + .addTranslator(null) // Text opacity + .addTranslator(null) // Bit mask .build(); INTERACTION = EntityDefinition.inherited(InteractionEntity::new, entityBase) diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockActionTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockActionTranslator.java index bff097248..611ca5824 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockActionTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockActionTranslator.java @@ -55,6 +55,7 @@ import org.geysermc.geyser.translator.inventory.item.CustomItemTranslator; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; import org.geysermc.geyser.util.BlockUtils; +import org.geysermc.geyser.util.CooldownUtils; @Translator(packet = PlayerActionPacket.class) public class BedrockActionTranslator extends PacketTranslator { @@ -281,6 +282,10 @@ public class BedrockActionTranslator extends PacketTranslator definition = Registries.ENTITY_DEFINITIONS.get(packet.getType()); if (definition == null) { - session.getGeyser().getLogger().warning("Could not find an entity definition with type " + packet.getType()); + session.getGeyser().getLogger().debug("Could not find an entity definition with type " + packet.getType()); return; } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2cba71745..9d6e390d0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ protocol-connection = "3.0.0.Beta1-20231016.115644-106" raknet = "1.0.0.CR1-20230703.195238-9" blockstateupdater="1.20.40-20231016.111746-1" mcauthlib = "d9d773e" -mcprotocollib = "1.20.2-1-20231003.141424-6" +mcprotocollib = "1.20.2-1-20231101.141901-7" adventure = "4.14.0" adventure-platform = "4.3.0" junit = "5.9.2"