diff --git a/src/main/java/carpet/fakes/MinecraftServerInterface.java b/src/main/java/carpet/fakes/MinecraftServerInterface.java index 69749c0c..6e52f69f 100644 --- a/src/main/java/carpet/fakes/MinecraftServerInterface.java +++ b/src/main/java/carpet/fakes/MinecraftServerInterface.java @@ -13,5 +13,5 @@ public interface MinecraftServerInterface void forceTick(BooleanSupplier sup); LevelStorageSource.LevelStorageAccess getCMSession(); Map, ServerLevel> getCMWorlds(); - //ServerResources getResourceManager(); + void reloadAfterReload(); } diff --git a/src/main/java/carpet/mixins/MinecraftServer_scarpetMixin.java b/src/main/java/carpet/mixins/MinecraftServer_scarpetMixin.java index d4e6776f..958dc17d 100644 --- a/src/main/java/carpet/mixins/MinecraftServer_scarpetMixin.java +++ b/src/main/java/carpet/mixins/MinecraftServer_scarpetMixin.java @@ -3,12 +3,16 @@ package carpet.mixins; import carpet.fakes.MinecraftServerInterface; import carpet.helpers.TickSpeed; import net.minecraft.Util; +import net.minecraft.core.RegistryAccess; import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.ServerFunctionManager; import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.players.PlayerList; import net.minecraft.util.thread.ReentrantBlockableEventLoop; import net.minecraft.world.level.Level; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import net.minecraft.world.level.storage.LevelStorageSource; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -46,6 +50,16 @@ public abstract class MinecraftServer_scarpetMixin extends ReentrantBlockableEve //@Shadow private ServerResources resources; + @Shadow private MinecraftServer.ReloadableResources resources; + + @Shadow public abstract RegistryAccess.Frozen registryAccess(); + + @Shadow public abstract PlayerList getPlayerList(); + + @Shadow @Final private ServerFunctionManager functionManager; + + @Shadow @Final private StructureManager structureManager; + @Override public void forceTick(BooleanSupplier isAhead) { @@ -84,5 +98,13 @@ public abstract class MinecraftServer_scarpetMixin extends ReentrantBlockableEve ENDER_TICK.onTick(); } - + @Override + public void reloadAfterReload() + { + resources.managers().updateRegistryTags(registryAccess()); + getPlayerList().saveAll(); + getPlayerList().reloadResources(); + functionManager.replaceLibrary(this.resources.managers().getFunctionLibrary()); + structureManager.onResourceManagerReload(this.resources.resourceManager()); + } } diff --git a/src/main/java/carpet/script/api/Auxiliary.java b/src/main/java/carpet/script/api/Auxiliary.java index 03c47d4f..735751a6 100644 --- a/src/main/java/carpet/script/api/Auxiliary.java +++ b/src/main/java/carpet/script/api/Auxiliary.java @@ -1144,6 +1144,7 @@ public class Auxiliary { addeds.add(ValueConversions.of(registryKey.location())); } } + ((MinecraftServerInterface)server).reloadAfterReload(); return ListValue.wrap(addeds); }); } diff --git a/src/main/resources/carpet.accesswidener b/src/main/resources/carpet.accesswidener index a606eb87..e355395a 100644 --- a/src/main/resources/carpet.accesswidener +++ b/src/main/resources/carpet.accesswidener @@ -4,3 +4,4 @@ accessible class net/minecraft/server/level/ChunkMap$DistanceManager accessible class net/minecraft/server/level/ThreadedLevelLightEngine$TaskType accessible class net/minecraft/world/item/crafting/Ingredient$Value accessible class net/minecraft/world/level/lighting/BlockLightSectionStorage$BlockDataLayerStorageMap +accessible class net/minecraft/server/MinecraftServer$ReloadableResources