Skip to content

Commit 9e5e682

Browse files
committed
update mixins (compatibility with a new mixinbooter), add autoload libs and fix patch
1 parent 8e3c1c1 commit 9e5e682

20 files changed

Lines changed: 421 additions & 124 deletions

.gitignore

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
/.idea/
2-
/.run/
3-
/.gradle/
4-
/projects/
5-
/buildSrc/.gradle/
6-
/buildSrc/build/
7-
/logs/
1+
.idea/
2+
.run/
3+
.gradle/
4+
projects/
5+
buildSrc/.gradle/
6+
buildSrc/build/
7+
logs/
88
version.txt
9-
src/main/java/com/cleanroommc/common/CleanroomVersion.java
9+
src/main/java/com/cleanroommc/common/CleanroomVersion.java

build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -500,8 +500,8 @@ project(':cleanroom') {
500500
installer 'org.openjdk.nashorn:nashorn-core:15.4'
501501

502502
// Mixin
503-
installer 'com.cleanroommc:sponge-mixin:0.20.6+mixin.0.8.7'
504-
installer annotationProcessor('io.github.llamalad7:mixinextras-common:0.4.1')
503+
installer 'com.cleanroommc:sponge-mixin:0.20.10+mixin.0.8.7'
504+
installer annotationProcessor('io.github.llamalad7:mixinextras-common:0.5.0-rc.2')
505505

506506
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.11.0'
507507
testImplementation 'org.junit.vintage:junit-vintage-engine:5.11.0'
@@ -515,7 +515,7 @@ project(':cleanroom') {
515515
installer 'net.md-5:bungeecord-chat:1.16-R0.4'
516516
installer 'commons-lang:commons-lang:2.6' // Is needed for plugin compatibility
517517
installer 'org.xerial:sqlite-jdbc:3.21.0.1'
518-
installer 'mysql:mysql-connector-java:5.1.49'
518+
installer 'mysql:mysql-connector-java:8.0.24'
519519

520520
// CatRoom
521521
installer 'net.openhft:affinity:3.23.3'

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ binary_patcher = net.minecraftforge:binarypatcher:1.1.1:fatjar
1717
installer_tools_version = 1.4.1
1818

1919
# Libraries
20-
asm_version = 9.7
20+
asm_version = 9.8
2121
asm_deprecated = 7.1
2222
netty_version = 4.1.113.Final
2323
lwjgl_version = 3.3.4-27-CLEANROOM

patches/minecraft/net/minecraft/network/NetHandlerPlayServer.java.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@
119119
+ // private int chatSpamThresholdCount;
120120
+ // CraftBukkit start - multithreaded fields
121121
+ private volatile int field_147374_l;
122-
+ private static final AtomicIntegerFieldUpdater chatSpamField = AtomicIntegerFieldUpdater.newUpdater(NetHandlerPlayServer.class, FMLLaunchHandler.isDeobfuscatedEnvironment() ? "chatSpamThresholdCount" : "field_147374_l");
122+
+ private static final AtomicIntegerFieldUpdater chatSpamField = AtomicIntegerFieldUpdater.newUpdater(NetHandlerPlayServer.class, FMLLaunchHandler.isDeobfuscatedEnvironment() ? "chatSpamThresholdCount" : new String(new char[]{'f', 'i', 'e', 'l', 'd', '_', '1', '4', '7', '3', '7', '4', '_', 'l'}));
123123
+ // CraftBukkit end
124124
private int field_147375_m;
125125
- private final IntHashMap<Short> field_147372_n = new IntHashMap<>();
@@ -184,7 +184,7 @@
184184
- }
185185
-
186186
- @Override
187-
+ this.craftServer = field_147367_d == null ? (org.bukkit.craftbukkit.v1_12_R1.CraftServer)org.bukkit.Bukkit.getServer() : field_147367_d.server;
187+
+ this.craftServer = p_i1530_1_ == null ? (org.bukkit.craftbukkit.v1_12_R1.CraftServer)org.bukkit.Bukkit.getServer() : p_i1530_1_.server;
188188
+ }
189189
+ // CatRoom End
190190
+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.cleanroommc.common;
2+
3+
import com.google.common.eventbus.EventBus;
4+
import net.minecraftforge.common.ForgeEarlyConfig;
5+
import net.minecraftforge.fml.common.DummyModContainer;
6+
import net.minecraftforge.fml.common.LoadController;
7+
import net.minecraftforge.fml.common.ModMetadata;
8+
import net.minecraftforge.fml.common.asm.FMLSanityChecker;
9+
10+
import java.io.File;
11+
12+
public final class MixinContainer extends DummyModContainer{
13+
public MixinContainer() {
14+
super(new ModMetadata());
15+
ModMetadata meta = this.getMetadata();
16+
meta.modId = "mixinbooter";
17+
meta.name = "MixinBooter";
18+
meta.description = "A Mixin library and loader.";
19+
meta.version = ForgeEarlyConfig.MIXIN_BOOTER_VERSION;
20+
meta.authorList.add("Rongmario");
21+
}
22+
23+
@Override
24+
public boolean registerBus(EventBus bus, LoadController controller) {
25+
return true;
26+
}
27+
28+
@Override
29+
public File getSource() {
30+
return FMLSanityChecker.fmlLocation;
31+
}
32+
}

