From 06da2fe2d525ab9cf36bb57206fbfb8610bca64d Mon Sep 17 00:00:00 2001 From: RedxAx Date: Fri, 2 Jan 2026 22:09:01 +0300 Subject: [PATCH] feat: integrate mapping reloads into the reload command --- .../java/org/geysermc/geyser/GeyserImpl.java | 10 ++++++++++ .../geyser/registry/ArrayRegistry.java | 6 ++++++ .../geyser/registry/BlockRegistries.java | 17 +++++++++++++++++ .../geyser/registry/DeferredRegistry.java | 8 ++++++++ .../geysermc/geyser/registry/IRegistry.java | 8 ++++++++ .../geysermc/geyser/registry/Registries.java | 8 ++++++++ .../geysermc/geyser/registry/Registry.java | 19 +++++++++++++++++++ 7 files changed, 76 insertions(+) diff --git a/core/src/main/java/org/geysermc/geyser/GeyserImpl.java b/core/src/main/java/org/geysermc/geyser/GeyserImpl.java index ed9d6c90cbb..b8c386ee338 100644 --- a/core/src/main/java/org/geysermc/geyser/GeyserImpl.java +++ b/core/src/main/java/org/geysermc/geyser/GeyserImpl.java @@ -83,6 +83,7 @@ import org.geysermc.geyser.level.WorldManager; import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.network.netty.GeyserServer; +import org.geysermc.geyser.pack.SkullResourcePackManager; import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough; import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.registry.Registries; @@ -305,6 +306,10 @@ private void startInstance() { if (isReloading) { // If we're reloading, the default locale in the config might have changed. GeyserLocale.finalizeDefaultLocale(this); + + Registries.load(); + BlockRegistries.populate(); + Registries.populate(); } else { CodeOfConductManager.load(); } @@ -777,6 +782,11 @@ public void reloadGeyser() { this.eventBus.fire(new GeyserPreReloadEvent(this.extensionManager, this.eventBus)); bootstrap.onGeyserDisable(); + + BlockRegistries.reset(); + Registries.reset(); + SkullResourcePackManager.SKULL_SKINS.clear(); + bootstrap.onGeyserEnable(); isReloading = false; diff --git a/core/src/main/java/org/geysermc/geyser/registry/ArrayRegistry.java b/core/src/main/java/org/geysermc/geyser/registry/ArrayRegistry.java index 3df3ded58c5..b5536da613c 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/ArrayRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/registry/ArrayRegistry.java @@ -28,6 +28,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.registry.loader.RegistryLoader; +import java.util.Arrays; import java.util.function.Supplier; /** @@ -148,4 +149,9 @@ public static ArrayRegistry create(RegistryLoader registryLoad public static ArrayRegistry create(I input, RegistryLoader registryLoader) { return new ArrayRegistry<>(input, registryLoader); } + + @Override + public void clear() { + Arrays.fill(this.mappings, null); + } } diff --git a/core/src/main/java/org/geysermc/geyser/registry/BlockRegistries.java b/core/src/main/java/org/geysermc/geyser/registry/BlockRegistries.java index e0e61bdce11..fcfd045ab7f 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/BlockRegistries.java +++ b/core/src/main/java/org/geysermc/geyser/registry/BlockRegistries.java @@ -148,4 +148,21 @@ public static void populate() { BlockRegistryPopulator.populate(BlockRegistryPopulator.Stage.INIT_BEDROCK); BlockRegistryPopulator.populate(BlockRegistryPopulator.Stage.POST_INIT); } + + public static void reset() { + BLOCKS.clear(); + JAVA_BLOCK_STATE_IDENTIFIER_TO_ID.clear(); + NON_VANILLA_BLOCK_IDS.clear(); + WATERLOGGED.clear(); + INTERACTIVE.clear(); + INTERACTIVE_MAY_BUILD.clear(); + CUSTOM_BLOCKS.clear(); + CUSTOM_BLOCK_STATE_OVERRIDES.clear(); + NON_VANILLA_BLOCK_STATE_OVERRIDES.clear(); + CUSTOM_BLOCK_ITEM_OVERRIDES.clear(); + EXTENDED_COLLISION_BOXES.clear(); + CUSTOM_SKULLS.clear(); + + COLLISIONS.clear(); + } } diff --git a/core/src/main/java/org/geysermc/geyser/registry/DeferredRegistry.java b/core/src/main/java/org/geysermc/geyser/registry/DeferredRegistry.java index f4273edeaf9..64923a67bb1 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/DeferredRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/registry/DeferredRegistry.java @@ -123,6 +123,14 @@ public boolean loaded() { return this.loaded; } + @Override + public void clear() { + if (!this.loaded) { + return; + } + this.backingRegistry.clear(); + } + /** * A registry initializer. * diff --git a/core/src/main/java/org/geysermc/geyser/registry/IRegistry.java b/core/src/main/java/org/geysermc/geyser/registry/IRegistry.java index fdb5f8c7701..96555b380bf 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/IRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/registry/IRegistry.java @@ -57,4 +57,12 @@ interface IRegistry { * @param consumer the consumer */ void register(Consumer consumer); + + /** + * Clears The Underlying Mappings. + * Throws {@link UnsupportedOperationException} When The Registry Doesn't Support It. + */ + default void clear() { + throw new UnsupportedOperationException("Registry does not support clear."); + } } diff --git a/core/src/main/java/org/geysermc/geyser/registry/Registries.java b/core/src/main/java/org/geysermc/geyser/registry/Registries.java index 5aed0d5a517..9067de14ae7 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/Registries.java +++ b/core/src/main/java/org/geysermc/geyser/registry/Registries.java @@ -239,6 +239,14 @@ public static void load() { DANGEROUS_ENTITIES.load(); } + public static void reset() { + loaded = false; + + ITEMS.clear(); + TAGS.clear(); + POTION_MIXES.clear(); + } + public static void populate() { PacketRegistryPopulator.populate(); DataComponentRegistryPopulator.populate(); diff --git a/core/src/main/java/org/geysermc/geyser/registry/Registry.java b/core/src/main/java/org/geysermc/geyser/registry/Registry.java index 8a82af05386..c330f7ace72 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/Registry.java +++ b/core/src/main/java/org/geysermc/geyser/registry/Registry.java @@ -25,6 +25,9 @@ package org.geysermc.geyser.registry; +import java.util.BitSet; +import java.util.Collection; +import java.util.Map; import java.util.function.Consumer; import org.geysermc.geyser.registry.loader.RegistryLoader; @@ -110,4 +113,20 @@ public void set(M mappings) { public void register(Consumer consumer) { consumer.accept(this.mappings); } + + /** + * Clears The Mappings. + */ + @Override + public void clear() { + if (this.mappings instanceof Collection) { + ((Collection) this.mappings).clear(); + } else if (this.mappings instanceof Map) { + ((Map) this.mappings).clear(); + } else if (this.mappings instanceof BitSet) { + ((BitSet) this.mappings).clear(); + } else { + throw new UnsupportedOperationException("Cannot clear registry of type " + (this.mappings == null ? "null" : this.mappings.getClass().getName())); + } + } }