Skip to content

Commit

Permalink
Compatible with forge 1.16.5-36.0.22.
Browse files Browse the repository at this point in the history
  • Loading branch information
ZekerZhayard committed Feb 12, 2021
1 parent c897f52 commit 56ec3d5
Show file tree
Hide file tree
Showing 9 changed files with 330 additions and 11 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: (2021-01-11)*
 *OptiForge-0.5.0*
 *Forge-1.16.5-36.0.7 or newer version*
*Compatibility: (2021-02-12)*
 *OptiForge-0.5.1*
 *Forge-1.16.5-36.0.22 or newer version*
 *OptiFine-1.16.5-G6 or newer version*

## How to Use
Expand Down
6 changes: 3 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ if (apiKey != null) {
project {
id = "372196"
changelogType = "markdown"
changelog = "Requires at least Forge-${minecraft_version}-${forge_version} and ${-> getOptiFineVersion()}.\nSee [update.json](https://github.com/ZekerZhayard/OptiForge/blob/update/update.json)."
changelog = "Requires at least Forge-${minecraft_version}-${forge_version} and ${-> getOptiFineVersion()}. See [update.json](https://github.com/ZekerZhayard/OptiForge/blob/update/update.json)."
releaseType = "beta"
relations {
optionalDependency "morecrashinfo"
Expand All @@ -207,8 +207,8 @@ if (apiKey != null) {
String getOptiFineVersion() {
String[] versions = "${optifine_version}".split("\\.")

String preVer = versions[2].equals("0") ? "" : ("_pre" + versions[2])
String preVer = versions[2].equals("0") ? "" : ("\\_pre" + versions[2])
String minorVer = Integer.parseInt(versions[1]) - (preVer.equals("") ? 1 : 0)
String majorVer = (char) ((int) ('A' as char) + Integer.parseInt(versions[0]) - 1)
return "OptiFine_${minecraft_version}_HD_U_${majorVer}${minorVer}${preVer}"
return "OptiFine\\_${minecraft_version}\\_HD\\_U\\_${majorVer}${minorVer}${preVer}"
}
8 changes: 4 additions & 4 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.5.0
mod_version=0.5.1
# G6
optifine_version=7.7.0
minecraft_version=1.16.5
forge_version=36.0.7
forge_gradle_version=4.0.10
mcp_mappings=20210126-1.15.1
forge_version=36.0.22
forge_gradle_version=4.0.15
mcp_mappings=20210210-1.15.1
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.2-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package io.github.zekerzhayard.optiforge.asm.transformers.net.minecraft.client.renderer.entity;

import java.util.Objects;

import cpw.mods.modlauncher.api.ITransformer;
import io.github.zekerzhayard.optiforge.asm.transformers.ITransformerImpl;
import io.github.zekerzhayard.optiforge.asm.utils.ASMUtils;
import net.minecraftforge.coremod.api.ASMAPI;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.FieldInsnNode;
import org.objectweb.asm.tree.LocalVariableNode;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.TypeInsnNode;
import org.spongepowered.asm.util.Bytecode;

public class EntityRendererManagerTransformer implements ITransformer<ClassNode>, ITransformerImpl {
@Override
public String targetClass() {
return "net.minecraft.client.renderer.entity.EntityRendererManager";
}

@Override
public ClassNode transform(ClassNode input) {
// https://github.com/MinecraftForge/MinecraftForge/blob/1.16.x/patches/minecraft/net/minecraft/client/renderer/entity/EntityRendererManager.java.patch#L18-L19
//
// private void func_229093_a_(MatrixStack p_229093_1_, IVertexBuilder p_229093_2_, Entity p_229093_3_, float p_229093_4_) {
// float f = p_229093_3_.func_213311_cf() / 2.0F;
// this.func_229094_a_(p_229093_1_, p_229093_2_, p_229093_3_, 1.0F, 1.0F, 1.0F);
// - if (p_229093_3_ instanceof EnderDragonEntity) {
// + if (p_229093_3_.isMultipartEntity()) {
// double d0 = -MathHelper.func_219803_d((double)p_229093_4_, p_229093_3_.field_70142_S, p_229093_3_.func_226277_ct_());
// double d1 = -MathHelper.func_219803_d((double)p_229093_4_, p_229093_3_.field_70137_T, p_229093_3_.func_226278_cu_());
// double d2 = -MathHelper.func_219803_d((double)p_229093_4_, p_229093_3_.field_70136_U, p_229093_3_.func_226281_cx_());
//

MethodNode renderDebugBoundingBox = Objects.requireNonNull(Bytecode.findMethod(input, ASMAPI.mapMethod("func_229093_a_"), "(Lcom/mojang/blaze3d/matrix/MatrixStack;Lcom/mojang/blaze3d/vertex/IVertexBuilder;Lnet/minecraft/entity/Entity;F)V"));

for (AbstractInsnNode ain : renderDebugBoundingBox.instructions.toArray()) {
if (ain.getOpcode() == Opcodes.INSTANCEOF) {
TypeInsnNode tin = (TypeInsnNode) ain;
if (tin.desc.equals("net/minecraft/entity/boss/dragon/EnderDragonEntity")) {
renderDebugBoundingBox.instructions.set(tin, new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/entity/Entity", "isMultipartEntity", "()Z", false));
}
} else if (ain.getOpcode() == Opcodes.INVOKEVIRTUAL) {
MethodInsnNode min = (MethodInsnNode) ain;
if (min.owner.equals("net/minecraft/entity/boss/dragon/EnderDragonEntity") && min.name.equals(ASMAPI.mapMethod("func_213404_dT")) && min.desc.equals("()[Lnet/minecraft/entity/boss/dragon/EnderDragonPartEntity;")) {

//
// https://github.com/MinecraftForge/MinecraftForge/blob/1.16.x/patches/minecraft/net/minecraft/client/renderer/entity/EntityRendererManager.java.patch#L24-L25
//
// double d1 = -MathHelper.func_219803_d((double)p_229093_4_, p_229093_3_.field_70137_T, p_229093_3_.func_226278_cu_());
// double d2 = -MathHelper.func_219803_d((double)p_229093_4_, p_229093_3_.field_70136_U, p_229093_3_.func_226281_cx_());
//
// - for(EnderDragonPartEntity enderdragonpartentity : ((EnderDragonEntity)p_229093_3_).func_213404_dT()) {
// + for(net.minecraftforge.entity.PartEntity<?> enderdragonpartentity : p_229093_3_.getParts()) {
// p_229093_1_.func_227860_a_();
// double d3 = d0 + MathHelper.func_219803_d((double)p_229093_4_, enderdragonpartentity.field_70142_S, enderdragonpartentity.func_226277_ct_());
// double d4 = d1 + MathHelper.func_219803_d((double)p_229093_4_, enderdragonpartentity.field_70137_T, enderdragonpartentity.func_226278_cu_());
//

renderDebugBoundingBox.instructions.remove(min.getPrevious());
renderDebugBoundingBox.instructions.set(min, new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/entity/Entity", "getParts", "()[Lnet/minecraftforge/entity/PartEntity;"));
} else if (min.owner.equals("net/minecraft/entity/boss/dragon/EnderDragonPartEntity") && (min.name.equals(ASMAPI.mapMethod("func_226277_ct_")) || min.name.equals(ASMAPI.mapMethod("func_226278_cu_")) || min.name.equals(ASMAPI.mapMethod("func_226281_cx_"))) && min.desc.equals("()D")) {
min.owner = "net/minecraftforge/entity/PartEntity";
}
} else if (ain.getOpcode() == Opcodes.GETFIELD) {
FieldInsnNode fin = (FieldInsnNode) ain;
if (fin.owner.equals("net/minecraft/entity/boss/dragon/EnderDragonPartEntity") && (fin.name.equals(ASMAPI.mapField("field_70142_S")) || fin.name.equals(ASMAPI.mapField("field_70137_T")) || fin.name.equals(ASMAPI.mapField("field_70136_U"))) && fin.desc.equals("D")) {
fin.owner = "net/minecraftforge/entity/PartEntity";
}
}
}

LocalVariableNode enderdragonpartentity = Objects.requireNonNull(ASMUtils.findLocalVariable(renderDebugBoundingBox, "Lnet/minecraft/entity/boss/dragon/EnderDragonPartEntity;", 0));
enderdragonpartentity.desc = "Lnet/minecraftforge/entity/PartEntity;";
enderdragonpartentity.signature = "Lnet/minecraftforge/entity/PartEntity<*>;";

return input;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package io.github.zekerzhayard.optiforge.asm.transformers.net.minecraft.util;

import java.util.Objects;

import cpw.mods.modlauncher.api.ITransformer;
import io.github.zekerzhayard.optiforge.asm.transformers.ITransformerImpl;
import net.minecraftforge.coremod.api.ASMAPI;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.MethodNode;
import org.spongepowered.asm.util.Bytecode;

public class UtilTransformer implements ITransformer<ClassNode>, ITransformerImpl {
@Override
public String targetClass() {
return "net.minecraft.util.Util";
}

@Override
public ClassNode transform(ClassNode input) {
// https://github.com/MinecraftForge/MinecraftForge/blob/1.16.x/patches/minecraft/net/minecraft/util/Util.java.patch#L7-L8
//
// try {
// type = DataFixesManager.func_210901_a().getSchema(DataFixUtils.makeKey(SharedConstants.func_215069_a().getWorldVersion())).getChoiceType(p_240990_0_, p_240990_1_);
// } catch (IllegalArgumentException illegalargumentexception) {
// - field_195650_a.error("No data fixer registered for {}", (Object)p_240990_1_);
// + field_195650_a.debug("No data fixer registered for {}", (Object)p_240990_1_);
// if (SharedConstants.field_206244_b) {
// throw illegalargumentexception;
// }
//

MethodNode attemptDataFixInternal = Objects.requireNonNull(Bytecode.findMethod(input, ASMAPI.mapMethod("func_240990_b_"), "(Lcom/mojang/datafixers/DSL$TypeReference;Ljava/lang/String;)Lcom/mojang/datafixers/types/Type;"));

for (AbstractInsnNode ain : attemptDataFixInternal.instructions.toArray()) {
if (ain.getOpcode() == Opcodes.INVOKEINTERFACE) {
MethodInsnNode min = (MethodInsnNode) ain;
if (min.owner.equals("org/apache/logging/log4j/Logger") && min.name.equals("error") && min.desc.equals("(Ljava/lang/String;Ljava/lang/Object;)V")) {
min.name = "debug";
}
}
}

return input;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package io.github.zekerzhayard.optiforge.asm.transformers.net.minecraft.world.server;

import java.util.Objects;

import cpw.mods.modlauncher.api.ITransformer;
import io.github.zekerzhayard.optiforge.asm.transformers.ITransformerImpl;
import net.minecraftforge.coremod.api.ASMAPI;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.TypeInsnNode;
import org.spongepowered.asm.util.Bytecode;

public class ChunkManagerTransformer implements ITransformer<ClassNode>, ITransformerImpl {
@Override
public String targetClass() {
return "net.minecraft.world.server.ChunkManager";
}

@Override
public ClassNode transform(ClassNode input) {

//
// https://github.com/MinecraftForge/MinecraftForge/blob/1.16.x/patches/minecraft/net/minecraft/world/server/ChunkManager.java.patch#L39-L40
//
// }
//
// protected void func_219210_a(Entity p_219210_1_) {
// - if (!(p_219210_1_ instanceof EnderDragonPartEntity)) {
// + if (!(p_219210_1_ instanceof net.minecraftforge.entity.PartEntity)) {
// EntityType<?> entitytype = p_219210_1_.func_200600_R();
// int i = entitytype.func_233602_m_() * 16;
// int j = entitytype.func_220332_l();
//

MethodNode track = Objects.requireNonNull(Bytecode.findMethod(input, ASMAPI.mapMethod("func_219210_a"), "(Lnet/minecraft/entity/Entity;)V"));

for (AbstractInsnNode ain : track.instructions.toArray()) {
if (ain.getOpcode() == Opcodes.INSTANCEOF) {
TypeInsnNode tin = (TypeInsnNode) ain;
if (tin.desc.equals("net/minecraft/entity/boss/dragon/EnderDragonPartEntity")) {
tin.desc = "net/minecraftforge/entity/PartEntity";
}
}
}

return input;
}
}
Loading

0 comments on commit 56ec3d5

Please sign in to comment.