Skip to content

Commit bbb8bc0

Browse files
authored
Fixes for Mixin 0.8 (#117)
1 parent 91d2d10 commit bbb8bc0

File tree

4 files changed

+57
-25
lines changed

4 files changed

+57
-25
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ repositories {
2727
}
2828

2929
dependencies {
30-
implementation("org.dimdev:mixin:0.7.11-SNAPSHOT") {
30+
implementation("org.spongepowered:mixin:0.8") {
3131
exclude module: "asm-commons"
3232
exclude module: "asm-tree"
3333
exclude module: "launchwrapper"
Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,26 @@
11
package org.dimdev.jeid.mixin.core;
22

3+
import net.minecraft.init.Biomes;
34
import net.minecraft.util.math.BlockPos;
5+
import net.minecraft.world.World;
46
import net.minecraft.world.biome.Biome;
57
import net.minecraft.world.biome.BiomeProvider;
68
import net.minecraft.world.chunk.Chunk;
79
import org.dimdev.jeid.INewChunk;
810
import org.dimdev.jeid.JEID;
9-
import org.dimdev.jeid.Utils;
11+
import org.spongepowered.asm.mixin.Final;
1012
import org.spongepowered.asm.mixin.Mixin;
1113
import org.spongepowered.asm.mixin.Overwrite;
12-
import org.spongepowered.asm.mixin.injection.*;
13-
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
14-
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
14+
import org.spongepowered.asm.mixin.Shadow;
1515

1616
import java.util.Arrays;
1717

1818
@Mixin(Chunk.class)
1919
public class MixinChunk implements INewChunk {
20+
21+
22+
@Shadow @Final private World world;
23+
2024
private static final byte errorBiomeID = (byte) Biome.REGISTRY.getIDForObject(JEID.errorBiome);
2125
private final int[] intBiomeArray = generateIntBiomeArray();
2226

@@ -36,25 +40,45 @@ public void setIntBiomeArray(int[] intBiomeArray) {
3640
System.arraycopy(intBiomeArray, 0, this.intBiomeArray, 0, this.intBiomeArray.length);
3741
}
3842

43+
/**
44+
* @author Unknown
45+
*/
3946
@Overwrite
4047
public byte[] getBiomeArray() {
4148
byte[] arr = new byte[256];
4249
Arrays.fill(arr, errorBiomeID);
4350
return arr;
4451
}
4552

46-
@Redirect(method = "getBiome", at = @At(value = "FIELD", target = "Lnet/minecraft/world/chunk/Chunk;blockBiomeArray:[B", args = "array=get"))
47-
private int getIntBiomeIdFromArray(byte[] array, int index) {
48-
return this.intBiomeArray[index];
49-
}
53+
/**
54+
* @author Clienthax
55+
* @reason No way to modify locals in the manner we need currently..
56+
*/
57+
@Overwrite
58+
public Biome getBiome(BlockPos pos, BiomeProvider provider)
59+
{
60+
int i = pos.getX() & 15;
61+
int j = pos.getZ() & 15;
62+
//JEID START
63+
int k = this.intBiomeArray[j << 4 | i];
64+
//JEID END
5065

51-
@Inject(method = "getBiome", at = @At(value = "FIELD", target = "Lnet/minecraft/world/chunk/Chunk;blockBiomeArray:[B", args = "array=set"), locals = LocalCapture.CAPTURE_FAILHARD)
52-
private void setIntBiomeIdInArray(BlockPos pos, BiomeProvider provider, CallbackInfoReturnable<Biome> cir, int i, int j, int k, Biome biome) {
53-
this.intBiomeArray[j << 4 | i] = k;
54-
}
66+
if (k == 255)
67+
{
68+
// Forge: checking for client ensures that biomes are only generated on integrated server
69+
// in singleplayer. Generating biomes on the client may corrupt the biome ID arrays on
70+
// the server while they are being generated because IntCache can't be thread safe,
71+
// so client and server may end up filling the same array.
72+
// This is not necessary in 1.13 and newer versions.
73+
Biome biome = world.isRemote ? Biomes.PLAINS : provider.getBiome(pos, Biomes.PLAINS);
74+
k = Biome.getIdForBiome(biome);
75+
//JEID START
76+
this.intBiomeArray[j << 4 | i] = k;
77+
//JEID END
78+
}
5579

56-
@ModifyConstant(method = "getBiome", constant = @Constant(intValue = 0xFF))
57-
private int getBiomeBitmask(int oldValue) {
58-
return 0xFFFFFFFF;
80+
Biome biome1 = Biome.getBiome(k);
81+
return biome1 == null ? Biomes.PLAINS : biome1;
5982
}
83+
6084
}

src/main/java/org/dimdev/jeid/mixin/init/MixinLoader.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import org.spongepowered.asm.mixin.injection.At;
1212
import org.spongepowered.asm.mixin.injection.Inject;
1313
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
14-
import org.spongepowered.asm.mixin.transformer.MixinTransformer;
14+
import org.spongepowered.asm.mixin.transformer.MixinProcessor;
1515
import org.spongepowered.asm.mixin.transformer.Proxy;
1616

1717
import java.lang.reflect.Field;
@@ -45,17 +45,25 @@ private void beforeConstructingMods(List<String> injectedModContainers, Callback
4545

4646
Proxy mixinProxy = (Proxy) Launch.classLoader.getTransformers().stream().filter(transformer -> transformer instanceof Proxy).findFirst().get();
4747
try {
48+
//This will very likely break on the next major mixin release.
49+
Class mixinTransformerClass = Class.forName("org.spongepowered.asm.mixin.transformer.MixinTransformer");
50+
4851
Field transformerField = Proxy.class.getDeclaredField("transformer");
4952
transformerField.setAccessible(true);
50-
MixinTransformer transformer = (MixinTransformer) transformerField.get(mixinProxy);
53+
Object transformer = transformerField.get(mixinProxy);
54+
55+
//Get MixinProcessor from MixinTransformer
56+
Field processorField = mixinTransformerClass.getDeclaredField("processor");
57+
processorField.setAccessible(true);
58+
Object processor = processorField.get(transformer);
5159

52-
Method selectConfigsMethod = MixinTransformer.class.getDeclaredMethod("selectConfigs", MixinEnvironment.class);
60+
Method selectConfigsMethod = MixinProcessor.class.getDeclaredMethod("selectConfigs", MixinEnvironment.class);
5361
selectConfigsMethod.setAccessible(true);
54-
selectConfigsMethod.invoke(transformer, MixinEnvironment.getCurrentEnvironment());
62+
selectConfigsMethod.invoke(processor, MixinEnvironment.getCurrentEnvironment());
5563

56-
Method prepareConfigsMethod = MixinTransformer.class.getDeclaredMethod("prepareConfigs", MixinEnvironment.class);
64+
Method prepareConfigsMethod = MixinProcessor.class.getDeclaredMethod("prepareConfigs", MixinEnvironment.class);
5765
prepareConfigsMethod.setAccessible(true);
58-
prepareConfigsMethod.invoke(transformer, MixinEnvironment.getCurrentEnvironment());
66+
prepareConfigsMethod.invoke(processor, MixinEnvironment.getCurrentEnvironment());
5967
} catch (ReflectiveOperationException e) {
6068
throw new RuntimeException(e);
6169
}

src/main/java/org/dimdev/jeid/mixin/modsupport/twilightforest/TwilightMixinPlugin.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import net.minecraftforge.fml.common.Loader;
44
import net.minecraftforge.fml.common.ModContainer;
55
import org.dimdev.jeid.Utils;
6-
import org.spongepowered.asm.lib.tree.ClassNode;
6+
import org.objectweb.asm.tree.ClassNode;
77
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
88
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
99

@@ -55,12 +55,12 @@ public List<String> getMixins() {
5555
}
5656

5757
@Override
58-
public void preApply(String s, ClassNode classNode, String s1, IMixinInfo iMixinInfo) {
58+
public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
5959

6060
}
6161

6262
@Override
63-
public void postApply(String s, ClassNode classNode, String s1, IMixinInfo iMixinInfo) {
63+
public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
6464

6565
}
6666
}

0 commit comments

Comments
 (0)