diff --git a/common/src/main/java/dev/architectury/event/events/client/ClientLifecycleEvent.java b/common/src/main/java/dev/architectury/event/events/client/ClientLifecycleEvent.java
index 742589fa..34378d04 100644
--- a/common/src/main/java/dev/architectury/event/events/client/ClientLifecycleEvent.java
+++ b/common/src/main/java/dev/architectury/event/events/client/ClientLifecycleEvent.java
@@ -48,6 +48,10 @@ public interface ClientLifecycleEvent {
* Invoked once client setup has begun.
*
This happens during {@code FMLClientSetupEvent} on Forge,
* or when Architectury API's client entrypoint initialises on Fabric.
+ *
+ * Registries should have been initialised by this point, but there
+ * are no such guarantees, as you can modify the registry beyond this point
+ * on non-Forge environments.
*/
Event CLIENT_SETUP = EventFactory.createLoop();
diff --git a/common/src/main/java/dev/architectury/event/events/common/LifecycleEvent.java b/common/src/main/java/dev/architectury/event/events/common/LifecycleEvent.java
index 8a7ed49a..1bdf461e 100644
--- a/common/src/main/java/dev/architectury/event/events/common/LifecycleEvent.java
+++ b/common/src/main/java/dev/architectury/event/events/common/LifecycleEvent.java
@@ -88,6 +88,16 @@ public interface LifecycleEvent {
* @see ServerLevelState#act(Level)
*/
Event SERVER_LEVEL_SAVE = EventFactory.createLoop();
+ /**
+ * Invoked once common setup has begun.
+ * This happens during {@code FMLCommonSetupEvent} on Forge,
+ * or when Architectury API's client/server entrypoint initialises on Fabric.
+ *
+ * Registries should have been initialised by this point, but there
+ * are no such guarantees, as you can modify the registry beyond this point
+ * on non-Forge environments.
+ */
+ Event SETUP = EventFactory.createLoop();
interface InstanceState {
/**
diff --git a/fabric/src/main/java/dev/architectury/init/fabric/ArchitecturyClient.java b/fabric/src/main/java/dev/architectury/init/fabric/ArchitecturyClient.java
index b7ad19a8..5024fc02 100644
--- a/fabric/src/main/java/dev/architectury/init/fabric/ArchitecturyClient.java
+++ b/fabric/src/main/java/dev/architectury/init/fabric/ArchitecturyClient.java
@@ -20,11 +20,13 @@
package dev.architectury.init.fabric;
import dev.architectury.event.events.client.ClientLifecycleEvent;
+import dev.architectury.event.events.common.LifecycleEvent;
import dev.architectury.networking.fabric.SpawnEntityPacket;
import net.minecraft.client.Minecraft;
public class ArchitecturyClient {
public static void init() {
+ LifecycleEvent.SETUP.invoker().run();
ClientLifecycleEvent.CLIENT_SETUP.invoker().stateChanged(Minecraft.getInstance());
SpawnEntityPacket.Client.register();
diff --git a/fabric/src/main/java/dev/architectury/init/fabric/ArchitecturyServer.java b/fabric/src/main/java/dev/architectury/init/fabric/ArchitecturyServer.java
new file mode 100644
index 00000000..7f932d12
--- /dev/null
+++ b/fabric/src/main/java/dev/architectury/init/fabric/ArchitecturyServer.java
@@ -0,0 +1,28 @@
+/*
+ * This file is part of architectury.
+ * Copyright (C) 2020, 2021 architectury
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package dev.architectury.init.fabric;
+
+import dev.architectury.event.events.common.LifecycleEvent;
+
+public class ArchitecturyServer {
+ public static void init() {
+ LifecycleEvent.SETUP.invoker().run();
+ }
+}
diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json
index acf3dc41..80d7fd9e 100644
--- a/fabric/src/main/resources/fabric.mod.json
+++ b/fabric/src/main/resources/fabric.mod.json
@@ -22,6 +22,9 @@
"main": [
"dev.architectury.utils.fabric.GameInstanceImpl::init"
],
+ "server": [
+ "dev.architectury.init.fabric.ArchitecturyServer::init"
+ ],
"client": [
"dev.architectury.init.fabric.ArchitecturyClient::init"
],
diff --git a/forge/src/main/java/dev/architectury/event/forge/EventHandlerImplCommon.java b/forge/src/main/java/dev/architectury/event/forge/EventHandlerImplCommon.java
index f331469e..1a307c10 100644
--- a/forge/src/main/java/dev/architectury/event/forge/EventHandlerImplCommon.java
+++ b/forge/src/main/java/dev/architectury/event/forge/EventHandlerImplCommon.java
@@ -59,6 +59,7 @@ import net.minecraftforge.eventbus.api.Event;
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.LogicalSide;
+import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.server.ServerLifecycleHooks;
public class EventHandlerImplCommon {
@@ -423,6 +424,9 @@ public class EventHandlerImplCommon {
}
public static class ModBasedEventHandler {
-
+ @SubscribeEvent(priority = EventPriority.HIGH)
+ public static void event(FMLCommonSetupEvent event) {
+ LifecycleEvent.SETUP.invoker().run();
+ }
}
}