Skip to content

Commit 35b2421

Browse files
committed
Started work on mixin support, will relocate to different plugin, another day, I just wanted a bare min, working mixin support, even if it only works for one class...
1 parent 11b931b commit 35b2421

15 files changed

+699
-11
lines changed

.idea/misc.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build.gradle

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ buildscript {
1010
}
1111

1212
dependencies {
13-
classpath 'org.mangorage:MangoBotGradle:6.0.11'
13+
classpath 'org.mangorage:MangoBotGradle:6.0.13'
1414
}
1515
}
1616

@@ -32,12 +32,22 @@ MangoBotConfig {
3232

3333
addRunConfig {
3434
it.setName("runDevBot")
35+
it.addArgs("--launchTarget", "mangobot")
3536
it.addArgs("--dev")
37+
it.addArgs("--mixin", "mangobotcore.mixins.json")
3638
}
3739
}
3840

3941
extraJavaModuleInfo {
4042
setDeriveAutomaticModuleNamesFromFileNames(true)
43+
module("net.fabricmc:sponge-mixin", "org.spongepowered.mixin") {
44+
preserveExisting()
45+
exports("org.spongepowered.asm.mixin.transformer", "org.mangorage.mangobotcore")
46+
opens("org.spongepowered.asm.mixin.transformer", "org.mangorage.mangobotcore")
47+
48+
exports("org.spongepowered.asm.transformers", "org.mangorage.mangobotcore")
49+
}
50+
4151
}
4252

