diff --git a/common/fml_at.cfg b/common/fml_at.cfg
index 436f311b00..0b71d07ab7 100644
--- a/common/fml_at.cfg
+++ b/common/fml_at.cfg
@@ -1,2 +1,168 @@
-#Blank FML Access Transformer
-public ajh.a(Ljava/lang/Class;Ljava/lang/String;)V
\ No newline at end of file
+#Main FML Access Transformer configuration file
+# TileEntity addMapping
+public ajh.a(Ljava/lang/Class;Ljava/lang/String;)V
+# EntityList addMappings
+public jq.a(Ljava/lang/Class;Ljava/lang/String;I)V
+public jq.a(Ljava/lang/Class;Ljava/lang/String;III)V
+# EntityList nameToClassMap
+public jq.b
+# RenderManager renderers
+public avx.o
+# RenderBlocks - everything
+public avf.A
+public avf.B
+public avf.C
+public avf.D
+public avf.E
+public avf.F
+public avf.G
+public avf.H
+public avf.I
+public avf.J
+public avf.K
+public avf.L
+public avf.M
+public avf.N
+public avf.S
+public avf.T
+public avf.U
+public avf.V
+public avf.W
+public avf.X
+public avf.Y
+public avf.Z
+public avf.a
+public avf.aA
+public avf.aB
+public avf.aC
+public avf.aD
+public avf.aE
+public avf.aF
+public avf.aG
+public avf.aH
+public avf.aI
+public avf.aJ
+public avf.aK
+public avf.aL
+public avf.aM
+public avf.aN
+public avf.aO
+public avf.aa
+public avf.ab
+public avf.ac
+public avf.ad
+public avf.ae
+public avf.af
+public avf.ag
+public avf.ah
+public avf.ai
+public avf.aj
+public avf.ak
+public avf.al
+public avf.am
+public avf.an
+public avf.ao
+public avf.ap
+public avf.aq
+public avf.ar
+public avf.as
+public avf.at
+public avf.au
+public avf.av
+public avf.aw
+public avf.ax
+public avf.ay
+public avf.az
+public avf.b
+public avf.c
+public avf.d
+public avf.e
+public avf.f
+public avf.g
+public avf.h
+public avf.i
+public avf.j
+public avf.k
+public avf.l
+public avf.m
+public avf.n
+public avf.o
+public avf.p
+public avf.q
+public avf.r
+public avf.s
+public avf.t
+public avf.u
+public avf.v
+public avf.w
+public avf.x
+public avf.y
+public avf.z
+public avf.a()V
+public avf.a(DDDDDDFD)V
+public avf.a(IIII)I
+public avf.a(IIILacn;)F
+public avf.a(Laex;III)Z
+public avf.a(Lafc;III)Z
+public avf.a(Lafg;III)Z
+public avf.a(Lafq;III)Z
+public avf.a(Lafv;III)Z
+public avf.a(Lafw;III)Z
+public avf.a(Lahg;III)Z
+public avf.a(Laie;III)Z
+public avf.a(Laif;DDDDD)V
+public avf.a(Laif;DDDI)V
+public avf.a(Laif;IDDD)V
+public avf.a(Laif;IDDDD)V
+public avf.a(Laif;IF)V
+public avf.a(Laif;IIDDDD)V
+public avf.a(Laif;III)V
+public avf.a(Laif;IIIFFF)Z
+public avf.a(Laif;IIII)V
+public avf.a(Laif;IIIZ)V
+public avf.a(Laif;Luo;IIII)V
+public avf.b(DDDDDDFD)V
+public avf.b(I)Z
+public avf.b(Laif;DDDI)V
+public avf.b(Laif;IDDD)V
+public avf.b(Laif;III)Z
+public avf.b(Laif;IIIZ)Z
+public avf.c(DDDDDDFD)V
+public avf.c(Laif;DDDI)V
+public avf.c(Laif;III)Z
+public avf.c(Laif;IIIFFF)Z
+public avf.c(Laif;IIIZ)Z
+public avf.d(Laif;DDDI)V
+public avf.d(Laif;III)V
+public avf.d(Laif;IIIFFF)Z
+public avf.e(Laif;DDDI)V
+public avf.e(Laif;III)Z
+public avf.f(Laif;DDDI)V
+public avf.f(Laif;III)Z
+public avf.g(Laif;III)Z
+public avf.h(Laif;III)Z
+public avf.i(Laif;III)Z
+public avf.j(Laif;III)Z
+public avf.k(Laif;III)Z
+public avf.l(Laif;III)Z
+public avf.m(Laif;III)Z
+public avf.n(Laif;III)Z
+public avf.o(Laif;III)Z
+public avf.p(Laif;III)Z
+public avf.q(Laif;III)Z
+public avf.r(Laif;III)Z
+public avf.s(Laif;III)Z
+public avf.t(Laif;III)Z
+public avf.u(Laif;III)Z
+public avf.v(Laif;III)Z
+public avf.w(Laif;III)Z
+public avf.x(Laif;III)Z
+#RenderEngine - make TextureFX list public
+public ave.h
+#RenderPlayer - make armorlist public and not final
+public-f awq.j
+#StringTranslate - make the current table public
+public ak.b
+# TileEntityRenderer - make the list of renderers public
+public axr.m
+
diff --git a/eclipse/FML-Client/.classpath b/eclipse/FML-Client/.classpath
index dd2c23157b..d6fb27b16e 100644
--- a/eclipse/FML-Client/.classpath
+++ b/eclipse/FML-Client/.classpath
@@ -4,6 +4,7 @@
+
diff --git a/eclipse/FML-Client/.project b/eclipse/FML-Client/.project
index 78c6fff4fa..fad25895ae 100644
--- a/eclipse/FML-Client/.project
+++ b/eclipse/FML-Client/.project
@@ -50,6 +50,11 @@
2
MCP_LOC/src-work/common
+
+ transformers
+ 2
+ MCP_LOC/FML/transformers
+
common/fmlversion.properties
1
diff --git a/install/fml.py b/install/fml.py
index fa80e4aea1..40fa44935e 100644
--- a/install/fml.py
+++ b/install/fml.py
@@ -146,19 +146,20 @@ def setup_fml(fml_dir, mcp_dir):
def applyrg_shunt(self, side, reobf=False, applyrg_real = Commands.applyrg):
jars = {CLIENT: self.jarclient, SERVER: self.jarserver}
- #print "==================================SHUNT %s============================" % side
- #print "Java: %s" % self.cmdjava
- #print "Javac: %s" % self.cmdjavac
- #print "Jar: %s" % jars[side]
+ print "==================================SHUNT %s============================" % side
+ print "Java: %s" % self.cmdjava
+ print "Javac: %s" % self.cmdjavac
+ print "Jar: %s" % jars[side]
binDir = os.path.join(fml_dir, 'bin')
if not os.path.isdir(binDir):
os.makedirs(binDir)
#Compile AccessTransformer
- forkcmd = ('%s -Xlint:-options -deprecation -g -source 1.6 -target 1.6 -classpath "{classpath};." -sourcepath {sourcepath} -d {outpath} {target}' % self.cmdjavac).format(
+ forkcmd = ('%s -Xlint:-options -deprecation -g -source 1.6 -target 1.6 -classpath "{classpath}" -sourcepath {sourcepath} -d {outpath} {target}' % self.cmdjavac).format(
classpath=os.path.join(mcp_dir, 'lib', '*'), sourcepath=os.path.join(fml_dir, 'common'), outpath=os.path.join(fml_dir, 'bin'),
target=os.path.join(fml_dir, 'transformers', 'cpw', 'mods', 'fml', 'common', 'asm', 'transformers', 'AccessTransformer.java'))
+ print forkcmd
self.runcmd(forkcmd)
#Run AccessTransformer
@@ -427,4 +428,4 @@ def merge_tree(root_src_dir, root_dst_dir):
dst_file = os.path.join(dst_dir, file_)
if os.path.exists(dst_file):
os.remove(dst_file)
- shutil.copy(src_file, dst_dir)
\ No newline at end of file
+ shutil.copy(src_file, dst_dir)
diff --git a/transformers/cpw/mods/fml/common/asm/transformers/AccessTransformer.java b/transformers/cpw/mods/fml/common/asm/transformers/AccessTransformer.java
index 7da4e2c714..dd8c30845a 100644
--- a/transformers/cpw/mods/fml/common/asm/transformers/AccessTransformer.java
+++ b/transformers/cpw/mods/fml/common/asm/transformers/AccessTransformer.java
@@ -3,6 +3,7 @@ package cpw.mods.fml.common.asm.transformers;
import static org.objectweb.asm.Opcodes.ACC_PRIVATE;
import static org.objectweb.asm.Opcodes.ACC_PROTECTED;
import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
+import static org.objectweb.asm.Opcodes.ACC_FINAL;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
@@ -55,12 +56,25 @@ public class AccessTransformer implements IClassTransformer
public int oldAccess = 0;
public int newAccess = 0;
public int targetAccess = 0;
+ public boolean changeFinal = false;
+ public boolean markFinal = false;
private void setTargetAccess(String name)
{
- if (name.equalsIgnoreCase("public")) targetAccess = ACC_PUBLIC;
- else if (name.equalsIgnoreCase("private")) targetAccess = ACC_PRIVATE;
- else if (name.equalsIgnoreCase("protected")) targetAccess = ACC_PROTECTED;
+ if (name.startsWith("public")) targetAccess = ACC_PUBLIC;
+ else if (name.startsWith("private")) targetAccess = ACC_PRIVATE;
+ else if (name.startsWith("protected")) targetAccess = ACC_PROTECTED;
+
+ if (name.endsWith("-f"))
+ {
+ changeFinal = true;
+ markFinal = false;
+ }
+ else if (name.endsWith("+f"))
+ {
+ changeFinal = true;
+ markFinal = true;
+ }
}
}
@@ -68,7 +82,7 @@ public class AccessTransformer implements IClassTransformer
public AccessTransformer() throws IOException
{
- this("/rules.csv");
+ this("fml_at.cfg");
}
protected AccessTransformer(String rulesFile) throws IOException
{
@@ -111,12 +125,17 @@ public class AccessTransformer implements IClassTransformer
Modifier m = new Modifier();
m.setTargetAccess(parts.get(0));
List descriptor = Lists.newArrayList(Splitter.on(".").trimResults().split(parts.get(1)));
- List method = Lists.newArrayList(Splitter.on(CharMatcher.anyOf("()")).omitEmptyStrings().trimResults().split(descriptor.get(1)));
- if (method.size()==3) //cpw, cleanthis up plz
+ String nameReference = descriptor.get(1);
+ int parenIdx = nameReference.indexOf('(');
+ if (parenIdx>0)
{
- m.desc = String.format("(%s)%s", method.get(1), method.get(2));
+ m.desc = nameReference.substring(parenIdx);
+ m.name = nameReference.substring(0,parenIdx-1);
+ }
+ else
+ {
+ m.name = nameReference;
}
- m.name = method.get(0);
modifiers.put(descriptor.get(0), m);
return true;
}
@@ -196,6 +215,19 @@ public class AccessTransformer implements IClassTransformer
default:
throw new RuntimeException("The fuck?");
}
+
+ // Clear the "final" marker on fields only if specified in control field
+ if (target.changeFinal && target.desc == "")
+ {
+ if (target.markFinal)
+ {
+ ret |= ACC_FINAL;
+ }
+ else
+ {
+ ret &= ~ACC_FINAL;
+ }
+ }
target.newAccess = ret;
return ret;
}