diff --git a/build.gradle.kts b/build.gradle.kts index a8af21a..8ac8ac6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -71,8 +71,13 @@ subprojects { setupRepositories() - val capitalizedName = - project.name.replaceFirstChar { it.uppercase() } + val capitalizedName = { + if (project.name == "neoforge") { + "NeoForge" + } else { + project.name.replaceFirstChar { it.titlecase() } + } + }(); val loom = project.extensions.getByType() loom.apply { diff --git a/common/src/main/java/io/github/slimeistdev/crystalline_sky/CrystallineSkyClient.java b/common/src/main/java/io/github/slimeistdev/crystalline_sky/CrystallineSkyClient.java index d7dc717..d7d0e39 100644 --- a/common/src/main/java/io/github/slimeistdev/crystalline_sky/CrystallineSkyClient.java +++ b/common/src/main/java/io/github/slimeistdev/crystalline_sky/CrystallineSkyClient.java @@ -30,15 +30,17 @@ public class CrystallineSkyClient { ); public static void init() { - ClientPlatformHelper.registerItemProperty( - CrystallineItems.SKY_LIGHT.value(), - ResourceLocation.withDefaultNamespace("level"), - (stack, world, entity, seed) -> { - BlockItemStateProperties state = stack.getOrDefault(DataComponents.BLOCK_STATE, BlockItemStateProperties.EMPTY); - Integer level = state.get(LightBlock.LEVEL); - return level != null ? level / 16.0F : 1.0F; - } - ); + CrystallineItems.SKY_LIGHT.onRegistered(i -> { + ClientPlatformHelper.registerItemProperty( + i, + ResourceLocation.withDefaultNamespace("level"), + (stack, world, entity, seed) -> { + BlockItemStateProperties state = stack.getOrDefault(DataComponents.BLOCK_STATE, BlockItemStateProperties.EMPTY); + Integer level = state.get(LightBlock.LEVEL); + return level != null ? level / 16.0F : 1.0F; + } + ); + }); } public static void registerKeybindings(Consumer registrar) { diff --git a/common/src/main/java/io/github/slimeistdev/crystalline_sky/foundation/registration/CatnipRegistry.java b/common/src/main/java/io/github/slimeistdev/crystalline_sky/foundation/registration/CatnipRegistry.java index 8aa47df..d2cd774 100644 --- a/common/src/main/java/io/github/slimeistdev/crystalline_sky/foundation/registration/CatnipRegistry.java +++ b/common/src/main/java/io/github/slimeistdev/crystalline_sky/foundation/registration/CatnipRegistry.java @@ -1,6 +1,6 @@ package io.github.slimeistdev.crystalline_sky.foundation.registration; -import com.google.common.collect.HashMultimap; +import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; import io.github.slimeistdev.crystalline_sky.foundation.registration.builder.BlockBuilder; @@ -21,7 +21,7 @@ import java.util.function.Function; public class CatnipRegistry { public final String modId; - private static final Multimap, Registration> REGISTRATIONS = HashMultimap.create(); + private static final Multimap, Registration> REGISTRATIONS = ArrayListMultimap.create(); public static final Multimap, Registration> REGISTRATIONS_VIEW = Multimaps.unmodifiableMultimap(REGISTRATIONS); public CatnipRegistry(String modId) { diff --git a/common/src/main/java/io/github/slimeistdev/crystalline_sky/multiloader/PlatformHelper.java b/common/src/main/java/io/github/slimeistdev/crystalline_sky/multiloader/PlatformHelper.java new file mode 100644 index 0000000..472d122 --- /dev/null +++ b/common/src/main/java/io/github/slimeistdev/crystalline_sky/multiloader/PlatformHelper.java @@ -0,0 +1,10 @@ +package io.github.slimeistdev.crystalline_sky.multiloader; + +import dev.architectury.injectables.annotations.ExpectPlatform; + +public class PlatformHelper { + @ExpectPlatform + public static boolean isDevEnv() { + throw new AssertionError(); + } +} diff --git a/common/src/main/java/io/github/slimeistdev/crystalline_sky/registry/client/CrystallineRenderTypes.java b/common/src/main/java/io/github/slimeistdev/crystalline_sky/registry/client/CrystallineRenderTypes.java index 2521635..f930ab9 100644 --- a/common/src/main/java/io/github/slimeistdev/crystalline_sky/registry/client/CrystallineRenderTypes.java +++ b/common/src/main/java/io/github/slimeistdev/crystalline_sky/registry/client/CrystallineRenderTypes.java @@ -48,4 +48,6 @@ public abstract class CrystallineRenderTypes extends RenderType { }, () -> {}); } } + + public static void init() {} } diff --git a/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/mixin/client/RenderTypeMixin.java b/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/mixin/client/RenderTypeMixin.java index 15c1280..11d5527 100644 --- a/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/mixin/client/RenderTypeMixin.java +++ b/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/mixin/client/RenderTypeMixin.java @@ -2,11 +2,15 @@ package io.github.slimeistdev.crystalline_sky.fabric.mixin.client; import com.google.common.collect.ImmutableList; import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.RenderType_Duck; +import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderTypes; import net.minecraft.client.renderer.RenderType; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(RenderType.class) public class RenderTypeMixin implements RenderType_Duck { @@ -22,4 +26,10 @@ public class RenderTypeMixin implements RenderType_Duck { .add((RenderType) (Object) this) .build(); } + + // must do this _now_, otherwise it won't inject in time for other rendering classes to get the right block layers + @Inject(method = "", at = @At("RETURN")) + private static void loadCustom(CallbackInfo ci) { + CrystallineRenderTypes.init(); + } } diff --git a/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/multiloader/fabric/PlatformHelperImpl.java b/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/multiloader/fabric/PlatformHelperImpl.java new file mode 100644 index 0000000..76d3a23 --- /dev/null +++ b/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/multiloader/fabric/PlatformHelperImpl.java @@ -0,0 +1,11 @@ +package io.github.slimeistdev.crystalline_sky.multiloader.fabric; + +import io.github.slimeistdev.crystalline_sky.annotation.multiloader.ImplClass; +import net.fabricmc.loader.api.FabricLoader; + +@ImplClass +public class PlatformHelperImpl { + public static boolean isDevEnv() { + return FabricLoader.getInstance().isDevelopmentEnvironment(); + } +} diff --git a/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/multiloader/neoforge/ItemGroupRegistrationEventImpl.java b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/multiloader/neoforge/ItemGroupRegistrationEventImpl.java index f2d0dcd..040af77 100644 --- a/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/multiloader/neoforge/ItemGroupRegistrationEventImpl.java +++ b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/multiloader/neoforge/ItemGroupRegistrationEventImpl.java @@ -1,6 +1,40 @@ package io.github.slimeistdev.crystalline_sky.multiloader.neoforge; -public class ItemGroupRegistrationEventImpl { - public static void create() { +import io.github.slimeistdev.crystalline_sky.multiloader.ItemGroupRegistrationEvent; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ItemLike; +import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; + +import java.util.List; + +import static net.minecraft.world.item.CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS; + +public class ItemGroupRegistrationEventImpl implements ItemGroupRegistrationEvent { + private final BuildCreativeModeTabContentsEvent event; + + public ItemGroupRegistrationEventImpl(BuildCreativeModeTabContentsEvent event) { + this.event = event; + } + + @Override + public ResourceKey getTab() { + return event.getTabKey(); + } + + @Override + public boolean hasPermissions() { + return event.hasPermissions(); + } + + @Override + public void addAfter(ItemLike reference, List stacks) { + // WARN: this is sort of hacky, but it should do for our current use cases + ItemStack referenceStack = new ItemStack(reference.asItem()); + + for (ItemStack stack : stacks) { + event.insertAfter(referenceStack, stack, PARENT_AND_SEARCH_TABS); + } } } diff --git a/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/multiloader/neoforge/PlatformHelperImpl.java b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/multiloader/neoforge/PlatformHelperImpl.java new file mode 100644 index 0000000..038a32f --- /dev/null +++ b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/multiloader/neoforge/PlatformHelperImpl.java @@ -0,0 +1,11 @@ +package io.github.slimeistdev.crystalline_sky.multiloader.neoforge; + +import io.github.slimeistdev.crystalline_sky.annotation.multiloader.ImplClass; +import net.neoforged.fml.loading.FMLLoader; + +@ImplClass +public class PlatformHelperImpl { + public static boolean isDevEnv() { + return !FMLLoader.isProduction(); + } +} diff --git a/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/CrystallineSkyClientImpl.java b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/CrystallineSkyClientImpl.java index e2d5801..5a49d44 100644 --- a/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/CrystallineSkyClientImpl.java +++ b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/CrystallineSkyClientImpl.java @@ -2,11 +2,11 @@ package io.github.slimeistdev.crystalline_sky.neoforge; import io.github.slimeistdev.crystalline_sky.CrystallineSky; import io.github.slimeistdev.crystalline_sky.CrystallineSkyClient; +import io.github.slimeistdev.crystalline_sky.multiloader.neoforge.ItemGroupRegistrationEventImpl; +import io.github.slimeistdev.crystalline_sky.registry.CrystallineItems; import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderTypes; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderType; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.CreativeModeTabs; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; @@ -39,6 +39,6 @@ public class CrystallineSkyClientImpl { @SubscribeEvent public static void buildCreativeModeTabContents(BuildCreativeModeTabContentsEvent event) { - event.insertAfter(); + CrystallineItems.onItemGroupRegistration(new ItemGroupRegistrationEventImpl(event)); } } diff --git a/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/CrystallineSkyImpl.java b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/CrystallineSkyImpl.java index fd37487..ca690ae 100644 --- a/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/CrystallineSkyImpl.java +++ b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/CrystallineSkyImpl.java @@ -1,19 +1,58 @@ package io.github.slimeistdev.crystalline_sky.neoforge; import io.github.slimeistdev.crystalline_sky.CrystallineSky; +import io.github.slimeistdev.crystalline_sky.foundation.registration.CatnipRegistry; +import io.github.slimeistdev.crystalline_sky.foundation.registration.Registration; import io.github.slimeistdev.crystalline_sky.multiloader.Env; +import io.github.slimeistdev.crystalline_sky.multiloader.PlatformHelper; import net.neoforged.bus.api.IEventBus; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.registries.RegisterEvent; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.ConfigurationFactory; +import org.apache.logging.log4j.core.config.ConfigurationSource; +import org.apache.logging.log4j.core.config.Configurator; +import java.net.URI; + +@EventBusSubscriber(modid = CrystallineSky.ID) @Mod(CrystallineSky.ID) public class CrystallineSkyImpl { static IEventBus bus; public CrystallineSkyImpl(IEventBus bus) { + restoreLoggers(); CrystallineSkyImpl.bus = bus; CrystallineSky.init(); //noinspection Convert2MethodRef Env.CLIENT.runIfCurrent(() -> () -> CrystallineSkyClientImpl.init()); } + + @SubscribeEvent + public static void onRegister(RegisterEvent event) { + for (Registration registration : CatnipRegistry.REGISTRATIONS_VIEW.get(event.getRegistry())) { + if (registration != null) { + registration.register(); + } + } + } + + private static void restoreLoggers() { + if (PlatformHelper.isDevEnv()) { + // restore our logging config, since forge likes to nuke it for fun + for (String prop : new String[] {"log4j.configurationFile", "log4j2.configurationFile"}) { + String file = System.getProperty(prop); + if (file != null) { + Configurator.reconfigure(ConfigurationFactory.getInstance().getConfiguration( + LoggerContext.getContext(), + ConfigurationSource.fromUri(URI.create(file)) + )); + break; + } + } + } + } } diff --git a/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/mixin/client/RenderTypeMixin.java b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/mixin/client/RenderTypeMixin.java index 46615f7..5e17759 100644 --- a/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/mixin/client/RenderTypeMixin.java +++ b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/mixin/client/RenderTypeMixin.java @@ -2,11 +2,15 @@ package io.github.slimeistdev.crystalline_sky.neoforge.mixin.client; import com.google.common.collect.ImmutableList; import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.RenderType_Duck; +import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderTypes; import net.minecraft.client.renderer.RenderType; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(RenderType.class) public class RenderTypeMixin implements RenderType_Duck { @@ -26,4 +30,10 @@ public class RenderTypeMixin implements RenderType_Duck { .build(); chunkLayerId = CHUNK_BUFFER_LAYERS.size() - 1; } + + // must do this _now_, otherwise it won't inject in time for other rendering classes to get the right block layers + @Inject(method = "", at = @At("RETURN")) + private static void loadCustom(CallbackInfo ci) { + CrystallineRenderTypes.init(); + } }