Multiloader VI

neoforge is working
This commit is contained in:
techno-sam
2026-04-16 23:28:41 +02:00
parent dc1670123e
commit 212fcbfad3
12 changed files with 152 additions and 18 deletions
@@ -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<CreativeModeTab> getTab() {
return event.getTabKey();
}
@Override
public boolean hasPermissions() {
return event.hasPermissions();
}
@Override
public void addAfter(ItemLike reference, List<ItemStack> 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);
}
}
}
@@ -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();
}
}
@@ -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));
}
}
@@ -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;
}
}
}
}
}
@@ -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 = "<clinit>", at = @At("RETURN"))
private static void loadCustom(CallbackInfo ci) {
CrystallineRenderTypes.init();
}
}