Added a coremod, shush, don't tell Lex.
Seriously, this is how to do targeted changes to specific classes. In this case, adding a fieldtomethod redirect for EffectInstance.potion to allow substitution. Signed-off-by: cpw <cpw+github@weeksfamily.ca>
This commit is contained in:
parent
57d4d60a33
commit
0bdc2d04b4
6 changed files with 20 additions and 158 deletions
|
@ -372,7 +372,7 @@ project(':forge') {
|
||||||
installer 'net.minecraftforge:accesstransformers:0.16.+:shadowed'
|
installer 'net.minecraftforge:accesstransformers:0.16.+:shadowed'
|
||||||
installer 'net.minecraftforge:eventbus:0.10.+:service'
|
installer 'net.minecraftforge:eventbus:0.10.+:service'
|
||||||
installer 'net.minecraftforge:forgespi:0.13.+'
|
installer 'net.minecraftforge:forgespi:0.13.+'
|
||||||
installer 'net.minecraftforge:coremods:0.6.+'
|
installer 'net.minecraftforge:coremods:0.7.+'
|
||||||
installer 'net.minecraftforge:unsafe:0.2.+'
|
installer 'net.minecraftforge:unsafe:0.2.+'
|
||||||
installer 'com.electronwill.night-config:core:3.6.0'
|
installer 'com.electronwill.night-config:core:3.6.0'
|
||||||
installer 'com.electronwill.night-config:toml:3.6.0'
|
installer 'com.electronwill.night-config:toml:3.6.0'
|
||||||
|
|
|
@ -1,126 +0,0 @@
|
||||||
/*
|
|
||||||
* Minecraft Forge
|
|
||||||
* Copyright (c) 2016-2019.
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
package net.minecraftforge.common.asm;
|
|
||||||
|
|
||||||
import java.util.EnumSet;
|
|
||||||
import java.util.ListIterator;
|
|
||||||
|
|
||||||
import org.objectweb.asm.Opcodes;
|
|
||||||
import org.objectweb.asm.Type;
|
|
||||||
import org.objectweb.asm.tree.AbstractInsnNode;
|
|
||||||
import org.objectweb.asm.tree.ClassNode;
|
|
||||||
import org.objectweb.asm.tree.FieldInsnNode;
|
|
||||||
import org.objectweb.asm.tree.FieldNode;
|
|
||||||
import org.objectweb.asm.tree.MethodInsnNode;
|
|
||||||
import org.objectweb.asm.tree.MethodNode;
|
|
||||||
|
|
||||||
import cpw.mods.modlauncher.serviceapi.ILaunchPluginService;
|
|
||||||
|
|
||||||
@Deprecated // TODO as this only targets a single class, it can be moved to a JS coremod
|
|
||||||
public abstract class FieldRedirectTransformer implements ILaunchPluginService
|
|
||||||
{
|
|
||||||
private final String clsName;
|
|
||||||
private final String TYPE;
|
|
||||||
private final String DESC;
|
|
||||||
private final String bypass;
|
|
||||||
|
|
||||||
protected FieldRedirectTransformer(String cls, String type, String bypass)
|
|
||||||
{
|
|
||||||
this.clsName = cls;
|
|
||||||
this.TYPE = type;
|
|
||||||
this.DESC = "()" + type;
|
|
||||||
this.bypass = bypass;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final EnumSet<Phase> YAY = EnumSet.of(Phase.AFTER);
|
|
||||||
private static final EnumSet<Phase> NAY = EnumSet.noneOf(Phase.class);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public EnumSet<Phase> handlesClass(Type classType, boolean isEmpty)
|
|
||||||
{
|
|
||||||
return classType.getClassName().equals(clsName) && !isEmpty ? YAY : NAY;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean processClass(Phase phase, ClassNode classNode, Type classType)
|
|
||||||
{
|
|
||||||
FieldNode fieldRef = null;
|
|
||||||
for (FieldNode f : classNode.fields)
|
|
||||||
{
|
|
||||||
if (this.TYPE.equals(f.desc) && fieldRef == null)
|
|
||||||
{
|
|
||||||
fieldRef = f;
|
|
||||||
}
|
|
||||||
else if (this.TYPE.equals(f.desc))
|
|
||||||
{
|
|
||||||
throw new RuntimeException("Error processing " + clsName + " - found a duplicate holder field");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (fieldRef == null)
|
|
||||||
{
|
|
||||||
throw new RuntimeException("Error processing " + clsName + " - no holder field declared (is the code somehow obfuscated?)");
|
|
||||||
}
|
|
||||||
|
|
||||||
MethodNode getMethod = null;
|
|
||||||
for (MethodNode m: classNode.methods)
|
|
||||||
{
|
|
||||||
if (m.name.equals(this.bypass)) continue;
|
|
||||||
if (this.DESC.equals(m.desc) && getMethod == null)
|
|
||||||
{
|
|
||||||
getMethod = m;
|
|
||||||
}
|
|
||||||
else if (this.DESC.equals(m.desc))
|
|
||||||
{
|
|
||||||
throw new RuntimeException("Error processing " + clsName + " - duplicate get method found");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (getMethod == null)
|
|
||||||
{
|
|
||||||
throw new RuntimeException("Error processing " + clsName + " - no get method found (is the code somehow obfuscated?)");
|
|
||||||
}
|
|
||||||
|
|
||||||
for (MethodNode m: classNode.methods)
|
|
||||||
{
|
|
||||||
if (m.name.equals(this.bypass)) continue;
|
|
||||||
for (ListIterator<AbstractInsnNode> it = m.instructions.iterator(); it.hasNext(); )
|
|
||||||
{
|
|
||||||
AbstractInsnNode insnNode = it.next();
|
|
||||||
if (insnNode.getType() == AbstractInsnNode.FIELD_INSN)
|
|
||||||
{
|
|
||||||
FieldInsnNode fi = (FieldInsnNode)insnNode;
|
|
||||||
if (fieldRef.name.equals(fi.name) && fi.getOpcode() == Opcodes.GETFIELD)
|
|
||||||
{
|
|
||||||
it.remove();
|
|
||||||
MethodInsnNode replace = new MethodInsnNode(Opcodes.INVOKEVIRTUAL, classNode.name, getMethod.name, getMethod.desc, false);
|
|
||||||
it.add(replace);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String name()
|
|
||||||
{
|
|
||||||
return "field_redirect_" + clsName + "/" + TYPE;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
/*
|
|
||||||
* Minecraft Forge
|
|
||||||
* Copyright (c) 2016-2019.
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
package net.minecraftforge.common.asm;
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public class PotionEffectTransformer extends FieldRedirectTransformer
|
|
||||||
{
|
|
||||||
public PotionEffectTransformer()
|
|
||||||
{
|
|
||||||
super("net.minecraft.potion.PotionEffect", "Lnet/minecraft/potion/Potion;", "getPotionRaw");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -2,4 +2,3 @@ net.minecraftforge.fml.loading.RuntimeDistCleaner
|
||||||
net.minecraftforge.common.asm.RuntimeEnumExtender
|
net.minecraftforge.common.asm.RuntimeEnumExtender
|
||||||
net.minecraftforge.common.asm.ObjectHolderDefinalize
|
net.minecraftforge.common.asm.ObjectHolderDefinalize
|
||||||
net.minecraftforge.common.asm.CapabilityInjectDefinalize
|
net.minecraftforge.common.asm.CapabilityInjectDefinalize
|
||||||
net.minecraftforge.common.asm.PotionEffectTransformer
|
|
||||||
|
|
3
src/main/resources/META-INF/coremods.json
Normal file
3
src/main/resources/META-INF/coremods.json
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"fieldtomethodtransformers": "META-INF/fieldtomethodtransformers.js"
|
||||||
|
}
|
15
src/main/resources/META-INF/fieldtomethodtransformers.js
Normal file
15
src/main/resources/META-INF/fieldtomethodtransformers.js
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
function initializeCoreMod() {
|
||||||
|
return {
|
||||||
|
'potion': {
|
||||||
|
'target': {
|
||||||
|
'type': 'CLASS',
|
||||||
|
'name': 'net.minecraft.potion.EffectInstance'
|
||||||
|
},
|
||||||
|
'transformer': function(classNode) {
|
||||||
|
var asmapi=Java.type('net.minecraftforge.coremod.api.ASMAPI')
|
||||||
|
asmapi.redirectFieldToMethod(classNode, 'potion', 'getPotionRaw')
|
||||||
|
return classNode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue