Skip to content

Commit

Permalink
Compatible with forge 1.15.2-31.1.95.
Browse files Browse the repository at this point in the history
  • Loading branch information
ZekerZhayard committed May 17, 2020
1 parent 8cc058c commit 4e560c5
Show file tree
Hide file tree
Showing 22 changed files with 381 additions and 116 deletions.
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# OptiForge ([CurseForge](https://www.curseforge.com/minecraft/mc-mods/optiforge))

*Compatibility: (2020-05-15)*
 *OptiForge-0.1.18*
 *Forge-1.15.2-31.1.89 or newer version*
*Compatibility: (2020-05-17)*
 *OptiForge-0.1.19*
 *Forge-1.15.2-31.1.95 or newer version*
 *OptiFine-1.15.2-G1-pre15 or newer version*

## How to Use
Expand Down
30 changes: 14 additions & 16 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ dependencies {
// For more info...
// http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
// http://www.gradle.org/docs/current/userguide/dependency_management.html
implementation "org.spongepowered:mixin:0.8.+"
implementation "org.spongepowered:mixin:0.8"
runtimeOnly fileTree(dir: "libs", include: "*.jar")
}

Expand All @@ -102,7 +102,7 @@ def attrs = [
"Implementation-Version": "${version}",
"Implementation-Vendor" :"ZekerZhayard",
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),
"MixinConnector": "io.github.zekerzhayard.optiforge.asm.MixinConnector"
"MixinConfigs": "mixins.optiforge.json"
]

jar {
Expand Down Expand Up @@ -133,10 +133,8 @@ artifacts {
}

processResources {
def forge_main_version = StringUtils.substringBeforeLast "${forge_version}", "."
def pros = [
"forge_version": "${forge_version}",
"forge_main_version": "${forge_main_version}",
"minecraft_version": "${minecraft_version}",
"optifine_version": "${optifine_version}",
"version": "${version}"
Expand All @@ -157,18 +155,18 @@ jar.finalizedBy("reobfJar")
// However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing
//publish.dependsOn('reobfJar')

publishing {
publications {
mavenJava(MavenPublication) {
artifact jar
}
}
repositories {
maven {
url "file:///${project.projectDir}/mcmodsrepo"
}
}
}
//publishing {
// publications {
// mavenJava(MavenPublication) {
// artifact jar
// }
// }
// repositories {
// maven {
// url "file:///${project.projectDir}/mcmodsrepo"
// }
// }
//}

compileJava {
options.compilerArgs << "-Xlint:deprecation"
Expand Down
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
org.gradle.jvmargs=-Xmx3G
org.gradle.daemon=false

mod_version=0.1.18
mod_version=0.1.19
# G1_pre15
optifine_version=7.1.15
minecraft_version=1.15.2
forge_version=31.1.89
forge_version=31.1.95
forge_gradle_version=3.0.170
mcp_mappings=20200515-1.15.1
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,34 @@

import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.ServiceLoader;
import java.util.Set;

import cpw.mods.modlauncher.Launcher;
import io.github.zekerzhayard.optiforge.asm.transformers.ITransformer;
import io.github.zekerzhayard.optiforge.asm.utils.ASMUtils;
import io.github.zekerzhayard.optiforge.asm.utils.annotations.IAnnotationAction;
import net.minecraftforge.fml.loading.FMLLoader;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.apache.commons.lang3.reflect.MethodUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.objectweb.asm.Type;
import org.objectweb.asm.tree.AnnotationNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodNode;
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
import org.spongepowered.asm.util.Annotations;

public class MixinConfigPlugin implements IMixinConfigPlugin {
private final static Logger LOGGER = LogManager.getLogger("OptiForge");

private boolean checked = false;
private List<ITransformer> transformers = new ArrayList<>();
private HashMap<String, IAnnotationAction> annotationActions = new HashMap<>();

@Override
public void onLoad(String mixinPackage) {
Expand All @@ -45,11 +52,17 @@ public void onLoad(String mixinPackage) {
}
});
ServiceLoader.load(ITransformer.class, ucl).forEach(t -> {
LOGGER.info(" - Add a transformer: {}", t.getClass().getName());
this.transformers.add(t);
LOGGER.info(" - Add a transformer: {}", t.getClass().getName());
});
LOGGER.info("Add {} transformer(s) totally.", this.transformers.size());

ServiceLoader.load(IAnnotationAction.class, ucl).forEach(a -> {
this.annotationActions.put(Type.getDescriptor(a.registerAnnotation()), a);
LOGGER.info(" - Add an annotation action: {}", a.getClass().getName());
});
LOGGER.info("Add {} annotation action(s) totally.", this.annotationActions.size());

this.checked = true;
} catch (Exception e) {
LOGGER.error("An unexpected issue occurred when loading transformers and all mixin classes will not apply: ", e);
Expand Down Expand Up @@ -88,8 +101,29 @@ public void preApply(String targetClassName, ClassNode targetClass, String mixin
@Override
public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
if (this.checked) {
ASMUtils.replaceRedirectSurrogateMethod(targetClass, mixinClassName);
this.applyAnnotationAction(targetClass, mixinClassName, IAnnotationAction::beforePostTransforming);
this.transformers.stream().filter(t -> t.isTargetClass(targetClassName)).peek(t -> LOGGER.info("[POST] Found a transformer \"{}\" for class \"{}\"", t.getClass().getName(), targetClassName)).forEach(t -> t.postTransform(targetClass, mixinClassName));
this.applyAnnotationAction(targetClass, mixinClassName, IAnnotationAction::afterPostTransforming);
}
}

private void applyAnnotationAction(ClassNode targetClass, String mixinClassName, IAnnotationAction.ActionFunction function) {
List<MethodNode> methods = new ArrayList<>(targetClass.methods);
for (MethodNode mn : methods) {
if (ASMUtils.isMixinMethod(mn, mixinClassName)) {
this.annotationActions.forEach((k, v) -> {
AnnotationNode annotation = Annotations.get(mn.visibleAnnotations, k);
if (annotation != null) {
HashMap<String, Object> values = new HashMap<>();
if (annotation.values != null) {
for (int i = 0; i < annotation.values.size(); i += 2) {
values.put((String) annotation.values.get(i), annotation.values.get(i + 1));
}
}
function.action(v, targetClass, mn, values, mixinClassName);
}
});
}
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package io.github.zekerzhayard.optiforge.asm.mixins.net.minecraft.client.renderer;

import com.mojang.blaze3d.matrix.MatrixStack;
import io.github.zekerzhayard.optiforge.asm.utils.RedirectSurrogate;
import io.github.zekerzhayard.optiforge.asm.utils.annotations.DynamicShadow;
import io.github.zekerzhayard.optiforge.asm.utils.annotations.LazyOverwrite;
import io.github.zekerzhayard.optiforge.asm.utils.annotations.RedirectSurrogate;
import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.ClientPlayerEntity;
Expand All @@ -19,6 +21,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;

/**
* {@link io.github.zekerzhayard.optiforge.asm.transformers.net.minecraft.client.renderer.OverlayRendererTransformer}
*/
@Mixin(OverlayRenderer.class)
public abstract class MixinOverlayRenderer {
@Shadow
Expand Down Expand Up @@ -79,10 +84,13 @@ private static void renderTexture(Minecraft minecraftIn, TextureAtlasSprite spri
return player.isBurning() && !ForgeEventFactory.renderFireOverlay(playerEntity, matrixStackIn);
}

private static BlockState optiforge_getViewBlockingState(PlayerEntity playerIn) {
// getViewBlockingState
@LazyOverwrite(prefix = "optiforge_")
private static BlockState optiforge_func_230018_a_(PlayerEntity playerIn) {
return MixinOverlayRenderer.getOverlayBlock(playerIn).getLeft();
}

@DynamicShadow
private static Pair<BlockState, BlockPos> getOverlayBlock(PlayerEntity playerIn) {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,24 @@
package io.github.zekerzhayard.optiforge.asm.mixins.net.minecraft.client.renderer;

import io.github.zekerzhayard.optiforge.asm.utils.annotations.DynamicShadow;
import io.github.zekerzhayard.optiforge.asm.utils.annotations.LazyOverwrite;
import io.github.zekerzhayard.optiforge.asm.utils.annotations.RedirectSurrogate;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher;
import net.minecraft.client.renderer.texture.Texture;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.MusicDiscItem;
import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.common.ForgeConfig;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;

/**
* {@link io.github.zekerzhayard.optiforge.asm.transformers.net.minecraft.client.renderer.WorldRendererTransformer}
*/
@Mixin(WorldRenderer.class)
public abstract class MixinWorldRenderer {
@Redirect(
Expand Down Expand Up @@ -35,4 +46,45 @@ public abstract class MixinWorldRenderer {
private void redirect$updateCameraAndRender$0(Texture texture, boolean blurIn, boolean mipmapIn) {
texture.setBlurMipmap(blurIn, mipmapIn);
}

@Redirect(
method = "Lnet/minecraft/client/renderer/WorldRenderer;playRecord(Lnet/minecraft/util/SoundEvent;Lnet/minecraft/util/math/BlockPos;)V",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/item/MusicDiscItem;getBySound(Lnet/minecraft/util/SoundEvent;)Lnet/minecraft/item/MusicDiscItem;"
),
require = 1,
allow = 1
)
private MusicDiscItem redirect$playRecord$0(SoundEvent _soundIn) {
return null;
}

@RedirectSurrogate(loacalVariableOrdinals = 0)
private MusicDiscItem redirect$playRecord$0(SoundEvent _soundIn, MusicDiscItem musicDiscItem) {
return musicDiscItem;
}

@Redirect(
method = "Lnet/minecraft/client/renderer/WorldRenderer;playEvent(Lnet/minecraft/entity/player/PlayerEntity;ILnet/minecraft/util/math/BlockPos;I)V",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/renderer/WorldRenderer;playRecord(Lnet/minecraft/util/SoundEvent;Lnet/minecraft/util/math/BlockPos;)V",
ordinal = 0
),
require = 1,
allow = 1
)
private void redirect$playEvent$0(WorldRenderer worldRenderer, SoundEvent soundIn, BlockPos pos, PlayerEntity player, int type, BlockPos blockPosIn, int data) {
this.playRecord(soundIn, pos, (MusicDiscItem) Item.getItemById(data));
}

// playRecord
@LazyOverwrite(prefix = "optiforge_")
public void optiforge_func_184377_a(SoundEvent soundIn, BlockPos pos) {
this.playRecord(soundIn, pos, soundIn == null ? null : MusicDiscItem.getBySound(soundIn));
}

@DynamicShadow
public abstract void playRecord(SoundEvent soundIn, BlockPos pos, MusicDiscItem musicDiscItem);
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package io.github.zekerzhayard.optiforge.asm.mixins.net.minecraft.client.renderer.entity;

import com.mojang.blaze3d.matrix.MatrixStack;
import io.github.zekerzhayard.optiforge.asm.utils.RedirectSurrogate;
import io.github.zekerzhayard.optiforge.asm.utils.annotations.RedirectSurrogate;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.entity.ItemFrameRenderer;
import net.minecraft.entity.item.ItemFrameEntity;
Expand All @@ -14,6 +14,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;

/**
* {@link io.github.zekerzhayard.optiforge.asm.transformers.net.minecraft.client.renderer.entity.ItemFrameRendererTransformer}
*/
@Mixin(ItemFrameRenderer.class)
public abstract class MixinItemFrameRenderer {
@Redirect(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package io.github.zekerzhayard.optiforge.asm.mixins.net.minecraft.entity;

import io.github.zekerzhayard.optiforge.asm.utils.RedirectSurrogate;
import io.github.zekerzhayard.optiforge.asm.utils.annotations.RedirectSurrogate;
import net.minecraft.entity.MobEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public abstract class MixinChunkManager {
private ServerWorld world;

@Redirect(
method = "Lnet/minecraft/world/server/ChunkManager;lambda$func_223172_f$14(Lnet/minecraft/util/math/ChunkPos;)Lcom/mojang/datafixers/util/Either;",
method = "Lnet/minecraft/world/server/ChunkManager;lambda$func_223172_f$14", // (Lnet/minecraft/util/math/ChunkPos;)Lcom/mojang/datafixers/util/Either;
at = @At(
value = "INVOKE",
target = "Lnet/optifine/reflect/ReflectorConstructor;exists()Z"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,13 @@ public boolean isTargetClass(String className) {

@Override
public ClassNode postTransform(ClassNode cn, String mixinClassName) {
cn.methods.remove(Bytecode.findMethod(cn, "getOverlayBlock", "(Lnet/minecraft/entity/player/PlayerEntity;)Lorg/apache/commons/lang3/tuple/Pair;"));
MethodNode mn1 = Objects.requireNonNull(Bytecode.findMethod(cn, ASMAPI.mapMethod("func_230018_a_"), "(Lnet/minecraft/entity/player/PlayerEntity;)Lnet/minecraft/block/BlockState;"));
mn1.name = "getOverlayBlock";
mn1.desc = "(Lnet/minecraft/entity/player/PlayerEntity;)Lorg/apache/commons/lang3/tuple/Pair;";
AbstractInsnNode ain = Objects.requireNonNull(Bytecode.findInsn(mn1, Opcodes.ARETURN));
mn1.instructions.insertBefore(ain, new VarInsnNode(Opcodes.ALOAD, 1));
mn1.instructions.insertBefore(ain, new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/util/math/BlockPos$Mutable", "func_185334_h", "()Lnet/minecraft/util/math/BlockPos;"));
mn1.instructions.insertBefore(ain, new MethodInsnNode(Opcodes.INVOKESTATIC, "org/apache/commons/lang3/tuple/Pair", "of", "(Ljava/lang/Object;Ljava/lang/Object;)Lorg/apache/commons/lang3/tuple/Pair;"));
MethodNode mn2 = Objects.requireNonNull(Bytecode.findMethod(cn, "optiforge_getViewBlockingState", "(Lnet/minecraft/entity/player/PlayerEntity;)Lnet/minecraft/block/BlockState;"));
mn2.name = ASMAPI.mapMethod("func_230018_a_");
MethodNode mn = Objects.requireNonNull(Bytecode.findMethod(cn, ASMAPI.mapMethod("func_230018_a_"), "(Lnet/minecraft/entity/player/PlayerEntity;)Lnet/minecraft/block/BlockState;"));
mn.name = "getOverlayBlock";
mn.desc = "(Lnet/minecraft/entity/player/PlayerEntity;)Lorg/apache/commons/lang3/tuple/Pair;";
AbstractInsnNode ain = Objects.requireNonNull(Bytecode.findInsn(mn, Opcodes.ARETURN));
mn.instructions.insertBefore(ain, new VarInsnNode(Opcodes.ALOAD, 1));
mn.instructions.insertBefore(ain, new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/util/math/BlockPos$Mutable", ASMAPI.mapMethod("func_185334_h"), "()Lnet/minecraft/util/math/BlockPos;"));
mn.instructions.insertBefore(ain, new MethodInsnNode(Opcodes.INVOKESTATIC, "org/apache/commons/lang3/tuple/Pair", "of", "(Ljava/lang/Object;Ljava/lang/Object;)Lorg/apache/commons/lang3/tuple/Pair;"));
return cn;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package io.github.zekerzhayard.optiforge.asm.transformers.net.minecraft.client.renderer;

import java.util.Objects;

import io.github.zekerzhayard.optiforge.asm.transformers.ITransformer;
import io.github.zekerzhayard.optiforge.asm.utils.ASMUtils;
import net.minecraftforge.coremod.api.ASMAPI;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.LabelNode;
import org.objectweb.asm.tree.LocalVariableNode;
import org.objectweb.asm.tree.MethodNode;
import org.spongepowered.asm.util.Bytecode;

public class WorldRendererTransformer implements ITransformer {
@Override
public boolean isTargetClass(String className) {
return className.equals("net.minecraft.client.renderer.WorldRenderer");
}

@Override
public ClassNode postTransform(ClassNode cn, String mixinClassName) {
MethodNode mn = Objects.requireNonNull(Bytecode.findMethod(cn, ASMAPI.mapMethod("func_184377_a"), "(Lnet/minecraft/util/SoundEvent;Lnet/minecraft/util/math/BlockPos;)V"));
LabelNode start = null, end = null;
for (AbstractInsnNode ain : mn.instructions.toArray()) {
if (ain instanceof LabelNode) {
LabelNode ln = (LabelNode) ain;
if (start == null) {
start = ln;
} else {
end = ln;
}
}
}
ASMUtils.insertLocalVariable(mn, new LocalVariableNode("musicDiscItem", "Lnet/minecraft/item/MusicDiscItem;", null, Objects.requireNonNull(start), Objects.requireNonNull(end), Bytecode.getFirstNonArgLocalIndex(mn)));
mn.name = "playRecord";
mn.desc = "(Lnet/minecraft/util/SoundEvent;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/item/MusicDiscItem;)V";
return cn;
}
}
Loading

0 comments on commit 4e560c5

Please sign in to comment.