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
+7 -2
View File
@@ -71,8 +71,13 @@ subprojects {
setupRepositories() setupRepositories()
val capitalizedName = val capitalizedName = {
project.name.replaceFirstChar { it.uppercase() } if (project.name == "neoforge") {
"NeoForge"
} else {
project.name.replaceFirstChar { it.titlecase() }
}
}();
val loom = project.extensions.getByType<LoomGradleExtensionAPI>() val loom = project.extensions.getByType<LoomGradleExtensionAPI>()
loom.apply { loom.apply {
@@ -30,8 +30,9 @@ public class CrystallineSkyClient {
); );
public static void init() { public static void init() {
CrystallineItems.SKY_LIGHT.onRegistered(i -> {
ClientPlatformHelper.registerItemProperty( ClientPlatformHelper.registerItemProperty(
CrystallineItems.SKY_LIGHT.value(), i,
ResourceLocation.withDefaultNamespace("level"), ResourceLocation.withDefaultNamespace("level"),
(stack, world, entity, seed) -> { (stack, world, entity, seed) -> {
BlockItemStateProperties state = stack.getOrDefault(DataComponents.BLOCK_STATE, BlockItemStateProperties.EMPTY); BlockItemStateProperties state = stack.getOrDefault(DataComponents.BLOCK_STATE, BlockItemStateProperties.EMPTY);
@@ -39,6 +40,7 @@ public class CrystallineSkyClient {
return level != null ? level / 16.0F : 1.0F; return level != null ? level / 16.0F : 1.0F;
} }
); );
});
} }
public static void registerKeybindings(Consumer<KeyMapping> registrar) { public static void registerKeybindings(Consumer<KeyMapping> registrar) {
@@ -1,6 +1,6 @@
package io.github.slimeistdev.crystalline_sky.foundation.registration; 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.Multimap;
import com.google.common.collect.Multimaps; import com.google.common.collect.Multimaps;
import io.github.slimeistdev.crystalline_sky.foundation.registration.builder.BlockBuilder; import io.github.slimeistdev.crystalline_sky.foundation.registration.builder.BlockBuilder;
@@ -21,7 +21,7 @@ import java.util.function.Function;
public class CatnipRegistry { public class CatnipRegistry {
public final String modId; public final String modId;
private static final Multimap<Registry<?>, Registration<?, ?, ?>> REGISTRATIONS = HashMultimap.create(); private static final Multimap<Registry<?>, Registration<?, ?, ?>> REGISTRATIONS = ArrayListMultimap.create();
public static final Multimap<Registry<?>, Registration<?, ?, ?>> REGISTRATIONS_VIEW = Multimaps.unmodifiableMultimap(REGISTRATIONS); public static final Multimap<Registry<?>, Registration<?, ?, ?>> REGISTRATIONS_VIEW = Multimaps.unmodifiableMultimap(REGISTRATIONS);
public CatnipRegistry(String modId) { public CatnipRegistry(String modId) {
@@ -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();
}
}
@@ -48,4 +48,6 @@ public abstract class CrystallineRenderTypes extends RenderType {
}, () -> {}); }, () -> {});
} }
} }
public static void init() {}
} }
@@ -2,11 +2,15 @@ package io.github.slimeistdev.crystalline_sky.fabric.mixin.client;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.RenderType_Duck; 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 net.minecraft.client.renderer.RenderType;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Shadow; 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) @Mixin(RenderType.class)
public class RenderTypeMixin implements RenderType_Duck { public class RenderTypeMixin implements RenderType_Duck {
@@ -22,4 +26,10 @@ public class RenderTypeMixin implements RenderType_Duck {
.add((RenderType) (Object) this) .add((RenderType) (Object) this)
.build(); .build();
} }
// 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();
}
} }
@@ -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();
}
}
@@ -1,6 +1,40 @@
package io.github.slimeistdev.crystalline_sky.multiloader.neoforge; package io.github.slimeistdev.crystalline_sky.multiloader.neoforge;
public class ItemGroupRegistrationEventImpl { import io.github.slimeistdev.crystalline_sky.multiloader.ItemGroupRegistrationEvent;
public static void create() { 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.CrystallineSky;
import io.github.slimeistdev.crystalline_sky.CrystallineSkyClient; 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 io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderTypes;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderType; 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.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.EventBusSubscriber;
@@ -39,6 +39,6 @@ public class CrystallineSkyClientImpl {
@SubscribeEvent @SubscribeEvent
public static void buildCreativeModeTabContents(BuildCreativeModeTabContentsEvent event) { public static void buildCreativeModeTabContents(BuildCreativeModeTabContentsEvent event) {
event.insertAfter(); CrystallineItems.onItemGroupRegistration(new ItemGroupRegistrationEventImpl(event));
} }
} }
@@ -1,19 +1,58 @@
package io.github.slimeistdev.crystalline_sky.neoforge; package io.github.slimeistdev.crystalline_sky.neoforge;
import io.github.slimeistdev.crystalline_sky.CrystallineSky; 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.Env;
import io.github.slimeistdev.crystalline_sky.multiloader.PlatformHelper;
import net.neoforged.bus.api.IEventBus; 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.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) @Mod(CrystallineSky.ID)
public class CrystallineSkyImpl { public class CrystallineSkyImpl {
static IEventBus bus; static IEventBus bus;
public CrystallineSkyImpl(IEventBus bus) { public CrystallineSkyImpl(IEventBus bus) {
restoreLoggers();
CrystallineSkyImpl.bus = bus; CrystallineSkyImpl.bus = bus;
CrystallineSky.init(); CrystallineSky.init();
//noinspection Convert2MethodRef //noinspection Convert2MethodRef
Env.CLIENT.runIfCurrent(() -> () -> CrystallineSkyClientImpl.init()); 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 com.google.common.collect.ImmutableList;
import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.RenderType_Duck; 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 net.minecraft.client.renderer.RenderType;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Shadow; 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) @Mixin(RenderType.class)
public class RenderTypeMixin implements RenderType_Duck { public class RenderTypeMixin implements RenderType_Duck {
@@ -26,4 +30,10 @@ public class RenderTypeMixin implements RenderType_Duck {
.build(); .build();
chunkLayerId = CHUNK_BUFFER_LAYERS.size() - 1; 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();
}
} }