diff --git a/.github/workflows/gradle-publish-commit.yml b/.github/workflows/gradle-publish-commit.yml index f97c19c..cfd4aea 100644 --- a/.github/workflows/gradle-publish-commit.yml +++ b/.github/workflows/gradle-publish-commit.yml @@ -39,12 +39,12 @@ jobs: run: echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_OUTPUT id: extract_branch - name: Build with Gradle - run: ./gradlew build + run: ./gradlew build -Pci=true -Pbranch=${{ steps.extract_branch.outputs.branch }} -Psnapshot=true # The USERNAME and TOKEN need to correspond to the credentials environment variables used in # the publishing section of your build.gradle - name: Publish to GitHub Packages - run: ./gradlew publish -Pversion=${{ steps.extract_branch.outputs.branch }}-SNAPSHOT + run: ./gradlew publish -Pci=true -Pbranch=${{ steps.extract_branch.outputs.branch }} -Psnapshot=true env: USERNAME: ${{ github.actor }} TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/gradle-publish.yml b/.github/workflows/gradle-publish.yml index 6648787..be701d1 100644 --- a/.github/workflows/gradle-publish.yml +++ b/.github/workflows/gradle-publish.yml @@ -33,12 +33,12 @@ jobs: uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0 - name: Build with Gradle - run: ./gradlew build + run: ./gradlew build -Pci=true # The USERNAME and TOKEN need to correspond to the credentials environment variables used in # the publishing section of your build.gradle - name: Publish to GitHub Packages - run: ./gradlew publish + run: ./gradlew publish -Pci=true env: USERNAME: ${{ github.actor }} TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/buildSrc/src/main/groovy/multiloader-common.gradle b/buildSrc/src/main/groovy/multiloader-common.gradle index a12b187..d0097ce 100644 --- a/buildSrc/src/main/groovy/multiloader-common.gradle +++ b/buildSrc/src/main/groovy/multiloader-common.gradle @@ -3,6 +3,10 @@ plugins { id 'maven-publish' } +if (project.hasProperty('ci') && project.ci.toBoolean() && project.hasProperty('snapshot') && project.snapshot.toBoolean()) { + version += '-SNAPSHOT' +} + base { archivesName = "${mod_id}-${project.name}-${minecraft_version}" } diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/EnvExecutor.java b/common/src/main/java/dev/ultreon/mods/xinexlib/EnvExecutor.java index 04b10cd..83de5c6 100644 --- a/common/src/main/java/dev/ultreon/mods/xinexlib/EnvExecutor.java +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/EnvExecutor.java @@ -1,27 +1,27 @@ package dev.ultreon.mods.xinexlib; -import dev.ultreon.mods.xinexlib.platform.Services; +import dev.ultreon.mods.xinexlib.platform.XinexPlatform; import java.util.concurrent.Callable; import java.util.function.Supplier; public class EnvExecutor { public static void runInEnv(Env env, Supplier runnable) { - if (Services.getEnv() == env) runnable.get().run(); + if (XinexPlatform.getEnv() == env) runnable.get().run(); } public static void runInEnv(Env env, Supplier runnable, Runnable fallback) { - if (Services.getEnv() == env) runnable.get().run(); + if (XinexPlatform.getEnv() == env) runnable.get().run(); else fallback.run(); } public static void runInEnvSpecific(Supplier client, Supplier server) { - if (Services.getEnv() == Env.CLIENT) client.get().run(); + if (XinexPlatform.getEnv() == Env.CLIENT) client.get().run(); else server.get().run(); } public static T getInEnv(Env env, Supplier> supplier, Supplier fallback) { - if (Services.getEnv() == env) return supplier.get().get(); + if (XinexPlatform.getEnv() == env) return supplier.get().get(); return fallback.get(); } @@ -30,22 +30,22 @@ public static T getInEnv(Env env, Supplier> supplier) { } public static T getInEnvSpecific(Supplier> client, Supplier> server) { - if (Services.getEnv() == Env.CLIENT) return client.get().get(); + if (XinexPlatform.getEnv() == Env.CLIENT) return client.get().get(); return server.get().get(); } public static T callInEnv(Env env, Supplier> supplier) throws Exception { - if (Services.getEnv() == env) return supplier.get().call(); + if (XinexPlatform.getEnv() == env) return supplier.get().call(); return null; } public static T callInEnv(Env env, Supplier> supplier, Callable fallback) throws Exception { - if (Services.getEnv() == env) return supplier.get().call(); + if (XinexPlatform.getEnv() == env) return supplier.get().call(); return fallback.call(); } public static T callInEnvSpecific(Supplier> client, Supplier> server) throws Exception { - if (Services.getEnv() == Env.CLIENT) return client.get().call(); + if (XinexPlatform.getEnv() == Env.CLIENT) return client.get().call(); return server.get().call(); } } diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/CommonClass.java b/common/src/main/java/dev/ultreon/mods/xinexlib/XinexLibCommon.java similarity index 94% rename from common/src/main/java/dev/ultreon/mods/xinexlib/CommonClass.java rename to common/src/main/java/dev/ultreon/mods/xinexlib/XinexLibCommon.java index cc049d3..39b6838 100644 --- a/common/src/main/java/dev/ultreon/mods/xinexlib/CommonClass.java +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/XinexLibCommon.java @@ -22,7 +22,7 @@ import dev.ultreon.mods.xinexlib.item.XinexBlockItem; import dev.ultreon.mods.xinexlib.nbt.DataKeys; import dev.ultreon.mods.xinexlib.network.Networker; -import dev.ultreon.mods.xinexlib.platform.Services; +import dev.ultreon.mods.xinexlib.platform.XinexPlatform; import dev.ultreon.mods.xinexlib.registrar.Registrar; import dev.ultreon.mods.xinexlib.registrar.RegistrarManager; import net.minecraft.commands.Commands; @@ -60,8 +60,8 @@ /// @author XyperCode /// @since 0.1.0 (December 10, 2024) -public class CommonClass { - private CommonClass() { +public class XinexLibCommon { + private XinexLibCommon() { } @@ -73,9 +73,9 @@ private CommonClass() { /// This method is invoked by the provided mod loader when it is ready to load the XinexLib mod. public static void init() { - Runtime.getRuntime().addShutdownHook(new Thread(CommonClass::shutdown)); + Runtime.getRuntime().addShutdownHook(new Thread(XinexLibCommon::shutdown)); - if (Services.isDevelopmentEnvironment() && "true".equals(System.getProperty("xinexlib.dev"))) { + if (XinexPlatform.isDevelopmentEnvironment() && "true".equals(System.getProperty("xinexlib.dev"))) { initDev(); } @@ -103,7 +103,7 @@ private static void shutdown() { } private static void initDev() { - RegistrarManager registrarManager = Services.getRegistrarManager(Constants.MOD_ID); + RegistrarManager registrarManager = XinexPlatform.getRegistrarManager(Constants.MOD_ID); Registrar blockRegistrar = registrarManager.getRegistrar(Registries.BLOCK); var testBlock = blockRegistrar.register("test_block", () -> new Block(BlockBehaviour.Properties.of().requiresCorrectToolForDrops())); var secondBlock = blockRegistrar.register("second_block", () -> new Block(BlockBehaviour.Properties.of().requiresCorrectToolForDrops())); @@ -112,7 +112,7 @@ private static void initDev() { var testBlockItem = itemRegistrar.register("test_block_item", () -> new XinexBlockItem(testBlock, new Item.Properties().stacksTo(1))); var secondBlockItem = itemRegistrar.register("second_block_item", () -> new XinexBlockItem(secondBlock, new Item.Properties().stacksTo(1))); Registrar creativeModeTabRegistrar = registrarManager.getRegistrar(Registries.CREATIVE_MODE_TAB); - var testTab = creativeModeTabRegistrar.register("test_tab", () -> Services.creativeTabBuilder().icon(() -> new ItemStack(testBlockItem)).displayItems((itemDisplayParameters, output) -> { + var testTab = creativeModeTabRegistrar.register("test_tab", () -> XinexPlatform.creativeTabBuilder().icon(() -> new ItemStack(testBlockItem)).displayItems((itemDisplayParameters, output) -> { output.accept(new ItemStack(testItem)); output.accept(new ItemStack(testBlockItem)); output.accept(new ItemStack(secondBlockItem)); @@ -237,7 +237,7 @@ public void load(CompoundTag tag, HolderLookup.Provider registryLookup) { } } - ComponentManager componentManager = Services.getComponentManager(Constants.MOD_ID); + ComponentManager componentManager = XinexPlatform.getComponentManager(Constants.MOD_ID); ComponentHolder testy = componentManager.registerComponent("testy", new EntityComponentBuilder(TestyComponent.class) .factory(entity -> new TestyComponent("John Doe")) .target(EntityType.PLAYER)); @@ -258,12 +258,12 @@ public void load(CompoundTag tag, HolderLookup.Provider registryLookup) { Constants.LOG.info("The developer mode is enabled!"); - Networker networker = Services.createNetworker(Constants.MOD_ID, iNetworkRegistry -> { + Networker networker = XinexPlatform.createNetworker(Constants.MOD_ID, iNetworkRegistry -> { iNetworkRegistry.registerClient("packet2client", PacketToClient.class, PacketToClient::read); // iNetworkRegistry.registerServer("packet2server", PacketToServer.class, PacketToServer::read); }); - Services.registerCommand((dispatcher, registryAccess, environment) -> { + XinexPlatform.registerCommand((dispatcher, registryAccess, environment) -> { dispatcher.register(Commands.literal("xinex-dev:packets") .then(Commands.literal("packet") .then(Commands.argument("message", StringArgumentType.greedyString()) diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/client/ClientClass.java b/common/src/main/java/dev/ultreon/mods/xinexlib/client/XinexLibClient.java similarity index 67% rename from common/src/main/java/dev/ultreon/mods/xinexlib/client/ClientClass.java rename to common/src/main/java/dev/ultreon/mods/xinexlib/client/XinexLibClient.java index eee39a5..da52429 100644 --- a/common/src/main/java/dev/ultreon/mods/xinexlib/client/ClientClass.java +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/client/XinexLibClient.java @@ -2,26 +2,31 @@ import dev.ultreon.mods.xinexlib.Env; import dev.ultreon.mods.xinexlib.EnvExecutor; +import dev.ultreon.mods.xinexlib.client.event.ClientScreenOpenEvent; import dev.ultreon.mods.xinexlib.client.event.LocalPlayerQuitEvent; import dev.ultreon.mods.xinexlib.client.render.TestEntityRenderer; import dev.ultreon.mods.xinexlib.client.render.model.TestEntityModel; import dev.ultreon.mods.xinexlib.event.system.EventSystem; import dev.ultreon.mods.xinexlib.dev.DevEntities; -import dev.ultreon.mods.xinexlib.platform.Services; -import dev.ultreon.mods.xinexlib.platform.services.ClientPlatformHelper; +import dev.ultreon.mods.xinexlib.platform.XinexPlatform; +import dev.ultreon.mods.xinexlib.platform.services.ClientPlatform; import net.minecraft.client.Minecraft; -public class ClientClass { +public class XinexLibClient { public static void init() { - if (Services.isDevelopmentEnvironment() && "true".equals(System.getProperty("xinexlib.dev"))) { + if (XinexPlatform.isDevelopmentEnvironment() && "true".equals(System.getProperty("xinexlib.dev"))) { initDev(); } } private static void initDev() { - ClientPlatformHelper client = Services.PLATFORM.client(); + ClientPlatform client = XinexPlatform.client(); client.entityRenderers().register(DevEntities.TEST::get, TestEntityRenderer::new); client.entityRenderers().registerModel(TestEntityModel.LAYER_LOCATION, TestEntityModel::createBodyLayer); + + EventSystem.MAIN.on(ClientScreenOpenEvent.class, event -> { + System.out.printf("Screen opened: %s%n", event.getScreen().getClass().getName()); + }); } public static void onDisconnect() { diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientEvent.java b/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientEvent.java new file mode 100644 index 0000000..6c81e3b --- /dev/null +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientEvent.java @@ -0,0 +1,7 @@ +package dev.ultreon.mods.xinexlib.client.event; + +import net.minecraft.client.Minecraft; + +public interface ClientEvent { + Minecraft getClient(); +} diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientRenderTickEvent.java b/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientRenderTickEvent.java index 93c85ef..d746274 100644 --- a/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientRenderTickEvent.java +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientRenderTickEvent.java @@ -4,13 +4,14 @@ import java.util.Objects; -public abstract class ClientRenderTickEvent { +public abstract class ClientRenderTickEvent implements ClientEvent { private final Minecraft client; public ClientRenderTickEvent(Minecraft client) { this.client = client; } + @Override public Minecraft getClient() { return client; } diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientScreenEvent.java b/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientScreenEvent.java new file mode 100644 index 0000000..785aaac --- /dev/null +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientScreenEvent.java @@ -0,0 +1,13 @@ +package dev.ultreon.mods.xinexlib.client.event; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; + +public interface ClientScreenEvent extends ClientEvent { + Screen getScreen(); + + @Override + default Minecraft getClient() { + return Minecraft.getInstance(); + } +} diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientScreenOpenEvent.java b/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientScreenOpenEvent.java new file mode 100644 index 0000000..0768433 --- /dev/null +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientScreenOpenEvent.java @@ -0,0 +1,37 @@ +package dev.ultreon.mods.xinexlib.client.event; + +import dev.ultreon.mods.xinexlib.event.CancelableValue; +import dev.ultreon.mods.xinexlib.event.system.Cancelable; +import net.minecraft.client.gui.screens.Screen; +import org.jetbrains.annotations.Nullable; + +public class ClientScreenOpenEvent implements ClientScreenEvent, CancelableValue { + private final Screen screen; + private boolean canceled; + private @Nullable Screen nextScreen; + + public ClientScreenOpenEvent(Screen screen) { + this.screen = screen; + } + + @Override + public Screen getScreen() { + return screen; + } + + @Override + public boolean isCanceled() { + return canceled; + } + + @Override + public void cancel(@Nullable Screen value) { + canceled = true; + nextScreen = value; + } + + @Override + public @Nullable Screen get() { + return nextScreen; + } +} diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientScreenPostInitEvent.java b/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientScreenPostInitEvent.java new file mode 100644 index 0000000..6f7c0ae --- /dev/null +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientScreenPostInitEvent.java @@ -0,0 +1,17 @@ +package dev.ultreon.mods.xinexlib.client.event; + +import net.minecraft.client.gui.screens.Screen; + + +public class ClientScreenPostInitEvent implements ClientScreenEvent { + private final Screen screen; + + public ClientScreenPostInitEvent(Screen screen) { + this.screen = screen; + } + + @Override + public Screen getScreen() { + return screen; + } +} diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientScreenPreInitEvent.java b/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientScreenPreInitEvent.java new file mode 100644 index 0000000..0679fb5 --- /dev/null +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientScreenPreInitEvent.java @@ -0,0 +1,17 @@ +package dev.ultreon.mods.xinexlib.client.event; + +import net.minecraft.client.gui.screens.Screen; + + +public class ClientScreenPreInitEvent implements ClientScreenEvent { + private final Screen screen; + + public ClientScreenPreInitEvent(Screen screen) { + this.screen = screen; + } + + @Override + public Screen getScreen() { + return screen; + } +} diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientStartedEvent.java b/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientStartedEvent.java index 60ca937..95944a8 100644 --- a/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientStartedEvent.java +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientStartedEvent.java @@ -4,13 +4,14 @@ import java.util.Objects; -public final class ClientStartedEvent { +public final class ClientStartedEvent implements ClientEvent { private final Minecraft client; public ClientStartedEvent(Minecraft client) { this.client = client; } + @Override public Minecraft getClient() { return client; } diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/dev/DevEntities.java b/common/src/main/java/dev/ultreon/mods/xinexlib/dev/DevEntities.java index be25cb9..acabec1 100644 --- a/common/src/main/java/dev/ultreon/mods/xinexlib/dev/DevEntities.java +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/dev/DevEntities.java @@ -1,7 +1,7 @@ package dev.ultreon.mods.xinexlib.dev; import dev.ultreon.mods.xinexlib.dev.entity.TestEntity; -import dev.ultreon.mods.xinexlib.platform.Services; +import dev.ultreon.mods.xinexlib.platform.XinexPlatform; import dev.ultreon.mods.xinexlib.registrar.Registrar; import dev.ultreon.mods.xinexlib.registrar.RegistrySupplier; import net.minecraft.core.registries.Registries; @@ -9,7 +9,7 @@ import net.minecraft.world.entity.MobCategory; public class DevEntities { - private static final Registrar> REGISTRAR = Services.getRegistrarManager("xinexlib").getRegistrar(Registries.ENTITY_TYPE); + private static final Registrar> REGISTRAR = XinexPlatform.getRegistrarManager("xinexlib").getRegistrar(Registries.ENTITY_TYPE); public static final RegistrySupplier, EntityType> TEST = REGISTRAR.register("test", () -> EntityType.Builder.of(TestEntity::new, MobCategory.AMBIENT) .sized(0.5f, 0.5f) diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/mixin/MixinClientConnection.java b/common/src/main/java/dev/ultreon/mods/xinexlib/mixin/MixinClientConnection.java index 469cebb..1d1be96 100644 --- a/common/src/main/java/dev/ultreon/mods/xinexlib/mixin/MixinClientConnection.java +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/mixin/MixinClientConnection.java @@ -1,6 +1,6 @@ package dev.ultreon.mods.xinexlib.mixin; -import dev.ultreon.mods.xinexlib.client.ClientClass; +import dev.ultreon.mods.xinexlib.client.XinexLibClient; import net.minecraft.network.Connection; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -14,11 +14,11 @@ public abstract class MixinClientConnection { @Inject(at = @At("HEAD"), method = "channelInactive") private void channelInactive(CallbackInfo ci) { - ClientClass.onDisconnect(); + XinexLibClient.onDisconnect(); } @Inject(at = @At("HEAD"), method = "disconnect(Lnet/minecraft/network/DisconnectionDetails;)V") private void runTick$return(CallbackInfo ci) { - ClientClass.onDisconnect(); + XinexLibClient.onDisconnect(); } } diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/platform/Mod.java b/common/src/main/java/dev/ultreon/mods/xinexlib/platform/Mod.java new file mode 100644 index 0000000..e572276 --- /dev/null +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/platform/Mod.java @@ -0,0 +1,8 @@ +package dev.ultreon.mods.xinexlib.platform; + +public interface Mod { + String getModId(); + String getName(); + String getVersion(); + String getDescription(); +} diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/platform/Services.java b/common/src/main/java/dev/ultreon/mods/xinexlib/platform/Services.java index 37bbaeb..9d008d0 100644 --- a/common/src/main/java/dev/ultreon/mods/xinexlib/platform/Services.java +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/platform/Services.java @@ -6,9 +6,10 @@ import dev.ultreon.mods.xinexlib.components.ComponentManager; import dev.ultreon.mods.xinexlib.network.NetworkRegistry; import dev.ultreon.mods.xinexlib.network.Networker; -import dev.ultreon.mods.xinexlib.platform.services.PlatformHelper; +import dev.ultreon.mods.xinexlib.platform.services.Platform; import dev.ultreon.mods.xinexlib.registrar.RegistrarManager; import dev.ultreon.mods.xinexlib.tabs.CreativeModeTabBuilder; +import org.jetbrains.annotations.ApiStatus; import java.util.ServiceLoader; import java.util.function.Consumer; @@ -18,6 +19,7 @@ environment to another. In the context of MultiLoader we use this feature to access a mock API in the common code that is swapped out for the platform specific implementation at runtime. */ +@Deprecated public class Services { private Services() { @@ -28,7 +30,7 @@ private Services() { For example this can be used to check if the code is running on Forge vs Fabric, or to ask the modloader if another mod is loaded. */ - public static final PlatformHelper PLATFORM = load(PlatformHelper.class); + public static final Platform PLATFORM = XinexPlatform.PLATFORM; /* This code is used to load a service for the current environment. Your implementation of the service must be defined @@ -36,48 +38,60 @@ private Services() { Inside the file you should write the fully qualified class name of the implementation to load for the platform. For example our file on Forge points to ForgePlatformHelper while Fabric points to FabricPlatformHelper. */ + @Deprecated + @ApiStatus.Internal public static T load(Class clazz) { final T loadedService = ServiceLoader.load(clazz).findFirst().orElseThrow(() -> new NullPointerException("Failed to load service for " + clazz.getName())); Constants.LOG.debug("Loaded {} for service {}", loadedService, clazz); return loadedService; } + @Deprecated public static RegistrarManager getRegistrarManager(String modId) { return PLATFORM.getRegistrarManager(modId); } + @Deprecated public static boolean isModLoaded(String modId) { return PLATFORM.isModLoaded(modId); } + @Deprecated public static boolean isDevelopmentEnvironment() { return PLATFORM.isDevelopmentEnvironment(); } + @Deprecated public static String getEnvironmentName() { return PLATFORM.getEnvironmentName(); } + @Deprecated public static ModPlatform getPlatformName() { return PLATFORM.getPlatformName(); } + @Deprecated public static ComponentManager getComponentManager(String modId) { return PLATFORM.getComponentManager(modId); } + @Deprecated public static CreativeModeTabBuilder creativeTabBuilder() { return PLATFORM.creativeTabBuilder(); } + @Deprecated public static Env getEnv() { return PLATFORM.getEnv(); } + @Deprecated public static Networker createNetworker(String modId, Consumer registrant) { return PLATFORM.createNetworker(modId, registrant); } + @Deprecated public static void registerCommand(CommandRegistrant registrant) { PLATFORM.registerCommand(registrant); } diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/platform/XinexPlatform.java b/common/src/main/java/dev/ultreon/mods/xinexlib/platform/XinexPlatform.java new file mode 100644 index 0000000..9a27cf9 --- /dev/null +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/platform/XinexPlatform.java @@ -0,0 +1,93 @@ +package dev.ultreon.mods.xinexlib.platform; + +import dev.ultreon.mods.xinexlib.Constants; +import dev.ultreon.mods.xinexlib.Env; +import dev.ultreon.mods.xinexlib.ModPlatform; +import dev.ultreon.mods.xinexlib.components.ComponentManager; +import dev.ultreon.mods.xinexlib.network.NetworkRegistry; +import dev.ultreon.mods.xinexlib.network.Networker; +import dev.ultreon.mods.xinexlib.platform.services.ClientPlatform; +import dev.ultreon.mods.xinexlib.registrar.RegistrarManager; +import dev.ultreon.mods.xinexlib.tabs.CreativeModeTabBuilder; + +import java.util.Optional; +import java.util.ServiceLoader; +import java.util.function.Consumer; + +/* + Service loaders are a built-in Java feature that allow us to locate implementations of an interface that vary from one + environment to another. In the context of MultiLoader we use this feature to access a mock API in the common code that + is swapped out for the platform specific implementation at runtime. +*/ +public class XinexPlatform { + private XinexPlatform() { + + } + + /* + In this example we provide a platform helper which provides information about what platform the mod is running on. + For example this can be used to check if the code is running on Forge vs Fabric, or to ask the modloader if another + mod is loaded. + */ + static final dev.ultreon.mods.xinexlib.platform.services.Platform PLATFORM = load(dev.ultreon.mods.xinexlib.platform.services.Platform.class); + + /* + This code is used to load a service for the current environment. Your implementation of the service must be defined + manually by including a text file in META-INF/services named with the fully qualified class name of the service. + Inside the file you should write the fully qualified class name of the implementation to load for the platform. For + example our file on Forge points to ForgePlatformHelper while Fabric points to FabricPlatformHelper. + */ + private static T load(Class clazz) { + final T loadedService = ServiceLoader.load(clazz).findFirst().orElseThrow(() -> new NullPointerException("Failed to load service for " + clazz.getName())); + Constants.LOG.debug("Loaded {} for service {}", loadedService, clazz); + return loadedService; + } + + public static RegistrarManager getRegistrarManager(String modId) { + return PLATFORM.getRegistrarManager(modId); + } + + public static boolean isModLoaded(String modId) { + return PLATFORM.isModLoaded(modId); + } + + public static Optional getMod(String modId) { + return PLATFORM.getMod(modId); + } + + public static boolean isDevelopmentEnvironment() { + return PLATFORM.isDevelopmentEnvironment(); + } + + public static String getEnvironmentName() { + return PLATFORM.getEnvironmentName(); + } + + public static ModPlatform getPlatformName() { + return PLATFORM.getPlatformName(); + } + + public static ComponentManager getComponentManager(String modId) { + return PLATFORM.getComponentManager(modId); + } + + public static CreativeModeTabBuilder creativeTabBuilder() { + return PLATFORM.creativeTabBuilder(); + } + + public static Env getEnv() { + return PLATFORM.getEnv(); + } + + public static Networker createNetworker(String modId, Consumer registrant) { + return PLATFORM.createNetworker(modId, registrant); + } + + public static void registerCommand(CommandRegistrant registrant) { + PLATFORM.registerCommand(registrant); + } + + public static ClientPlatform client() { + return PLATFORM.client(); + } +} diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/platform/services/ClientPlatformHelper.java b/common/src/main/java/dev/ultreon/mods/xinexlib/platform/services/ClientPlatform.java similarity index 71% rename from common/src/main/java/dev/ultreon/mods/xinexlib/platform/services/ClientPlatformHelper.java rename to common/src/main/java/dev/ultreon/mods/xinexlib/platform/services/ClientPlatform.java index 93e1db7..e79bb93 100644 --- a/common/src/main/java/dev/ultreon/mods/xinexlib/platform/services/ClientPlatformHelper.java +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/platform/services/ClientPlatform.java @@ -1,5 +1,5 @@ package dev.ultreon.mods.xinexlib.platform.services; -public interface ClientPlatformHelper { +public interface ClientPlatform { EntityRendererRegistry entityRenderers(); } diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/platform/services/PlatformHelper.java b/common/src/main/java/dev/ultreon/mods/xinexlib/platform/services/Platform.java similarity index 92% rename from common/src/main/java/dev/ultreon/mods/xinexlib/platform/services/PlatformHelper.java rename to common/src/main/java/dev/ultreon/mods/xinexlib/platform/services/Platform.java index 5d390fd..76f63fb 100644 --- a/common/src/main/java/dev/ultreon/mods/xinexlib/platform/services/PlatformHelper.java +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/platform/services/Platform.java @@ -7,14 +7,16 @@ import dev.ultreon.mods.xinexlib.components.ComponentManager; import dev.ultreon.mods.xinexlib.network.NetworkRegistry; import dev.ultreon.mods.xinexlib.platform.CommandRegistrant; +import dev.ultreon.mods.xinexlib.platform.Mod; import dev.ultreon.mods.xinexlib.registrar.RegistrarManager; import dev.ultreon.mods.xinexlib.tabs.CreativeModeTabBuilder; +import java.util.Optional; import java.util.function.Consumer; /// @author XyperCode /// @since 0.1.0 (December 10, 2024) -public interface PlatformHelper { +public interface Platform { /// Gets the name of the current platform /// @@ -61,5 +63,7 @@ default ComponentManager getComponentManager(String modId) { void registerCommand(CommandRegistrant registrant); - ClientPlatformHelper client(); + ClientPlatform client(); + + Optional getMod(String modId); } diff --git a/fabric/src/main/java/dev/ultreon/mods/xinexlib/XinexLib.java b/fabric/src/main/java/dev/ultreon/mods/xinexlib/FabricXinexLib.java similarity index 70% rename from fabric/src/main/java/dev/ultreon/mods/xinexlib/XinexLib.java rename to fabric/src/main/java/dev/ultreon/mods/xinexlib/FabricXinexLib.java index 0c10b43..2ca11a6 100644 --- a/fabric/src/main/java/dev/ultreon/mods/xinexlib/XinexLib.java +++ b/fabric/src/main/java/dev/ultreon/mods/xinexlib/FabricXinexLib.java @@ -1,5 +1,7 @@ package dev.ultreon.mods.xinexlib; +import dev.ultreon.mods.xinexlib.client.event.ClientScreenPostInitEvent; +import dev.ultreon.mods.xinexlib.client.event.ClientScreenPreInitEvent; import dev.ultreon.mods.xinexlib.event.interact.UseBlockEvent; import dev.ultreon.mods.xinexlib.event.interact.UseEntityEvent; import dev.ultreon.mods.xinexlib.event.interact.UseItemEvent; @@ -11,8 +13,11 @@ import dev.ultreon.mods.xinexlib.event.server.ServerStoppingEvent; import dev.ultreon.mods.xinexlib.event.system.EventSystem; import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.event.player.*; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.core.BlockPos; import net.minecraft.server.MinecraftServer; import net.minecraft.world.InteractionHand; @@ -28,7 +33,7 @@ import net.minecraft.world.phys.EntityHitResult; import org.jetbrains.annotations.Nullable; -public class XinexLib implements ModInitializer { +public class FabricXinexLib implements ModInitializer { private static InteractionResult interact(Player player, Level world, InteractionHand hand, BlockHitResult hitResult) { return EventSystem.MAIN.publish(new UseBlockEvent(hitResult, player, world)).get(); } @@ -71,6 +76,14 @@ private static InteractionResult attackEntity(Player player, Level level, Intera return InteractionResult.PASS; } + private static void beforeScreenInit(Minecraft client, Screen screen, int scaledWidth, int scaledHeight) { + EventSystem.MAIN.publish(new ClientScreenPreInitEvent(screen)); + } + + private static void afterScreenInit(Minecraft client, Screen screen, int scaledWidth, int scaledHeight) { + EventSystem.MAIN.publish(new ClientScreenPostInitEvent(screen)); + } + @Override public void onInitialize() { @@ -80,19 +93,22 @@ public void onInitialize() { // Use Fabric to bootstrap the Common mod. Constants.LOG.info("Hello Fabric world!"); - CommonClass.init(); + XinexLibCommon.init(); + + PlayerBlockBreakEvents.AFTER.register(FabricXinexLib::afterBlockBreak); - PlayerBlockBreakEvents.AFTER.register(XinexLib::afterBlockBreak); + ServerLifecycleEvents.SERVER_STARTING.register(FabricXinexLib::onServerStarting); + ServerLifecycleEvents.SERVER_STOPPING.register(FabricXinexLib::onServerStopping); + ServerLifecycleEvents.SERVER_STARTED.register(FabricXinexLib::onServerStarted); + ServerLifecycleEvents.SERVER_STOPPED.register(FabricXinexLib::onServerStopped); - ServerLifecycleEvents.SERVER_STARTING.register(XinexLib::onServerStarting); - ServerLifecycleEvents.SERVER_STOPPING.register(XinexLib::onServerStopping); - ServerLifecycleEvents.SERVER_STARTED.register(XinexLib::onServerStarted); - ServerLifecycleEvents.SERVER_STOPPED.register(XinexLib::onServerStopped); + UseBlockCallback.EVENT.register(FabricXinexLib::interact); + UseItemCallback.EVENT.register(FabricXinexLib::interactItem); + UseEntityCallback.EVENT.register(FabricXinexLib::interactEntity); - UseBlockCallback.EVENT.register(XinexLib::interact); - UseItemCallback.EVENT.register(XinexLib::interactItem); - UseEntityCallback.EVENT.register(XinexLib::interactEntity); + AttackEntityCallback.EVENT.register(FabricXinexLib::attackEntity); - AttackEntityCallback.EVENT.register(XinexLib::attackEntity); + ScreenEvents.BEFORE_INIT.register(FabricXinexLib::beforeScreenInit); + ScreenEvents.AFTER_INIT.register(FabricXinexLib::afterScreenInit); } } diff --git a/fabric/src/main/java/dev/ultreon/mods/xinexlib/client/FabricXinexLibClient.java b/fabric/src/main/java/dev/ultreon/mods/xinexlib/client/FabricXinexLibClient.java new file mode 100644 index 0000000..28ba30b --- /dev/null +++ b/fabric/src/main/java/dev/ultreon/mods/xinexlib/client/FabricXinexLibClient.java @@ -0,0 +1,16 @@ +package dev.ultreon.mods.xinexlib.client; + +import net.fabricmc.api.ClientModInitializer; + +public class FabricXinexLibClient implements ClientModInitializer { + @Override + public void onInitializeClient() { + + // This method is invoked by the Fabric mod loader when it is ready + // to load your mod. You can access Fabric and Common code in this + // project. + + // Use Fabric to bootstrap the Common mod. + XinexLibClient.init(); + } +} diff --git a/fabric/src/main/java/dev/ultreon/mods/xinexlib/client/XinexLibClient.java b/fabric/src/main/java/dev/ultreon/mods/xinexlib/client/XinexLibClient.java deleted file mode 100644 index 10a4697..0000000 --- a/fabric/src/main/java/dev/ultreon/mods/xinexlib/client/XinexLibClient.java +++ /dev/null @@ -1,44 +0,0 @@ -package dev.ultreon.mods.xinexlib.client; - -import dev.ultreon.mods.xinexlib.CommonClass; -import dev.ultreon.mods.xinexlib.Constants; -import dev.ultreon.mods.xinexlib.event.interact.UseBlockEvent; -import dev.ultreon.mods.xinexlib.event.interact.UseEntityEvent; -import dev.ultreon.mods.xinexlib.event.interact.UseItemEvent; -import dev.ultreon.mods.xinexlib.event.player.AttackEntityEvent; -import dev.ultreon.mods.xinexlib.event.player.PlayerBreakBlockEvent; -import dev.ultreon.mods.xinexlib.event.server.ServerStartedEvent; -import dev.ultreon.mods.xinexlib.event.server.ServerStartingEvent; -import dev.ultreon.mods.xinexlib.event.server.ServerStoppedEvent; -import dev.ultreon.mods.xinexlib.event.server.ServerStoppingEvent; -import dev.ultreon.mods.xinexlib.event.system.EventSystem; -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.api.ModInitializer; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; -import net.minecraft.core.BlockPos; -import net.minecraft.server.MinecraftServer; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.EntityHitResult; -import org.jetbrains.annotations.Nullable; - -public class XinexLibClient implements ClientModInitializer { - @Override - public void onInitializeClient() { - - // This method is invoked by the Fabric mod loader when it is ready - // to load your mod. You can access Fabric and Common code in this - // project. - - // Use Fabric to bootstrap the Common mod. - ClientClass.init(); - } -} diff --git a/fabric/src/main/java/dev/ultreon/mods/xinexlib/mixin/FabricMinecraftMixin.java b/fabric/src/main/java/dev/ultreon/mods/xinexlib/mixin/FabricMinecraftMixin.java new file mode 100644 index 0000000..db2f878 --- /dev/null +++ b/fabric/src/main/java/dev/ultreon/mods/xinexlib/mixin/FabricMinecraftMixin.java @@ -0,0 +1,27 @@ +package dev.ultreon.mods.xinexlib.mixin; + +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; +import dev.ultreon.mods.xinexlib.client.event.ClientScreenOpenEvent; +import dev.ultreon.mods.xinexlib.event.system.EventSystem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Minecraft.class) +public class FabricMinecraftMixin { + @Inject(method = "setScreen", at = @At(value = "HEAD"), cancellable = true) + public void setScreen(Screen screen, CallbackInfo ci, @Local(ordinal = 0, argsOnly = true) LocalRef guiScreen) { + ClientScreenOpenEvent publish = EventSystem.MAIN.publish(new ClientScreenOpenEvent(screen)); + if (publish.isCanceled()) { + if (publish.get() != null) { + guiScreen.set(publish.get()); + } + ci.cancel(); + } + } +} diff --git a/fabric/src/main/java/dev/ultreon/mods/xinexlib/network/FabricNetworkRegistry.java b/fabric/src/main/java/dev/ultreon/mods/xinexlib/network/FabricNetworkRegistry.java index 26591b2..1e5437b 100644 --- a/fabric/src/main/java/dev/ultreon/mods/xinexlib/network/FabricNetworkRegistry.java +++ b/fabric/src/main/java/dev/ultreon/mods/xinexlib/network/FabricNetworkRegistry.java @@ -4,7 +4,7 @@ import dev.ultreon.mods.xinexlib.network.endpoint.ClientEndpoint; import dev.ultreon.mods.xinexlib.network.endpoint.ServerEndpoint; import dev.ultreon.mods.xinexlib.network.packet.Packet; -import dev.ultreon.mods.xinexlib.platform.Services; +import dev.ultreon.mods.xinexlib.platform.XinexPlatform; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; @@ -36,7 +36,7 @@ public & ClientEndpoint> void registerClient(String name, C (buf, wrapper) -> wrapper.write(buf), (buf) -> new PayloadWrapper<>(type, reader.read(buf)) )); - if (Services.getEnv() == Env.CLIENT) + if (XinexPlatform.getEnv() == Env.CLIENT) ClientPlayNetworking.registerGlobalReceiver(type, (packet, context) -> packet.packet.handle(this.networker)); } @@ -64,7 +64,7 @@ public & ServerEndpoint & ClientEndpoint> void registerBiDi ); PayloadTypeRegistry.playS2C().register(type, codec); PayloadTypeRegistry.playC2S().register(type, codec); - if (Services.getEnv() == Env.CLIENT) + if (XinexPlatform.getEnv() == Env.CLIENT) ClientPlayNetworking.registerGlobalReceiver(type, (packet, context) -> packet.packet.handle(networker)); ServerPlayNetworking.registerGlobalReceiver(type, (packet, context) -> packet.packet.handle(networker, context.player())); } diff --git a/fabric/src/main/java/dev/ultreon/mods/xinexlib/platform/FabricClientPlatformHelper.java b/fabric/src/main/java/dev/ultreon/mods/xinexlib/platform/FabricClientPlatform.java similarity index 84% rename from fabric/src/main/java/dev/ultreon/mods/xinexlib/platform/FabricClientPlatformHelper.java rename to fabric/src/main/java/dev/ultreon/mods/xinexlib/platform/FabricClientPlatform.java index ea85c14..8c3c72d 100644 --- a/fabric/src/main/java/dev/ultreon/mods/xinexlib/platform/FabricClientPlatformHelper.java +++ b/fabric/src/main/java/dev/ultreon/mods/xinexlib/platform/FabricClientPlatform.java @@ -1,10 +1,10 @@ package dev.ultreon.mods.xinexlib.platform; import dev.ultreon.mods.xinexlib.platform.client.FabricEntityRendererRegistry; -import dev.ultreon.mods.xinexlib.platform.services.ClientPlatformHelper; +import dev.ultreon.mods.xinexlib.platform.services.ClientPlatform; import dev.ultreon.mods.xinexlib.platform.services.EntityRendererRegistry; -public class FabricClientPlatformHelper implements ClientPlatformHelper { +public class FabricClientPlatform implements ClientPlatform { private final EntityRendererRegistry entityRenderers = new FabricEntityRendererRegistry(); @Override diff --git a/fabric/src/main/java/dev/ultreon/mods/xinexlib/platform/FabricMod.java b/fabric/src/main/java/dev/ultreon/mods/xinexlib/platform/FabricMod.java new file mode 100644 index 0000000..ae6f2bf --- /dev/null +++ b/fabric/src/main/java/dev/ultreon/mods/xinexlib/platform/FabricMod.java @@ -0,0 +1,33 @@ +package dev.ultreon.mods.xinexlib.platform; + +import net.fabricmc.loader.api.ModContainer; +import net.fabricmc.loader.api.metadata.ModMetadata; + +public class FabricMod implements Mod { + private final ModMetadata meta; + + public FabricMod(ModContainer container) { + this.meta = container.getMetadata(); + } + + @Override + public String getModId() { + return meta.getId(); + } + + @Override + public String getName() { + return meta.getName(); + } + + @Override + public String getVersion() { + return meta.getVersion().getFriendlyString(); + } + + @Override + public String getDescription() { + return meta.getDescription(); + } + +} diff --git a/fabric/src/main/java/dev/ultreon/mods/xinexlib/platform/FabricPlatformHelper.java b/fabric/src/main/java/dev/ultreon/mods/xinexlib/platform/FabricPlatform.java similarity index 87% rename from fabric/src/main/java/dev/ultreon/mods/xinexlib/platform/FabricPlatformHelper.java rename to fabric/src/main/java/dev/ultreon/mods/xinexlib/platform/FabricPlatform.java index 9ffb418..37449a1 100644 --- a/fabric/src/main/java/dev/ultreon/mods/xinexlib/platform/FabricPlatformHelper.java +++ b/fabric/src/main/java/dev/ultreon/mods/xinexlib/platform/FabricPlatform.java @@ -6,8 +6,8 @@ import dev.ultreon.mods.xinexlib.network.FabricNetworker; import dev.ultreon.mods.xinexlib.network.NetworkRegistry; import dev.ultreon.mods.xinexlib.network.Networker; -import dev.ultreon.mods.xinexlib.platform.services.ClientPlatformHelper; -import dev.ultreon.mods.xinexlib.platform.services.PlatformHelper; +import dev.ultreon.mods.xinexlib.platform.services.ClientPlatform; +import dev.ultreon.mods.xinexlib.platform.services.Platform; import dev.ultreon.mods.xinexlib.registrar.FabricRegistrarManager; import dev.ultreon.mods.xinexlib.registrar.RegistrarManager; import dev.ultreon.mods.xinexlib.tabs.FabricCreativeTabBuilder; @@ -19,20 +19,17 @@ import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.Consumer; -public class FabricPlatformHelper implements PlatformHelper { +public class FabricPlatform implements Platform { private final List commandRegistrants = new ArrayList<>(); private final Map registrars = new HashMap<>(); - private ClientPlatformHelper client; + private ClientPlatform client; - public FabricPlatformHelper() { + public FabricPlatform() { if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { - client = new FabricClientPlatformHelper(); + client = new FabricClientPlatform(); } CommandRegistrationCallback.EVENT.register(this::register); @@ -87,13 +84,18 @@ public void registerCommand(CommandRegistrant registrant) { } @Override - public ClientPlatformHelper client() { + public ClientPlatform client() { if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { return client; } throw new IllegalStateException("This method should only be called on the client"); } + @Override + public Optional getMod(String modId) { + return FabricLoader.getInstance().getModContainer(modId).map(FabricMod::new); + } + private void register(CommandDispatcher dispatcher, CommandBuildContext registryAccess, Commands.CommandSelection environment) { for (CommandRegistrant registrant : commandRegistrants) { registrant.register(dispatcher, registryAccess, environment); diff --git a/fabric/src/main/resources/META-INF/services/dev.ultreon.mods.xinexlib.platform.services.Platform b/fabric/src/main/resources/META-INF/services/dev.ultreon.mods.xinexlib.platform.services.Platform new file mode 100644 index 0000000..9528cac --- /dev/null +++ b/fabric/src/main/resources/META-INF/services/dev.ultreon.mods.xinexlib.platform.services.Platform @@ -0,0 +1 @@ +dev.ultreon.mods.xinexlib.platform.FabricPlatform diff --git a/fabric/src/main/resources/META-INF/services/dev.ultreon.mods.xinexlib.platform.services.PlatformHelper b/fabric/src/main/resources/META-INF/services/dev.ultreon.mods.xinexlib.platform.services.PlatformHelper deleted file mode 100644 index 8d9d350..0000000 --- a/fabric/src/main/resources/META-INF/services/dev.ultreon.mods.xinexlib.platform.services.PlatformHelper +++ /dev/null @@ -1 +0,0 @@ -dev.ultreon.mods.xinexlib.platform.FabricPlatformHelper diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 67409b1..e1bd8a6 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -20,10 +20,10 @@ "environment": "*", "entrypoints": { "main": [ - "dev.ultreon.mods.xinexlib.XinexLib" + "dev.ultreon.mods.xinexlib.FabricXinexLib" ], "client": [ - "dev.ultreon.mods.xinexlib.client.XinexLibClient" + "dev.ultreon.mods.xinexlib.client.FabricXinexLibClient" ], "cardinal-components-entity": [ "dev.ultreon.mods.xinexlib.platform.components.EntityComponents" diff --git a/fabric/src/main/resources/xinexlib.fabric.mixins.json b/fabric/src/main/resources/xinexlib.fabric.mixins.json index 95b1abb..3b03930 100644 --- a/fabric/src/main/resources/xinexlib.fabric.mixins.json +++ b/fabric/src/main/resources/xinexlib.fabric.mixins.json @@ -5,10 +5,9 @@ "refmap": "${mod_id}.refmap.json", "compatibilityLevel": "JAVA_21", "mixins": [ - + "FabricMinecraftMixin" ], "client": [ - ], "server": [], "injectors": { diff --git a/forge/src/main/java/dev/ultreon/mods/xinexlib/XinexLib.java b/forge/src/main/java/dev/ultreon/mods/xinexlib/ForgeXinexLib.java similarity index 95% rename from forge/src/main/java/dev/ultreon/mods/xinexlib/XinexLib.java rename to forge/src/main/java/dev/ultreon/mods/xinexlib/ForgeXinexLib.java index d9593f7..6737ea5 100644 --- a/forge/src/main/java/dev/ultreon/mods/xinexlib/XinexLib.java +++ b/forge/src/main/java/dev/ultreon/mods/xinexlib/ForgeXinexLib.java @@ -1,6 +1,6 @@ package dev.ultreon.mods.xinexlib; -import dev.ultreon.mods.xinexlib.client.ClientClass; +import dev.ultreon.mods.xinexlib.client.ForgeXinexLibClient; import dev.ultreon.mods.xinexlib.event.SetupEvent; import dev.ultreon.mods.xinexlib.event.interact.UseBlockEvent; import dev.ultreon.mods.xinexlib.event.interact.UseEntityEvent; @@ -26,20 +26,20 @@ @Mod(Constants.MOD_ID) @Mod.EventBusSubscriber(modid = Constants.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) -public class XinexLib { +public class ForgeXinexLib { - public XinexLib() { + public ForgeXinexLib() { // This method is invoked by the Forge mod loader when it is ready // to load your mod. You can access Forge and Common code in this // project. // Use Forge to bootstrap the Common mod. Constants.LOG.info("Hello Forge world!"); - CommonClass.init(); + XinexLibCommon.init(); MinecraftForge.EVENT_BUS.register(this); - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> ClientClass::init); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> ForgeXinexLibClient::clientInit); } @SubscribeEvent diff --git a/forge/src/main/java/dev/ultreon/mods/xinexlib/client/ForgeXinexLibClient.java b/forge/src/main/java/dev/ultreon/mods/xinexlib/client/ForgeXinexLibClient.java new file mode 100644 index 0000000..53f9e0b --- /dev/null +++ b/forge/src/main/java/dev/ultreon/mods/xinexlib/client/ForgeXinexLibClient.java @@ -0,0 +1,49 @@ +package dev.ultreon.mods.xinexlib.client; + +import dev.ultreon.mods.xinexlib.client.event.ClientScreenOpenEvent; +import dev.ultreon.mods.xinexlib.client.event.ClientScreenPreInitEvent; +import dev.ultreon.mods.xinexlib.event.system.EventSystem; +import dev.ultreon.mods.xinexlib.platform.XinexPlatform; +import net.minecraftforge.client.event.ScreenEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.SubscribeEvent; + +public class ForgeXinexLibClient { + private ForgeXinexLibClient() { + + } + + public static void clientInit() { + ForgeXinexLibClient client = new ForgeXinexLibClient(); + if (XinexPlatform.isDevelopmentEnvironment() && "true".equals(System.getProperty("xinexlib.dev"))) { + client.initDev(); + } + MinecraftForge.EVENT_BUS.register(client); + XinexLibClient.init(); + } + + private void initDev() { + + } + + @SubscribeEvent + public void onScreenOpen(ScreenEvent.Opening event) { + ClientScreenOpenEvent published = EventSystem.MAIN.publish(new ClientScreenOpenEvent(event.getScreen())); + if (published.isCanceled()) { + if (published.get() != null) { + event.setNewScreen(published.get()); + } + event.setCanceled(true); + } + } + + @SubscribeEvent + public void onScreenPreInit(ScreenEvent.Init.Pre event) { + EventSystem.MAIN.publish(new ClientScreenPreInitEvent(event.getScreen())); + } + + @SubscribeEvent + public void onScreenPostInit(ScreenEvent.Init.Post event) { + EventSystem.MAIN.publish(new ClientScreenPreInitEvent(event.getScreen())); + } +} diff --git a/forge/src/main/java/dev/ultreon/mods/xinexlib/platform/ForgeClientPlatformHelper.java b/forge/src/main/java/dev/ultreon/mods/xinexlib/platform/ForgeClientPlatform.java similarity index 85% rename from forge/src/main/java/dev/ultreon/mods/xinexlib/platform/ForgeClientPlatformHelper.java rename to forge/src/main/java/dev/ultreon/mods/xinexlib/platform/ForgeClientPlatform.java index 35017be..17fc2ae 100644 --- a/forge/src/main/java/dev/ultreon/mods/xinexlib/platform/ForgeClientPlatformHelper.java +++ b/forge/src/main/java/dev/ultreon/mods/xinexlib/platform/ForgeClientPlatform.java @@ -1,10 +1,10 @@ package dev.ultreon.mods.xinexlib.platform; import dev.ultreon.mods.xinexlib.platform.client.ForgeEntityRendererRegistry; -import dev.ultreon.mods.xinexlib.platform.services.ClientPlatformHelper; +import dev.ultreon.mods.xinexlib.platform.services.ClientPlatform; import dev.ultreon.mods.xinexlib.platform.services.EntityRendererRegistry; -public class ForgeClientPlatformHelper implements ClientPlatformHelper { +public class ForgeClientPlatform implements ClientPlatform { private final EntityRendererRegistry entityRenderers = new ForgeEntityRendererRegistry(); @Override diff --git a/forge/src/main/java/dev/ultreon/mods/xinexlib/platform/ForgeMod.java b/forge/src/main/java/dev/ultreon/mods/xinexlib/platform/ForgeMod.java new file mode 100644 index 0000000..68b7f6b --- /dev/null +++ b/forge/src/main/java/dev/ultreon/mods/xinexlib/platform/ForgeMod.java @@ -0,0 +1,33 @@ +package dev.ultreon.mods.xinexlib.platform; + +import net.minecraftforge.common.util.MavenVersionStringHelper; +import net.minecraftforge.fml.ModContainer; + +public class ForgeMod implements Mod { + private final ModContainer container; + + public ForgeMod(ModContainer container) { + this.container = container; + } + + @Override + public String getModId() { + return container.getModId(); + } + + @Override + public String getName() { + return container.getModInfo().getDisplayName(); + } + + @Override + public String getVersion() { + return MavenVersionStringHelper.artifactVersionToString(container.getModInfo().getVersion()); + } + + @Override + public String getDescription() { + return container.getModInfo().getDescription(); + } + +} diff --git a/forge/src/main/java/dev/ultreon/mods/xinexlib/platform/ForgePlatformHelper.java b/forge/src/main/java/dev/ultreon/mods/xinexlib/platform/ForgePlatform.java similarity index 87% rename from forge/src/main/java/dev/ultreon/mods/xinexlib/platform/ForgePlatformHelper.java rename to forge/src/main/java/dev/ultreon/mods/xinexlib/platform/ForgePlatform.java index ae703ca..2bf6e6c 100644 --- a/forge/src/main/java/dev/ultreon/mods/xinexlib/platform/ForgePlatformHelper.java +++ b/forge/src/main/java/dev/ultreon/mods/xinexlib/platform/ForgePlatform.java @@ -5,8 +5,8 @@ import dev.ultreon.mods.xinexlib.network.ForgeNetworker; import dev.ultreon.mods.xinexlib.network.NetworkRegistry; import dev.ultreon.mods.xinexlib.network.Networker; -import dev.ultreon.mods.xinexlib.platform.services.ClientPlatformHelper; -import dev.ultreon.mods.xinexlib.platform.services.PlatformHelper; +import dev.ultreon.mods.xinexlib.platform.services.ClientPlatform; +import dev.ultreon.mods.xinexlib.platform.services.Platform; import dev.ultreon.mods.xinexlib.registrar.ForgeRegistrarManager; import dev.ultreon.mods.xinexlib.registrar.RegistrarManager; import dev.ultreon.mods.xinexlib.tabs.ForgeCreativeTabBuilder; @@ -19,19 +19,16 @@ import net.minecraftforge.fml.loading.FMLEnvironment; import net.minecraftforge.fml.loading.FMLLoader; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.Consumer; -public class ForgePlatformHelper implements PlatformHelper { +public class ForgePlatform implements Platform { private final List registrants = new ArrayList<>(); private final Map registrars = new HashMap<>(); - private ClientPlatformHelper client; + private ClientPlatform client; - public ForgePlatformHelper() { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> this.client = new ForgeClientPlatformHelper()); + public ForgePlatform() { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> this.client = new ForgeClientPlatform()); MinecraftForge.EVENT_BUS.addListener((RegisterCommandsEvent event) -> { var dispatcher = event.getDispatcher(); @@ -91,10 +88,15 @@ public void registerCommand(CommandRegistrant registrant) { } @Override - public ClientPlatformHelper client() { + public ClientPlatform client() { if (FMLEnvironment.dist == Dist.CLIENT) { return client; } throw new IllegalStateException("This method should only be called on the client"); } + + @Override + public Optional getMod(String modId) { + return ModList.get().getModContainerById(modId).map(ForgeMod::new); + } } diff --git a/forge/src/main/resources/META-INF/services/dev.ultreon.mods.xinexlib.platform.services.Platform b/forge/src/main/resources/META-INF/services/dev.ultreon.mods.xinexlib.platform.services.Platform new file mode 100644 index 0000000..65805f1 --- /dev/null +++ b/forge/src/main/resources/META-INF/services/dev.ultreon.mods.xinexlib.platform.services.Platform @@ -0,0 +1 @@ +dev.ultreon.mods.xinexlib.platform.ForgePlatform diff --git a/forge/src/main/resources/META-INF/services/dev.ultreon.mods.xinexlib.platform.services.PlatformHelper b/forge/src/main/resources/META-INF/services/dev.ultreon.mods.xinexlib.platform.services.PlatformHelper deleted file mode 100644 index 66529c4..0000000 --- a/forge/src/main/resources/META-INF/services/dev.ultreon.mods.xinexlib.platform.services.PlatformHelper +++ /dev/null @@ -1 +0,0 @@ -dev.ultreon.mods.xinexlib.platform.ForgePlatformHelper diff --git a/neoforge/src/main/java/dev/ultreon/mods/xinexlib/XinexLib.java b/neoforge/src/main/java/dev/ultreon/mods/xinexlib/NeoForgeXinexLib.java similarity index 92% rename from neoforge/src/main/java/dev/ultreon/mods/xinexlib/XinexLib.java rename to neoforge/src/main/java/dev/ultreon/mods/xinexlib/NeoForgeXinexLib.java index bd52362..693b6be 100644 --- a/neoforge/src/main/java/dev/ultreon/mods/xinexlib/XinexLib.java +++ b/neoforge/src/main/java/dev/ultreon/mods/xinexlib/NeoForgeXinexLib.java @@ -1,12 +1,12 @@ package dev.ultreon.mods.xinexlib; +import dev.ultreon.mods.xinexlib.client.NeoForgeXinexLibClient; import dev.ultreon.mods.xinexlib.event.SetupEvent; import dev.ultreon.mods.xinexlib.event.interact.UseBlockEvent; import dev.ultreon.mods.xinexlib.event.interact.UseItemEvent; import dev.ultreon.mods.xinexlib.event.player.PlayerBreakBlockEvent; import dev.ultreon.mods.xinexlib.event.system.EventSystem; -import dev.ultreon.mods.xinexlib.platform.NeoForgePlatformHelper; -import dev.ultreon.mods.xinexlib.platform.Services; +import dev.ultreon.mods.xinexlib.platform.NeoForgePlatform; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.neoforged.api.distmarker.Dist; @@ -25,27 +25,26 @@ import net.neoforged.neoforge.event.server.ServerStoppingEvent; @Mod(Constants.MOD_ID) -public class XinexLib { - public XinexLib(IEventBus eventBus) { +public class NeoForgeXinexLib { + public NeoForgeXinexLib(IEventBus eventBus) { /* This method is invoked by the NeoForge mod loader when it is ready to load your mod. You can access NeoForge and Common code in this project. Use NeoForge to bootstrap the Common mod. */ - - NeoForgePlatformHelper platform = (NeoForgePlatformHelper) Services.PLATFORM; + NeoForgePlatform platform = NeoForgePlatform.getPlatform(); platform.registerMod(Constants.MOD_ID, eventBus); Constants.LOG.info("Hello NeoForge world!"); - CommonClass.init(); + XinexLibCommon.init(); NeoForge.EVENT_BUS.register(this); eventBus.addListener(FMLCommonSetupEvent.class, fmlCommonSetupEvent -> EventSystem.MAIN.publish(SetupEvent.COMMON)); if (FMLEnvironment.dist == Dist.CLIENT) { - XinexLibClient.init(); + NeoForgeXinexLibClient.init(); } } diff --git a/neoforge/src/main/java/dev/ultreon/mods/xinexlib/XinexLibClient.java b/neoforge/src/main/java/dev/ultreon/mods/xinexlib/XinexLibClient.java deleted file mode 100644 index bfc71c9..0000000 --- a/neoforge/src/main/java/dev/ultreon/mods/xinexlib/XinexLibClient.java +++ /dev/null @@ -1,21 +0,0 @@ -package dev.ultreon.mods.xinexlib; - -import dev.ultreon.mods.xinexlib.client.ClientClass; -import dev.ultreon.mods.xinexlib.platform.Services; - -public class XinexLibClient { - private XinexLibClient() { - - } - - public static void init() { - ClientClass.init(); - if (Services.isDevelopmentEnvironment() && "true".equals(System.getProperty("xinexlib.dev"))) { - XinexLibClient.initDev(); - } - } - - private static void initDev() { - - } -} diff --git a/neoforge/src/main/java/dev/ultreon/mods/xinexlib/client/NeoForgeXinexLibClient.java b/neoforge/src/main/java/dev/ultreon/mods/xinexlib/client/NeoForgeXinexLibClient.java new file mode 100644 index 0000000..b667e43 --- /dev/null +++ b/neoforge/src/main/java/dev/ultreon/mods/xinexlib/client/NeoForgeXinexLibClient.java @@ -0,0 +1,50 @@ +package dev.ultreon.mods.xinexlib.client; + +import dev.ultreon.mods.xinexlib.client.event.ClientScreenOpenEvent; +import dev.ultreon.mods.xinexlib.client.event.ClientScreenPreInitEvent; +import dev.ultreon.mods.xinexlib.event.system.EventSystem; +import dev.ultreon.mods.xinexlib.platform.XinexPlatform; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.client.event.ScreenEvent; +import net.neoforged.neoforge.common.NeoForge; + +public class NeoForgeXinexLibClient { + private NeoForgeXinexLibClient() { + + } + + public static void init() { + NeoForgeXinexLibClient client = new NeoForgeXinexLibClient(); + NeoForge.EVENT_BUS.register(client); + + XinexLibClient.init(); + if (XinexPlatform.isDevelopmentEnvironment() && "true".equals(System.getProperty("xinexlib.dev"))) { + client.initDev(); + } + } + + @SubscribeEvent + public void onScreenOpen(ScreenEvent.Opening event) { + ClientScreenOpenEvent published = EventSystem.MAIN.publish(new ClientScreenOpenEvent(event.getScreen())); + if (published.isCanceled()) { + if (published.get() != null) { + event.setNewScreen(published.get()); + } + event.setCanceled(true); + } + } + + @SubscribeEvent + public void onScreenPreInit(ScreenEvent.Init.Pre event) { + EventSystem.MAIN.publish(new ClientScreenPreInitEvent(event.getScreen())); + } + + @SubscribeEvent + public void onScreenPostInit(ScreenEvent.Init.Post event) { + EventSystem.MAIN.publish(new ClientScreenPreInitEvent(event.getScreen())); + } + + private void initDev() { + + } +} diff --git a/neoforge/src/main/java/dev/ultreon/mods/xinexlib/platform/NeoForgeClientPlatformHelper.java b/neoforge/src/main/java/dev/ultreon/mods/xinexlib/platform/NeoForgeClientPlatform.java similarity index 84% rename from neoforge/src/main/java/dev/ultreon/mods/xinexlib/platform/NeoForgeClientPlatformHelper.java rename to neoforge/src/main/java/dev/ultreon/mods/xinexlib/platform/NeoForgeClientPlatform.java index 73f314e..b5b1e31 100644 --- a/neoforge/src/main/java/dev/ultreon/mods/xinexlib/platform/NeoForgeClientPlatformHelper.java +++ b/neoforge/src/main/java/dev/ultreon/mods/xinexlib/platform/NeoForgeClientPlatform.java @@ -1,10 +1,10 @@ package dev.ultreon.mods.xinexlib.platform; import dev.ultreon.mods.xinexlib.platform.client.NeoForgeEntityRendererRegistry; -import dev.ultreon.mods.xinexlib.platform.services.ClientPlatformHelper; +import dev.ultreon.mods.xinexlib.platform.services.ClientPlatform; import dev.ultreon.mods.xinexlib.platform.services.EntityRendererRegistry; -public class NeoForgeClientPlatformHelper implements ClientPlatformHelper { +public class NeoForgeClientPlatform implements ClientPlatform { private final EntityRendererRegistry entityRenderers = new NeoForgeEntityRendererRegistry(); @Override diff --git a/neoforge/src/main/java/dev/ultreon/mods/xinexlib/platform/NeoForgeMod.java b/neoforge/src/main/java/dev/ultreon/mods/xinexlib/platform/NeoForgeMod.java new file mode 100644 index 0000000..65b4081 --- /dev/null +++ b/neoforge/src/main/java/dev/ultreon/mods/xinexlib/platform/NeoForgeMod.java @@ -0,0 +1,32 @@ +package dev.ultreon.mods.xinexlib.platform; + +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.i18n.MavenVersionTranslator; + +public class NeoForgeMod implements Mod { + private final ModContainer container; + + public NeoForgeMod(ModContainer container) { + this.container = container; + } + + @Override + public String getModId() { + return container.getModId(); + } + + @Override + public String getName() { + return container.getModInfo().getDisplayName(); + } + + @Override + public String getVersion() { + return MavenVersionTranslator.artifactVersionToString(container.getModInfo().getVersion()); + } + + @Override + public String getDescription() { + return container.getModInfo().getDescription(); + } +} diff --git a/neoforge/src/main/java/dev/ultreon/mods/xinexlib/platform/NeoForgePlatformHelper.java b/neoforge/src/main/java/dev/ultreon/mods/xinexlib/platform/NeoForgePlatform.java similarity index 83% rename from neoforge/src/main/java/dev/ultreon/mods/xinexlib/platform/NeoForgePlatformHelper.java rename to neoforge/src/main/java/dev/ultreon/mods/xinexlib/platform/NeoForgePlatform.java index 671f496..50c4355 100644 --- a/neoforge/src/main/java/dev/ultreon/mods/xinexlib/platform/NeoForgePlatformHelper.java +++ b/neoforge/src/main/java/dev/ultreon/mods/xinexlib/platform/NeoForgePlatform.java @@ -5,8 +5,8 @@ import dev.ultreon.mods.xinexlib.network.NetworkRegistry; import dev.ultreon.mods.xinexlib.network.Networker; import dev.ultreon.mods.xinexlib.network.NeoForgeNetworker; -import dev.ultreon.mods.xinexlib.platform.services.ClientPlatformHelper; -import dev.ultreon.mods.xinexlib.platform.services.PlatformHelper; +import dev.ultreon.mods.xinexlib.platform.services.ClientPlatform; +import dev.ultreon.mods.xinexlib.platform.services.Platform; import dev.ultreon.mods.xinexlib.registrar.RegistrarManager; import dev.ultreon.mods.xinexlib.registrar.NeoForgeRegistrarManager; import dev.ultreon.mods.xinexlib.tabs.CreativeModeTabBuilder; @@ -22,17 +22,21 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Optional; import java.util.function.Consumer; -public class NeoForgePlatformHelper implements PlatformHelper { +public class NeoForgePlatform implements Platform { + public static NeoForgePlatform platform; private final HashMap registrars = new HashMap<>(); private final List registrants = new ArrayList<>(); private IEventBus modEventBus; - private ClientPlatformHelper client; + private ClientPlatform client; + + public NeoForgePlatform() { + platform = this; - public NeoForgePlatformHelper() { if (FMLEnvironment.dist == Dist.CLIENT) { - client = new NeoForgeClientPlatformHelper(); + client = new NeoForgeClientPlatform(); } NeoForge.EVENT_BUS.addListener(RegisterCommandsEvent.class, event -> { @@ -42,6 +46,10 @@ public NeoForgePlatformHelper() { }); } + public static NeoForgePlatform getPlatform() { + return (NeoForgePlatform) XinexPlatform.PLATFORM; + } + @Override public ModPlatform getPlatformName() { return ModPlatform.NeoForge; @@ -90,13 +98,18 @@ public void registerCommand(CommandRegistrant registrant) { } @Override - public ClientPlatformHelper client() { + public ClientPlatform client() { if (FMLEnvironment.dist == Dist.CLIENT) { return client; } throw new IllegalStateException("This method should only be called on the client"); } + @Override + public Optional getMod(String modId) { + return ModList.get().getModContainerById(modId).map(NeoForgeMod::new); + } + public void registerMod(String modId, IEventBus modEventBus) { this.modEventBus = modEventBus; this.registrars.put(modId, new NeoForgeRegistrarManager(modId, modEventBus)); diff --git a/neoforge/src/main/resources/META-INF/services/dev.ultreon.mods.xinexlib.platform.services.Platform b/neoforge/src/main/resources/META-INF/services/dev.ultreon.mods.xinexlib.platform.services.Platform new file mode 100644 index 0000000..bf2ac2b --- /dev/null +++ b/neoforge/src/main/resources/META-INF/services/dev.ultreon.mods.xinexlib.platform.services.Platform @@ -0,0 +1 @@ +dev.ultreon.mods.xinexlib.platform.NeoForgePlatform diff --git a/neoforge/src/main/resources/META-INF/services/dev.ultreon.mods.xinexlib.platform.services.PlatformHelper b/neoforge/src/main/resources/META-INF/services/dev.ultreon.mods.xinexlib.platform.services.PlatformHelper deleted file mode 100644 index aeb5e8a..0000000 --- a/neoforge/src/main/resources/META-INF/services/dev.ultreon.mods.xinexlib.platform.services.PlatformHelper +++ /dev/null @@ -1 +0,0 @@ -dev.ultreon.mods.xinexlib.platform.NeoForgePlatformHelper