Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"environment": "*",

"depends": {
"java": "17",
"java": ">=17",
"fabricloader": "*",
"minecraft": "1.0.0-beta.7.3",
"station-registry-api-v0": "*",
Expand Down
12 changes: 2 additions & 10 deletions src/test/java/net/modificationstation/sltest/SLTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,13 @@
import net.mine_diver.unsafeevents.listener.EventListener;
import net.mine_diver.unsafeevents.listener.ListenerPriority;
import net.modificationstation.stationapi.api.event.mod.InitEvent;
import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint;
import net.modificationstation.stationapi.api.util.Namespace;
import net.modificationstation.stationapi.api.util.Null;
import org.apache.logging.log4j.Logger;

public class SLTest {
public static final Namespace NAMESPACE = Namespace.resolve();

@Entrypoint.Logger
public static final Logger LOGGER = Null.get();

@Entrypoint.Instance
public static final SLTest INSTANCE = Null.get();

@Entrypoint.Namespace
public static final Namespace NAMESPACE = Null.get();
public static final Logger LOGGER = NAMESPACE.getLogger();

@EventListener
public void init(InitEvent event) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package net.modificationstation.sltest.block;

import net.mine_diver.unsafeevents.listener.EventListener;
import net.mine_diver.unsafeevents.listener.Listener;
import net.minecraft.block.Block;
import net.minecraft.block.Material;
import net.modificationstation.sltest.mixin.BlockBaseAccessor;
import net.modificationstation.stationapi.api.event.registry.BlockRegistryEvent;
import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager;
import net.modificationstation.stationapi.api.template.block.TemplateBlock;
import net.modificationstation.stationapi.api.util.Identifier;

Expand Down Expand Up @@ -40,7 +40,7 @@ public Block get() {

public static class Init {
static {
Listener.registerLookup(MethodHandles.lookup());
EntrypointManager.registerLookup(MethodHandles.lookup());
}

@EventListener
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package net.modificationstation.sltest.datafixer;

import net.mine_diver.unsafeevents.listener.EventListener;
import net.mine_diver.unsafeevents.listener.Listener;
import net.minecraft.nbt.NbtCompound;
import net.modificationstation.stationapi.api.event.datafixer.DataFixerRegisterEvent;
import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager;
import net.modificationstation.stationapi.api.util.Util;

import java.lang.invoke.MethodHandles;
Expand All @@ -13,7 +13,7 @@

public class DataFixerListener {
static {
Listener.registerLookup(MethodHandles.lookup());
EntrypointManager.registerLookup(MethodHandles.lookup());
}

@EventListener
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package net.modificationstation.sltest.dimension;

import net.mine_diver.unsafeevents.listener.EventListener;
import net.mine_diver.unsafeevents.listener.Listener;
import net.modificationstation.stationapi.api.event.registry.DimensionRegistryEvent;
import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager;
import net.modificationstation.stationapi.api.registry.DimensionContainer;
import net.modificationstation.stationapi.api.registry.DimensionRegistry;

Expand All @@ -13,7 +13,7 @@

public class DimensionListener {
static {
Listener.registerLookup(MethodHandles.lookup());
EntrypointManager.registerLookup(MethodHandles.lookup());
}

@EventListener
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import net.fabricmc.loader.api.FabricLoader;
import net.mine_diver.unsafeevents.listener.EventListener;
import net.mine_diver.unsafeevents.listener.Listener;
import net.minecraft.achievement.Achievement;
import net.minecraft.achievement.Achievements;
import net.minecraft.client.Minecraft;
Expand All @@ -11,6 +10,7 @@
import net.modificationstation.stationapi.api.client.gui.screen.achievement.AchievementPage;
import net.modificationstation.stationapi.api.event.achievement.AchievementRegisterEvent;
import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint;
import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager;
import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy;

import java.lang.invoke.MethodHandles;
Expand All @@ -22,7 +22,7 @@
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public class AchievementPageImpl {
static {
Listener.registerLookup(MethodHandles.lookup());
EntrypointManager.registerLookup(MethodHandles.lookup());
}

@EventListener
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy;
import net.modificationstation.stationapi.api.util.Identifier;
import net.modificationstation.stationapi.api.util.Namespace;
import net.modificationstation.stationapi.api.util.Null;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Configurator;
Expand All @@ -25,20 +24,12 @@
registerStatic = false
))
public class StationAPI implements PreLaunchEntrypoint {
/**
* StationAPI's instance.
*/
@Entrypoint.Instance
public static final StationAPI INSTANCE = Null.get();

/**
* StationAPI's namespace.
*/
@Entrypoint.Namespace
public static final Namespace NAMESPACE = Namespace.of("stationapi");

@Entrypoint.Logger("Station|API")
public static final Logger LOGGER = Null.get();
public static final Logger LOGGER = NAMESPACE.getLogger("Station|API");

@ApiStatus.Internal
public static final String INTERNAL_PHASE = "stationapi:internal";
Expand All @@ -53,7 +44,6 @@ public class StationAPI implements PreLaunchEntrypoint {
*/
@Override
public void onPreLaunch() {
FabricLoader.getInstance().getModContainer("stationapi").ifPresent(modContainer -> EntrypointManager.setup(this, modContainer));
String name = NAMESPACE.getName();
LOGGER.info("Initializing " + name + "...");
Configurator.setLevel("mixin", Level.TRACE);
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package net.modificationstation.stationapi.api.mod.entrypoint;

import it.unimi.dsi.fastutil.objects.Reference2ReferenceMap;
import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap;
import lombok.val;
import net.fabricmc.loader.api.ModContainer;
import net.fabricmc.loader.api.entrypoint.EntrypointContainer;
import net.mine_diver.unsafeevents.Event;
import net.mine_diver.unsafeevents.listener.Listener;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.util.Namespace;
import net.modificationstation.stationapi.api.util.ReflectionHelper;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.message.ParameterizedMessageFactory;

import java.lang.invoke.MethodHandles;
import java.lang.reflect.Method;
import java.util.function.Consumer;

Expand All @@ -20,6 +20,41 @@
* @author mine_diver
*/
public class EntrypointManager {
private static final Reference2ReferenceMap<Class<?>, MethodHandles.Lookup> LOOKUPS = new Reference2ReferenceOpenHashMap<>();

/**
* By registering a lookup via this method, an entrypoint class gives StationAPI and UnsafeEvents safe access to
* its non-public fields and methods.
*
* <p>
* This is useful if you wish to keep your
* {@link net.mine_diver.unsafeevents.listener.EventListener listener methods} or utility fields
* (such as {@link net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint.Instance},
* {@link net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint.Namespace},
* and {@link net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint.Logger}) private.
* </p>
*
* <p>
* It's best to perform the registration as soon as possible in the static initializer of the class,
* for example:
* <pre><code>
* public class ExampleEntrypoint {
* static {
* EntrypointManager.registerLookup(MethodHandles.lookup());
* }
*
* // ... the rest of the entrypoint code ...
* }
* </code></pre>
* </p>
*
* @param lookup an entrypoint class's lookup obtained via {@link MethodHandles#lookup()}.
*/
public static void registerLookup(MethodHandles.Lookup lookup) {
Listener.registerLookup(lookup);
LOOKUPS.put(lookup.lookupClass(), lookup);
}

/**
* Performs the setup of entrypoint, such as:
* - Registration of EventBus listeners.
Expand Down Expand Up @@ -79,19 +114,18 @@ else if (o instanceof Method listener)
.listener(o)
.build()
);
val lookup = LOOKUPS.getOrDefault(o.getClass(), MethodHandles.publicLookup());
try {
ReflectionHelper.setFieldsWithAnnotation(o, Entrypoint.Instance.class, o);
ReflectionHelper.setFieldsWithAnnotation(o, Entrypoint.Namespace.class, namespace -> namespace.value().isEmpty() ? Namespace.of(modContainer) : Namespace.of(namespace.value()));
ReflectionHelper.setFieldsWithAnnotation(o, Entrypoint.Logger.class, logger -> {
String name = logger.value().isEmpty() ? modContainer.getMetadata().getId() + "|Mod" : logger.value();
org.apache.logging.log4j.Logger log = LogManager.getLogger(name, ParameterizedMessageFactory.INSTANCE);
Configurator.setLevel(name, Level.INFO);
return log;
ReflectionHelper.setFieldsWithAnnotation(lookup, o, Entrypoint.Instance.class, o);
ReflectionHelper.setFieldsWithAnnotation(lookup, o, Entrypoint.Namespace.class, namespace -> namespace.value().isEmpty() ? Namespace.of(modContainer) : Namespace.of(namespace.value()));
ReflectionHelper.setFieldsWithAnnotation(lookup, o, Entrypoint.Logger.class, logger -> {
val namespace = Namespace.of(modContainer);
val name = logger.value();
return name.isEmpty() ? namespace.getLogger() : namespace.getLogger(name);
});
} catch (IllegalAccessException e) {
} catch (IllegalAccessException | NoSuchFieldException e) {
throw new RuntimeException(e);
}
}
}

}
Loading