diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json
index fac17cc49..b180c0782 100644
--- a/src/main/resources/fabric.mod.json
+++ b/src/main/resources/fabric.mod.json
@@ -20,7 +20,7 @@
"environment": "*",
"depends": {
- "java": "17",
+ "java": ">=17",
"fabricloader": "*",
"minecraft": "1.0.0-beta.7.3",
"station-registry-api-v0": "*",
diff --git a/src/test/java/net/modificationstation/sltest/SLTest.java b/src/test/java/net/modificationstation/sltest/SLTest.java
index 1c7c4c9df..4d4d96d59 100644
--- a/src/test/java/net/modificationstation/sltest/SLTest.java
+++ b/src/test/java/net/modificationstation/sltest/SLTest.java
@@ -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) {
diff --git a/src/test/java/net/modificationstation/sltest/block/Blocks.java b/src/test/java/net/modificationstation/sltest/block/Blocks.java
index a86479b9c..882fd7902 100644
--- a/src/test/java/net/modificationstation/sltest/block/Blocks.java
+++ b/src/test/java/net/modificationstation/sltest/block/Blocks.java
@@ -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;
@@ -40,7 +40,7 @@ public Block get() {
public static class Init {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
@EventListener
diff --git a/src/test/java/net/modificationstation/sltest/datafixer/DataFixerListener.java b/src/test/java/net/modificationstation/sltest/datafixer/DataFixerListener.java
index e98c66547..de17ef907 100644
--- a/src/test/java/net/modificationstation/sltest/datafixer/DataFixerListener.java
+++ b/src/test/java/net/modificationstation/sltest/datafixer/DataFixerListener.java
@@ -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;
@@ -13,7 +13,7 @@
public class DataFixerListener {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
@EventListener
diff --git a/src/test/java/net/modificationstation/sltest/dimension/DimensionListener.java b/src/test/java/net/modificationstation/sltest/dimension/DimensionListener.java
index 24e45f194..23e4e20de 100644
--- a/src/test/java/net/modificationstation/sltest/dimension/DimensionListener.java
+++ b/src/test/java/net/modificationstation/sltest/dimension/DimensionListener.java
@@ -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;
@@ -13,7 +13,7 @@
public class DimensionListener {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
@EventListener
diff --git a/station-achievements-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/achievement/AchievementPageImpl.java b/station-achievements-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/achievement/AchievementPageImpl.java
index e9f7fb7ca..e8f06c59d 100644
--- a/station-achievements-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/achievement/AchievementPageImpl.java
+++ b/station-achievements-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/achievement/AchievementPageImpl.java
@@ -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;
@@ -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;
@@ -22,7 +22,7 @@
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public class AchievementPageImpl {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
@EventListener
diff --git a/station-api-base/src/main/java/net/modificationstation/stationapi/api/StationAPI.java b/station-api-base/src/main/java/net/modificationstation/stationapi/api/StationAPI.java
index 9224c750a..d3a8fd949 100644
--- a/station-api-base/src/main/java/net/modificationstation/stationapi/api/StationAPI.java
+++ b/station-api-base/src/main/java/net/modificationstation/stationapi/api/StationAPI.java
@@ -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;
@@ -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";
@@ -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);
diff --git a/station-api-base/src/main/java/net/modificationstation/stationapi/api/factory/EnumFactory.java b/station-api-base/src/main/java/net/modificationstation/stationapi/api/factory/EnumFactory.java
deleted file mode 100644
index 511938b98..000000000
--- a/station-api-base/src/main/java/net/modificationstation/stationapi/api/factory/EnumFactory.java
+++ /dev/null
@@ -1,138 +0,0 @@
-package net.modificationstation.stationapi.api.factory;
-
-import sun.reflect.ReflectionFactory;
-
-import java.lang.invoke.MethodHandle;
-import java.lang.invoke.MethodHandles;
-import java.lang.invoke.MethodType;
-import java.lang.reflect.Array;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.function.BiFunction;
-import java.util.function.Function;
-
-import static net.modificationstation.stationapi.api.util.UnsafeProvider.theUnsafe;
-
-public class EnumFactory {
- private static final Function, Object> NEW_CONSTRUCTOR_ACCESSOR;
- private static final BiFunction
+ *
+ * @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.
@@ -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);
}
}
}
-
}
\ No newline at end of file
diff --git a/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/Namespace.java b/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/Namespace.java
index 1ce30760e..a8dfb178d 100644
--- a/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/Namespace.java
+++ b/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/Namespace.java
@@ -2,15 +2,38 @@
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
+import com.google.common.base.Suppliers;
+import it.unimi.dsi.fastutil.objects.Object2ReferenceMap;
+import it.unimi.dsi.fastutil.objects.Object2ReferenceOpenHashMap;
+import it.unimi.dsi.fastutil.objects.Reference2ReferenceMap;
+import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap;
+import lombok.extern.slf4j.Slf4j;
+import lombok.val;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ModContainer;
import net.fabricmc.loader.api.Version;
import net.fabricmc.loader.api.metadata.ModMetadata;
import net.modificationstation.stationapi.api.util.exception.MissingModException;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.config.Configurator;
+import org.apache.logging.log4j.message.ParameterizedMessageFactory;
+import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.function.Function;
+import java.util.function.Supplier;
+import java.util.stream.Stream;
+@Slf4j
public final class Namespace implements Comparable<@NotNull Namespace> {
private static final boolean CHECK_MISSING_MODS = false;
@@ -19,6 +42,8 @@ public final class Namespace implements Comparable<@NotNull Namespace> {
@NotNull
private static final Function<@NotNull String, @NotNull Namespace> NAMESPACE_FACTORY = Namespace::new;
+ private static final Reference2ReferenceMap, Namespace> CLASS_CACHE = new Reference2ReferenceOpenHashMap<>();
+
@NotNull
public static final Namespace MINECRAFT = of("minecraft");
@@ -34,15 +59,102 @@ public final class Namespace implements Comparable<@NotNull Namespace> {
return CACHE.get(namespace, NAMESPACE_FACTORY);
}
+ @ApiStatus.Experimental
+ public static @NotNull Namespace resolve() {
+ return CLASS_CACHE.computeIfAbsent(
+ StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).getCallerClass(),
+ (Class> caller) -> {
+ final Path callerPath;
+ try {
+ callerPath = Paths.get(caller.getProtectionDomain().getCodeSource().getLocation().toURI());
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(e);
+ }
+
+ val mods = FabricLoader.getInstance().getAllMods().stream();
+ final Stream candidates;
+
+ // i'm so sorry
+ if (Files.isRegularFile(callerPath)) { // regular case
+ final URI callerRoot;
+ try (val fs = FileSystems.newFileSystem(callerPath)) {
+ callerRoot = fs.getPath("/").toUri();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ candidates = mods
+ .filter(modContainer -> modContainer.getRootPaths()
+ .stream()
+ .filter(Files::isDirectory)
+ .map(Path::toUri)
+ .anyMatch(callerRoot::equals)
+ );
+ } else if (Files.isDirectory(callerPath)) { // most likely a development environment
+ candidates = mods
+ .filter(modContainer -> modContainer.getRootPaths()
+ .stream()
+ .filter(Files::isDirectory)
+ .anyMatch(path -> {
+ Path pathName;
+ val nameCount = path.getNameCount();
+
+ // IntelliJ build path test
+ if (nameCount > 0) {
+ pathName = path.getFileName();
+ if (pathName.toString().equals("resources"))
+ return path.getParent().resolve("classes").equals(callerPath);
+ }
+
+ // Gradle build path test
+ if (nameCount > 2) {
+ val resources = path.getParent();
+ pathName = resources.getFileName();
+ if (pathName.toString().equals("resources")) {
+ try (val walk = Files.walk(
+ resources.getParent().resolve("classes"), 2
+ )) {
+ if (walk.anyMatch(callerPath::equals)) return true;
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ return false;
+ })
+ );
+ } else candidates = Stream.empty();
+
+ return of(candidates
+ .findAny()
+ .orElseThrow(() -> new IllegalCallerException("""
+ Class "%s" has attempted to resolve its namespace, \
+ but it's either not a part of a mod, \
+ or was loaded in an unusual way. \
+ Class's location resolves to "%s".\
+ """
+ .formatted(
+ caller.getName(),
+ callerPath.toUri()
+ )
+ ))
+ .getMetadata()
+ .getId()
+ );
+ });
+ }
+
@NotNull
private final String namespace;
private final int hashCode;
+ private final Supplier> loggers;
private Namespace(@NotNull final String namespace) {
if (CHECK_MISSING_MODS && !FabricLoader.getInstance().isModLoaded(namespace))
throw new MissingModException(namespace);
this.namespace = namespace;
hashCode = toString().hashCode();
+ loggers = Suppliers.memoize(Object2ReferenceOpenHashMap::new);
}
public @NotNull ModContainer getContainer() {
@@ -65,6 +177,18 @@ private Namespace(@NotNull final String namespace) {
return Identifier.of(this, id);
}
+ public @NotNull Logger getLogger() {
+ return getLogger(namespace + "|Mod");
+ }
+
+ public @NotNull Logger getLogger(String name) {
+ return loggers.get().computeIfAbsent(name, (String s) -> {
+ val log = LogManager.getLogger(s, ParameterizedMessageFactory.INSTANCE);
+ Configurator.setLevel(s, Level.INFO);
+ return log;
+ });
+ }
+
@Override
public boolean equals(@NotNull final Object other) {
if (this == other) return true;
diff --git a/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/ReflectionHelper.java b/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/ReflectionHelper.java
index 87468fc7f..4a665dde0 100644
--- a/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/ReflectionHelper.java
+++ b/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/ReflectionHelper.java
@@ -1,44 +1,31 @@
package net.modificationstation.stationapi.api.util;
-import sun.misc.Unsafe;
-
import java.lang.annotation.Annotation;
import java.lang.invoke.MethodHandles;
-import java.lang.invoke.VarHandle;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.function.Function;
public class ReflectionHelper {
- private static final VarHandle modifiers;
-
- static {
- try {
- Unsafe unsafe = UnsafeProvider.theUnsafe;
- Field implLookupField = MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP");
- MethodHandles.Lookup lookup = (MethodHandles.Lookup) unsafe.getObject(unsafe.staticFieldBase(implLookupField), unsafe.staticFieldOffset(implLookupField));
- modifiers = lookup.findVarHandle(Field.class, "modifiers", int.class);
- } catch (NoSuchFieldException | IllegalAccessException e) {
- throw new RuntimeException(e);
- }
+ public static void setFieldsWithAnnotation(MethodHandles.Lookup lookup, Object target, Class extends Annotation> annotation, Object value) throws IllegalAccessException, NoSuchFieldException {
+ setFieldsWithAnnotation(lookup, target.getClass(), target, annotation, value);
}
- public static void setFieldsWithAnnotation(Object target, Class extends Annotation> annotation, Object value) throws IllegalAccessException {
- setFieldsWithAnnotation(target.getClass(), target, annotation, value);
+ public static void setFieldsWithAnnotation(MethodHandles.Lookup lookup, Class> targetClass, Object target, Class extends Annotation> annotation, Object value) throws IllegalAccessException, NoSuchFieldException {
+ setFieldsWithAnnotation(lookup, targetClass, target, annotation, annotation1 -> value);
}
- public static void setFieldsWithAnnotation(Class> targetClass, Object target, Class extends Annotation> annotation, Object value) throws IllegalAccessException {
- setFieldsWithAnnotation(targetClass, target, annotation, annotation1 -> value);
+ public static void setFieldsWithAnnotation(MethodHandles.Lookup lookup, Object target, Class annotation, Function processor) throws IllegalAccessException, NoSuchFieldException {
+ setFieldsWithAnnotation(lookup, target.getClass(), target, annotation, processor);
}
- public static void setFieldsWithAnnotation(Object target, Class annotation, Function processor) throws IllegalAccessException {
- setFieldsWithAnnotation(target.getClass(), target, annotation, processor);
- }
-
- public static void setFieldsWithAnnotation(Class> targetClass, Object target, Class annotation, Function processor) throws IllegalAccessException {
- for (Field field : ReflectionHelper.getFieldsWithAnnotation(targetClass, annotation))
- ReflectionHelper.setPrivateFinalField(field, target, processor.apply(field.getAnnotation(annotation)));
+ public static void setFieldsWithAnnotation(MethodHandles.Lookup lookup, Class> targetClass, Object target, Class annotation, Function processor) throws IllegalAccessException, NoSuchFieldException {
+ for (Field field : getFieldsWithAnnotation(targetClass, annotation))
+ if (Modifier.isStatic(field.getModifiers()))
+ lookup.findStaticVarHandle(targetClass, field.getName(), field.getType()).set(processor.apply(field.getAnnotation(annotation)));
+ else
+ lookup.findVarHandle(targetClass, field.getName(), field.getType()).set(target, processor.apply(field.getAnnotation(annotation)));
}
public static Field[] getFieldsWithAnnotation(Class> targetClass, Class extends Annotation> annotationClass) {
@@ -50,25 +37,4 @@ public static Field[] getFieldsWithAnnotation(Class> targetClass, Class exte
}
return fields;
}
-
- public static void setPrivateFinalField(Field field, Object instance, Object value) throws IllegalAccessException {
- int mod = field.getModifiers();
- setPrivateField(modifiers, field, mod & ~Modifier.FINAL);
- setPrivateField(field, instance, value);
- setPrivateField(modifiers, field, mod);
- }
-
- public static void setPrivateField(Field field, Object instance, Object value) throws IllegalAccessException {
- //noinspection deprecation
- boolean inaccessible = !field.isAccessible();
- if (inaccessible)
- field.setAccessible(true);
- field.set(instance, value);
- if (inaccessible)
- field.setAccessible(false);
- }
-
- public static void setPrivateField(VarHandle var, Object instance, Object value) {
- var.set(instance, value);
- }
}
\ No newline at end of file
diff --git a/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/UnsafeProvider.java b/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/UnsafeProvider.java
deleted file mode 100644
index f66a88ef3..000000000
--- a/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/UnsafeProvider.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package net.modificationstation.stationapi.api.util;
-
-import sun.misc.Unsafe;
-
-import java.lang.reflect.Field;
-
-public class UnsafeProvider {
- @API
- public static final Unsafe theUnsafe;
-
- static {
- try {
- Field field = Unsafe.class.getDeclaredField("theUnsafe");
- field.setAccessible(true);
- theUnsafe = (Unsafe) field.get(null);
- } catch (NoSuchFieldException | IllegalAccessException e) {
- throw new RuntimeException(e);
- }
- }
-}
diff --git a/station-api-base/src/main/java/net/modificationstation/stationapi/impl/mod/DeprecatedInitEventsImpl.java b/station-api-base/src/main/java/net/modificationstation/stationapi/impl/mod/DeprecatedInitEventsImpl.java
index 6a11f5591..8f92329b8 100644
--- a/station-api-base/src/main/java/net/modificationstation/stationapi/impl/mod/DeprecatedInitEventsImpl.java
+++ b/station-api-base/src/main/java/net/modificationstation/stationapi/impl/mod/DeprecatedInitEventsImpl.java
@@ -1,12 +1,12 @@
package net.modificationstation.stationapi.impl.mod;
import net.mine_diver.unsafeevents.listener.EventListener;
-import net.mine_diver.unsafeevents.listener.Listener;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.event.mod.InitEvent;
import net.modificationstation.stationapi.api.event.mod.PostInitEvent;
import net.modificationstation.stationapi.api.event.mod.PreInitEvent;
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;
@@ -15,7 +15,7 @@
@Entrypoint(eventBus = @EventBusPolicy(registerInstance = false))
public final class DeprecatedInitEventsImpl {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
@EventListener(phase = InitEvent.PRE_INIT_PHASE)
diff --git a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockFormOnlyHandler.java b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockFormOnlyHandler.java
index f8e598218..6725f43aa 100644
--- a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockFormOnlyHandler.java
+++ b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockFormOnlyHandler.java
@@ -1,35 +1,21 @@
package net.modificationstation.stationapi.impl.block;
-import com.google.common.base.Suppliers;
import net.mine_diver.unsafeevents.listener.EventListener;
-import net.mine_diver.unsafeevents.listener.Listener;
-import net.minecraft.item.BlockItem;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.event.block.BlockItemFactoryEvent;
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 net.modificationstation.stationapi.api.util.UnsafeProvider;
-import org.jetbrains.annotations.ApiStatus;
import java.lang.invoke.MethodHandles;
-import java.util.function.Supplier;
@Entrypoint(eventBus = @EventBusPolicy(registerInstance = false))
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public class BlockFormOnlyHandler {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
- @ApiStatus.Internal
- public static final Supplier EMPTY_BLOCK_ITEM = Suppliers.memoize(() -> {
- try {
- return (BlockItem) UnsafeProvider.theUnsafe.allocateInstance(BlockItem.class);
- } catch (InstantiationException e) {
- throw new RuntimeException(e);
- }
- });
-
@EventListener
private static void registerBlockItem(BlockItemFactoryEvent event) {
if (event.block.isAutoItemRegistrationDisabled()) event.cancel();
diff --git a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasCustomBlockItemFactoryImpl.java b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasCustomBlockItemFactoryImpl.java
index 466786870..7c52ed3c0 100644
--- a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasCustomBlockItemFactoryImpl.java
+++ b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasCustomBlockItemFactoryImpl.java
@@ -1,13 +1,13 @@
package net.modificationstation.stationapi.impl.block;
import net.mine_diver.unsafeevents.listener.EventListener;
-import net.mine_diver.unsafeevents.listener.Listener;
import net.minecraft.block.Block;
import net.minecraft.item.BlockItem;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.block.*;
import net.modificationstation.stationapi.api.event.block.BlockItemFactoryEvent;
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.LambdaMetafactory;
@@ -30,7 +30,7 @@
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public class HasCustomBlockItemFactoryImpl {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
/**
diff --git a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaBlockItemImpl.java b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaBlockItemImpl.java
index dd1941dde..2ed62d8b6 100644
--- a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaBlockItemImpl.java
+++ b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaBlockItemImpl.java
@@ -1,12 +1,12 @@
package net.modificationstation.stationapi.impl.block;
import net.mine_diver.unsafeevents.listener.EventListener;
-import net.mine_diver.unsafeevents.listener.Listener;
import net.minecraft.item.BlockItem;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.block.*;
import net.modificationstation.stationapi.api.event.block.BlockItemFactoryEvent;
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 net.modificationstation.stationapi.api.template.item.MetaBlockItem;
@@ -28,7 +28,7 @@
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public class HasMetaBlockItemImpl {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
/**
diff --git a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaNamedBlockItemImpl.java b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaNamedBlockItemImpl.java
index 47bf2fae2..700a2f5ef 100644
--- a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaNamedBlockItemImpl.java
+++ b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaNamedBlockItemImpl.java
@@ -1,12 +1,12 @@
package net.modificationstation.stationapi.impl.block;
import net.mine_diver.unsafeevents.listener.EventListener;
-import net.mine_diver.unsafeevents.listener.Listener;
import net.minecraft.item.BlockItem;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.block.*;
import net.modificationstation.stationapi.api.event.block.BlockItemFactoryEvent;
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 net.modificationstation.stationapi.api.template.item.MetaNamedBlockItem;
@@ -28,7 +28,7 @@
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public class HasMetaNamedBlockItemImpl {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
/**
diff --git a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/mixin/blockitem/BlockMixin.java b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/mixin/blockitem/BlockMixin.java
index 7fef77cda..b2ee4da68 100644
--- a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/mixin/blockitem/BlockMixin.java
+++ b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/mixin/blockitem/BlockMixin.java
@@ -13,7 +13,6 @@
import net.modificationstation.stationapi.api.registry.BlockRegistry;
import net.modificationstation.stationapi.api.registry.ItemRegistry;
import net.modificationstation.stationapi.api.registry.Registry;
-import net.modificationstation.stationapi.impl.block.BlockFormOnlyHandler;
import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
@@ -65,7 +64,7 @@ private static BlockItem stationapi_getBlockItem(int blockId, Operation typeSuperClass, int unusedInt, Material spawnMaterial, boolean unusedBoolean) {
- return EnumFactory.addEnum(
- class_238.class, typeName,
- new Class[] { Class.class, int.class, Material.class, boolean.class },
- typeSuperClass, unusedInt, spawnMaterial, unusedBoolean
- );
+ return EntityTypeAccessor.stationapi_create(typeName, nextId++, typeSuperClass, unusedInt, spawnMaterial, unusedBoolean);
}
}
diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java
index 384f48122..46db9080e 100644
--- a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java
+++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java
@@ -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.class_454;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
@@ -20,6 +19,7 @@
import net.modificationstation.stationapi.api.event.registry.MessageListenerRegistryEvent;
import net.modificationstation.stationapi.api.event.registry.MobHandlerRegistryEvent;
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 net.modificationstation.stationapi.api.network.packet.MessagePacket;
import net.modificationstation.stationapi.api.server.entity.StationSpawnDataProvider;
@@ -39,7 +39,7 @@
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public final class EntityClientNetworkHandler {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
@EventListener
diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/CustomTrackingImpl.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/CustomTrackingImpl.java
index d9fd5a78b..0a5d97771 100644
--- a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/CustomTrackingImpl.java
+++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/CustomTrackingImpl.java
@@ -1,11 +1,11 @@
package net.modificationstation.stationapi.impl.server.entity;
import net.mine_diver.unsafeevents.listener.EventListener;
-import net.mine_diver.unsafeevents.listener.Listener;
import net.minecraft.class_488;
import net.minecraft.class_80;
import net.modificationstation.stationapi.api.StationAPI;
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 net.modificationstation.stationapi.api.server.entity.CustomTracking;
import net.modificationstation.stationapi.api.server.entity.HasTrackingParameters;
@@ -26,7 +26,7 @@
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public final class CustomTrackingImpl {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
/**
diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/TrackingParametersImpl.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/TrackingParametersImpl.java
index b61240567..8bb4299e0 100644
--- a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/TrackingParametersImpl.java
+++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/TrackingParametersImpl.java
@@ -1,12 +1,12 @@
package net.modificationstation.stationapi.impl.server.entity;
import net.mine_diver.unsafeevents.listener.EventListener;
-import net.mine_diver.unsafeevents.listener.Listener;
import net.minecraft.class_488;
import net.minecraft.class_80;
import net.minecraft.entity.Entity;
import net.modificationstation.stationapi.api.StationAPI;
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 net.modificationstation.stationapi.api.server.entity.CustomTracking;
import net.modificationstation.stationapi.api.server.entity.HasTrackingParameters;
@@ -28,7 +28,7 @@
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public class TrackingParametersImpl {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
/**
diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/mixin/entity/EntityTypeAccessor.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/mixin/entity/EntityTypeAccessor.java
new file mode 100644
index 000000000..e3a8a07ce
--- /dev/null
+++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/mixin/entity/EntityTypeAccessor.java
@@ -0,0 +1,16 @@
+package net.modificationstation.stationapi.mixin.entity;
+
+import net.minecraft.block.Material;
+import net.minecraft.class_238;
+import net.minecraft.entity.Entity;
+import net.modificationstation.stationapi.api.util.Util;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Invoker;
+
+@Mixin(class_238.class)
+public interface EntityTypeAccessor {
+ @Invoker("")
+ static class_238 stationapi_create(String typeName, int id, Class extends Entity> typeSuperClass, int unusedInt, Material spawnMaterial, boolean unusedBoolean) {
+ return Util.assertMixin();
+ }
+}
diff --git a/station-entities-v0/src/main/resources/station-entities-v0.mixins.json b/station-entities-v0/src/main/resources/station-entities-v0.mixins.json
index 61f9769cf..4c0a4f7c4 100644
--- a/station-entities-v0/src/main/resources/station-entities-v0.mixins.json
+++ b/station-entities-v0/src/main/resources/station-entities-v0.mixins.json
@@ -4,7 +4,8 @@
"package": "net.modificationstation.stationapi.mixin.entity",
"compatibilityLevel": "JAVA_17",
"mixins": [
- "EntityRegistryMixin"
+ "EntityRegistryMixin",
+ "EntityTypeAccessor"
],
"server": [
"server.ServerEntityTrackerMixin",
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/States.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/States.java
index 7fd763f31..f25adad64 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/States.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/States.java
@@ -2,11 +2,11 @@
import com.google.common.base.Suppliers;
import net.mine_diver.unsafeevents.listener.EventListener;
-import net.mine_diver.unsafeevents.listener.Listener;
import net.minecraft.block.Block;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.event.registry.BlockRegistryEvent;
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 net.modificationstation.stationapi.api.util.collection.IdList;
@@ -19,7 +19,7 @@
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public final class States {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
private static final Supplier AIR_BLOCK = Suppliers.memoize(() -> new Air(0));
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/vanilla/BlockItemTracker.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/vanilla/BlockItemTracker.java
index 3c89c79f1..d9f66164e 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/vanilla/BlockItemTracker.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/vanilla/BlockItemTracker.java
@@ -5,6 +5,7 @@
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.modificationstation.stationapi.api.event.registry.RegistryEntryAddedEvent;
+import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager;
import net.modificationstation.stationapi.api.registry.ListenableRegistry;
import net.modificationstation.stationapi.api.registry.Registry;
@@ -12,7 +13,7 @@
public final class BlockItemTracker {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
private BlockItemTracker() { }
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockInteractionImpl.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockInteractionImpl.java
index 7abf61833..f713d1712 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockInteractionImpl.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockInteractionImpl.java
@@ -1,11 +1,11 @@
package net.modificationstation.stationapi.impl.block;
import net.mine_diver.unsafeevents.listener.EventListener;
-import net.mine_diver.unsafeevents.listener.Listener;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.block.BeforeBlockRemoved;
import net.modificationstation.stationapi.api.event.block.BlockEvent;
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;
@@ -14,7 +14,7 @@
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public final class BlockInteractionImpl {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
@EventListener
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/PlacementStateImpl.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/PlacementStateImpl.java
index ff5f1b8b1..e7aa309ea 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/PlacementStateImpl.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/PlacementStateImpl.java
@@ -1,7 +1,6 @@
package net.modificationstation.stationapi.impl.block;
import net.mine_diver.unsafeevents.listener.EventListener;
-import net.mine_diver.unsafeevents.listener.Listener;
import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.Vec3d;
import net.modificationstation.stationapi.api.StationAPI;
@@ -9,6 +8,7 @@
import net.modificationstation.stationapi.api.event.block.BlockEvent;
import net.modificationstation.stationapi.api.item.ItemPlacementContext;
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;
@@ -17,7 +17,7 @@
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public final class PlacementStateImpl {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
@EventListener
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/WorldDataVersionImpl.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/WorldDataVersionImpl.java
index 608abb33a..5502f59c8 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/WorldDataVersionImpl.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/WorldDataVersionImpl.java
@@ -2,12 +2,12 @@
import com.google.common.collect.Iterators;
import net.mine_diver.unsafeevents.listener.EventListener;
-import net.mine_diver.unsafeevents.listener.Listener;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.event.world.WorldPropertiesEvent;
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 net.modificationstation.stationapi.api.nbt.NbtHelper;
import net.modificationstation.stationapi.mixin.nbt.NbtCompoundAccessor;
@@ -19,7 +19,7 @@
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public final class WorldDataVersionImpl {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
@EventListener
diff --git a/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/EditWorldScreenImpl.java b/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/EditWorldScreenImpl.java
index b573d5cb3..88d94a2bc 100644
--- a/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/EditWorldScreenImpl.java
+++ b/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/EditWorldScreenImpl.java
@@ -1,7 +1,6 @@
package net.modificationstation.stationapi.impl.client.gui.screen;
import net.mine_diver.unsafeevents.listener.EventListener;
-import net.mine_diver.unsafeevents.listener.Listener;
import net.minecraft.client.gui.screen.world.EditWorldScreen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.resource.language.I18n;
@@ -9,6 +8,7 @@
import net.modificationstation.stationapi.api.client.event.gui.screen.EditWorldScreenEvent;
import net.modificationstation.stationapi.api.client.gui.widget.ButtonWidgetDetachedContext;
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 net.modificationstation.stationapi.mixin.gui.client.ScreenAccessor;
@@ -18,7 +18,7 @@
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public final class EditWorldScreenImpl {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
@EventListener
diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/container/CustomTooltipRendererImpl.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/container/CustomTooltipRendererImpl.java
index a13663c3b..ae1a575f4 100644
--- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/container/CustomTooltipRendererImpl.java
+++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/container/CustomTooltipRendererImpl.java
@@ -1,12 +1,12 @@
package net.modificationstation.stationapi.impl.client.gui.screen.container;
import net.mine_diver.unsafeevents.listener.EventListener;
-import net.mine_diver.unsafeevents.listener.Listener;
import net.minecraft.client.gui.DrawContext;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.client.TooltipHelper;
import net.modificationstation.stationapi.api.client.event.gui.screen.container.TooltipRenderEvent;
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 net.modificationstation.stationapi.mixin.item.client.DrawContextAccessor;
import net.modificationstation.stationapi.mixin.item.client.HandledScreenAccessor;
@@ -19,7 +19,7 @@
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public final class CustomTooltipRendererImpl {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
private static final DrawContext CONTEXT = new DrawContext();
diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/item/CustomItemOverlayImpl.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/item/CustomItemOverlayImpl.java
index c4cce8b15..4fdcbcfdb 100644
--- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/item/CustomItemOverlayImpl.java
+++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/item/CustomItemOverlayImpl.java
@@ -1,11 +1,11 @@
package net.modificationstation.stationapi.impl.client.render.item;
import net.mine_diver.unsafeevents.listener.EventListener;
-import net.mine_diver.unsafeevents.listener.Listener;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.client.event.render.item.ItemOverlayRenderEvent;
import net.modificationstation.stationapi.api.client.item.CustomItemOverlay;
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;
@@ -14,7 +14,7 @@
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public final class CustomItemOverlayImpl {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
@EventListener
diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/dispenser/CustomDispenseBehaviorImpl.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/dispenser/CustomDispenseBehaviorImpl.java
index 8d7fb3518..1aa32364f 100644
--- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/dispenser/CustomDispenseBehaviorImpl.java
+++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/dispenser/CustomDispenseBehaviorImpl.java
@@ -1,11 +1,11 @@
package net.modificationstation.stationapi.impl.dispenser;
import net.mine_diver.unsafeevents.listener.EventListener;
-import net.mine_diver.unsafeevents.listener.Listener;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.dispenser.DispenseEvent;
import net.modificationstation.stationapi.api.item.CustomDispenseBehavior;
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;
@@ -14,7 +14,7 @@
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public class CustomDispenseBehaviorImpl {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
@EventListener
diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/entity/player/ItemCustomReachImpl.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/entity/player/ItemCustomReachImpl.java
index 338162157..1654a89b1 100644
--- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/entity/player/ItemCustomReachImpl.java
+++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/entity/player/ItemCustomReachImpl.java
@@ -1,13 +1,13 @@
package net.modificationstation.stationapi.impl.entity.player;
import net.mine_diver.unsafeevents.listener.EventListener;
-import net.mine_diver.unsafeevents.listener.Listener;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.event.entity.player.PlayerEvent;
import net.modificationstation.stationapi.api.item.CustomReachProvider;
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;
@@ -16,7 +16,7 @@
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public final class ItemCustomReachImpl {
static {
- Listener.registerLookup(MethodHandles.lookup());
+ EntrypointManager.registerLookup(MethodHandles.lookup());
}
@EventListener
diff --git a/station-keybindings-v0/src/main/java/net/modificationstation/stationapi/api/client/option/OptionFactory.java b/station-keybindings-v0/src/main/java/net/modificationstation/stationapi/api/client/option/OptionFactory.java
index de59d51de..481dc3b94 100644
--- a/station-keybindings-v0/src/main/java/net/modificationstation/stationapi/api/client/option/OptionFactory.java
+++ b/station-keybindings-v0/src/main/java/net/modificationstation/stationapi/api/client/option/OptionFactory.java
@@ -3,15 +3,13 @@
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import net.minecraft.client.option.Option;
-import net.modificationstation.stationapi.api.factory.EnumFactory;
+import net.modificationstation.stationapi.mixin.keybinding.client.OptionAccessor;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class OptionFactory {
+ private static int nextId = Option.values().length;
+
public static Option create(String optionName, String translationKey, boolean slider, boolean toggle) {
- return EnumFactory.addEnum(
- Option.class, optionName,
- new Class[] { String.class, boolean.class, boolean.class },
- translationKey, slider, toggle
- );
+ return OptionAccessor.stationapi_create(optionName, nextId++, translationKey, slider, toggle);
}
}
diff --git a/station-keybindings-v0/src/main/java/net/modificationstation/stationapi/mixin/keybinding/client/OptionAccessor.java b/station-keybindings-v0/src/main/java/net/modificationstation/stationapi/mixin/keybinding/client/OptionAccessor.java
new file mode 100644
index 000000000..b98ca0716
--- /dev/null
+++ b/station-keybindings-v0/src/main/java/net/modificationstation/stationapi/mixin/keybinding/client/OptionAccessor.java
@@ -0,0 +1,14 @@
+package net.modificationstation.stationapi.mixin.keybinding.client;
+
+import net.minecraft.client.option.Option;
+import net.modificationstation.stationapi.api.util.Util;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Invoker;
+
+@Mixin(Option.class)
+public interface OptionAccessor {
+ @Invoker("")
+ static Option stationapi_create(String optionName, int id, String translationKey, boolean slider, boolean toggle) {
+ return Util.assertMixin();
+ }
+}
diff --git a/station-keybindings-v0/src/main/resources/station-keybindings-v0.mixins.json b/station-keybindings-v0/src/main/resources/station-keybindings-v0.mixins.json
index e08db3268..6b4bad74b 100644
--- a/station-keybindings-v0/src/main/resources/station-keybindings-v0.mixins.json
+++ b/station-keybindings-v0/src/main/resources/station-keybindings-v0.mixins.json
@@ -8,6 +8,7 @@
"client": [
"client.GameOptionsMixin",
"client.MinecraftMixin",
+ "client.OptionAccessor",
"client.ScreenMixin"
],
"injectors": {
diff --git a/station-localization-api-v0/src/main/java/net/modificationstation/stationapi/api/resource/language/LanguageManager.java b/station-localization-api-v0/src/main/java/net/modificationstation/stationapi/api/resource/language/LanguageManager.java
index b93184427..4ba6e6f35 100644
--- a/station-localization-api-v0/src/main/java/net/modificationstation/stationapi/api/resource/language/LanguageManager.java
+++ b/station-localization-api-v0/src/main/java/net/modificationstation/stationapi/api/resource/language/LanguageManager.java
@@ -6,7 +6,6 @@
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.mine_diver.unsafeevents.listener.EventListener;
-import net.mine_diver.unsafeevents.listener.Listener;
import net.minecraft.client.resource.language.TranslationStorage;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.client.event.resource.AssetsResourceReloaderRegisterEvent;
@@ -14,13 +13,13 @@
import net.modificationstation.stationapi.api.event.resource.DataReloadEvent;
import net.modificationstation.stationapi.api.event.resource.language.TranslationInvalidationEvent;
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 net.modificationstation.stationapi.api.resource.IdentifiableResourceReloadListener;
import net.modificationstation.stationapi.api.resource.ResourceManager;
import net.modificationstation.stationapi.api.resource.SinglePreparationResourceReloader;
import net.modificationstation.stationapi.api.util.Identifier;
import net.modificationstation.stationapi.api.util.Namespace;
-import net.modificationstation.stationapi.api.util.Null;
import net.modificationstation.stationapi.api.util.Util;
import net.modificationstation.stationapi.api.util.profiler.DummyProfiler;
import net.modificationstation.stationapi.api.util.profiler.Profiler;
@@ -44,12 +43,12 @@
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public class LanguageManager extends SinglePreparationResourceReloader