From 90237abca6d4e42940be7c178a776432a0e29d75 Mon Sep 17 00:00:00 2001 From: HypherionMC Date: Thu, 30 Jun 2022 23:19:24 +0200 Subject: [PATCH] Implement Event System and Basic Events --- .../client/events/ColorRegistrationEvent.java | 43 +++++++++++++++++ .../client/gui/tabs/CreativeTabBuilder.java | 48 +++++++++++++++++++ .../craterlib/common/config/ModuleConfig.java | 6 +-- .../craterlib/events/CraterEventBus.java | 32 +++++++++++++ .../hypherionmc/craterlib/events/Event.java | 25 ++++++++++ .../craterlib/events/IEventExecutor.java | 10 ++++ .../mixin/colors/BlockColorsMixin.java | 23 +++++++++ .../mixin/colors/ItemColorsMixin.java | 24 ++++++++++ .../craterlib/platform/Services.java | 3 ++ .../platform/services/LibClientHelper.java | 16 +++++++ .../src/main/resources/craterlib.mixins.json | 2 + .../craterlib/client/FabricClientHelper.java | 33 +++++++++++++ ...raterlib.platform.services.LibClientHelper | 1 + .../craterlib/client/ForgeClientHelper.java | 34 +++++++++++++ ...raterlib.platform.services.LibClientHelper | 1 + README.md | 1 + gradle.properties | 2 +- 17 files changed, 300 insertions(+), 4 deletions(-) create mode 100644 Common/src/main/java/me/hypherionmc/craterlib/client/events/ColorRegistrationEvent.java create mode 100644 Common/src/main/java/me/hypherionmc/craterlib/client/gui/tabs/CreativeTabBuilder.java create mode 100644 Common/src/main/java/me/hypherionmc/craterlib/events/CraterEventBus.java create mode 100644 Common/src/main/java/me/hypherionmc/craterlib/events/Event.java create mode 100644 Common/src/main/java/me/hypherionmc/craterlib/events/IEventExecutor.java create mode 100644 Common/src/main/java/me/hypherionmc/craterlib/mixin/colors/BlockColorsMixin.java create mode 100644 Common/src/main/java/me/hypherionmc/craterlib/mixin/colors/ItemColorsMixin.java create mode 100644 Common/src/main/java/me/hypherionmc/craterlib/platform/services/LibClientHelper.java create mode 100644 Fabric/src/main/java/me/hypherionmc/craterlib/client/FabricClientHelper.java create mode 100644 Fabric/src/main/resources/META-INF/services/me.hypherionmc.craterlib.platform.services.LibClientHelper create mode 100644 Forge/src/main/java/me/hypherionmc/craterlib/client/ForgeClientHelper.java create mode 100644 Forge/src/main/resources/META-INF/services/me.hypherionmc.craterlib.platform.services.LibClientHelper diff --git a/Common/src/main/java/me/hypherionmc/craterlib/client/events/ColorRegistrationEvent.java b/Common/src/main/java/me/hypherionmc/craterlib/client/events/ColorRegistrationEvent.java new file mode 100644 index 0000000..c494627 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/client/events/ColorRegistrationEvent.java @@ -0,0 +1,43 @@ +package me.hypherionmc.craterlib.client.events; + +import me.hypherionmc.craterlib.events.Event; +import net.minecraft.client.color.block.BlockColors; +import net.minecraft.client.color.item.ItemColors; + +/** + * @author HypherionSA + * @date 17/06/2022 + */ +public class ColorRegistrationEvent { + + public static class BLOCKS extends Event { + + private BlockColors colors; + + public BLOCKS() {} + + public BLOCKS(BlockColors colors) { + this.colors = colors; + } + + public BlockColors getColors() { + return colors; + } + } + + public static class ITEMS extends Event { + + private ItemColors colors; + + public ITEMS() {} + + public ITEMS(ItemColors colors) { + this.colors = colors; + } + + public ItemColors getColors() { + return colors; + } + } + +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/client/gui/tabs/CreativeTabBuilder.java b/Common/src/main/java/me/hypherionmc/craterlib/client/gui/tabs/CreativeTabBuilder.java new file mode 100644 index 0000000..a0861a3 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/client/gui/tabs/CreativeTabBuilder.java @@ -0,0 +1,48 @@ +package me.hypherionmc.craterlib.client.gui.tabs; + +import me.hypherionmc.craterlib.platform.Services; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; + +import java.util.function.Supplier; + +/** + * @author HypherionSA + * @date 16/06/2022 + */ +public class CreativeTabBuilder { + + public static Builder builder(String modid, String tabid) { + return new Builder(modid, tabid); + } + + public static final class Builder { + + private Supplier tabIcon; + private final String modid; + private final String tabid; + private String backgroundPrefix; + + public Builder(String modid, String tabid) { + this.modid = modid; + this.tabid = tabid; + } + + public Builder setIcon(Supplier stack) { + this.tabIcon = stack; + return this; + } + + public Builder setBackgroundPrefix(String prefix) { + this.backgroundPrefix = prefix; + return this; + } + + public CreativeModeTab build() { + return Services.CLIENT_HELPER.tabBuilder(this.modid, this.tabid, this.tabIcon, this.backgroundPrefix); + } + + } + +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/common/config/ModuleConfig.java b/Common/src/main/java/me/hypherionmc/craterlib/common/config/ModuleConfig.java index a5f3ef6..0657d9c 100644 --- a/Common/src/main/java/me/hypherionmc/craterlib/common/config/ModuleConfig.java +++ b/Common/src/main/java/me/hypherionmc/craterlib/common/config/ModuleConfig.java @@ -50,7 +50,7 @@ public class ModuleConfig { * @param config - The config class to use */ public void registerAndSetup(ModuleConfig config) { - if (!configPath.exists() || configPath.length() < 10) { + if (!configPath.exists() || configPath.length() < 2) { saveConfig(config); } else { migrateConfig(config); @@ -67,7 +67,7 @@ public class ModuleConfig { ObjectConverter converter = new ObjectConverter(); CommentedFileConfig config = CommentedFileConfig.builder(configPath).build(); - /* Save the config and fire the reload event */ + /* Save the config and fire the reload events */ converter.toConfig(conf, config); config.save(); } @@ -90,7 +90,7 @@ public class ModuleConfig { } /** - * INTERNAL METHOD - Upgrades the config files in the event the config structure changes + * INTERNAL METHOD - Upgrades the config files in the events the config structure changes * * @param conf - The config class to load */ diff --git a/Common/src/main/java/me/hypherionmc/craterlib/events/CraterEventBus.java b/Common/src/main/java/me/hypherionmc/craterlib/events/CraterEventBus.java new file mode 100644 index 0000000..977409a --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/events/CraterEventBus.java @@ -0,0 +1,32 @@ +package me.hypherionmc.craterlib.events; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author HypherionSA + * @date 21/06/2022 + */ +public class CraterEventBus { + private static final ConcurrentHashMap, List>> map = new ConcurrentHashMap(); + + public static void register(Class clazz, IEventExecutor handler) { + if (!map.containsKey(clazz)) map.put(clazz, new ArrayList<>()); + map.get(clazz).add(handler); + } + + public static boolean post(Event event) { + Class clazz = event.getClass(); + if (map.containsKey(clazz)) { + List> handlers = map.get(clazz); + for (IEventExecutor handler : handlers) { + handler.execute(event); + if (event.isCancelled()) { + return false; + } + } + } + return true; + } +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/events/Event.java b/Common/src/main/java/me/hypherionmc/craterlib/events/Event.java new file mode 100644 index 0000000..b75067c --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/events/Event.java @@ -0,0 +1,25 @@ +package me.hypherionmc.craterlib.events; + +/** + * @author HypherionSA + * @date 21/06/2022 + */ +public class Event { + private boolean cancelled; + + public boolean isCancellable() { + return false; + } + + public void setCancelled(boolean canceled) { + if (!this.isCancellable()) { + throw new RuntimeException("Cannot cancel event " + this); + } + this.cancelled = canceled; + } + + + public boolean isCancelled() { + return cancelled; + } +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/events/IEventExecutor.java b/Common/src/main/java/me/hypherionmc/craterlib/events/IEventExecutor.java new file mode 100644 index 0000000..3a7a167 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/events/IEventExecutor.java @@ -0,0 +1,10 @@ +package me.hypherionmc.craterlib.events; + +/** + * @author HypherionSA + * @date 21/06/2022 + */ +@FunctionalInterface +public interface IEventExecutor { + void execute(T event); +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/mixin/colors/BlockColorsMixin.java b/Common/src/main/java/me/hypherionmc/craterlib/mixin/colors/BlockColorsMixin.java new file mode 100644 index 0000000..e8249a3 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/mixin/colors/BlockColorsMixin.java @@ -0,0 +1,23 @@ +package me.hypherionmc.craterlib.mixin.colors; + +import me.hypherionmc.craterlib.client.events.ColorRegistrationEvent; +import me.hypherionmc.craterlib.events.CraterEventBus; +import net.minecraft.client.color.block.BlockColors; +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.CallbackInfoReturnable; + +/** + * @author HypherionSA + * @date 17/06/2022 + */ +@Mixin(BlockColors.class) +public class BlockColorsMixin { + + @Inject(method = "createDefault", at = @At("RETURN")) + private static void injectBlockColors(CallbackInfoReturnable cir) { + CraterEventBus.post(new ColorRegistrationEvent.BLOCKS(cir.getReturnValue())); + } + +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/mixin/colors/ItemColorsMixin.java b/Common/src/main/java/me/hypherionmc/craterlib/mixin/colors/ItemColorsMixin.java new file mode 100644 index 0000000..6df4790 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/mixin/colors/ItemColorsMixin.java @@ -0,0 +1,24 @@ +package me.hypherionmc.craterlib.mixin.colors; + +import me.hypherionmc.craterlib.client.events.ColorRegistrationEvent; +import me.hypherionmc.craterlib.events.CraterEventBus; +import net.minecraft.client.color.block.BlockColors; +import net.minecraft.client.color.item.ItemColors; +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.CallbackInfoReturnable; + +/** + * @author HypherionSA + * @date 17/06/2022 + */ +@Mixin(ItemColors.class) +public class ItemColorsMixin { + + @Inject(method = "createDefault", at = @At("RETURN")) + private static void injectItemColors(BlockColors $$0, CallbackInfoReturnable cir) { + CraterEventBus.post(new ColorRegistrationEvent.ITEMS(cir.getReturnValue())); + } + +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/platform/Services.java b/Common/src/main/java/me/hypherionmc/craterlib/platform/Services.java index 0d46dbc..3f7f387 100644 --- a/Common/src/main/java/me/hypherionmc/craterlib/platform/Services.java +++ b/Common/src/main/java/me/hypherionmc/craterlib/platform/Services.java @@ -2,6 +2,7 @@ package me.hypherionmc.craterlib.platform; import me.hypherionmc.craterlib.Constants; import me.hypherionmc.craterlib.platform.services.IPlatformHelper; +import me.hypherionmc.craterlib.platform.services.LibClientHelper; import java.util.ServiceLoader; @@ -9,6 +10,8 @@ public class Services { public static final IPlatformHelper PLATFORM = load(IPlatformHelper.class); + public static final LibClientHelper CLIENT_HELPER = load(LibClientHelper.class); + public static T load(Class clazz) { final T loadedService = ServiceLoader.load(clazz) diff --git a/Common/src/main/java/me/hypherionmc/craterlib/platform/services/LibClientHelper.java b/Common/src/main/java/me/hypherionmc/craterlib/platform/services/LibClientHelper.java new file mode 100644 index 0000000..b813f12 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/platform/services/LibClientHelper.java @@ -0,0 +1,16 @@ +package me.hypherionmc.craterlib.platform.services; + +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; + +import java.util.function.Supplier; + +/** + * @author HypherionSA + * @date 16/06/2022 + */ +public interface LibClientHelper { + + public CreativeModeTab tabBuilder(String modid, String tabid, Supplier icon, String backgroundSuf); + +} diff --git a/Common/src/main/resources/craterlib.mixins.json b/Common/src/main/resources/craterlib.mixins.json index 7b33759..3075b8f 100644 --- a/Common/src/main/resources/craterlib.mixins.json +++ b/Common/src/main/resources/craterlib.mixins.json @@ -6,6 +6,8 @@ "mixins": [ ], "client": [ + "colors.BlockColorsMixin", + "colors.ItemColorsMixin" ], "server": [ ], diff --git a/Fabric/src/main/java/me/hypherionmc/craterlib/client/FabricClientHelper.java b/Fabric/src/main/java/me/hypherionmc/craterlib/client/FabricClientHelper.java new file mode 100644 index 0000000..c1b1f1c --- /dev/null +++ b/Fabric/src/main/java/me/hypherionmc/craterlib/client/FabricClientHelper.java @@ -0,0 +1,33 @@ +package me.hypherionmc.craterlib.client; + +import me.hypherionmc.craterlib.platform.services.LibClientHelper; +import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; + +import java.util.function.Supplier; + +/** + * @author HypherionSA + * @date 16/06/2022 + */ +class FabricClientHelper implements LibClientHelper { + + + @Override + public CreativeModeTab tabBuilder(String modid, String tabid, Supplier icon, String backgroundSuf) { + FabricItemGroupBuilder tab = FabricItemGroupBuilder.create(new ResourceLocation(modid, tabid)); + + if (icon != null) { + tab.icon(icon); + } + + CreativeModeTab tab1 = tab.build(); + + if (backgroundSuf != null && !backgroundSuf.isEmpty()) { + tab1.setBackgroundSuffix(backgroundSuf); + } + return tab1; + } +} diff --git a/Fabric/src/main/resources/META-INF/services/me.hypherionmc.craterlib.platform.services.LibClientHelper b/Fabric/src/main/resources/META-INF/services/me.hypherionmc.craterlib.platform.services.LibClientHelper new file mode 100644 index 0000000..a0b514c --- /dev/null +++ b/Fabric/src/main/resources/META-INF/services/me.hypherionmc.craterlib.platform.services.LibClientHelper @@ -0,0 +1 @@ +me.hypherionmc.craterlib.client.FabricClientHelper diff --git a/Forge/src/main/java/me/hypherionmc/craterlib/client/ForgeClientHelper.java b/Forge/src/main/java/me/hypherionmc/craterlib/client/ForgeClientHelper.java new file mode 100644 index 0000000..c6114d8 --- /dev/null +++ b/Forge/src/main/java/me/hypherionmc/craterlib/client/ForgeClientHelper.java @@ -0,0 +1,34 @@ +package me.hypherionmc.craterlib.client; + +import me.hypherionmc.craterlib.platform.services.LibClientHelper; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; + +import java.util.function.Supplier; + +/** + * @author HypherionSA + * @date 16/06/2022 + */ +class ForgeClientHelper implements LibClientHelper { + + @Override + public CreativeModeTab tabBuilder(String modid, String tabid, Supplier icon, String backgroundSuf) { + CreativeModeTab tab = new CreativeModeTab(modid + "." + tabid) { + @Override + public ItemStack makeIcon() { + if (icon != null) { + return icon.get(); + } else { + return ItemStack.EMPTY; + } + } + }; + + if (backgroundSuf != null && !backgroundSuf.isEmpty()) { + tab.setBackgroundSuffix(backgroundSuf); + } + return tab; + } + +} diff --git a/Forge/src/main/resources/META-INF/services/me.hypherionmc.craterlib.platform.services.LibClientHelper b/Forge/src/main/resources/META-INF/services/me.hypherionmc.craterlib.platform.services.LibClientHelper new file mode 100644 index 0000000..8a73f15 --- /dev/null +++ b/Forge/src/main/resources/META-INF/services/me.hypherionmc.craterlib.platform.services.LibClientHelper @@ -0,0 +1 @@ +me.hypherionmc.craterlib.client.ForgeClientHelper diff --git a/README.md b/README.md index 7c44eff..24244fb 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ A library mod used by HypherionSA's mods. Mostly used by Hyper Lighting 2. * Built in FluidTank and Energy systems for Forge/Fabric (Forge versions are just wrappers). * Built in Optifine-Compat utilities * Various utilities for Blockstates, LANG, Math and Rendering +* Cross Mod-Loader Events * TODO: Built in Cross Mod-Loader Network system * TODO: Various GUI widgets and Utilities * TODO: Cross Mod-Loader Dynamic Lighting diff --git a/gradle.properties b/gradle.properties index 5edcb2f..704e882 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ # Project version_major=1 version_minor=0 -version_patch=0 +version_patch=6d group=me.hypherionmc.craterlib # Common