From abb57db9714d6d2e339942e6a3070238803d0c95 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sun, 1 Nov 2020 22:42:36 +0800 Subject: [PATCH] Command registry events and ReloadListenerRegistry --- .../events/CommandRegistrationEvent.java | 12 ++++++ .../architectury/event/events/GuiEvent.java | 4 ++ .../registry/ReloadListenerRegistry.java | 25 +++++++++++ .../event/fabric/EventFactoryImpl.java | 8 ++-- .../fabric/ReloadListenerRegistryImpl.java | 43 +++++++++++++++++++ .../event/forge/EventFactoryImpl.java | 11 +++-- .../forge/ReloadListenerRegistryImpl.java | 40 +++++++++++++++++ 7 files changed, 135 insertions(+), 8 deletions(-) create mode 100644 common/src/main/java/me/shedaniel/architectury/event/events/CommandRegistrationEvent.java create mode 100644 common/src/main/java/me/shedaniel/architectury/registry/ReloadListenerRegistry.java create mode 100644 fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ReloadListenerRegistryImpl.java create mode 100644 forge/src/main/java/me/shedaniel/architectury/registry/forge/ReloadListenerRegistryImpl.java diff --git a/common/src/main/java/me/shedaniel/architectury/event/events/CommandRegistrationEvent.java b/common/src/main/java/me/shedaniel/architectury/event/events/CommandRegistrationEvent.java new file mode 100644 index 00000000..4ff4e412 --- /dev/null +++ b/common/src/main/java/me/shedaniel/architectury/event/events/CommandRegistrationEvent.java @@ -0,0 +1,12 @@ +package me.shedaniel.architectury.event.events; + +import com.mojang.brigadier.CommandDispatcher; +import me.shedaniel.architectury.event.Event; +import me.shedaniel.architectury.event.EventFactory; +import net.minecraft.commands.CommandSourceStack; + +public interface CommandRegistrationEvent { + Event EVENT = EventFactory.createLoop(CommandRegistrationEvent.class); + + void register(CommandDispatcher var1); +} diff --git a/common/src/main/java/me/shedaniel/architectury/event/events/GuiEvent.java b/common/src/main/java/me/shedaniel/architectury/event/events/GuiEvent.java index 338d15a0..c83530c5 100644 --- a/common/src/main/java/me/shedaniel/architectury/event/events/GuiEvent.java +++ b/common/src/main/java/me/shedaniel/architectury/event/events/GuiEvent.java @@ -19,10 +19,14 @@ package me.shedaniel.architectury.event.events; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.architectury.event.Event; import me.shedaniel.architectury.event.EventFactory; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +@Environment(EnvType.CLIENT) public interface GuiEvent { Event RENDER_HUD = EventFactory.createLoop(RenderHud.class); + @Environment(EnvType.CLIENT) interface RenderHud { void renderHud(PoseStack matrices, float tickDelta); } diff --git a/common/src/main/java/me/shedaniel/architectury/registry/ReloadListenerRegistry.java b/common/src/main/java/me/shedaniel/architectury/registry/ReloadListenerRegistry.java new file mode 100644 index 00000000..077b19b4 --- /dev/null +++ b/common/src/main/java/me/shedaniel/architectury/registry/ReloadListenerRegistry.java @@ -0,0 +1,25 @@ +package me.shedaniel.architectury.registry; + +import me.shedaniel.architectury.ArchitecturyPopulator; +import me.shedaniel.architectury.Populatable; +import net.minecraft.server.packs.PackType; +import net.minecraft.server.packs.resources.PreparableReloadListener; + +public final class ReloadListenerRegistry { + private ReloadListenerRegistry() {} + + @Populatable + private static final Impl IMPL = null; + + public static void registerReloadListener(PackType type, PreparableReloadListener listener) { + IMPL.registerReloadListener(type, listener); + } + + public interface Impl { + void registerReloadListener(PackType type, PreparableReloadListener listener); + } + + static { + ArchitecturyPopulator.populate(ReloadListenerRegistry.class); + } +} diff --git a/fabric/src/main/java/me/shedaniel/architectury/event/fabric/EventFactoryImpl.java b/fabric/src/main/java/me/shedaniel/architectury/event/fabric/EventFactoryImpl.java index d9d0b14d..f8756e49 100644 --- a/fabric/src/main/java/me/shedaniel/architectury/event/fabric/EventFactoryImpl.java +++ b/fabric/src/main/java/me/shedaniel/architectury/event/fabric/EventFactoryImpl.java @@ -17,14 +17,12 @@ package me.shedaniel.architectury.event.fabric; import me.shedaniel.architectury.event.EventFactory; -import me.shedaniel.architectury.event.events.GuiEvent; -import me.shedaniel.architectury.event.events.LifecycleEvent; -import me.shedaniel.architectury.event.events.TickEvent; -import me.shedaniel.architectury.event.events.TooltipEvent; +import me.shedaniel.architectury.event.events.*; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; +import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; @@ -54,6 +52,8 @@ public class EventFactoryImpl implements EventFactory.Impl { ServerTickEvents.END_SERVER_TICK.register(TickEvent.SERVER_POST.invoker()::tick); ServerTickEvents.START_WORLD_TICK.register(TickEvent.SERVER_WORLD_PRE.invoker()::tick); ServerTickEvents.END_WORLD_TICK.register(TickEvent.SERVER_WORLD_POST.invoker()::tick); + + CommandRegistrationCallback.EVENT.register((commandDispatcher, b) -> CommandRegistrationEvent.EVENT.invoker().register(commandDispatcher)); } @Override diff --git a/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ReloadListenerRegistryImpl.java b/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ReloadListenerRegistryImpl.java new file mode 100644 index 00000000..623b908d --- /dev/null +++ b/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ReloadListenerRegistryImpl.java @@ -0,0 +1,43 @@ +package me.shedaniel.architectury.registry.fabric; + +import com.google.common.primitives.Longs; +import me.shedaniel.architectury.registry.ReloadListenerRegistry; +import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; +import net.fabricmc.fabric.api.resource.ResourceManagerHelper; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.PackType; +import net.minecraft.server.packs.resources.PreparableReloadListener; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.util.profiling.ProfilerFiller; +import org.apache.commons.lang3.StringUtils; + +import java.security.SecureRandom; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; + +public class ReloadListenerRegistryImpl implements ReloadListenerRegistry.Impl { + private static final SecureRandom RANDOM = new SecureRandom(); + + @Override + public void registerReloadListener(PackType type, PreparableReloadListener listener) { + byte[] bytes = new byte[8]; + RANDOM.nextBytes(bytes); + ResourceLocation id = new ResourceLocation("architectury:reload_" + StringUtils.leftPad(Math.abs(Longs.fromByteArray(bytes)) + "", 19)); + ResourceManagerHelper.get(type).registerReloadListener(new IdentifiableResourceReloadListener() { + @Override + public ResourceLocation getFabricId() { + return id; + } + + @Override + public String getName() { + return listener.getName(); + } + + @Override + public CompletableFuture reload(PreparationBarrier preparationBarrier, ResourceManager resourceManager, ProfilerFiller profilerFiller, ProfilerFiller profilerFiller2, Executor executor, Executor executor2) { + return listener.reload(preparationBarrier, resourceManager, profilerFiller, profilerFiller2, executor, executor2); + } + }); + } +} diff --git a/forge/src/main/java/me/shedaniel/architectury/event/forge/EventFactoryImpl.java b/forge/src/main/java/me/shedaniel/architectury/event/forge/EventFactoryImpl.java index a189f739..3a8fda35 100644 --- a/forge/src/main/java/me/shedaniel/architectury/event/forge/EventFactoryImpl.java +++ b/forge/src/main/java/me/shedaniel/architectury/event/forge/EventFactoryImpl.java @@ -17,16 +17,14 @@ package me.shedaniel.architectury.event.forge; import me.shedaniel.architectury.event.EventFactory; -import me.shedaniel.architectury.event.events.GuiEvent; -import me.shedaniel.architectury.event.events.LifecycleEvent; -import me.shedaniel.architectury.event.events.TickEvent; -import me.shedaniel.architectury.event.events.TooltipEvent; +import me.shedaniel.architectury.event.events.*; import net.minecraft.client.Minecraft; import net.minecraft.world.server.ServerWorld; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.RegisterCommandsEvent; import net.minecraftforge.event.TickEvent.ClientTickEvent; import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.event.TickEvent.ServerTickEvent; @@ -115,6 +113,11 @@ public class EventFactoryImpl implements EventFactory.Impl { public static void event(FMLServerStoppedEvent event) { LifecycleEvent.SERVER_STOPPED.invoker().stateChanged(event.getServer()); } + + @SubscribeEvent + public static void event(RegisterCommandsEvent event) { + CommandRegistrationEvent.EVENT.invoker().register(event.getDispatcher()); + } } @OnlyIn(Dist.DEDICATED_SERVER) diff --git a/forge/src/main/java/me/shedaniel/architectury/registry/forge/ReloadListenerRegistryImpl.java b/forge/src/main/java/me/shedaniel/architectury/registry/forge/ReloadListenerRegistryImpl.java new file mode 100644 index 00000000..9b58cffb --- /dev/null +++ b/forge/src/main/java/me/shedaniel/architectury/registry/forge/ReloadListenerRegistryImpl.java @@ -0,0 +1,40 @@ +package me.shedaniel.architectury.registry.forge; + +import com.google.common.collect.Lists; +import me.shedaniel.architectury.registry.ReloadListenerRegistry; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.IFutureReloadListener; +import net.minecraft.resources.IReloadableResourceManager; +import net.minecraft.resources.ResourcePackType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.AddReloadListenerEvent; + +import java.util.List; + +public class ReloadListenerRegistryImpl implements ReloadListenerRegistry.Impl { + private List serverDataReloadListeners = Lists.newArrayList(); + + public ReloadListenerRegistryImpl() { + MinecraftForge.EVENT_BUS.addListener(event -> { + for (IFutureReloadListener listener : serverDataReloadListeners) { + event.addListener(listener); + } + }); + } + + @Override + public void registerReloadListener(ResourcePackType type, IFutureReloadListener listener) { + if (type == ResourcePackType.SERVER_DATA) { + serverDataReloadListeners.add(listener); + } else if (type == ResourcePackType.CLIENT_RESOURCES) { + reloadClientReloadListener(listener); + } + } + + @OnlyIn(Dist.CLIENT) + private void reloadClientReloadListener(IFutureReloadListener listener) { + ((IReloadableResourceManager) Minecraft.getInstance().getResourceManager()).registerReloadListener(listener); + } +}