4353
repositories {
@@ -46,6 +56,9 @@ repositories {
4656
maven {
4757
url = 'https://maven.minecraftforge.net/'
4858
}
59+
maven {
60+
url = "https://maven.fabricmc.net/"
61+
}
4962
maven {
5063
url 'https://m2.dv8tion.net/releases'
5164
}
@@ -61,7 +74,21 @@ repositories {
6174
dependencies {
6275

6376
installer('org.mangorage:installer:4.0.20')
64-
bootstrap("org.mangorage:mangobotbootstrap:1.0.31")
77+
bootstrap("org.mangorage:mangobotbootstrap:1.0.41")
78+
79+
80+
// SpongeMixin...
81+
library('net.fabricmc:sponge-mixin:0.13.4+mixin.0.8.5')
82+
83+
library('net.minecraftforge:modlauncher:10.2.4')
84+
library('net.minecraftforge:securemodules:2.2.21')
85+
86+
library('org.ow2.asm:asm:9.8')
87+
library('org.ow2.asm:asm-util:9.8')
88+
library('org.ow2.asm:asm-analysis:9.8')
89+
library('org.ow2.asm:asm-tree:9.8')
90+
library('org.ow2.asm:asm-commons:9.8')
91+
6592

6693
library('net.dv8tion:JDA:5.3.2')
6794
library('com.google.code.gson:gson:2.10.1')

src/main/java/module-info.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1-
module org.mangorage.mangobotcore {
2-
requires org.jetbrains.annotations;
1+
open module org.mangorage.mangobotcore {
2+
requires org.jetbrains.annotations;
33
requires org.slf4j;
44
requires net.minecraftforge.eventbus;
55

6-
requires com.google.gson;
76
requires net.dv8tion.jda;
87
requires org.mangorage.bootstrap;
98
requires kotlin.stdlib;
9+
requires org.spongepowered.mixin;
10+
11+
requires com.google.gson;
12+
requires java.sql;
1013

1114
// Common Utils
1215
exports org.mangorage.commonutils.misc;
@@ -32,15 +35,21 @@
3235
exports org.mangorage.mangobotcore;
3336

3437

38+
exports org.mangorage.mixin.core;
39+
40+
exports org.mangorage.mangobotcore.mixin;
41+
3542

36-
opens org.mangorage.mangobotcore.plugin.internal;
37-
opens org.mangorage.mangobotcore.plugin.internal.dependency;
38-
opens org.mangorage.entrypoint;
43+
// opens org.mangorage.mangobotcore.plugin.internal;
44+
// opens org.mangorage.mangobotcore.plugin.internal.dependency;
45+
// opens org.mangorage.entrypoint;
3946

4047

4148
provides org.mangorage.mangobotcore.plugin.api.Plugin with org.mangorage.mangobotcore.MangoBotCore;
42-
provides org.mangorage.bootstrap.api.transformer.IClassTransformer with org.mangorage.mangobotcore.transformer.ExampleTransformer;
49+
provides org.mangorage.bootstrap.api.transformer.IClassTransformer with org.mangorage.mangobotcore.transformer.ExampleTransformer, org.mangorage.mixin.SpongeMixinTransformer;
50+
provides org.spongepowered.asm.service.IGlobalPropertyService with org.mangorage.mixin.core.MixinBlackboardImpl;
4351

4452
uses org.mangorage.mangobotcore.plugin.api.Plugin;
4553
uses org.mangorage.bootstrap.api.transformer.IClassTransformer;
54+
uses org.spongepowered.asm.service.IGlobalPropertyService;
4655
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.mangorage.mangobotcore;
2+
3+
public class ExampleThing {
4+
public void load() {
5+
System.out.println("Faiiled");
6+
}
7+
}

src/main/java/org/mangorage/mangobotcore/MangoBotCore.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package org.mangorage.mangobotcore;
22

3+
import org.mangorage.bootstrap.api.loader.MangoLoader;
34
import org.mangorage.mangobotcore.plugin.api.MangoBotPlugin;
45
import org.mangorage.mangobotcore.plugin.api.Plugin;
6+
import org.mangorage.mixin.core.MixinServiceMangoBot;
57

68
import static org.mangorage.mangobotcore.MangoBotCore.ID;
79

@@ -21,6 +23,17 @@ public String getId() {
2123

2224
@Override
2325
public void load() {
24-
26+
var a = 1;
27+
new ExampleThing().load();
28+
29+
MangoLoader loader = (MangoLoader) Thread.currentThread().getContextClassLoader();
30+
var bytes = MixinServiceMangoBot.getClassNode(
31+
loader.getClassBytes(
32+
ExampleThing.class.getName()
33+
)
34+
);
35+
36+
37+
var aa = 1;
2538
}
2639
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.mangorage.mangobotcore.mixin;
2+
3+
import org.mangorage.mangobotcore.ExampleThing;
4+
import org.spongepowered.asm.mixin.Debug;
5+
import org.spongepowered.asm.mixin.Mixin;
6+
import org.spongepowered.asm.mixin.Overwrite;
7+
8+
@Debug(print = true, export = true)
9+
@Mixin(ExampleThing.class)
10+
public class ExampleMixin {
11+
public ExampleMixin() {
12+
System.out.println("LOADED MIXIN!");
13+
}
14+
15+
16+
/**
17+
* @author
18+
* @reason
19+
*/
20+
@Overwrite
21+
public void load() {
22+
System.out.println("Loaded via mixins!");
23+
}
24+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package org.mangorage.mixin;
2+
3+
import org.jetbrains.annotations.NotNull;
4+
import org.spongepowered.asm.launch.platform.container.ContainerHandleURI;
5+
import org.spongepowered.asm.launch.platform.container.ContainerHandleVirtual;
6+
import org.spongepowered.asm.launch.platform.container.IContainerHandle;
7+
import org.spongepowered.asm.mixin.Mixins;
8+
9+
import java.nio.file.Path;
10+
import java.util.Collection;
11+
import java.util.List;
12+
import java.util.Map;
13+
14+
public final class MixinContainer extends ContainerHandleVirtual {
15+
/**
16+
* Creates a new root container handle.
17+
*
18+
* @param name the name
19+
* @since 1.0.0
20+
*/
21+
public MixinContainer(final @NotNull String name) {
22+
super(name);
23+
Path path = Path.of("plugins/MangoBotCore-12.0.66.jar");
24+
25+
addResource(path.getFileName().toString(), path);
26+
}
27+
28+
/**
29+
* Adds a resource to this container.
30+
*
31+
* @param name the name
32+
* @param path the path
33+
* @since 1.0.0
34+
*/
35+
public void addResource(final @NotNull String name, final @NotNull Path path) {
36+
this.add(new ResourceContainer(name, path));
37+
}
38+
39+
/**
40+
* Adds a resource to this container.
41+
*
42+
* @param entry the entry
43+
* @since 1.0.0
44+
*/
45+
public void addResource(final Map.@NotNull Entry<String, Path> entry) {
46+
this.add(new ResourceContainer(entry.getKey(), entry.getValue()));
47+
}
48+
49+
@Override
50+
public String toString() {
51+
return "MixinContainer{name=" + this.getName() + "}";
52+
}
53+
54+
/* package */ static class ResourceContainer extends ContainerHandleURI {
55+
private final String name;
56+
private final Path path;
57+
58+
/* package */ ResourceContainer(final @NotNull String name, final @NotNull Path path) {
59+
super(path.toUri());
60+
61+
this.name = name;
62+
this.path = path;
63+
}
64+
65+
public @NotNull String name() {
66+
return this.name;
67+
}
68+
69+
public @NotNull Path path() {
70+
return this.path;
71+
}
72+
73+
@Override
74+
public @NotNull String toString() {
75+
return "ResourceContainer{name=" + this.name + ", path=" + this.path + "}";
76+
}
77+
}
78+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.mangorage.mixin;
2+
3+
import org.spongepowered.asm.logging.ILogger;
4+
import org.spongepowered.asm.logging.Level;
5+
import org.spongepowered.asm.logging.LoggerAdapterAbstract;
6+
7+
import java.util.Map;
8+
import java.util.concurrent.ConcurrentHashMap;
9+
10+
public class MixinLogger extends LoggerAdapterAbstract {
11+
private static final Map<String, ILogger> LOGGER_MAP = new ConcurrentHashMap<>();
12+
13+
public static ILogger get(String name) {
14+
return LOGGER_MAP.computeIfAbsent(name, MixinLogger::new);
15+
}
16+
17+
protected MixinLogger(String id) {
18+
super(id);
19+
}
20+
21+
@Override
22+
public String getType() {
23+
return "MangoBot Mixin Logger";
24+
}
25+
26+
@Override
27+
public void catching(Level level, Throwable throwable) {
28+
throwable.printStackTrace();
29+
}
30+
31+
public static void print(String message, Object... args) {
32+
for (Object arg : args) {
33+
message = message.replaceFirst("\\{}", arg == null ? "null" : arg.toString());
34+
}
35+
System.out.println(message);
36+
}
37+
38+
@Override
39+
public void log(Level level, String s, Object... objects) {
40+
print(s, objects);
41+
}
42+
43+
@Override
44+
public void log(Level level, String s, Throwable throwable) {
45+
System.out.println(s);
46+
}
47+
48+
@Override
49+
public <T extends Throwable> T throwing(T t) {
50+
System.out.println(t);
51+
t.printStackTrace();
52+
return null;
53+
}
54+
}
55+
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package org.mangorage.mixin;
2+
3+
import org.mangorage.mixin.core.MangoBotMixinBootstrap;
4+
import org.mangorage.mixin.core.MixinServiceMangoBot;
5+
import org.mangorage.mixin.transformer.MangoBotTransformer;
6+
import org.spongepowered.asm.launch.MixinBootstrap;
7+
import org.spongepowered.asm.mixin.MixinEnvironment;
8+
import org.spongepowered.asm.mixin.Mixins;
9+
import org.spongepowered.asm.mixin.extensibility.IMixinConfig;
10+
import org.spongepowered.asm.mixin.transformer.Config;
11+
import org.spongepowered.asm.service.MixinService;
12+
13+
import java.lang.reflect.Method;
14+
15+
public final class SpongeMixinImpl {
16+
private static final SpongeMixinImpl INSTANCE = new SpongeMixinImpl();
17+
18+
public static void load() {}
19+
20+
SpongeMixinImpl() {
21+
// Load
22+
// System.setProperty("mixin.debug.verbose", "true");
23+
// System.setProperty("mixin.debug", "true");
24+
// System.setProperty("mixin.env.disableRefMap", "true");
25+
// System.setProperty("mixin.checks", "true");
26+
27+
System.setProperty("mixin.bootstrapService", MangoBotMixinBootstrap.class.getName());
28+
System.setProperty("mixin.service", MixinServiceMangoBot.class.getName());
29+
System.setProperty("mixin.env.remapRefMap", "false");
30+
31+
MixinBootstrap.init();
32+
33+
Mixins.addConfiguration("mangobotcore.mixins.json");
34+
35+
completeMixinBootstrap();
36+
37+
// Mixin Extras Init
38+
39+
for(Config config : Mixins.getConfigs()) {
40+
41+
IMixinConfig mixinConfig = config.getConfig();
42+
mixinConfig.decorate("fabric-modId", "mango");
43+
mixinConfig.decorate("fabric-compat", 14000);
44+
45+
}
46+
}
47+
48+
private void completeMixinBootstrap() {
49+
// Move to the default phase.
50+
try {
51+
final Method method = MixinEnvironment.class.getDeclaredMethod("gotoPhase", MixinEnvironment.Phase.class);
52+
method.setAccessible(true);
53+
method.invoke(null, MixinEnvironment.Phase.INIT);
54+
method.invoke(null, MixinEnvironment.Phase.DEFAULT);
55+
} catch(final Exception exception) {
56+
exception.printStackTrace();
57+
}
58+
59+
MangoBotTransformer.getInstance().load();
60+
}
61+
}
62+
63+

0 commit comments

Comments
 (0)