src/main/java/net/minecraftforge/common/ForgeEarlyConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,6 @@ public class ForgeEarlyConfig {
2121
public static String X11_CLASS_NAME = "minecraft";
2222
public static String COCOA_FRAME_NAME = "minecraft";
2323
public static String CONFIG_ANY_TIME_VERSION = "3.0";
24+
public static String MIXIN_BOOTER_VERSION = "10.6";
2425
public static String[] LOADING_PLUGIN_BLACKLIST = new String[] { "com.cleanroommc.configanytime.ConfigAnytimePlugin", "zone.rong.mixinbooter.MixinBooterPlugin"};
2526
}

src/main/java/net/minecraftforge/fml/common/FMLContextQuery.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ private FMLContextQuery() {
2929
modApiManager$dataTable.setAccessible(true);
3030
asmDataTable = (ASMDataTable) modApiManager$dataTable.get(ModAPIManager.INSTANCE);
3131
} catch (ReflectiveOperationException e) {
32-
MixinBooterPlugin.LOGGER.fatal("Not able to reflect ModAPIManager#dataTable", e);
32+
FMLLog.log.fatal("Not able to reflect ModAPIManager#dataTable", e);
3333
}
3434
this.asmDataTable = asmDataTable;
3535
}

src/main/java/net/minecraftforge/fml/common/LoadController.java

Lines changed: 56 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -36,24 +36,27 @@
3636
import net.minecraftforge.fml.common.versioning.ArtifactVersion;
3737
import net.minecraftforge.fml.relauncher.MixinBooterPlugin;
3838
import net.minecraftforge.fml.relauncher.libraries.LibraryManager;
39-
import net.minecraftforge.fml.relauncher.mixinfix.MixinFixer;
4039
import org.apache.logging.log4j.ThreadContext;
4140
import org.apache.logging.log4j.message.FormattedMessage;
41+
4242
import org.spongepowered.asm.mixin.MixinEnvironment;
4343
import org.spongepowered.asm.mixin.Mixins;
44+
import org.spongepowered.asm.mixin.ModUtil;
45+
import org.spongepowered.asm.mixin.transformer.Config;
4446
import org.spongepowered.asm.mixin.transformer.Proxy;
4547
import org.spongepowered.asm.service.MixinService;
4648
import org.spongepowered.asm.service.mojang.MixinServiceLaunchWrapper;
4749
import org.spongepowered.asm.util.Constants;
50+
import zone.rong.mixinbooter.Context;
4851
import zone.rong.mixinbooter.ILateMixinLoader;
4952

