diff --git a/app/src/main/java/sib/bedohswe/hellofabric/Main.java b/app/src/main/java/sib/bedohswe/hellofabric/Main.java index 5907918..0ccba46 100644 --- a/app/src/main/java/sib/bedohswe/hellofabric/Main.java +++ b/app/src/main/java/sib/bedohswe/hellofabric/Main.java @@ -1,11 +1,14 @@ package sib.bedohswe.hellofabric; public class Main { + public static void callEntrypoints() {} + public String getMessage() { return "Hello World!"; } public static void main(String args[]) { + callEntrypoints(); System.out.println(new Main().getMessage()); } } diff --git a/app/src/main/java/sib/bedohswe/hellofabric/modloader/GamePatchImpl.java b/app/src/main/java/sib/bedohswe/hellofabric/modloader/GamePatchImpl.java new file mode 100644 index 0000000..60784c9 --- /dev/null +++ b/app/src/main/java/sib/bedohswe/hellofabric/modloader/GamePatchImpl.java @@ -0,0 +1,49 @@ +package sib.bedohswe.hellofabric.modloader; + +import com.google.j2objc.annotations.Property; +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.api.ModInitializer; +import net.fabricmc.loader.impl.FabricLoaderImpl; +import net.fabricmc.loader.impl.game.patch.GamePatch; +import net.fabricmc.loader.impl.launch.FabricLauncher; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.*; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Objects; +import java.util.function.Consumer; +import java.util.function.Function; + +import static sib.bedohswe.hellofabric.modloader.GameProviderImpl.PROPERTY_APP_DIRECTORY; + +public class GamePatchImpl extends GamePatch { + public static void initClient() { + Path runDir = Paths.get(System.getProperty(PROPERTY_APP_DIRECTORY)); + FabricLoaderImpl loader = FabricLoaderImpl.INSTANCE; + loader.prepareModInit(runDir, FabricLoaderImpl.INSTANCE.getGameInstance()); + loader.invokeEntrypoints("main", ModInitializer.class, ModInitializer::onInitialize); + loader.invokeEntrypoints("client", ClientModInitializer.class, ClientModInitializer::onInitializeClient); + } + + @Override + public void process(FabricLauncher launcher, Function classSource, Consumer classEmitter) { + String entrypoint = launcher.getEntrypoint(); + ClassNode entrypointClazz = Objects.requireNonNull(classSource.apply(entrypoint), "Failed to load entrypoint class."); + + MethodNode initMethod = Objects.requireNonNull(findMethod(entrypointClazz, + (method) -> method.name.equals("callEntrypoints") && method.desc.equals("()V") + ), "Failed load load entrypoint method."); + + initMethod.instructions.insertBefore(initMethod.instructions.getFirst(), new MethodInsnNode( + Opcodes.INVOKESTATIC, + "sib/bedohswe/hellofabric/modloader/GamePatchImpl", + "initClient", + "()V", + false)); + + classEmitter.accept(entrypointClazz); + } + + +} \ No newline at end of file diff --git a/app/src/main/java/sib/bedohswe/hellofabric/modloader/GameProviderImpl.java b/app/src/main/java/sib/bedohswe/hellofabric/modloader/GameProviderImpl.java index 5f1b2cb..da3d889 100644 --- a/app/src/main/java/sib/bedohswe/hellofabric/modloader/GameProviderImpl.java +++ b/app/src/main/java/sib/bedohswe/hellofabric/modloader/GameProviderImpl.java @@ -26,7 +26,7 @@ public class GameProviderImpl implements GameProvider { public static final String PROPERTY_APP_DIRECTORY = "appDirectory"; - private static final GameTransformer TRANSFORMER = new GameTransformerImpl(); + private static final GameTransformer TRANSFORMER = new GameTransformer(new GamePatchImpl()); private Arguments arguments; private Path appJar; diff --git a/app/src/main/java/sib/bedohswe/hellofabric/modloader/GameTransformerImpl.java b/app/src/main/java/sib/bedohswe/hellofabric/modloader/GameTransformerImpl.java deleted file mode 100644 index 17b54cb..0000000 --- a/app/src/main/java/sib/bedohswe/hellofabric/modloader/GameTransformerImpl.java +++ /dev/null @@ -1,15 +0,0 @@ -package sib.bedohswe.hellofabric.modloader; - -import net.fabricmc.loader.impl.game.patch.GameTransformer; - -public class GameTransformerImpl extends GameTransformer { - /* - * @param className The class name, - * @return The transformed class data. - */ - @Override - public byte[] transform(String name) { - return null; - } -} -