5053
import javax.annotation.Nullable;
5154
import java.io.File;
5255
import java.io.IOException;
5356
import java.lang.reflect.InvocationTargetException;
5457
import java.lang.reflect.Method;
55-
import java.net.URL;
5658
import java.util.*;
59+
import java.util.function.Supplier;
5760
import java.util.jar.Attributes;
5861
import java.util.jar.JarFile;
5962
import java.util.stream.Collectors;
@@ -166,44 +169,55 @@ public void distributeStateMessage(LoaderState state, Object... eventData)
166169
}
167170

168171
FMLContextQuery.init(); // Initialize FMLContextQuery and add it to the global list
169-
boolean log = false;
170-
171-
MixinBooterPlugin.LOGGER.info("Instantiating all ILateMixinLoader implemented classes...");
172172

173+
// Load late mixins
174+
FMLLog.log.info("Instantiating all ILateMixinLoader implemented classes...");
173175
for (ASMDataTable.ASMData asmData : asmDataTable.getAll(ILateMixinLoader.class.getName().replace('.', '/'))) {
174-
if (!log) {
175-
MixinBooterPlugin.LOGGER.info("Instantiating all ILateMixinLoader implemented classes...");
176-
log = true;
177-
}
178-
modClassLoader.addFile(asmData.getCandidate().getModContainer()); // Add to path before `newInstance`
179-
Class<?> clazz = Class.forName(asmData.getClassName().replace('/', '.'));
180-
MixinBooterPlugin.LOGGER.info("Instantiating {} for its mixins.", clazz);
181-
ILateMixinLoader loader = (ILateMixinLoader) clazz.newInstance();
182-
for (String mixinConfig : loader.getMixinConfigs()) {
183-
if (loader.shouldMixinConfigQueue(mixinConfig)) {
184-
MixinBooterPlugin.LOGGER.info("Adding {} mixin configuration.", mixinConfig);
185-
Mixins.addConfiguration(mixinConfig);
186-
loader.onMixinConfigQueued(mixinConfig);
176+
try {
177+
modClassLoader.addFile(asmData.getCandidate().getModContainer()); // Add to path before `newInstance`
178+
Class<?> clazz = Class.forName(asmData.getClassName().replace('/', '.'));
179+
FMLLog.log.info("Instantiating {} for its mixins.", clazz);
180+
@SuppressWarnings("deprecation")
181+
ILateMixinLoader loader = (ILateMixinLoader) clazz.getConstructor().newInstance();
182+
for (String mixinConfig : loader.getMixinConfigs()) {
183+
@SuppressWarnings("deprecation")
184+
Context context = new Context(mixinConfig);
185+
if (loader.shouldMixinConfigQueue(context)) {
186+
try {
187+
FMLLog.log.info("Adding {} mixin configuration.", mixinConfig);
188+
Mixins.addConfiguration(mixinConfig);
189+
loader.onMixinConfigQueued(context);
190+
} catch (Throwable t) {
191+
FMLLog.log.error("Error adding mixin configuration for {}", mixinConfig, t);
192+
}
193+
}
187194
}
195+
} catch (ClassNotFoundException | ClassCastException | InstantiationException | IllegalAccessException e) {
196+
FMLLog.log.error("Unable to load the ILateMixinLoader", e);
188197
}
189198
}
190199

191-
log = false;
192-
193-
// Append all non-conventional mixin configurations gathered via MixinFixer
194-
for (String mixinConfig : MixinFixer.retrieveLateMixinConfigs()) {
195-
if (!log) {
196-
MixinBooterPlugin.LOGGER.info("Appending non-conventional mixin configurations...");
197-
log = true;
200+
// mark config owners : for earlys, lates, and mfAttributes.
201+
for (Config config : Mixins.getConfigs()) {
202+
if (!config.getConfig().hasDecoration(ModUtil.OWNER_DECORATOR)) {
203+
String pkg = config.getConfig().getMixinPackage();
204+
pkg = pkg.charAt(pkg.length() - 1) == '.' ? pkg.substring(0, pkg.length() - 1) : pkg;
205+
List<ModContainer> owners = getPackageOwners(pkg);
206+
if (owners.isEmpty()) {
207+
config.getConfig().decorate(ModUtil.OWNER_DECORATOR, (Supplier) () -> ModUtil.UNKNOWN_OWNER);
208+
} else {
209+
final String owner = owners.get(0).getModId(); // better assign ?
210+
config.getConfig().decorate(ModUtil.OWNER_DECORATOR, (Supplier) () -> owner);
211+
}
198212
}
199-
MixinBooterPlugin.LOGGER.info("Adding {} mixin configuration.", mixinConfig);
200-
Mixins.addConfiguration(mixinConfig);
201213
}
202214

203215
for (ModContainer container : this.loader.getActiveModList()) {
204216
modClassLoader.addFile(container.getSource());
205217
}
206-
} catch (Throwable ignored) {}
218+
} catch (Throwable t) {
219+
FMLLog.log.error("Error loading Mods", t);
220+
}
207221
if (MixinService.getService() instanceof MixinServiceLaunchWrapper) {
208222
((MixinServiceLaunchWrapper) MixinService.getService()).setDelegatedTransformers(null);
209223
}
@@ -433,15 +447,20 @@ void forceState(LoaderState newState)
433447
private ModContainer findActiveContainerFromStack()
434448
{
435449
return StackWalker.getInstance()
436-
.walk(frames -> frames.map(StackWalker.StackFrame::getClassName)
437-
.filter(name -> name.lastIndexOf('.') != -1)
438-
.map(name -> name.substring(0, name.lastIndexOf('.')))
439-
.map(pkg -> packageOwners.get(pkg))
440-
.filter(l -> !l.isEmpty())
441-
.findFirst()
442-
.map(List::getFirst)
443-
.orElse(null)
444-
);
450+
.walk(frames -> frames.map(StackWalker.StackFrame::getClassName)
451+
.filter(name -> name.lastIndexOf('.') != -1)
452+
.map(name -> packageOwners.get(name.substring(0, name.lastIndexOf('.'))))
453+
.filter(l -> !l.isEmpty())
454+
.findFirst()
455+
.map(List::getFirst)
456+
.orElse(null)
457+
);
458+
}
459+
460+
@Nullable
461+
public List<ModContainer> getPackageOwners(String pkg)
462+
{
463+
return packageOwners.get(pkg);
445464
}
446465

447466
LoaderState getState()

src/main/java/net/minecraftforge/fml/common/Loader.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040

4141
import com.cleanroommc.common.CleanroomContainer;
4242
import com.cleanroommc.common.ConfigAnytimeContainer;
43+
import com.cleanroommc.common.MixinContainer;
4344
import net.minecraft.util.ResourceLocation;
4445
import net.minecraftforge.common.ForgeVersion;
4546
import net.minecraftforge.common.capabilities.CapabilityManager;
@@ -375,6 +376,7 @@ private ModDiscoverer identifyMods(List<String> additionalContainers)
375376
// Add in the MCP mod container
376377
mods.add(new InjectedModContainer(mcp,new File("minecraft.jar")));
377378
mods.add(new InjectedModContainer(new ConfigAnytimeContainer(), FMLSanityChecker.fmlLocation));
379+
mods.add(new InjectedModContainer(new MixinContainer(), FMLSanityChecker.fmlLocation));
378380
mods.add(new InjectedModContainer(new CleanroomContainer(), FMLSanityChecker.fmlLocation));
379381
for (String cont : injectedContainers)
380382
{

src/main/java/net/minecraftforge/fml/common/MixinContainer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@
55

66
import java.io.File;
77

8+
import static net.minecraftforge.common.ForgeEarlyConfig.MIXIN_BOOTER_VERSION;
9+
810
public final class MixinContainer extends DummyModContainer{
911
public MixinContainer() {
1012
super(new ModMetadata());
1113
ModMetadata meta = this.getMetadata();
1214
meta.modId = "mixinbooter";
1315
meta.name = "MixinBooter";
1416
meta.description = "A Mixin library and loader.";
15-
meta.version = "10.0";
17+
meta.version = MIXIN_BOOTER_VERSION;
1618
meta.authorList.add("Rongmario");
1719
}
1820

0 commit comments

Comments
 (0)